diff --git a/apps/server/src/application/coordinators/disconnectCoordinator.ts b/apps/server/src/application/coordinators/disconnectCoordinator.ts index 8075b48..dcb2d76 100644 --- a/apps/server/src/application/coordinators/disconnectCoordinator.ts +++ b/apps/server/src/application/coordinators/disconnectCoordinator.ts @@ -6,15 +6,16 @@ type DisconnectPlayerPort, type GameOutputPort, } from "@server/domains/game/application/ports/gameUseCasePorts"; -import { disconnectUseCase } from "@server/domains/game/application/useCases/disconnectUseCase"; import type { DisconnectRoomPort, FindRoomByPlayerPort, RoomOutputPort, } from "@server/domains/room/application/ports/roomUseCasePorts"; +import { disconnectUseCase } from "@server/domains/game/application/useCases/disconnectUseCase"; import { roomDisconnectUseCase } from "@server/domains/room/application/useCases/roomDisconnectUseCase"; -type DisconnectCoordinatorParams = { +/** 切断調停で利用する入力ポートと出力ポートの契約 */ +export type DisconnectCoordinatorParams = { socketId: string; gameManager: DisconnectPlayerPort; roomManager: DisconnectRoomPort & FindRoomByPlayerPort; diff --git a/apps/server/src/application/coordinators/startGameCoordinator.ts b/apps/server/src/application/coordinators/startGameCoordinator.ts index ea2e09b..87220ce 100644 --- a/apps/server/src/application/coordinators/startGameCoordinator.ts +++ b/apps/server/src/application/coordinators/startGameCoordinator.ts @@ -2,7 +2,6 @@ * startGameCoordinator * START_GAMEイベントの調停を行い,ルーム状態更新とゲーム開始処理を橋渡しする */ -import { roomConsts } from "@repo/shared"; import { type GameOutputPort, type StartGamePort, @@ -10,6 +9,7 @@ } from "@server/domains/game/application/ports/gameUseCasePorts"; import { startGameUseCase } from "@server/domains/game/application/useCases/startGameUseCase"; import { logEvent } from "@server/logging/logEvent"; +import { roomConsts } from "@repo/shared"; type StartGameCoordinatorParams = { ownerId: string; diff --git a/apps/server/src/domains/game/entities/map/MapStore.ts b/apps/server/src/domains/game/entities/map/MapStore.ts index 3880749..cd244c9 100644 --- a/apps/server/src/domains/game/entities/map/MapStore.ts +++ b/apps/server/src/domains/game/entities/map/MapStore.ts @@ -21,7 +21,7 @@ } /** - * マスを塗り、色が変化した場合のみ差分キューに追加する + * マスを塗り,色が変化した場合のみ差分キューに追加する */ public paintCell(index: number, teamId: number): void { paintCellIfChanged({ @@ -33,7 +33,7 @@ } /** - * 溜まっている差分を取得し、キューをクリアする(ループ送信時に使用) + * 溜まっている差分を取得し,キューをクリアする(ループ送信時に使用) */ public getAndClearUpdates(): gridMapTypes.CellUpdate[] { return drainPendingUpdates(this.pendingUpdates); diff --git a/apps/server/src/network/SocketManager.ts b/apps/server/src/network/SocketManager.ts index 39372ed..279a30c 100644 --- a/apps/server/src/network/SocketManager.ts +++ b/apps/server/src/network/SocketManager.ts @@ -3,28 +3,35 @@ * Socket.IO接続ハンドラの登録を初期化するマネージャ */ import { Server } from "socket.io"; -import { GameManager } from "@server/domains/game/GameManager"; -import { RoomManager } from "@server/domains/room/RoomManager"; +import type { + SocketConnectionManagerBundle, + SocketConnectionGamePort, + SocketConnectionRoomPort, +} from "./types/connectionPorts"; import { registerConnectionHandlers } from "./handlers/registerConnectionHandlers"; /** Socket.IOの接続ハンドラ登録を統括する */ export class SocketManager { private io: Server; - private gameManager: GameManager; - private roomManager: RoomManager; + private managers: SocketConnectionManagerBundle; - constructor(io: Server, gameManager: GameManager, roomManager: RoomManager) { + constructor( + io: Server, + gameManager: SocketConnectionGamePort, + roomManager: SocketConnectionRoomPort + ) { this.io = io; - this.gameManager = gameManager; - this.roomManager = roomManager; + this.managers = { + gameManager, + roomManager, + }; } public initialize() { // 接続時に必要な各ドメインハンドラを登録する registerConnectionHandlers({ io: this.io, - gameManager: this.gameManager, - roomManager: this.roomManager, + ...this.managers, }); } } \ No newline at end of file diff --git a/apps/server/src/network/handlers/game/createGameOutputAdapter.ts b/apps/server/src/network/handlers/game/createGameOutputAdapter.ts index 3af44f2..98d1c63 100644 --- a/apps/server/src/network/handlers/game/createGameOutputAdapter.ts +++ b/apps/server/src/network/handlers/game/createGameOutputAdapter.ts @@ -5,8 +5,8 @@ import { Server } from "socket.io"; import { protocol } from "@repo/shared"; import type { gridMapTypes, playerTypes, roomTypes } from "@repo/shared"; -import { createEmitToRoom } from "@server/network/adapters/socketEmitters"; import type { GameOutputPort } from "@server/domains/game/application/ports/gameUseCasePorts"; +import { createEmitToRoom } from "@server/network/adapters/socketEmitters"; import type { CommonHandlerContext } from "../CommonHandler"; type RoomId = roomTypes.Room["roomId"]; diff --git a/apps/server/src/network/handlers/game/registerGameHandlers.ts b/apps/server/src/network/handlers/game/registerGameHandlers.ts index 9646d31..8b6ada2 100644 --- a/apps/server/src/network/handlers/game/registerGameHandlers.ts +++ b/apps/server/src/network/handlers/game/registerGameHandlers.ts @@ -3,22 +3,22 @@ * ゲーム関連イベントの受信ハンドラを登録する */ import { Server, Socket } from "socket.io"; +import { protocol } from "@repo/shared"; +import { readyForGameCoordinator } from "@server/application/coordinators/readyForGameCoordinator"; +import { startGameCoordinator } from "@server/application/coordinators/startGameCoordinator"; import type { MovePlayerPort, ReadyForGamePort, - StartGamePort, ReadyForGameRoomPort, + StartGamePort, StartGameRoomPort, } from "@server/domains/game/application/ports/gameUseCasePorts"; -import { protocol } from "@repo/shared"; -import { pingUseCase } from "@server/domains/game/application/useCases/pingUseCase"; import { movePlayerUseCase } from "@server/domains/game/application/useCases/movePlayerUseCase"; -import { createCommonHandlerContext } from "@server/network/handlers/CommonHandler"; -import { createGameOutputAdapter } from "./createGameOutputAdapter"; +import { pingUseCase } from "@server/domains/game/application/useCases/pingUseCase"; import { logEvent } from "@server/logging/logEvent"; +import { createCommonHandlerContext } from "@server/network/handlers/CommonHandler"; import { isMovePayload, isPingPayload } from "@server/network/validation/socketPayloadValidators"; -import { startGameCoordinator } from "@server/application/coordinators/startGameCoordinator"; -import { readyForGameCoordinator } from "@server/application/coordinators/readyForGameCoordinator"; +import { createGameOutputAdapter } from "./createGameOutputAdapter"; /** ゲームイベントの購読とユースケース呼び出しを設定する */ export const registerGameHandlers = ( diff --git a/apps/server/src/network/handlers/registerConnectionHandlers.ts b/apps/server/src/network/handlers/registerConnectionHandlers.ts index 9731a4c..fc7fad4 100644 --- a/apps/server/src/network/handlers/registerConnectionHandlers.ts +++ b/apps/server/src/network/handlers/registerConnectionHandlers.ts @@ -3,46 +3,21 @@ * 接続時にルームとゲームの各ハンドラを登録する */ import { Server, Socket } from "socket.io"; -import type { - DisconnectPlayerPort, - MovePlayerPort, - ReadyForGamePort, - ReadyForGameRoomPort, - StartGamePort, - StartGameRoomPort, -} from "@server/domains/game/application/ports/gameUseCasePorts"; -import type { - DisconnectRoomPort, - FindRoomByPlayerPort, - JoinRoomPort, -} from "@server/domains/room/application/ports/roomUseCasePorts"; import { protocol } from "@repo/shared"; -import { registerRoomHandlers } from "./RoomHandler"; -import { registerGameHandlers } from "./GameHandler"; -import { logEvent } from "@server/logging/logEvent"; import { disconnectCoordinator } from "@server/application/coordinators/disconnectCoordinator"; +import { logEvent } from "@server/logging/logEvent"; +import { registerGameHandlers } from "./GameHandler"; +import { registerRoomHandlers } from "./RoomHandler"; import { createGameDisconnectOutputAdapter } from "./game/createGameOutputAdapter"; import { createRoomDisconnectOutputAdapter } from "./room/createRoomOutputAdapter"; - -type ConnectionGamePort = - & StartGamePort - & ReadyForGamePort - & MovePlayerPort; - -type DisconnectGamePort = DisconnectPlayerPort; - -type ConnectionRoomPort = - & JoinRoomPort - & StartGameRoomPort - & ReadyForGameRoomPort; - -type DisconnectRoomHandlerPort = DisconnectRoomPort & FindRoomByPlayerPort; - -type RegisterConnectionHandlersParams = { - io: Server; - gameManager: ConnectionGamePort & DisconnectGamePort; - roomManager: ConnectionRoomPort & DisconnectRoomHandlerPort; -}; +import type { + ConnectionGamePort, + ConnectionRoomPort, + DisconnectCoordinatorPortBundle, + DisconnectGamePort, + DisconnectRoomHandlerPort, + RegisterConnectionHandlersParams, +} from "../types/connectionPorts"; /** ソケット接続と切断イベントに対する共通ハンドラを登録する */ export const registerConnectionHandlers = ({ @@ -56,6 +31,12 @@ const disconnectGameManager: DisconnectGamePort = gameManager; const connectionRoomManager: ConnectionRoomPort = roomManager; const disconnectRoomManager: DisconnectRoomHandlerPort = roomManager; + const disconnectPorts: DisconnectCoordinatorPortBundle = { + gameManager: disconnectGameManager, + roomManager: disconnectRoomManager, + gameOutput: gameDisconnectOutputAdapter, + roomOutput: roomDisconnectOutputAdapter, + }; io.on(protocol.SocketEvents.CONNECT, (socket: Socket) => { // 接続ログを記録してドメイン別ハンドラを登録する @@ -78,10 +59,7 @@ disconnectCoordinator({ socketId: socket.id, - gameManager: disconnectGameManager, - roomManager: disconnectRoomManager, - gameOutput: gameDisconnectOutputAdapter, - roomOutput: roomDisconnectOutputAdapter, + ...disconnectPorts, }); }); }); diff --git a/apps/server/src/network/handlers/room/createRoomOutputAdapter.ts b/apps/server/src/network/handlers/room/createRoomOutputAdapter.ts index 932d2d2..90aacab 100644 --- a/apps/server/src/network/handlers/room/createRoomOutputAdapter.ts +++ b/apps/server/src/network/handlers/room/createRoomOutputAdapter.ts @@ -4,9 +4,9 @@ */ import { Server } from "socket.io"; import { protocol } from "@repo/shared"; -import { createEmitToRoom } from "@server/network/adapters/socketEmitters"; import type { roomTypes } from "@repo/shared"; import type { RoomOutputPort } from "@server/domains/room/application/ports/roomUseCasePorts"; +import { createEmitToRoom } from "@server/network/adapters/socketEmitters"; import type { CommonHandlerContext } from "../CommonHandler"; type RoomId = roomTypes.Room["roomId"]; diff --git a/apps/server/src/network/handlers/room/registerRoomHandlers.ts b/apps/server/src/network/handlers/room/registerRoomHandlers.ts index 66b9d3f..c4b42b9 100644 --- a/apps/server/src/network/handlers/room/registerRoomHandlers.ts +++ b/apps/server/src/network/handlers/room/registerRoomHandlers.ts @@ -3,13 +3,13 @@ * ルーム参加イベントの受信ハンドラを登録する */ import { Server, Socket } from "socket.io"; -import type { JoinRoomPort } from "@server/domains/room/application/ports/roomUseCasePorts"; import { protocol } from "@repo/shared"; +import type { JoinRoomPort } from "@server/domains/room/application/ports/roomUseCasePorts"; import { joinRoomUseCase } from "@server/domains/room/application/useCases/joinRoomUseCase"; -import { createCommonHandlerContext } from "@server/network/handlers/CommonHandler"; -import { createRoomOutputAdapter } from "./createRoomOutputAdapter"; -import { isJoinRoomPayload } from "@server/network/validation/socketPayloadValidators"; import { logEvent } from "@server/logging/logEvent"; +import { createCommonHandlerContext } from "@server/network/handlers/CommonHandler"; +import { isJoinRoomPayload } from "@server/network/validation/socketPayloadValidators"; +import { createRoomOutputAdapter } from "./createRoomOutputAdapter"; /** ルーム参加イベントを検証して参加ユースケースへ連携する */ export const registerRoomHandlers = ( diff --git a/apps/server/src/network/types/connectionPorts.ts b/apps/server/src/network/types/connectionPorts.ts new file mode 100644 index 0000000..dcb61a3 --- /dev/null +++ b/apps/server/src/network/types/connectionPorts.ts @@ -0,0 +1,62 @@ +/** + * connectionPorts + * ネットワーク接続処理で利用するポート型を提供する + */ +import type { Server } from "socket.io"; +import type { + DisconnectPlayerPort, + MovePlayerPort, + ReadyForGamePort, + ReadyForGameRoomPort, + StartGamePort, + StartGameRoomPort, +} from "@server/domains/game/application/ports/gameUseCasePorts"; +import type { + DisconnectRoomPort, + FindRoomByPlayerPort, + JoinRoomPort, +} from "@server/domains/room/application/ports/roomUseCasePorts"; +import type { DisconnectCoordinatorParams } from "../../application/coordinators/disconnectCoordinator"; + +/** 接続時のゲーム処理で利用する入力ポート集合 */ +export type ConnectionGamePort = + & StartGamePort + & ReadyForGamePort + & MovePlayerPort; + +/** 接続時のルーム処理で利用する入力ポート集合 */ +export type ConnectionRoomPort = + & JoinRoomPort + & StartGameRoomPort + & ReadyForGameRoomPort; + +/** ソケット接続全体で利用するゲーム管理ポート集合 */ +export type SocketConnectionGamePort = + & ConnectionGamePort + & DisconnectPlayerPort; + +/** ソケット接続全体で利用するルーム管理ポート集合 */ +export type SocketConnectionRoomPort = + & ConnectionRoomPort + & DisconnectRoomPort + & FindRoomByPlayerPort; + +/** ソケット接続ハンドラで受け取るマネージャ依存の束 */ +export type SocketConnectionManagerBundle = { + gameManager: SocketConnectionGamePort; + roomManager: SocketConnectionRoomPort; +}; + +/** 切断時のゲーム処理で利用する入力ポート */ +export type DisconnectGamePort = DisconnectPlayerPort; + +/** 切断時のルーム処理で利用する入力ポート集合 */ +export type DisconnectRoomHandlerPort = DisconnectRoomPort & FindRoomByPlayerPort; + +/** 切断調停処理へ受け渡す依存集合 */ +export type DisconnectCoordinatorPortBundle = Omit; + +/** 接続ハンドラ登録関数が受け取る入力パラメータ */ +export type RegisterConnectionHandlersParams = SocketConnectionManagerBundle & { + io: Server; +};