feat(chengdu): 添加socket消息解析和路由功能
- 创建SocketEnvelope接口和parseSocketEnvelope函数用于解析socket消息 - 实现createSocketMessageRouter函数用于创建消息路由器 - 配置多种消息类型的路由映射关系 - 支持房间、玩家、回合和状态相关的消息处理 - 提供统一的消息分发机制给相应的处理器
This commit is contained in:
20
src/views/chengdu/socket/parsers/socketEnvelope.ts
Normal file
20
src/views/chengdu/socket/parsers/socketEnvelope.ts
Normal 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),
|
||||
}
|
||||
}
|
||||
38
src/views/chengdu/socket/router/socketMessageRouter.ts
Normal file
38
src/views/chengdu/socket/router/socketMessageRouter.ts
Normal 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,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user