diff --git a/apps/server/eslint.config.mjs b/apps/server/eslint.config.mjs index e50ff7f..fd5e1d4 100644 --- a/apps/server/eslint.config.mjs +++ b/apps/server/eslint.config.mjs @@ -46,4 +46,22 @@ 'no-restricted-imports': 'off', }, }, + { + files: ['src/domains/**/*.ts'], + rules: { + 'no-restricted-imports': [ + 'error', + { + paths: [ + { + name: '@repo/shared', + importNames: ['protocol'], + message: + 'domains 配下では protocol を直接 import せず、network でイベント名を解決してください。', + }, + ], + }, + ], + }, + }, ]; \ No newline at end of file diff --git a/apps/server/src/domains/game/application/useCases/disconnectUseCase.ts b/apps/server/src/domains/game/application/useCases/disconnectUseCase.ts index 327a343..ce9ce89 100644 --- a/apps/server/src/domains/game/application/useCases/disconnectUseCase.ts +++ b/apps/server/src/domains/game/application/useCases/disconnectUseCase.ts @@ -1,22 +1,19 @@ -import { protocol } from "@repo/shared"; import type { DisconnectPlayerPort } from "../ports/gameUseCasePorts"; import { logEvent } from "@server/logging/logEvent"; -type EmitToAll = (event: string, payload?: unknown) => void; - type DisconnectUseCaseParams = { gameManager: DisconnectPlayerPort; playerId: string; - emitToAll: EmitToAll; + publishPlayerRemoved: (playerId: string) => void; }; export const disconnectUseCase = ({ gameManager, playerId, - emitToAll, + publishPlayerRemoved, }: DisconnectUseCaseParams) => { gameManager.removePlayer(playerId); - emitToAll(protocol.SocketEvents.REMOVE_PLAYER, playerId); + publishPlayerRemoved(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 0ef9f54..d71fb20 100644 --- a/apps/server/src/domains/game/application/useCases/pingUseCase.ts +++ b/apps/server/src/domains/game/application/useCases/pingUseCase.ts @@ -1,17 +1,13 @@ -import { protocol } from "@repo/shared"; - -type EmitToSocket = (event: string, payload?: unknown) => void; - type PingUseCaseParams = { clientTime: number; - emitToSocket: EmitToSocket; + publishPong: (payload: { clientTime: number; serverTime: number }) => void; }; export const pingUseCase = ({ clientTime, - emitToSocket, + publishPong, }: PingUseCaseParams) => { - emitToSocket(protocol.SocketEvents.PONG, { + publishPong({ 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 dd57ff0..f0cf53b 100644 --- a/apps/server/src/domains/game/application/useCases/readyForGameUseCase.ts +++ b/apps/server/src/domains/game/application/useCases/readyForGameUseCase.ts @@ -1,24 +1,23 @@ -import { protocol } from "@repo/shared"; import type { ReadyForGamePort } from "../ports/gameUseCasePorts"; import { logEvent } from "@server/logging/logEvent"; -type EmitToSocket = (event: string, payload?: unknown) => void; - type ReadyForGameUseCaseParams = { socketId: string; roomId?: string; gameManager: ReadyForGamePort; - emitToSocket: EmitToSocket; + publishCurrentPlayers: (players: unknown[]) => void; + publishGameStart: (payload: { startTime: number }) => void; }; export const readyForGameUseCase = ({ socketId, roomId, gameManager, - emitToSocket, + publishCurrentPlayers, + publishGameStart, }: ReadyForGameUseCaseParams) => { const allPlayers = gameManager.getAllPlayers(); - emitToSocket(protocol.SocketEvents.CURRENT_PLAYERS, allPlayers); + publishCurrentPlayers(allPlayers); logEvent("GameUseCase", { event: "READY_FOR_GAME", @@ -42,7 +41,7 @@ return; } - emitToSocket(protocol.SocketEvents.GAME_START, { startTime }); + publishGameStart({ 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 1e3d1d8..39a0f4d 100644 --- a/apps/server/src/domains/game/application/useCases/startGameUseCase.ts +++ b/apps/server/src/domains/game/application/useCases/startGameUseCase.ts @@ -1,22 +1,26 @@ -import { protocol, roomConsts } from "@repo/shared"; +import { roomConsts } from "@repo/shared"; import { RoomManager } from "@server/domains/room/RoomManager"; import type { StartGamePort } from "../ports/gameUseCasePorts"; import { logEvent } from "@server/logging/logEvent"; -type EmitToRoom = (roomId: string, event: string, payload?: unknown) => void; - type StartGameUseCaseParams = { ownerId: string; gameManager: StartGamePort; roomManager: RoomManager; - emitToRoom: EmitToRoom; + publishUpdatePlayer: (roomId: string, playerData: unknown) => void; + publishMapCellUpdates: (roomId: string, cellUpdates: unknown[]) => void; + publishGameEnd: (roomId: string) => void; + publishGameStart: (roomId: string, payload: { startTime: number }) => void; }; export const startGameUseCase = ({ ownerId, gameManager, roomManager, - emitToRoom, + publishUpdatePlayer, + publishMapCellUpdates, + publishGameEnd, + publishGameStart, }: StartGameUseCaseParams) => { const room = roomManager.getRoomByOwnerId(ownerId); if (!room) { @@ -59,11 +63,11 @@ playerIds, (tickData) => { tickData.players.forEach((playerData) => { - emitToRoom(room.roomId, protocol.SocketEvents.UPDATE_PLAYER, playerData); + publishUpdatePlayer(room.roomId, playerData); }); if (tickData.cellUpdates.length > 0) { - emitToRoom(room.roomId, protocol.SocketEvents.UPDATE_MAP_CELLS, tickData.cellUpdates); + publishMapCellUpdates(room.roomId, tickData.cellUpdates); } }, () => { @@ -73,11 +77,11 @@ roomId: room.roomId, reason: "duration_elapsed", }); - emitToRoom(room.roomId, protocol.SocketEvents.GAME_END); + publishGameEnd(room.roomId); room.status = roomConsts.RoomPhase.WAITING; } ); const startTime = gameManager.getRoomStartTime(room.roomId) || Date.now(); - emitToRoom(room.roomId, protocol.SocketEvents.GAME_START, { startTime }); + publishGameStart(room.roomId, { startTime }); }; diff --git a/apps/server/src/domains/room/application/useCases/joinRoomUseCase.ts b/apps/server/src/domains/room/application/useCases/joinRoomUseCase.ts index 1123299..82fdde4 100644 --- a/apps/server/src/domains/room/application/useCases/joinRoomUseCase.ts +++ b/apps/server/src/domains/room/application/useCases/joinRoomUseCase.ts @@ -1,22 +1,19 @@ -import { protocol } from "@repo/shared"; import type { roomTypes } from "@repo/shared"; import type { JoinRoomPort } from "../ports/roomUseCasePorts"; import { logEvent } from "@server/logging/logEvent"; -type EmitToRoom = (roomId: string, event: string, payload?: unknown) => void; - type JoinRoomUseCaseParams = { roomManager: JoinRoomPort; socketId: string; data: roomTypes.JoinRoomPayload; - emitToRoom: EmitToRoom; + publishRoomUpdate: (roomId: string, room: roomTypes.Room) => void; }; export const joinRoomUseCase = ({ roomManager, socketId, data, - emitToRoom, + publishRoomUpdate, }: JoinRoomUseCaseParams) => { const { roomId, playerName } = data; logEvent("RoomUseCase", { @@ -29,7 +26,7 @@ const room = roomManager.addPlayerToRoom(roomId, socketId, playerName); - emitToRoom(roomId, protocol.SocketEvents.ROOM_UPDATE, room); + publishRoomUpdate(roomId, room); logEvent("RoomUseCase", { event: "ROOM_UPDATE", result: "emitted", diff --git a/apps/server/src/domains/room/application/useCases/roomDisconnectUseCase.ts b/apps/server/src/domains/room/application/useCases/roomDisconnectUseCase.ts index e3c4a14..bff69ef 100644 --- a/apps/server/src/domains/room/application/useCases/roomDisconnectUseCase.ts +++ b/apps/server/src/domains/room/application/useCases/roomDisconnectUseCase.ts @@ -1,19 +1,17 @@ -import { protocol } from "@repo/shared"; import type { DisconnectRoomPort } from "../ports/roomUseCasePorts"; +import type { roomTypes } from "@repo/shared"; import { logEvent } from "@server/logging/logEvent"; -type EmitToRoom = (roomId: string, event: string, payload?: unknown) => void; - type RoomDisconnectUseCaseParams = { roomManager: DisconnectRoomPort; socketId: string; - emitToRoom: EmitToRoom; + publishRoomUpdate: (roomId: string, room: roomTypes.Room) => void; }; export const roomDisconnectUseCase = ({ roomManager, socketId, - emitToRoom, + publishRoomUpdate, }: RoomDisconnectUseCaseParams) => { const updatedRooms = roomManager.removePlayer(socketId); logEvent("RoomUseCase", { @@ -24,7 +22,7 @@ }); updatedRooms.forEach((room) => { - emitToRoom(room.roomId, protocol.SocketEvents.ROOM_UPDATE, room); + publishRoomUpdate(room.roomId, room); logEvent("RoomUseCase", { event: "ROOM_UPDATE", result: "emitted", diff --git a/apps/server/src/network/createIo.ts b/apps/server/src/network/createIo.ts deleted file mode 100644 index e77fb86..0000000 --- a/apps/server/src/network/createIo.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Server } from "socket.io"; -import { config } from "@repo/shared"; -import type { Server as HttpServer } from "http"; - -export const createIo = (httpServer: HttpServer) => { - return new Server(httpServer, { - cors: { - origin: config.NETWORK_CONFIG.CORS_ORIGIN, - methods: [...config.NETWORK_CONFIG.CORS_METHODS], - }, - }); -}; diff --git a/apps/server/src/network/handlers/game/handleGameDisconnect.ts b/apps/server/src/network/handlers/game/handleGameDisconnect.ts index dc9e33d..b57e17f 100644 --- a/apps/server/src/network/handlers/game/handleGameDisconnect.ts +++ b/apps/server/src/network/handlers/game/handleGameDisconnect.ts @@ -1,5 +1,6 @@ import { Server } from "socket.io"; import { GameManager } from "@server/domains/game/GameManager"; +import { protocol } from "@repo/shared"; import { disconnectUseCase } from "@server/domains/game/application/useCases/disconnectUseCase"; import { createEmitToAll } from "@server/network/adapters/socketEmitters"; @@ -8,9 +9,13 @@ gameManager: GameManager, playerId: string ) => { + const emitToAll = createEmitToAll(io); + disconnectUseCase({ gameManager, playerId, - emitToAll: createEmitToAll(io), + publishPlayerRemoved: (removedPlayerId) => { + emitToAll(protocol.SocketEvents.REMOVE_PLAYER, removedPlayerId); + }, }); }; diff --git a/apps/server/src/network/handlers/game/registerGameHandlers.ts b/apps/server/src/network/handlers/game/registerGameHandlers.ts index 61a8f65..d60b385 100644 --- a/apps/server/src/network/handlers/game/registerGameHandlers.ts +++ b/apps/server/src/network/handlers/game/registerGameHandlers.ts @@ -20,7 +20,9 @@ socket.on(protocol.SocketEvents.PING, (clientTime: number) => { pingUseCase({ clientTime, - emitToSocket: common.emitToSocket, + publishPong: (payload) => { + common.emitToSocket(protocol.SocketEvents.PONG, payload); + }, }); }); @@ -29,7 +31,18 @@ ownerId: socket.id, gameManager, roomManager, - emitToRoom: common.emitToRoom, + publishUpdatePlayer: (roomId, playerData) => { + common.emitToRoom(roomId, protocol.SocketEvents.UPDATE_PLAYER, playerData); + }, + publishMapCellUpdates: (roomId, cellUpdates) => { + common.emitToRoom(roomId, protocol.SocketEvents.UPDATE_MAP_CELLS, cellUpdates); + }, + publishGameEnd: (roomId) => { + common.emitToRoom(roomId, protocol.SocketEvents.GAME_END); + }, + publishGameStart: (roomId, payload) => { + common.emitToRoom(roomId, protocol.SocketEvents.GAME_START, payload); + }, }); }); @@ -40,7 +53,12 @@ socketId: socket.id, roomId, gameManager, - emitToSocket: common.emitToSocket, + publishCurrentPlayers: (players) => { + common.emitToSocket(protocol.SocketEvents.CURRENT_PLAYERS, players); + }, + publishGameStart: (payload) => { + common.emitToSocket(protocol.SocketEvents.GAME_START, payload); + }, }); }); diff --git a/apps/server/src/network/handlers/room/handleRoomDisconnect.ts b/apps/server/src/network/handlers/room/handleRoomDisconnect.ts index 03046af..fce362d 100644 --- a/apps/server/src/network/handlers/room/handleRoomDisconnect.ts +++ b/apps/server/src/network/handlers/room/handleRoomDisconnect.ts @@ -1,5 +1,6 @@ import { Server, Socket } from "socket.io"; import { RoomManager } from "@server/domains/room/RoomManager"; +import { protocol } from "@repo/shared"; import { roomDisconnectUseCase } from "@server/domains/room/application/useCases/roomDisconnectUseCase"; import { createEmitToRoom } from "@server/network/adapters/socketEmitters"; @@ -8,9 +9,13 @@ socket: Socket, roomManager: RoomManager ) => { + const emitToRoom = createEmitToRoom(io); + roomDisconnectUseCase({ roomManager, socketId: socket.id, - emitToRoom: createEmitToRoom(io), + publishRoomUpdate: (roomId, room) => { + emitToRoom(roomId, protocol.SocketEvents.ROOM_UPDATE, room); + }, }); }; diff --git a/apps/server/src/network/handlers/room/registerRoomHandlers.ts b/apps/server/src/network/handlers/room/registerRoomHandlers.ts index f5173b5..c4a236b 100644 --- a/apps/server/src/network/handlers/room/registerRoomHandlers.ts +++ b/apps/server/src/network/handlers/room/registerRoomHandlers.ts @@ -21,7 +21,9 @@ roomManager, socketId: socket.id, data, - emitToRoom: common.emitToRoom, + publishRoomUpdate: (roomId, room) => { + common.emitToRoom(roomId, protocol.SocketEvents.ROOM_UPDATE, room); + }, }); }); }; diff --git "a/docs/01_Env/ENV_01_\347\222\260\345\242\203\346\247\213\347\257\211\343\203\273\346\212\200\350\241\223\343\202\271\343\202\277\343\203\203\343\202\257.txt" "b/docs/01_Env/ENV_01_\347\222\260\345\242\203\346\247\213\347\257\211\343\203\273\346\212\200\350\241\223\343\202\271\343\202\277\343\203\203\343\202\257.txt" index 3e34b9e..1ebe1d0 100644 --- "a/docs/01_Env/ENV_01_\347\222\260\345\242\203\346\247\213\347\257\211\343\203\273\346\212\200\350\241\223\343\202\271\343\202\277\343\203\203\343\202\257.txt" +++ "b/docs/01_Env/ENV_01_\347\222\260\345\242\203\346\247\213\347\257\211\343\203\273\346\212\200\350\241\223\343\202\271\343\202\277\343\203\203\343\202\257.txt" @@ -123,7 +123,6 @@ │ │ ├── createHttpServer.ts # HTTP生成 │ │ ├── createIo.ts # Socket.IO生成 │ │ └── boot.ts # 起動配線 - │ └── createIo.ts # 互換用ファイル ├── docs/ │ ├── 01_Env/ │ │ ├── ENV_01_環境構築・技術スタック.txt # 環境・技術定義