diff --git a/apps/server/src/application/coordinators/disconnectCoordinator.ts b/apps/server/src/application/coordinators/disconnectCoordinator.ts index 8f0d0ce..52acd07 100644 --- a/apps/server/src/application/coordinators/disconnectCoordinator.ts +++ b/apps/server/src/application/coordinators/disconnectCoordinator.ts @@ -19,9 +19,8 @@ /** 切断調停で利用する入力ポートと出力ポートの契約 */ export type DisconnectCoordinatorParams = { socketId: string; - gameManager: DisconnectPlayerPort; + gameManager: DisconnectPlayerPort & BombRoomStateCleanupPort; roomManager: DisconnectRoomPort & FindRoomByPlayerPort & FindRoomByIdPort; - bombStateStore: BombRoomStateCleanupPort; gameOutput: Pick; roomOutput: Pick; }; @@ -31,7 +30,6 @@ socketId, gameManager, roomManager, - bombStateStore, gameOutput, roomOutput, }: DisconnectCoordinatorParams) => { @@ -51,6 +49,6 @@ }); if (roomId && !roomManager.getRoomById(roomId)) { - bombStateStore.clearBombRoomState(roomId, "room-deleted"); + gameManager.clearBombRoomState(roomId, "room-deleted"); } }; diff --git a/apps/server/src/application/coordinators/startGameCoordinator.ts b/apps/server/src/application/coordinators/startGameCoordinator.ts index c1f9bfa..d96240a 100644 --- a/apps/server/src/application/coordinators/startGameCoordinator.ts +++ b/apps/server/src/application/coordinators/startGameCoordinator.ts @@ -15,9 +15,8 @@ type StartGameCoordinatorParams = { ownerId: string; - gameManager: StartGamePort; + gameManager: StartGamePort & BombRoomStateCleanupPort; roomManager: StartGameRoomPort; - bombStateStore: BombRoomStateCleanupPort; output: Pick< GameOutputPort, | "publishUpdatePlayersToRoom" @@ -33,7 +32,6 @@ ownerId, gameManager, roomManager, - bombStateStore, output, }: StartGameCoordinatorParams) => { const room = roomManager.getRoomByOwnerId(ownerId); @@ -83,7 +81,7 @@ gameManager, onGameEnd: () => { roomManager.markRoomWaiting(updatedRoom.roomId); - bombStateStore.clearBombRoomState(updatedRoom.roomId, "game-ended"); + gameManager.clearBombRoomState(updatedRoom.roomId, "game-ended"); }, output, }); diff --git a/apps/server/src/domains/game/GameManager.ts b/apps/server/src/domains/game/GameManager.ts index 389f85c..4a4bdd4 100644 --- a/apps/server/src/domains/game/GameManager.ts +++ b/apps/server/src/domains/game/GameManager.ts @@ -3,6 +3,11 @@ * ゲームセッション集合の生成,更新,参照管理を統括する */ import type { gameTypes, GameResultPayload } from "@repo/shared"; +import { + clearBombRoomState, + issueServerBombId, + shouldBroadcastBombPlaced, +} from "./entities/bomb/BombRoomStateStore"; import { Player } from "./entities/player/Player.js"; import { GameRoomSession } from "./application/services/GameRoomSession"; import { GameSessionLifecycleService } from "./application/services/GameSessionLifecycleService"; @@ -59,4 +64,19 @@ getRoomPlayers(roomId: string): Player[] { return this.lifecycleService.getRoomPlayers(roomId); } + + // 爆弾設置イベントを配信すべきか判定し,配信時は重複排除状態を更新する + shouldBroadcastBombPlaced(roomId: string, dedupeKey: string, nowMs: number): boolean { + return shouldBroadcastBombPlaced(roomId, dedupeKey, nowMs); + } + + // ルーム単位の連番からサーバー採番の爆弾IDを生成する + issueServerBombId(roomId: string): string { + return issueServerBombId(roomId); + } + + // 指定ルームの爆弾採番状態と重複排除状態を破棄する + clearBombRoomState(roomId: string, reason: "game-ended" | "room-deleted"): void { + clearBombRoomState(roomId, reason); + } } \ No newline at end of file diff --git a/apps/server/src/network/handlers/game/createBombRoomStateStoreAdapter.ts b/apps/server/src/network/handlers/game/createBombRoomStateStoreAdapter.ts deleted file mode 100644 index 0d5215b..0000000 --- a/apps/server/src/network/handlers/game/createBombRoomStateStoreAdapter.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * createBombRoomStateStoreAdapter - * 爆弾状態ストア実装をネットワーク層向けの入力ポートへ変換する - */ -import type { BombRoomStateStorePort } from "@server/domains/game/application/ports/gameUseCasePorts"; -import { - clearBombRoomState, - issueServerBombId, - shouldBroadcastBombPlaced, -} from "@server/domains/game/entities/bomb/BombRoomStateStore"; - -/** 爆弾状態ストア入力ポートの実装を生成する */ -export const createBombRoomStateStoreAdapter = (): BombRoomStateStorePort => { - return { - clearBombRoomState, - issueServerBombId, - shouldBroadcastBombPlaced, - }; -}; diff --git a/apps/server/src/network/handlers/game/registerGameHandlers.ts b/apps/server/src/network/handlers/game/registerGameHandlers.ts index 37352c6..ad9a157 100644 --- a/apps/server/src/network/handlers/game/registerGameHandlers.ts +++ b/apps/server/src/network/handlers/game/registerGameHandlers.ts @@ -35,9 +35,8 @@ export const registerGameHandlers = ( io: Server, socket: Socket, - gameManager: StartGamePort & ReadyForGamePort & MovePlayerPort, - roomManager: StartGameRoomPort & ReadyForGameRoomPort & PlaceBombRoomPort, - bombStateStore: BombRoomStateStorePort + gameManager: StartGamePort & ReadyForGamePort & MovePlayerPort & BombRoomStateStorePort, + roomManager: StartGameRoomPort & ReadyForGameRoomPort & PlaceBombRoomPort ) => { const common = createCommonHandlerContext(io, socket); const gameOutputAdapter = createGameOutputAdapter(common); @@ -73,7 +72,6 @@ ownerId: socket.id, gameManager, roomManager, - bombStateStore, output: gameOutputAdapter, }); }); @@ -109,7 +107,7 @@ placeBombUseCase({ roomResolver: roomManager, - bombStore: bombStateStore, + bombStore: gameManager, input: { socketId: socket.id, payload: data, diff --git a/apps/server/src/network/handlers/registerConnectionHandlers.ts b/apps/server/src/network/handlers/registerConnectionHandlers.ts index 7c2466a..66850a8 100644 --- a/apps/server/src/network/handlers/registerConnectionHandlers.ts +++ b/apps/server/src/network/handlers/registerConnectionHandlers.ts @@ -9,7 +9,6 @@ import { logResults, logScopes } from "@server/logging/index"; import { registerGameHandlers } from "./GameHandler"; import { registerRoomHandlers } from "./RoomHandler"; -import { createBombRoomStateStoreAdapter } from "./game/createBombRoomStateStoreAdapter"; import { createGameDisconnectOutputAdapter } from "./game/createGameOutputAdapter"; import { createRoomDisconnectOutputAdapter } from "./room/createRoomOutputAdapter"; import type { @@ -24,7 +23,6 @@ }: RegisterConnectionHandlersParams) => { const gameDisconnectOutputAdapter = createGameDisconnectOutputAdapter(io); const roomDisconnectOutputAdapter = createRoomDisconnectOutputAdapter(io); - const bombStateStoreAdapter = createBombRoomStateStoreAdapter(); io.on(protocol.SocketEvents.CONNECT, (socket: Socket) => { // 接続ログを記録してドメイン別ハンドラを登録する @@ -35,7 +33,7 @@ }); registerRoomHandlers(io, socket, roomManager); - registerGameHandlers(io, socket, gameManager, roomManager, bombStateStoreAdapter); + registerGameHandlers(io, socket, gameManager, roomManager); socket.on(protocol.SocketEvents.DISCONNECT, () => { // 切断ログ記録後にドメイン別の後処理を実行する @@ -49,7 +47,6 @@ socketId: socket.id, gameManager, roomManager, - bombStateStore: bombStateStoreAdapter, gameOutput: gameDisconnectOutputAdapter, roomOutput: roomDisconnectOutputAdapter, }); diff --git a/apps/server/src/network/types/connectionPorts.ts b/apps/server/src/network/types/connectionPorts.ts index 6624da9..0ddfd48 100644 --- a/apps/server/src/network/types/connectionPorts.ts +++ b/apps/server/src/network/types/connectionPorts.ts @@ -4,6 +4,7 @@ */ import type { Server } from "socket.io"; import type { + BombRoomStateStorePort, DisconnectPlayerPort, MovePlayerPort, ReadyForGamePort, @@ -23,7 +24,8 @@ export type ConnectionGamePort = & StartGamePort & ReadyForGamePort - & MovePlayerPort; + & MovePlayerPort + & BombRoomStateStorePort; /** 接続時のルーム処理で利用する入力ポート集合 */ export type ConnectionRoomPort =