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_ALLOW_ACTION', [deps.turnHandlers.handlePlayerAllowAction]], ['PLAYER_TURN', [deps.turnHandlers.handlePlayerTurn]], ['NEXT_TURN', [deps.turnHandlers.handlePlayerTurn]], ['ACTION_ACK', [deps.statusHandlers.handleActionAck]], ['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, } }