feat(chengdu): 添加socket消息解析和路由功能

- 创建SocketEnvelope接口和parseSocketEnvelope函数用于解析socket消息
- 实现createSocketMessageRouter函数用于创建消息路由器
- 配置多种消息类型的路由映射关系
- 支持房间、玩家、回合和状态相关的消息处理
- 提供统一的消息分发机制给相应的处理器
This commit is contained in:
2026-04-03 20:48:31 +08:00
parent e96c45739e
commit 0bf68d4e49
2 changed files with 58 additions and 0 deletions

View File

@@ -0,0 +1,20 @@
import { asRecord, normalizeWsType } from '../../../../game/chengdu/messageNormalizers'
export interface SocketEnvelope {
raw: unknown
source: Record<string, unknown>
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),
}
}

View File

@@ -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<string, SocketRouteHandler[]>([
['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,
}
}