diff --git a/apps/server/src/network/handlers/game/input/registerMoveInputHandler.ts b/apps/server/src/network/handlers/game/input/registerMoveInputHandler.ts new file mode 100644 index 0000000..596a67b --- /dev/null +++ b/apps/server/src/network/handlers/game/input/registerMoveInputHandler.ts @@ -0,0 +1,39 @@ +/** + * registerMoveInputHandler + * MOVE入力イベントの購読とユースケース連携を登録する + */ +import { protocol, type playerTypes } from "@repo/shared"; +import type { + BombPlacementPort, + MovePlayerPort, + ReadyForGamePort, + StartGamePort, +} from "@server/domains/game/application/ports/gameUseCasePorts"; +import { movePlayerUseCase } from "@server/domains/game/application/useCases/movePlayerUseCase"; + +type RegisterMoveInputHandlerParams = { + socketId: string; + gameManager: StartGamePort & ReadyForGamePort & MovePlayerPort & BombPlacementPort; + onEvent: (event: typeof protocol.SocketEvents.MOVE, listener: (payload: unknown) => void) => void; + guardMovePayload: (payload: unknown) => payload is playerTypes.MovePayload; +}; + +/** MOVE入力を検証しプレイヤー移動ユースケースへ連携する */ +export const registerMoveInputHandler = ({ + socketId, + gameManager, + onEvent, + guardMovePayload, +}: RegisterMoveInputHandlerParams): void => { + onEvent(protocol.SocketEvents.MOVE, (data) => { + if (!guardMovePayload(data)) { + return; + } + + movePlayerUseCase({ + gameManager, + playerId: socketId, + move: data, + }); + }); +}; diff --git a/apps/server/src/network/handlers/game/input/registerPlaceBombInputHandler.ts b/apps/server/src/network/handlers/game/input/registerPlaceBombInputHandler.ts new file mode 100644 index 0000000..216018c --- /dev/null +++ b/apps/server/src/network/handlers/game/input/registerPlaceBombInputHandler.ts @@ -0,0 +1,54 @@ +/** + * registerPlaceBombInputHandler + * PLACE_BOMB入力イベントの購読とユースケース連携を登録する + */ +import { protocol, type PlaceBombPayload } from "@repo/shared"; +import type { + BombPlacementPort, + BombOutputPort, + MovePlayerPort, + ReadyForGamePort, + StartGamePort, +} from "@server/domains/game/application/ports/gameUseCasePorts"; +import type { + FindRoomByOwnerPort, + FindRoomByPlayerPort, + RoomPhaseTransitionPort, +} from "@server/domains/room/application/ports/roomUseCasePorts"; +import { placeBombUseCase } from "@server/domains/game/application/useCases/placeBombUseCase"; + +type RegisterPlaceBombInputHandlerParams = { + socketId: string; + gameManager: StartGamePort & ReadyForGamePort & MovePlayerPort & BombPlacementPort; + roomManager: FindRoomByOwnerPort & FindRoomByPlayerPort & RoomPhaseTransitionPort; + output: BombOutputPort; + onEvent: (event: typeof protocol.SocketEvents.PLACE_BOMB, listener: (payload: unknown) => void) => void; + guardPlaceBombPayload: (payload: unknown) => payload is PlaceBombPayload; +}; + +/** PLACE_BOMB入力を検証し,所属ルームへ同期配信する */ +export const registerPlaceBombInputHandler = ({ + socketId, + gameManager, + roomManager, + output, + onEvent, + guardPlaceBombPayload, +}: RegisterPlaceBombInputHandlerParams): void => { + onEvent(protocol.SocketEvents.PLACE_BOMB, (data) => { + if (!guardPlaceBombPayload(data)) { + return; + } + + placeBombUseCase({ + roomResolver: roomManager, + bombStore: gameManager, + input: { + socketId, + payload: data, + nowMs: Date.now(), + }, + output, + }); + }); +}; diff --git a/apps/server/src/network/handlers/game/registerGameHandlers.ts b/apps/server/src/network/handlers/game/registerGameHandlers.ts index 525b6d9..7d3adc5 100644 --- a/apps/server/src/network/handlers/game/registerGameHandlers.ts +++ b/apps/server/src/network/handlers/game/registerGameHandlers.ts @@ -17,13 +17,13 @@ ReadyForGamePort, StartGamePort, } from "@server/domains/game/application/ports/gameUseCasePorts"; -import { movePlayerUseCase } from "@server/domains/game/application/useCases/movePlayerUseCase"; -import { placeBombUseCase } from "@server/domains/game/application/useCases/placeBombUseCase"; import { pingUseCase } from "@server/domains/game/application/useCases/pingUseCase"; import { createCommonHandlerContext } from "@server/network/handlers/CommonHandler"; import { isMovePayload, isPingPayload, isPlaceBombPayload } from "@server/network/validation/socketPayloadValidators"; import { createServerSocketOnBridge } from "@server/network/handlers/socketEventBridge"; import { createPayloadGuard } from "@server/network/handlers/payloadGuard"; +import { registerMoveInputHandler } from "./input/registerMoveInputHandler"; +import { registerPlaceBombInputHandler } from "./input/registerPlaceBombInputHandler"; import { createGameOutputAdapter } from "./createGameOutputAdapter"; /** ゲーム受信イベントごとの入力検証関数を保持するテーブル */ @@ -88,34 +88,19 @@ }); }); - // 移動入力を検証しプレイヤー移動ユースケースへ連携する - onEvent(protocol.SocketEvents.MOVE, (data) => { - if (!guardMovePayload(data)) { - return; - } - - movePlayerUseCase({ - gameManager, - playerId: socket.id, - move: data, - }); + registerMoveInputHandler({ + socketId: socket.id, + gameManager, + onEvent, + guardMovePayload, }); - // 爆弾設置入力を検証し,所属ルームへ同期配信する - onEvent(protocol.SocketEvents.PLACE_BOMB, (data) => { - if (!guardPlaceBombPayload(data)) { - return; - } - - placeBombUseCase({ - roomResolver: roomManager, - bombStore: gameManager, - input: { - socketId: socket.id, - payload: data, - nowMs: Date.now(), - }, - output: gameOutputAdapter, - }); + registerPlaceBombInputHandler({ + socketId: socket.id, + gameManager, + roomManager, + output: gameOutputAdapter, + onEvent, + guardPlaceBombPayload, }); };