From 0bf68d4e4927125da2941343962f17027f8d45b6 Mon Sep 17 00:00:00 2001 From: wsy182 <2392948297@qq.com> Date: Fri, 3 Apr 2026 20:48:31 +0800 Subject: [PATCH] =?UTF-8?q?feat(chengdu):=20=E6=B7=BB=E5=8A=A0socket?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E8=A7=A3=E6=9E=90=E5=92=8C=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建SocketEnvelope接口和parseSocketEnvelope函数用于解析socket消息 - 实现createSocketMessageRouter函数用于创建消息路由器 - 配置多种消息类型的路由映射关系 - 支持房间、玩家、回合和状态相关的消息处理 - 提供统一的消息分发机制给相应的处理器 --- .../chengdu/socket/parsers/socketEnvelope.ts | 20 ++++++++++ .../socket/router/socketMessageRouter.ts | 38 +++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 src/views/chengdu/socket/parsers/socketEnvelope.ts create mode 100644 src/views/chengdu/socket/router/socketMessageRouter.ts diff --git a/src/views/chengdu/socket/parsers/socketEnvelope.ts b/src/views/chengdu/socket/parsers/socketEnvelope.ts new file mode 100644 index 0000000..4d58a23 --- /dev/null +++ b/src/views/chengdu/socket/parsers/socketEnvelope.ts @@ -0,0 +1,20 @@ +import { asRecord, normalizeWsType } from '../../../../game/chengdu/messageNormalizers' + +export interface SocketEnvelope { + raw: unknown + source: Record + normalizedType: string +} + +export function parseSocketEnvelope(message: unknown): SocketEnvelope | null { + const source = asRecord(message) + if (!source || typeof source.type !== 'string') { + return null + } + + return { + raw: message, + source, + normalizedType: normalizeWsType(source.type), + } +} diff --git a/src/views/chengdu/socket/router/socketMessageRouter.ts b/src/views/chengdu/socket/router/socketMessageRouter.ts new file mode 100644 index 0000000..e64360d --- /dev/null +++ b/src/views/chengdu/socket/router/socketMessageRouter.ts @@ -0,0 +1,38 @@ +import type { PlayerHandlerApi, RoomHandlerApi, StatusHandlerApi, TurnHandlerApi } from '../types' + +interface SocketMessageRouterDeps { + roomHandlers: RoomHandlerApi + playerHandlers: PlayerHandlerApi + turnHandlers: TurnHandlerApi + statusHandlers: StatusHandlerApi +} + +type SocketRouteHandler = (message: unknown) => void + +export function createSocketMessageRouter(deps: SocketMessageRouterDeps) { + const routes = new Map([ + ['GET_ROOM_INFO', [deps.roomHandlers.handleRoomInfoResponse]], + ['ROOM_INFO', [deps.roomHandlers.handleRoomInfoResponse]], + ['ROOM_STATE', [deps.roomHandlers.handleRoomStateResponse]], + ['PLAYER_HAND', [deps.playerHandlers.handlePlayerHandResponse]], + ['PLAYER_TURN', [deps.turnHandlers.handlePlayerTurn]], + ['NEXT_TURN', [deps.turnHandlers.handlePlayerTurn]], + ['ACTION_ERROR', [deps.statusHandlers.handleActionError]], + ['DING_QUE_COUNTDOWN', [deps.turnHandlers.handleDingQueCountdown]], + ['PLAYER_READY', [deps.playerHandlers.handleReadyStateResponse]], + ['PLAYER_DING_QUE', [deps.playerHandlers.handlePlayerDingQueResponse]], + ]) + + function route(normalizedType: string, message: unknown): void { + const handlers = routes.get(normalizedType) + if (!handlers) { + return + } + + handlers.forEach((handler) => handler(message)) + } + + return { + route, + } +}