Commit 94b7862d authored by Chunchi Che's avatar Chunchi Che

add unpack logic

parent b45308de
Pipeline #23660 passed with stages
in 15 minutes and 21 seconds
...@@ -40,7 +40,7 @@ export class YgoProPacket { ...@@ -40,7 +40,7 @@ export class YgoProPacket {
* 返回值可用于业务逻辑处理。 * 返回值可用于业务逻辑处理。
* *
* */ * */
static deserialize(array: ArrayBuffer): YgoProPacket { static deserialize(array: ArrayBuffer): YgoProPacket[] {
try { try {
if (array.byteLength < PACKET_MIN_LEN) { if (array.byteLength < PACKET_MIN_LEN) {
throw new Error( throw new Error(
...@@ -51,13 +51,29 @@ export class YgoProPacket { ...@@ -51,13 +51,29 @@ export class YgoProPacket {
console.error(e); console.error(e);
} }
const dataView = new DataView(array); // 由于srvpro实现问题,目前可能出现粘包的情况,因此这里做下解包
const packets = [];
const packetLen = dataView.getInt16(0, littleEndian); let offset = 0;
const proto = dataView.getInt8(2); while (true) {
const exData = array.slice(3, packetLen + 2); const buffer = array.slice(offset);
return new YgoProPacket(packetLen, proto, new Uint8Array(exData)); if (buffer.byteLength < PACKET_MIN_LEN) {
// 解包结束
break;
}
const dataView = new DataView(buffer);
const packetLen = dataView.getInt16(0, littleEndian);
const proto = dataView.getInt8(2);
const exData = buffer.slice(3, packetLen + 2);
packets.push(new YgoProPacket(packetLen, proto, new Uint8Array(exData)));
offset += packetLen + 2;
}
return packets;
} }
} }
......
...@@ -38,87 +38,92 @@ export default async function handleSocketMessage(e: MessageEvent) { ...@@ -38,87 +38,92 @@ export default async function handleSocketMessage(e: MessageEvent) {
} }
async function _handle(e: MessageEvent) { async function _handle(e: MessageEvent) {
const packet = YgoProPacket.deserialize(e.data); const packets = YgoProPacket.deserialize(e.data);
const pb = adaptStoc(packet);
switch (pb.msg) { await Promise.all(
case "stoc_join_game": { packets.map(async (packet) => {
handleJoinGame(pb); const pb = adaptStoc(packet);
break;
} switch (pb.msg) {
case "stoc_chat": { case "stoc_join_game": {
handleChat(pb); handleJoinGame(pb);
break; break;
} }
case "stoc_hs_player_change": { case "stoc_chat": {
handleHsPlayerChange(pb); handleChat(pb);
break; break;
} }
case "stoc_hs_watch_change": { case "stoc_hs_player_change": {
handleHsWatchChange(pb); handleHsPlayerChange(pb);
break; break;
} }
case "stoc_hs_player_enter": { case "stoc_hs_watch_change": {
handleHsPlayerEnter(pb); handleHsWatchChange(pb);
break; break;
} }
case "stoc_type_change": { case "stoc_hs_player_enter": {
handleTypeChange(pb); handleHsPlayerEnter(pb);
break; break;
} }
case "stoc_select_hand": { case "stoc_type_change": {
handleSelectHand(pb); handleTypeChange(pb);
break; break;
} }
case "stoc_hand_result": { case "stoc_select_hand": {
handleHandResult(pb); handleSelectHand(pb);
break; break;
} }
case "stoc_select_tp": { case "stoc_hand_result": {
handleSelectTp(pb); handleHandResult(pb);
break; break;
} }
case "stoc_deck_count": { case "stoc_select_tp": {
handleDeckCount(pb); handleSelectTp(pb);
break; break;
} }
case "stoc_duel_start": { case "stoc_deck_count": {
handleDuelStart(pb); handleDeckCount(pb);
break; break;
} }
case "stoc_duel_end": { case "stoc_duel_start": {
handleDuelEnd(pb); handleDuelStart(pb);
break; break;
} }
case "stoc_game_msg": { case "stoc_duel_end": {
if (!replayStore.isReplay) { handleDuelEnd(pb);
// 如果不是回放模式,则记录回放数据 break;
replayStore.record(packet); }
} case "stoc_game_msg": {
await handleGameMsg(pb); if (!replayStore.isReplay) {
// 如果不是回放模式,则记录回放数据
replayStore.record(packet);
}
await handleGameMsg(pb);
break; break;
} }
case "stoc_time_limit": { case "stoc_time_limit": {
handleTimeLimit(pb.stoc_time_limit); handleTimeLimit(pb.stoc_time_limit);
break; break;
} }
case "stoc_error_msg": { case "stoc_error_msg": {
await handleErrorMsg(pb.stoc_error_msg); await handleErrorMsg(pb.stoc_error_msg);
break; break;
} }
case "stoc_change_side": { case "stoc_change_side": {
handleChangeSide(pb.stoc_change_side); handleChangeSide(pb.stoc_change_side);
break; break;
} }
case "stoc_waiting_side": { case "stoc_waiting_side": {
handleWaitingSide(pb.stoc_waiting_side); handleWaitingSide(pb.stoc_waiting_side);
break; break;
} }
default: { default: {
console.log(packet); console.log(packet);
break; break;
} }
} }
}),
);
} }
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