diff --git a/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts b/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts index 2686513..659e636 100644 --- a/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts +++ b/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts @@ -1,5 +1,5 @@ import type { TickData } from "../../loop/GameLoop"; -import type { playerTypes } from "@repo/shared"; +import type { gridMapTypes, playerTypes, roomTypes } from "@repo/shared"; export interface StartGamePort { startRoomSession( @@ -23,3 +23,17 @@ export interface DisconnectPlayerPort { removePlayer(id: string): void; } + +export interface GameOutputPort { + publishPongToSocket(payload: { clientTime: number; serverTime: number }): void; + publishUpdatePlayerToRoom(roomId: roomTypes.Room["roomId"], playerData: playerTypes.PlayerData): void; + publishMapCellUpdatesToRoom( + roomId: roomTypes.Room["roomId"], + cellUpdates: gridMapTypes.CellUpdate[] + ): void; + publishGameEndToRoom(roomId: roomTypes.Room["roomId"]): void; + publishGameStartToRoom(roomId: roomTypes.Room["roomId"], payload: { startTime: number }): void; + publishCurrentPlayersToSocket(players: playerTypes.PlayerData[]): void; + publishGameStartToSocket(payload: { startTime: number }): void; + publishPlayerRemovedToRoom(roomId: roomTypes.Room["roomId"], removedPlayerId: string): void; +} diff --git a/apps/server/src/domains/game/application/useCases/disconnectUseCase.ts b/apps/server/src/domains/game/application/useCases/disconnectUseCase.ts index ce9ce89..865ec74 100644 --- a/apps/server/src/domains/game/application/useCases/disconnectUseCase.ts +++ b/apps/server/src/domains/game/application/useCases/disconnectUseCase.ts @@ -1,19 +1,25 @@ -import type { DisconnectPlayerPort } from "../ports/gameUseCasePorts"; +import type { DisconnectPlayerPort, GameOutputPort } from "../ports/gameUseCasePorts"; import { logEvent } from "@server/logging/logEvent"; type DisconnectUseCaseParams = { gameManager: DisconnectPlayerPort; + roomId?: string; playerId: string; - publishPlayerRemoved: (playerId: string) => void; + output: Pick; }; export const disconnectUseCase = ({ gameManager, + roomId, playerId, - publishPlayerRemoved, + output, }: DisconnectUseCaseParams) => { gameManager.removePlayer(playerId); - publishPlayerRemoved(playerId); + + if (roomId) { + output.publishPlayerRemovedToRoom(roomId, playerId); + } + logEvent("GameUseCase", { event: "DISCONNECT", result: "player_removed", diff --git a/apps/server/src/domains/game/application/useCases/pingUseCase.ts b/apps/server/src/domains/game/application/useCases/pingUseCase.ts index d71fb20..42e8fbd 100644 --- a/apps/server/src/domains/game/application/useCases/pingUseCase.ts +++ b/apps/server/src/domains/game/application/useCases/pingUseCase.ts @@ -1,13 +1,15 @@ +import type { GameOutputPort } from "../ports/gameUseCasePorts"; + type PingUseCaseParams = { clientTime: number; - publishPong: (payload: { clientTime: number; serverTime: number }) => void; + output: Pick; }; export const pingUseCase = ({ clientTime, - publishPong, + output, }: PingUseCaseParams) => { - publishPong({ + output.publishPongToSocket({ clientTime, serverTime: Date.now(), }); diff --git a/apps/server/src/domains/game/application/useCases/readyForGameUseCase.ts b/apps/server/src/domains/game/application/useCases/readyForGameUseCase.ts index 067a1e2..f8a72c0 100644 --- a/apps/server/src/domains/game/application/useCases/readyForGameUseCase.ts +++ b/apps/server/src/domains/game/application/useCases/readyForGameUseCase.ts @@ -1,24 +1,22 @@ import type { ReadyForGamePort } from "../ports/gameUseCasePorts"; -import type { playerTypes } from "@repo/shared"; +import type { GameOutputPort } from "../ports/gameUseCasePorts"; import { logEvent } from "@server/logging/logEvent"; type ReadyForGameUseCaseParams = { socketId: string; roomId?: string; gameManager: ReadyForGamePort; - publishCurrentPlayers: (players: playerTypes.PlayerData[]) => void; - publishGameStart: (payload: { startTime: number }) => void; + output: Pick; }; export const readyForGameUseCase = ({ socketId, roomId, gameManager, - publishCurrentPlayers, - publishGameStart, + output, }: ReadyForGameUseCaseParams) => { if (!roomId) { - publishCurrentPlayers([]); + output.publishCurrentPlayersToSocket([]); logEvent("GameUseCase", { event: "READY_FOR_GAME", result: "ignored_missing_room", @@ -28,7 +26,7 @@ } const roomPlayers = gameManager.getRoomPlayers(roomId); - publishCurrentPlayers(roomPlayers); + output.publishCurrentPlayersToSocket(roomPlayers); logEvent("GameUseCase", { event: "READY_FOR_GAME", @@ -43,7 +41,7 @@ return; } - publishGameStart({ startTime }); + output.publishGameStartToSocket({ startTime }); logEvent("GameUseCase", { event: "GAME_START", result: "emitted", diff --git a/apps/server/src/domains/game/application/useCases/startGameUseCase.ts b/apps/server/src/domains/game/application/useCases/startGameUseCase.ts index b8991db..e492412 100644 --- a/apps/server/src/domains/game/application/useCases/startGameUseCase.ts +++ b/apps/server/src/domains/game/application/useCases/startGameUseCase.ts @@ -1,27 +1,26 @@ import { roomConsts } from "@repo/shared"; -import type { gridMapTypes, playerTypes } from "@repo/shared"; import { RoomManager } from "@server/domains/room/RoomManager"; -import type { StartGamePort } from "../ports/gameUseCasePorts"; +import type { GameOutputPort, StartGamePort } from "../ports/gameUseCasePorts"; import { logEvent } from "@server/logging/logEvent"; type StartGameUseCaseParams = { ownerId: string; gameManager: StartGamePort; roomManager: RoomManager; - publishUpdatePlayer: (roomId: string, playerData: playerTypes.PlayerData) => void; - publishMapCellUpdates: (roomId: string, cellUpdates: gridMapTypes.CellUpdate[]) => void; - publishGameEnd: (roomId: string) => void; - publishGameStart: (roomId: string, payload: { startTime: number }) => void; + output: Pick< + GameOutputPort, + | "publishUpdatePlayerToRoom" + | "publishMapCellUpdatesToRoom" + | "publishGameEndToRoom" + | "publishGameStartToRoom" + >; }; export const startGameUseCase = ({ ownerId, gameManager, roomManager, - publishUpdatePlayer, - publishMapCellUpdates, - publishGameEnd, - publishGameStart, + output, }: StartGameUseCaseParams) => { const room = roomManager.getRoomByOwnerId(ownerId); if (!room) { @@ -60,11 +59,11 @@ playerIds, (tickData) => { tickData.players.forEach((playerData) => { - publishUpdatePlayer(room.roomId, playerData); + output.publishUpdatePlayerToRoom(room.roomId, playerData); }); if (tickData.cellUpdates.length > 0) { - publishMapCellUpdates(room.roomId, tickData.cellUpdates); + output.publishMapCellUpdatesToRoom(room.roomId, tickData.cellUpdates); } }, () => { @@ -74,11 +73,11 @@ roomId: room.roomId, reason: "duration_elapsed", }); - publishGameEnd(room.roomId); + output.publishGameEndToRoom(room.roomId); room.status = roomConsts.RoomPhase.WAITING; } ); const startTime = gameManager.getRoomStartTime(room.roomId) || Date.now(); - publishGameStart(room.roomId, { startTime }); + output.publishGameStartToRoom(room.roomId, { startTime }); }; diff --git a/apps/server/src/network/handlers/game/createGameEventPublisher.ts b/apps/server/src/network/handlers/game/createGameEventPublisher.ts index 8d36b1e..b966185 100644 --- a/apps/server/src/network/handlers/game/createGameEventPublisher.ts +++ b/apps/server/src/network/handlers/game/createGameEventPublisher.ts @@ -6,6 +6,7 @@ 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 type { CommonHandlerContext } from "../CommonHandler"; type RoomId = roomTypes.Room["roomId"]; @@ -17,20 +18,10 @@ type MapCellUpdatesPayload = gridMapTypes.CellUpdate[]; /** ゲーム進行中イベントの送信インターフェース */ -export type GameEventPublisher = { - publishPongToSocket: (payload: PongPayload) => void; - publishUpdatePlayerToRoom: (roomId: RoomId, playerData: UpdatePlayerPayload) => void; - publishMapCellUpdatesToRoom: (roomId: RoomId, cellUpdates: MapCellUpdatesPayload) => void; - publishGameEndToRoom: (roomId: RoomId) => void; - publishGameStartToRoom: (roomId: RoomId, payload: GameStartPayload) => void; - publishCurrentPlayersToSocket: (players: CurrentPlayersPayload) => void; - publishGameStartToSocket: (payload: GameStartPayload) => void; -}; +export type GameEventPublisher = Omit; /** 切断時に配信するゲームイベントの送信インターフェース */ -export type GameDisconnectPublisher = { - publishPlayerRemovedToRoom: (roomId: RoomId, removedPlayerId: SocketId) => void; -}; +export type GameDisconnectPublisher = Pick; /** 共通送信コンテキストからゲームイベント送信関数群を生成する */ export const createGameEventPublisher = (common: CommonHandlerContext): GameEventPublisher => { diff --git a/apps/server/src/network/handlers/game/handleGameDisconnect.ts b/apps/server/src/network/handlers/game/handleGameDisconnect.ts index 0a7be66..d25704e 100644 --- a/apps/server/src/network/handlers/game/handleGameDisconnect.ts +++ b/apps/server/src/network/handlers/game/handleGameDisconnect.ts @@ -18,13 +18,8 @@ disconnectUseCase({ gameManager, + roomId, playerId, - publishPlayerRemoved: (removedPlayerId) => { - if (!roomId) { - return; - } - - gameDisconnectPublisher.publishPlayerRemovedToRoom(roomId, removedPlayerId); - }, + output: gameDisconnectPublisher, }); }; diff --git a/apps/server/src/network/handlers/game/registerGameHandlers.ts b/apps/server/src/network/handlers/game/registerGameHandlers.ts index 29d3511..7767024 100644 --- a/apps/server/src/network/handlers/game/registerGameHandlers.ts +++ b/apps/server/src/network/handlers/game/registerGameHandlers.ts @@ -6,7 +6,6 @@ import { GameManager } from "@server/domains/game/GameManager"; import { RoomManager } from "@server/domains/room/RoomManager"; import { protocol } from "@repo/shared"; -import type { playerTypes } from "@repo/shared"; import { pingUseCase } from "@server/domains/game/application/useCases/pingUseCase"; import { startGameUseCase } from "@server/domains/game/application/useCases/startGameUseCase"; import { readyForGameUseCase } from "@server/domains/game/application/useCases/readyForGameUseCase"; @@ -39,7 +38,7 @@ pingUseCase({ clientTime, - publishPong: gamePublisher.publishPongToSocket, + output: gamePublisher, }); }); @@ -49,10 +48,7 @@ ownerId: socket.id, gameManager, roomManager, - publishUpdatePlayer: gamePublisher.publishUpdatePlayerToRoom, - publishMapCellUpdates: gamePublisher.publishMapCellUpdatesToRoom, - publishGameEnd: gamePublisher.publishGameEndToRoom, - publishGameStart: gamePublisher.publishGameStartToRoom, + output: gamePublisher, }); }); @@ -64,8 +60,7 @@ socketId: socket.id, roomId, gameManager, - publishCurrentPlayers: gamePublisher.publishCurrentPlayersToSocket, - publishGameStart: gamePublisher.publishGameStartToSocket, + output: gamePublisher, }); });