Commit cb4fd0fb authored by Chunchi Che's avatar Chunchi Che Committed by WANG HE

add adapter layer

parent 4e52f9cf
import { StocAdapter, ygoProPacket } from "./packet";
import { ygopro } from "../idl/ocgcore";
import {
STOC_CHAT,
STOC_HS_PLAYER_CHANGE,
STOC_HS_PLAYER_ENTER,
STOC_HS_WATCH_CHANGE,
STOC_JOIN_GAME,
STOC_TYPE_CHANGE,
} from "./protoDecl";
import StocChat from "./stoc/stocChat";
import StocJoinGame from "./stoc/stocJoinGame";
import StocHsPlayerEnter from "./stoc/stocHsPlayerEnter";
import StocHsPlayerChange from "./stoc/stocHsPlayerChange";
import StocHsWatchChange from "./stoc/stocHsWatchChange";
import StocTypeChange from "./stoc/stocTypeChange";
export function adaptStoc(packet: ygoProPacket): ygopro.YgoStocMsg {
let pb = new ygopro.YgoStocMsg({});
switch (packet.proto) {
case STOC_JOIN_GAME: {
pb = new StocJoinGame(packet).upcast();
break;
}
case STOC_CHAT: {
pb = new StocChat(packet).upcast();
break;
}
case STOC_HS_PLAYER_ENTER: {
pb = new StocHsPlayerEnter(packet).upcast();
break;
}
case STOC_HS_PLAYER_CHANGE: {
pb = new StocHsPlayerChange(packet).upcast();
break;
}
case STOC_HS_WATCH_CHANGE: {
pb = new StocHsWatchChange(packet).upcast();
break;
}
case STOC_TYPE_CHANGE: {
pb = new StocTypeChange(packet).upcast();
break;
}
default: {
break;
}
}
return pb;
}
......@@ -24,10 +24,8 @@ export class ygoProPacket {
return array;
}
}
export class ygoArrayBuilder extends ygoProPacket {
constructor(array: ArrayBuffer) {
static deserialize(array: ArrayBuffer): ygoProPacket {
try {
if (array.byteLength < PACKET_MIN_LEN) {
throw new Error(
......@@ -35,7 +33,7 @@ export class ygoArrayBuilder extends ygoProPacket {
);
}
} catch (e) {
console.log("[e][ygoProPacket][constructor]" + e);
console.log(e);
}
const dataView = new DataView(array);
......@@ -44,12 +42,16 @@ export class ygoArrayBuilder extends ygoProPacket {
const proto = dataView.getInt8(2);
const exData = array.slice(3, packetLen + 2);
super(packetLen, proto, new Uint8Array(exData));
return new ygoProPacket(packetLen, proto, new Uint8Array(exData));
}
}
export interface ygoProtobuf {
readonly packet: ygoProPacket;
export interface StocAdapter {
upcast(): ygopro.YgoStocMsg;
}
export interface CtosAdapter {
readonly protobuf: ygopro.YgoCtosMsg;
adapt(): ygopro.YgoStocMsg;
downcast(): ygoProPacket;
}
import { ygopro } from "../../idl/ocgcore";
import { ygoProPacket, ygoProtobuf } from "../packet";
import { ygoProPacket, StocAdapter } from "../packet";
export default class StocChatPB implements ygoProtobuf {
export default class chatAdapter implements StocAdapter {
packet: ygoProPacket;
constructor(packet: ygoProPacket) {
this.packet = packet;
}
adapt(): ygopro.YgoStocMsg {
upcast(): ygopro.YgoStocMsg {
const player = new DataView(this.packet.exData.buffer).getInt16(0, true);
const decoder = new TextDecoder("utf-16");
......
import { ygopro } from "../../idl/ocgcore";
import { ygoProPacket, ygoProtobuf } from "../packet";
import { ygoProPacket, StocAdapter } from "../packet";
export default class StocHsPlayerChange implements ygoProtobuf {
export default class hsPlayerChangeAdapter implements StocAdapter {
packet: ygoProPacket;
constructor(packet: ygoProPacket) {
this.packet = packet;
}
adapt(): ygopro.YgoStocMsg {
upcast(): ygopro.YgoStocMsg {
const pb = new ygopro.StocHsPlayerChange({});
pb.state = ygopro.StocHsPlayerChange.State.UNKNOWN;
......
import { ygopro } from "../../idl/ocgcore";
import { ygoProPacket, ygoProtobuf } from "../packet";
import { ygoProPacket, StocAdapter } from "../packet";
import { UTF16_BUFFER_MAX_LEN } from "../util";
const UINT8_PER_UINT16 = 2;
export default class StocHsPlayerEnter implements ygoProtobuf {
export default class hsPlayerEnterAdapter implements StocAdapter {
packet: ygoProPacket;
constructor(packet: ygoProPacket) {
this.packet = packet;
}
adapt(): ygopro.YgoStocMsg {
upcast(): ygopro.YgoStocMsg {
const exData = this.packet.exData;
const decoder = new TextDecoder("utf-16");
......
import { ygopro } from "../../idl/ocgcore";
import { ygoProPacket, ygoProtobuf } from "../packet";
import { ygoProPacket, StocAdapter } from "../packet";
export default class StocHsWatchChange implements ygoProtobuf {
export default class hsWatchChangeAdapter implements StocAdapter {
packet: ygoProPacket;
constructor(packet: ygoProPacket) {
this.packet = packet;
}
adapt(): ygopro.YgoStocMsg {
upcast(): ygopro.YgoStocMsg {
const count = new DataView(this.packet.exData.buffer).getUint16(0, true);
return new ygopro.YgoStocMsg({
......
import { ygopro } from "../../idl/ocgcore";
import { ygoProPacket, ygoProtobuf } from "../packet";
import { ygoProPacket, StocAdapter } from "../packet";
export default class StocJoinGamePB implements ygoProtobuf {
export default class joinGameAdapter implements StocAdapter {
packet: ygoProPacket;
constructor(packet: ygoProPacket) {
this.packet = packet;
}
adapt(): ygopro.YgoStocMsg {
upcast(): ygopro.YgoStocMsg {
// todo
return new ygopro.YgoStocMsg({
stoc_join_game: new ygopro.StocJoinGame({}),
......
import { ygopro } from "../../idl/ocgcore";
import { ygoProPacket, ygoProtobuf } from "../packet";
import { ygoProPacket, StocAdapter } from "../packet";
export default class StocTypeChange implements ygoProtobuf {
export default class typeChangeAdapter implements StocAdapter {
packet: ygoProPacket;
constructor(packet: ygoProPacket) {
this.packet = packet;
}
adapt(): ygopro.YgoStocMsg {
upcast(): ygopro.YgoStocMsg {
const type_ = new DataView(this.packet.exData.buffer).getUint8(0);
const isHost = ((type_ >> 4) & 0xf) != 0;
......
import { ygopro } from "./idl/ocgcore";
import socketMiddleWare, { socketCmd } from "../../middleware/socket";
import { IDeck } from "../Card";
import CtosPlayerInfo from "./ocgAdapter/ctos/ctosPlayerInfo";
import CtosJoinGame from "./ocgAdapter/ctos/ctosJoinGame";
import CtosUpdateDeck from "./ocgAdapter/ctos/ctosUpdateDeck";
import CtosHsReady from "./ocgAdapter/ctos/ctosHsReady";
import CtosHsStart from "./ocgAdapter/ctos/ctosHsStart";
import PlayerInfoAdapter from "./ocgAdapter/ctos/ctosPlayerInfo";
import JoinGameAdapter from "./ocgAdapter/ctos/ctosJoinGame";
import UpdateDeckAdapter from "./ocgAdapter/ctos/ctosUpdateDeck";
import HsReadyAdapter from "./ocgAdapter/ctos/ctosHsReady";
import HsStartAdapter from "./ocgAdapter/ctos/ctosHsStart";
export function sendUpdateDeck(deck: IDeck) {
const updateDeck = new ygopro.YgoCtosMsg({
......@@ -15,7 +15,9 @@ export function sendUpdateDeck(deck: IDeck) {
side: deck.side,
}),
});
const payload = new CtosUpdateDeck(updateDeck).serialize();
// 如果要实现UI层和Adapter层解耦,这里应该不感知具体Adapter类型
const payload = new UpdateDeckAdapter(updateDeck).serialize();
socketMiddleWare({ cmd: socketCmd.SEND, payload });
}
......@@ -24,7 +26,7 @@ export function sendHsReady() {
const hasReady = new ygopro.YgoCtosMsg({
ctos_hs_ready: new ygopro.CtosHsReady({}),
});
const payload = new CtosHsReady(hasReady).serialize();
const payload = new HsReadyAdapter(hasReady).serialize();
socketMiddleWare({ cmd: socketCmd.SEND, payload });
}
......@@ -33,7 +35,7 @@ export function sendHsStart() {
const hasStart = new ygopro.YgoCtosMsg({
ctos_hs_start: new ygopro.CtosHsStart({}),
});
const payload = new CtosHsStart(hasStart).serialize();
const payload = new HsStartAdapter(hasStart).serialize();
socketMiddleWare({ cmd: socketCmd.SEND, payload });
}
......@@ -44,7 +46,7 @@ export function sendPlayerInfo(ws: WebSocket, player: string) {
name: player,
}),
});
const packet = new CtosPlayerInfo(playerInfo); // todo: 需要收敛在一个层次里
const packet = new PlayerInfoAdapter(playerInfo); // todo: 需要收敛在一个层次里
ws.send(packet.serialize());
}
......@@ -57,7 +59,7 @@ export function sendJoinGame(ws: WebSocket, version: number, passWd: string) {
passwd: passWd,
}),
});
const packet = new CtosJoinGame(joinGame);
const packet = new JoinGameAdapter(joinGame);
ws.send(packet.serialize());
}
import { ygopro } from "../api/ocgcore/idl/ocgcore";
import handleHsPlayerChange from "./room/hsPlayerChange";
import handleTypeChange from "./room/typeChange";
import handleHsPlayerEnter from "./room/hsPlayerEnter";
import handleJoinGame from "./room/joinGame";
import handleChat from "./room/chat";
import handleHsWatchChange from "./room/hsWatchChange";
import { ygoArrayBuilder } from "../api/ocgcore/ocgAdapter/packet";
import StocJoinGame from "../api/ocgcore/ocgAdapter/stoc/stocJoinGame";
import {
STOC_CHAT,
STOC_HS_PLAYER_CHANGE,
STOC_HS_PLAYER_ENTER,
STOC_HS_WATCH_CHANGE,
STOC_JOIN_GAME,
STOC_TYPE_CHANGE,
} from "../api/ocgcore/ocgAdapter/protoDecl";
import StocChat from "../api/ocgcore/ocgAdapter/stoc/stocChat";
import StocHsPlayerEnter from "../api/ocgcore/ocgAdapter/stoc/stocHsPlayerEnter";
import StocHsPlayerChange from "../api/ocgcore/ocgAdapter/stoc/stocHsPlayerChange";
import StocHsWatchChange from "../api/ocgcore/ocgAdapter/stoc/stocHsWatchChange";
import StocTypeChange from "../api/ocgcore/ocgAdapter/stoc/stocTypeChange";
import { ygoProPacket } from "../api/ocgcore/ocgAdapter/packet";
import { adaptStoc } from "../api/ocgcore/ocgAdapter/adapter";
export default function handleSocketMessage(e: MessageEvent) {
const packet = new ygoArrayBuilder(e.data);
console.log(packet);
let pb = new ygopro.YgoStocMsg({});
switch (packet.proto) {
case STOC_JOIN_GAME: {
pb = new StocJoinGame(packet).adapt();
break;
}
case STOC_CHAT: {
pb = new StocChat(packet).adapt();
break;
}
case STOC_HS_PLAYER_ENTER: {
pb = new StocHsPlayerEnter(packet).adapt();
break;
}
case STOC_HS_PLAYER_CHANGE: {
pb = new StocHsPlayerChange(packet).adapt();
break;
}
case STOC_HS_WATCH_CHANGE: {
pb = new StocHsWatchChange(packet).adapt();
break;
}
case STOC_TYPE_CHANGE: {
pb = new StocTypeChange(packet).adapt();
break;
}
default: {
break;
}
}
const packet = ygoProPacket.deserialize(e.data);
const pb = adaptStoc(packet);
switch (pb.msg) {
case "stoc_join_game": {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment