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