diff --git a/apps/server/src/network/handlers/game/registerGameHandlers.ts b/apps/server/src/network/handlers/game/registerGameHandlers.ts index 8b6ada2..302daf7 100644 --- a/apps/server/src/network/handlers/game/registerGameHandlers.ts +++ b/apps/server/src/network/handlers/game/registerGameHandlers.ts @@ -4,6 +4,7 @@ */ import { Server, Socket } from "socket.io"; import { protocol } from "@repo/shared"; +import type { PayloadOf, SocketPayloadMap } from "@repo/shared"; import { readyForGameCoordinator } from "@server/application/coordinators/readyForGameCoordinator"; import { startGameCoordinator } from "@server/application/coordinators/startGameCoordinator"; import type { @@ -20,6 +21,8 @@ import { isMovePayload, isPingPayload } from "@server/network/validation/socketPayloadValidators"; import { createGameOutputAdapter } from "./createGameOutputAdapter"; +type SocketEventName = Exclude; + /** ゲームイベントの購読とユースケース呼び出しを設定する */ export const registerGameHandlers = ( io: Server, @@ -30,8 +33,15 @@ const common = createCommonHandlerContext(io, socket); const gameOutputAdapter = createGameOutputAdapter(common); + const onEvent = ( + event: TEvent, + callback: (payload: PayloadOf) => void + ) => { + (socket as any).on(event, callback); + }; + // 遅延計測用のPINGを検証しPONGを返す - socket.on(protocol.SocketEvents.PING, (clientTime: unknown) => { + onEvent(protocol.SocketEvents.PING, (clientTime) => { if (!isPingPayload(clientTime)) { logEvent("Network", { event: "PING", @@ -48,7 +58,7 @@ }); // オーナー開始要求に応じてゲーム進行ユースケースを起動する - socket.on(protocol.SocketEvents.START_GAME, () => { + onEvent(protocol.SocketEvents.START_GAME, () => { startGameCoordinator({ ownerId: socket.id, gameManager, @@ -58,7 +68,7 @@ }); // 参加者の準備完了通知を受けて現在状態を返す - socket.on(protocol.SocketEvents.READY_FOR_GAME, () => { + onEvent(protocol.SocketEvents.READY_FOR_GAME, () => { readyForGameCoordinator({ socketId: socket.id, gameManager, @@ -68,7 +78,7 @@ }); // 移動入力を検証しプレイヤー移動ユースケースへ連携する - socket.on(protocol.SocketEvents.MOVE, (data: unknown) => { + onEvent(protocol.SocketEvents.MOVE, (data) => { if (!isMovePayload(data)) { logEvent("Network", { event: "MOVE", diff --git a/apps/server/src/network/handlers/room/registerRoomHandlers.ts b/apps/server/src/network/handlers/room/registerRoomHandlers.ts index c4b42b9..459305c 100644 --- a/apps/server/src/network/handlers/room/registerRoomHandlers.ts +++ b/apps/server/src/network/handlers/room/registerRoomHandlers.ts @@ -4,6 +4,7 @@ */ import { Server, Socket } from "socket.io"; import { protocol } from "@repo/shared"; +import type { PayloadOf, SocketPayloadMap } from "@repo/shared"; import type { JoinRoomPort } from "@server/domains/room/application/ports/roomUseCasePorts"; import { joinRoomUseCase } from "@server/domains/room/application/useCases/joinRoomUseCase"; import { logEvent } from "@server/logging/logEvent"; @@ -11,6 +12,8 @@ import { isJoinRoomPayload } from "@server/network/validation/socketPayloadValidators"; import { createRoomOutputAdapter } from "./createRoomOutputAdapter"; +type SocketEventName = Exclude; + /** ルーム参加イベントを検証して参加ユースケースへ連携する */ export const registerRoomHandlers = ( io: Server, @@ -20,8 +23,15 @@ const common = createCommonHandlerContext(io, socket); const roomOutputAdapter = createRoomOutputAdapter(common); + const onEvent = ( + event: TEvent, + callback: (payload: PayloadOf) => void + ) => { + (socket as any).on(event, callback); + }; + // 参加要求のペイロード検証と参加処理を実行する - socket.on(protocol.SocketEvents.JOIN_ROOM, async (data: unknown) => { + onEvent(protocol.SocketEvents.JOIN_ROOM, async (data) => { if (!isJoinRoomPayload(data)) { logEvent("Network", { event: "JOIN_ROOM",