diff --git a/apps/server/src/application/coordinators/disconnectCoordinator.ts b/apps/server/src/application/coordinators/disconnectCoordinator.ts index c76880a..f6c899f 100644 --- a/apps/server/src/application/coordinators/disconnectCoordinator.ts +++ b/apps/server/src/application/coordinators/disconnectCoordinator.ts @@ -19,7 +19,8 @@ /** 切断調停で利用する入力ポートと出力ポートの契約 */ export type DisconnectCoordinatorParams = { socketId: string; - gameManager: DisconnectPlayerPort & BombCleanupPort; + gameManager: DisconnectPlayerPort; + bombState: BombCleanupPort; roomManager: DisconnectRoomPort & FindRoomByPlayerPort & FindRoomByIdPort; gameOutput: Pick; roomOutput: Pick; @@ -29,6 +30,7 @@ export const disconnectCoordinator = ({ socketId, gameManager, + bombState, roomManager, gameOutput, roomOutput, @@ -49,6 +51,6 @@ }); if (roomId && !roomManager.getRoomById(roomId)) { - gameManager.clearBombRoomState(roomId, "room-deleted"); + bombState.clearBombRoomState(roomId, "room-deleted"); } }; diff --git a/apps/server/src/application/coordinators/startGameCoordinator.ts b/apps/server/src/application/coordinators/startGameCoordinator.ts index 57e5cd1..049dd23 100644 --- a/apps/server/src/application/coordinators/startGameCoordinator.ts +++ b/apps/server/src/application/coordinators/startGameCoordinator.ts @@ -18,7 +18,8 @@ type StartGameCoordinatorParams = { ownerId: string; - gameManager: StartGamePort & BombCleanupPort; + gameManager: StartGamePort; + bombState: BombCleanupPort; roomManager: FindRoomByOwnerPort & RoomPhaseTransitionPort; output: Pick< GameOutputPort, @@ -34,6 +35,7 @@ export const startGameCoordinator = ({ ownerId, gameManager, + bombState, roomManager, output, }: StartGameCoordinatorParams) => { @@ -84,7 +86,7 @@ gameManager, onGameEnd: () => { roomManager.markRoomWaiting(updatedRoom.roomId); - gameManager.clearBombRoomState(updatedRoom.roomId, "game-ended"); + bombState.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 3f86bcf..389f85c 100644 --- a/apps/server/src/domains/game/GameManager.ts +++ b/apps/server/src/domains/game/GameManager.ts @@ -3,10 +3,6 @@ * ゲームセッション集合の生成,更新,参照管理を統括する */ import type { gameTypes, GameResultPayload } from "@repo/shared"; -import { - BombRoomStateClearReason, - BombRoomStateStore, -} from "./entities/bomb/BombRoomStateStore"; import { Player } from "./entities/player/Player.js"; import { GameRoomSession } from "./application/services/GameRoomSession"; import { GameSessionLifecycleService } from "./application/services/GameSessionLifecycleService"; @@ -20,7 +16,6 @@ private roomToPlayers: Map>; private lifecycleService: GameSessionLifecycleService; private playerOperationService: GamePlayerOperationService; - private bombRoomStateStore: BombRoomStateStore; constructor() { this.sessions = new Map(); @@ -28,7 +23,6 @@ this.roomToPlayers = new Map(); this.lifecycleService = new GameSessionLifecycleService(this.sessions, this.playerToRoom, this.roomToPlayers); this.playerOperationService = new GamePlayerOperationService(this.sessions, this.playerToRoom, this.roomToPlayers); - this.bombRoomStateStore = new BombRoomStateStore(); } // 外部(GameHandlerなど)から開始時刻を取得できるようにする @@ -65,19 +59,4 @@ getRoomPlayers(roomId: string): Player[] { return this.lifecycleService.getRoomPlayers(roomId); } - - // 爆弾設置イベントを配信すべきか判定し,配信時は重複排除状態を更新する - shouldBroadcastBombPlaced(roomId: string, dedupeKey: string, nowMs: number): boolean { - return this.bombRoomStateStore.shouldBroadcastBombPlaced(roomId, dedupeKey, nowMs); - } - - // ルーム単位の連番からサーバー採番の爆弾IDを生成する - issueServerBombId(roomId: string): string { - return this.bombRoomStateStore.issueServerBombId(roomId); - } - - // 指定ルームの爆弾採番状態と重複排除状態を破棄する - clearBombRoomState(roomId: string, reason: BombRoomStateClearReason): void { - this.bombRoomStateStore.clearBombRoomState(roomId, reason); - } } \ No newline at end of file diff --git a/apps/server/src/network/SocketManager.ts b/apps/server/src/network/SocketManager.ts index 279a30c..6ba5c30 100644 --- a/apps/server/src/network/SocketManager.ts +++ b/apps/server/src/network/SocketManager.ts @@ -4,6 +4,7 @@ */ import { Server } from "socket.io"; import type { + SocketConnectionBombPort, SocketConnectionManagerBundle, SocketConnectionGamePort, SocketConnectionRoomPort, @@ -18,11 +19,13 @@ constructor( io: Server, gameManager: SocketConnectionGamePort, + bombState: SocketConnectionBombPort, roomManager: SocketConnectionRoomPort ) { this.io = io; this.managers = { gameManager, + bombState, roomManager, }; } diff --git a/apps/server/src/network/bootstrap/boot.ts b/apps/server/src/network/bootstrap/boot.ts index 29ba1ff..414e6eb 100644 --- a/apps/server/src/network/bootstrap/boot.ts +++ b/apps/server/src/network/bootstrap/boot.ts @@ -4,6 +4,7 @@ */ import type { Server as HttpServer } from "http"; import { GameManager } from "@server/domains/game/GameManager"; +import { BombRoomStateStore } from "@server/domains/game/entities/bomb/BombRoomStateStore"; import { RoomManager } from "@server/domains/room/RoomManager"; import { SocketManager } from "../SocketManager"; import { createIo } from "./createIo"; @@ -13,8 +14,9 @@ // ネットワーク層とドメイン層の依存を構築する const io = createIo(httpServer); const gameManager = new GameManager(); + const bombState = new BombRoomStateStore(); const roomManager = new RoomManager(); - const socketManager = new SocketManager(io, gameManager, roomManager); + const socketManager = new SocketManager(io, gameManager, bombState, roomManager); socketManager.initialize(); }; diff --git a/apps/server/src/network/handlers/game/registerGameHandlers.ts b/apps/server/src/network/handlers/game/registerGameHandlers.ts index 68b0ed9..d1e0fa6 100644 --- a/apps/server/src/network/handlers/game/registerGameHandlers.ts +++ b/apps/server/src/network/handlers/game/registerGameHandlers.ts @@ -12,7 +12,8 @@ RoomPhaseTransitionPort, } from "@server/domains/room/application/ports/roomUseCasePorts"; import type { - BombStatePort, + BombPlacementPort, + BombCleanupPort, MovePlayerPort, ReadyForGamePort, StartGamePort, @@ -37,7 +38,8 @@ export const registerGameHandlers = ( io: Server, socket: Socket, - gameManager: StartGamePort & ReadyForGamePort & MovePlayerPort & BombStatePort, + gameManager: StartGamePort & ReadyForGamePort & MovePlayerPort, + bombState: BombPlacementPort & BombCleanupPort, roomManager: FindRoomByOwnerPort & FindRoomByPlayerPort & RoomPhaseTransitionPort ) => { const common = createCommonHandlerContext(io, socket); @@ -73,6 +75,7 @@ startGameCoordinator({ ownerId: socket.id, gameManager, + bombState, roomManager, output: gameOutputAdapter, }); @@ -109,7 +112,7 @@ placeBombUseCase({ roomResolver: roomManager, - bombStore: gameManager, + bombStore: bombState, 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 66850a8..5701b69 100644 --- a/apps/server/src/network/handlers/registerConnectionHandlers.ts +++ b/apps/server/src/network/handlers/registerConnectionHandlers.ts @@ -19,6 +19,7 @@ export const registerConnectionHandlers = ({ io, gameManager, + bombState, roomManager, }: RegisterConnectionHandlersParams) => { const gameDisconnectOutputAdapter = createGameDisconnectOutputAdapter(io); @@ -33,7 +34,7 @@ }); registerRoomHandlers(io, socket, roomManager); - registerGameHandlers(io, socket, gameManager, roomManager); + registerGameHandlers(io, socket, gameManager, bombState, roomManager); socket.on(protocol.SocketEvents.DISCONNECT, () => { // 切断ログ記録後にドメイン別の後処理を実行する @@ -46,6 +47,7 @@ disconnectCoordinator({ socketId: socket.id, gameManager, + bombState, roomManager, gameOutput: gameDisconnectOutputAdapter, roomOutput: roomDisconnectOutputAdapter, diff --git a/apps/server/src/network/types/connectionPorts.ts b/apps/server/src/network/types/connectionPorts.ts index 7a1696a..7e872b7 100644 --- a/apps/server/src/network/types/connectionPorts.ts +++ b/apps/server/src/network/types/connectionPorts.ts @@ -4,12 +4,12 @@ */ import type { Server } from "socket.io"; import type { - BombStatePort, DisconnectPlayerPort, MovePlayerPort, ReadyForGamePort, StartGamePort, } from "@server/domains/game/application/ports/gameUseCasePorts"; +import type { BombStatePort } from "@server/domains/game/application/ports/gameUseCasePorts"; import type { DisconnectRoomPort, FindRoomByOwnerPort, @@ -24,8 +24,7 @@ export type ConnectionGamePort = & StartGamePort & ReadyForGamePort - & MovePlayerPort - & BombStatePort; + & MovePlayerPort; /** 接続時のルーム処理で利用する入力ポート集合 */ export type ConnectionRoomPort = @@ -39,6 +38,9 @@ & ConnectionGamePort & DisconnectPlayerPort; +/** ソケット接続全体で利用する爆弾状態ポート集合 */ +export type SocketConnectionBombPort = BombStatePort; + /** ソケット接続全体で利用するルーム管理ポート集合 */ export type SocketConnectionRoomPort = & ConnectionRoomPort @@ -48,6 +50,7 @@ /** ソケット接続ハンドラで受け取るマネージャ依存の束 */ export type SocketConnectionManagerBundle = { gameManager: SocketConnectionGamePort; + bombState: SocketConnectionBombPort; roomManager: SocketConnectionRoomPort; };