diff --git a/apps/server/src/network/handlers/game/createGameEventPublisher.ts b/apps/server/src/network/handlers/game/createGameEventPublisher.ts deleted file mode 100644 index b966185..0000000 --- a/apps/server/src/network/handlers/game/createGameEventPublisher.ts +++ /dev/null @@ -1,62 +0,0 @@ -/** - * createGameEventPublisher - * ゲーム系ユースケースから利用する送信関数群を生成する - */ -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 type { CommonHandlerContext } from "../CommonHandler"; - -type RoomId = roomTypes.Room["roomId"]; -type SocketId = playerTypes.PlayerData["id"]; -type PongPayload = { clientTime: number; serverTime: number }; -type GameStartPayload = { startTime: number }; -type CurrentPlayersPayload = playerTypes.PlayerData[]; -type UpdatePlayerPayload = playerTypes.PlayerData; -type MapCellUpdatesPayload = gridMapTypes.CellUpdate[]; - -/** ゲーム進行中イベントの送信インターフェース */ -export type GameEventPublisher = Omit; - -/** 切断時に配信するゲームイベントの送信インターフェース */ -export type GameDisconnectPublisher = Pick; - -/** 共通送信コンテキストからゲームイベント送信関数群を生成する */ -export const createGameEventPublisher = (common: CommonHandlerContext): GameEventPublisher => { - return { - publishPongToSocket: (payload: PongPayload) => { - common.emitToSocket(protocol.SocketEvents.PONG, payload); - }, - publishUpdatePlayerToRoom: (roomId: RoomId, playerData: UpdatePlayerPayload) => { - common.emitToRoom(roomId, protocol.SocketEvents.UPDATE_PLAYER, playerData); - }, - publishMapCellUpdatesToRoom: (roomId: RoomId, cellUpdates: MapCellUpdatesPayload) => { - common.emitToRoom(roomId, protocol.SocketEvents.UPDATE_MAP_CELLS, cellUpdates); - }, - publishGameEndToRoom: (roomId: RoomId) => { - common.emitToRoom(roomId, protocol.SocketEvents.GAME_END); - }, - publishGameStartToRoom: (roomId: RoomId, payload: GameStartPayload) => { - common.emitToRoom(roomId, protocol.SocketEvents.GAME_START, payload); - }, - publishCurrentPlayersToSocket: (players: CurrentPlayersPayload) => { - common.emitToSocket(protocol.SocketEvents.CURRENT_PLAYERS, players); - }, - publishGameStartToSocket: (payload: GameStartPayload) => { - common.emitToSocket(protocol.SocketEvents.GAME_START, payload); - }, - }; -}; - -/** ゲーム切断時の送信関数群を生成する */ -export const createGameDisconnectPublisher = (io: Server): GameDisconnectPublisher => { - const emitToRoom = createEmitToRoom(io); - - return { - publishPlayerRemovedToRoom: (roomId: RoomId, removedPlayerId: SocketId) => { - emitToRoom(roomId, protocol.SocketEvents.REMOVE_PLAYER, removedPlayerId); - }, - }; -}; diff --git a/apps/server/src/network/handlers/game/createGameOutputAdapter.ts b/apps/server/src/network/handlers/game/createGameOutputAdapter.ts new file mode 100644 index 0000000..3af44f2 --- /dev/null +++ b/apps/server/src/network/handlers/game/createGameOutputAdapter.ts @@ -0,0 +1,62 @@ +/** + * createGameOutputAdapter + * ゲーム系ユースケースから利用する送信関数群を生成する + */ +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 type { CommonHandlerContext } from "../CommonHandler"; + +type RoomId = roomTypes.Room["roomId"]; +type SocketId = playerTypes.PlayerData["id"]; +type PongPayload = { clientTime: number; serverTime: number }; +type GameStartPayload = { startTime: number }; +type CurrentPlayersPayload = playerTypes.PlayerData[]; +type UpdatePlayerPayload = playerTypes.PlayerData; +type MapCellUpdatesPayload = gridMapTypes.CellUpdate[]; + +/** ゲーム出力アダプターのインターフェース */ +export type GameOutputAdapter = Omit; + +/** ゲーム切断時の出力アダプターのインターフェース */ +export type GameDisconnectOutputAdapter = Pick; + +/** 共通送信コンテキストからゲーム出力アダプターを生成する */ +export const createGameOutputAdapter = (common: CommonHandlerContext): GameOutputAdapter => { + return { + publishPongToSocket: (payload: PongPayload) => { + common.emitToSocket(protocol.SocketEvents.PONG, payload); + }, + publishUpdatePlayerToRoom: (roomId: RoomId, playerData: UpdatePlayerPayload) => { + common.emitToRoom(roomId, protocol.SocketEvents.UPDATE_PLAYER, playerData); + }, + publishMapCellUpdatesToRoom: (roomId: RoomId, cellUpdates: MapCellUpdatesPayload) => { + common.emitToRoom(roomId, protocol.SocketEvents.UPDATE_MAP_CELLS, cellUpdates); + }, + publishGameEndToRoom: (roomId: RoomId) => { + common.emitToRoom(roomId, protocol.SocketEvents.GAME_END); + }, + publishGameStartToRoom: (roomId: RoomId, payload: GameStartPayload) => { + common.emitToRoom(roomId, protocol.SocketEvents.GAME_START, payload); + }, + publishCurrentPlayersToSocket: (players: CurrentPlayersPayload) => { + common.emitToSocket(protocol.SocketEvents.CURRENT_PLAYERS, players); + }, + publishGameStartToSocket: (payload: GameStartPayload) => { + common.emitToSocket(protocol.SocketEvents.GAME_START, payload); + }, + }; +}; + +/** ゲーム切断時の送信関数群を生成する */ +export const createGameDisconnectOutputAdapter = (io: Server): GameDisconnectOutputAdapter => { + const emitToRoom = createEmitToRoom(io); + + return { + publishPlayerRemovedToRoom: (roomId: RoomId, removedPlayerId: SocketId) => { + emitToRoom(roomId, protocol.SocketEvents.REMOVE_PLAYER, removedPlayerId); + }, + }; +}; diff --git a/apps/server/src/network/handlers/game/handleGameDisconnect.ts b/apps/server/src/network/handlers/game/handleGameDisconnect.ts index d25704e..77af1c8 100644 --- a/apps/server/src/network/handlers/game/handleGameDisconnect.ts +++ b/apps/server/src/network/handlers/game/handleGameDisconnect.ts @@ -5,7 +5,7 @@ import { Server } from "socket.io"; import { GameManager } from "@server/domains/game/GameManager"; import { disconnectUseCase } from "@server/domains/game/application/useCases/disconnectUseCase"; -import { createGameDisconnectPublisher } from "./createGameEventPublisher"; +import { createGameDisconnectOutputAdapter } from "./createGameOutputAdapter"; /** 切断したプレイヤーをゲーム管理から除外し通知する */ export const handleGameDisconnect = ( @@ -14,12 +14,12 @@ roomId: string | undefined, playerId: string ) => { - const gameDisconnectPublisher = createGameDisconnectPublisher(io); + const gameDisconnectOutputAdapter = createGameDisconnectOutputAdapter(io); disconnectUseCase({ gameManager, roomId, playerId, - output: gameDisconnectPublisher, + output: gameDisconnectOutputAdapter, }); }; diff --git a/apps/server/src/network/handlers/game/registerGameHandlers.ts b/apps/server/src/network/handlers/game/registerGameHandlers.ts index 7767024..f64b1b0 100644 --- a/apps/server/src/network/handlers/game/registerGameHandlers.ts +++ b/apps/server/src/network/handlers/game/registerGameHandlers.ts @@ -11,7 +11,7 @@ import { readyForGameUseCase } from "@server/domains/game/application/useCases/readyForGameUseCase"; import { movePlayerUseCase } from "@server/domains/game/application/useCases/movePlayerUseCase"; import { createCommonHandlerContext } from "@server/network/handlers/CommonHandler"; -import { createGameEventPublisher } from "./createGameEventPublisher"; +import { createGameOutputAdapter } from "./createGameOutputAdapter"; import { logEvent } from "@server/logging/logEvent"; import { isMovePayload, isPingPayload } from "@server/network/validation/socketPayloadValidators"; @@ -23,7 +23,7 @@ roomManager: RoomManager ) => { const common = createCommonHandlerContext(io, socket); - const gamePublisher = createGameEventPublisher(common); + const gameOutputAdapter = createGameOutputAdapter(common); // 遅延計測用のPINGを検証しPONGを返す socket.on(protocol.SocketEvents.PING, (clientTime: unknown) => { @@ -38,7 +38,7 @@ pingUseCase({ clientTime, - output: gamePublisher, + output: gameOutputAdapter, }); }); @@ -48,7 +48,7 @@ ownerId: socket.id, gameManager, roomManager, - output: gamePublisher, + output: gameOutputAdapter, }); }); @@ -60,7 +60,7 @@ socketId: socket.id, roomId, gameManager, - output: gamePublisher, + output: gameOutputAdapter, }); }); diff --git a/apps/server/src/network/handlers/room/createRoomEventPublisher.ts b/apps/server/src/network/handlers/room/createRoomEventPublisher.ts deleted file mode 100644 index 6797199..0000000 --- a/apps/server/src/network/handlers/room/createRoomEventPublisher.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * createRoomEventPublisher - * ルーム系ユースケースから利用する送信関数を生成する - */ -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 type { CommonHandlerContext } from "../CommonHandler"; - -type RoomId = roomTypes.Room["roomId"]; -type RoomUpdatePayload = roomTypes.Room; - -/** ルーム更新イベントの送信インターフェース */ -export type RoomEventPublisher = RoomOutputPort; - -/** 共通送信コンテキストからルームイベント送信関数を生成する */ -export const createRoomEventPublisher = ( - common: CommonHandlerContext -): RoomEventPublisher => { - return { - publishRoomUpdateToRoom: (roomId: RoomId, room: RoomUpdatePayload) => { - common.emitToRoom(roomId, protocol.SocketEvents.ROOM_UPDATE, room); - }, - publishJoinRejectedToSocket: (payload: roomTypes.JoinRoomRejectedPayload) => { - common.emitToSocket(protocol.SocketEvents.ROOM_JOIN_REJECTED, payload); - }, - }; -}; - -/** 切断時のルーム更新送信関数を生成する */ -export const createRoomDisconnectPublisher = ( - io: Server -): Pick => { - const emitToRoom = createEmitToRoom(io); - - return { - publishRoomUpdateToRoom: (roomId: RoomId, room: RoomUpdatePayload) => { - emitToRoom(roomId, protocol.SocketEvents.ROOM_UPDATE, room); - }, - }; -}; diff --git a/apps/server/src/network/handlers/room/createRoomOutputAdapter.ts b/apps/server/src/network/handlers/room/createRoomOutputAdapter.ts new file mode 100644 index 0000000..932d2d2 --- /dev/null +++ b/apps/server/src/network/handlers/room/createRoomOutputAdapter.ts @@ -0,0 +1,43 @@ +/** + * createRoomOutputAdapter + * ルーム系ユースケースから利用する送信関数を生成する + */ +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 type { CommonHandlerContext } from "../CommonHandler"; + +type RoomId = roomTypes.Room["roomId"]; +type RoomUpdatePayload = roomTypes.Room; + +/** ルーム出力アダプターのインターフェース */ +export type RoomOutputAdapter = RoomOutputPort; + +/** 共通送信コンテキストからルーム出力アダプターを生成する */ +export const createRoomOutputAdapter = ( + common: CommonHandlerContext +): RoomOutputAdapter => { + return { + publishRoomUpdateToRoom: (roomId: RoomId, room: RoomUpdatePayload) => { + common.emitToRoom(roomId, protocol.SocketEvents.ROOM_UPDATE, room); + }, + publishJoinRejectedToSocket: (payload: roomTypes.JoinRoomRejectedPayload) => { + common.emitToSocket(protocol.SocketEvents.ROOM_JOIN_REJECTED, payload); + }, + }; +}; + +/** 切断時のルーム出力アダプターを生成する */ +export const createRoomDisconnectOutputAdapter = ( + io: Server +): Pick => { + const emitToRoom = createEmitToRoom(io); + + return { + publishRoomUpdateToRoom: (roomId: RoomId, room: RoomUpdatePayload) => { + emitToRoom(roomId, protocol.SocketEvents.ROOM_UPDATE, room); + }, + }; +}; diff --git a/apps/server/src/network/handlers/room/handleRoomDisconnect.ts b/apps/server/src/network/handlers/room/handleRoomDisconnect.ts index c0f1bd1..998b0f9 100644 --- a/apps/server/src/network/handlers/room/handleRoomDisconnect.ts +++ b/apps/server/src/network/handlers/room/handleRoomDisconnect.ts @@ -5,7 +5,7 @@ import { Server, Socket } from "socket.io"; import { RoomManager } from "@server/domains/room/RoomManager"; import { roomDisconnectUseCase } from "@server/domains/room/application/useCases/roomDisconnectUseCase"; -import { createRoomDisconnectPublisher } from "./createRoomEventPublisher"; +import { createRoomDisconnectOutputAdapter } from "./createRoomOutputAdapter"; /** 切断ソケットのルーム離脱処理を実行して更新通知する */ export const handleRoomDisconnect = ( @@ -13,11 +13,11 @@ socket: Socket, roomManager: RoomManager ) => { - const roomDisconnectPublisher = createRoomDisconnectPublisher(io); + const roomDisconnectOutputAdapter = createRoomDisconnectOutputAdapter(io); roomDisconnectUseCase({ roomManager, socketId: socket.id, - output: roomDisconnectPublisher, + output: roomDisconnectOutputAdapter, }); }; diff --git a/apps/server/src/network/handlers/room/registerRoomHandlers.ts b/apps/server/src/network/handlers/room/registerRoomHandlers.ts index 21f501d..d5729b1 100644 --- a/apps/server/src/network/handlers/room/registerRoomHandlers.ts +++ b/apps/server/src/network/handlers/room/registerRoomHandlers.ts @@ -7,7 +7,7 @@ import { protocol } from "@repo/shared"; import { joinRoomUseCase } from "@server/domains/room/application/useCases/joinRoomUseCase"; import { createCommonHandlerContext } from "@server/network/handlers/CommonHandler"; -import { createRoomEventPublisher } from "./createRoomEventPublisher"; +import { createRoomOutputAdapter } from "./createRoomOutputAdapter"; import { isJoinRoomPayload } from "@server/network/validation/socketPayloadValidators"; import { logEvent } from "@server/logging/logEvent"; @@ -18,7 +18,7 @@ roomManager: RoomManager ) => { const common = createCommonHandlerContext(io, socket); - const roomPublisher = createRoomEventPublisher(common); + const roomOutputAdapter = createRoomOutputAdapter(common); // 参加要求のペイロード検証と参加処理を実行する socket.on(protocol.SocketEvents.JOIN_ROOM, (data: unknown) => { @@ -37,7 +37,7 @@ roomManager, socketId: socket.id, data, - output: roomPublisher, + output: roomOutputAdapter, }); // 参加拒否時は理由を通知する @@ -62,7 +62,7 @@ case "joined": socket.join(roomId); - roomPublisher.publishRoomUpdateToRoom(roomId, joinResult.room); + roomOutputAdapter.publishRoomUpdateToRoom(roomId, joinResult.room); logEvent("RoomUseCase", { event: "ROOM_UPDATE", result: "emitted",