diff --git a/apps/server/src/domains/room/application/ports/roomUseCasePorts.ts b/apps/server/src/domains/room/application/ports/roomUseCasePorts.ts index b00b3c8..c381914 100644 --- a/apps/server/src/domains/room/application/ports/roomUseCasePorts.ts +++ b/apps/server/src/domains/room/application/ports/roomUseCasePorts.ts @@ -10,6 +10,12 @@ status: "joined" | "duplicate" | "full"; }; +/** ルームユースケースが利用する出力ポート */ +export interface RoomOutputPort { + publishRoomUpdate(roomId: roomTypes.Room["roomId"], room: roomTypes.Room): void; + publishJoinRejected(payload: roomTypes.JoinRoomRejectedPayload): void; +} + /** ルーム参加ユースケースが利用する参加操作ポート */ export interface JoinRoomPort { addPlayerToRoom(roomId: string, socketId: string, playerName: string): JoinRoomResult; diff --git a/apps/server/src/domains/room/application/useCases/joinRoomUseCase.ts b/apps/server/src/domains/room/application/useCases/joinRoomUseCase.ts index ecca7bd..406bc68 100644 --- a/apps/server/src/domains/room/application/useCases/joinRoomUseCase.ts +++ b/apps/server/src/domains/room/application/useCases/joinRoomUseCase.ts @@ -3,14 +3,18 @@ * ルーム参加要求を処理し,状態更新を配信するユースケース */ import type { roomTypes } from "@repo/shared"; -import type { JoinRoomPort, JoinRoomResult } from "../ports/roomUseCasePorts"; +import type { + JoinRoomPort, + JoinRoomResult, + RoomOutputPort, +} from "../ports/roomUseCasePorts"; import { logEvent } from "@server/logging/logEvent"; type JoinRoomUseCaseParams = { roomManager: JoinRoomPort; socketId: string; data: roomTypes.JoinRoomPayload; - publishRoomUpdate: (roomId: roomTypes.Room["roomId"], room: roomTypes.Room) => void; + output: RoomOutputPort; }; /** 参加イベントを受け取り,ルーム更新を配信する */ @@ -18,7 +22,7 @@ roomManager, socketId, data, - publishRoomUpdate, + output, }: JoinRoomUseCaseParams): JoinRoomResult => { const { roomId, playerName } = data; logEvent("RoomUseCase", { @@ -31,6 +35,11 @@ const joinResult = roomManager.addPlayerToRoom(roomId, socketId, playerName); if (joinResult.status !== "joined") { + output.publishJoinRejected({ + roomId, + reason: joinResult.status, + }); + logEvent("RoomUseCase", { event: "JOIN_ROOM", result: "rejected", @@ -41,7 +50,7 @@ return joinResult; } - publishRoomUpdate(roomId, joinResult.room); + output.publishRoomUpdate(roomId, joinResult.room); return joinResult; }; diff --git a/apps/server/src/domains/room/application/useCases/roomDisconnectUseCase.ts b/apps/server/src/domains/room/application/useCases/roomDisconnectUseCase.ts index 1f3a4e1..2fe1be0 100644 --- a/apps/server/src/domains/room/application/useCases/roomDisconnectUseCase.ts +++ b/apps/server/src/domains/room/application/useCases/roomDisconnectUseCase.ts @@ -3,20 +3,20 @@ * 切断時のルーム退出処理と状態更新配信を行うユースケース */ import type { DisconnectRoomPort } from "../ports/roomUseCasePorts"; -import type { roomTypes } from "@repo/shared"; +import type { RoomOutputPort } from "../ports/roomUseCasePorts"; import { logEvent } from "@server/logging/logEvent"; type RoomDisconnectUseCaseParams = { roomManager: DisconnectRoomPort; socketId: string; - publishRoomUpdate: (roomId: roomTypes.Room["roomId"], room: roomTypes.Room) => void; + output: Pick; }; /** 切断ソケットを各ルームから退出させ,更新ルームを配信する */ export const roomDisconnectUseCase = ({ roomManager, socketId, - publishRoomUpdate, + output, }: RoomDisconnectUseCaseParams) => { const updatedRooms = roomManager.removePlayer(socketId); logEvent("RoomUseCase", { @@ -27,7 +27,7 @@ }); updatedRooms.forEach((room) => { - publishRoomUpdate(room.roomId, room); + output.publishRoomUpdate(room.roomId, room); logEvent("RoomUseCase", { event: "ROOM_UPDATE", result: "emitted", diff --git a/apps/server/src/network/handlers/room/createRoomEventPublisher.ts b/apps/server/src/network/handlers/room/createRoomEventPublisher.ts index 5e2bf4d..d838bcc 100644 --- a/apps/server/src/network/handlers/room/createRoomEventPublisher.ts +++ b/apps/server/src/network/handlers/room/createRoomEventPublisher.ts @@ -6,16 +6,14 @@ 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 = { - publishRoomUpdate: (roomId: RoomId, room: RoomUpdatePayload) => void; - publishJoinRejected: (payload: roomTypes.JoinRoomRejectedPayload) => void; -}; +export type RoomEventPublisher = RoomOutputPort; /** 共通送信コンテキストからルームイベント送信関数を生成する */ export const createRoomEventPublisher = ( @@ -32,15 +30,14 @@ }; /** 切断時のルーム更新送信関数を生成する */ -export const createRoomDisconnectPublisher = (io: Server): RoomEventPublisher => { +export const createRoomDisconnectPublisher = ( + io: Server +): Pick => { const emitToRoom = createEmitToRoom(io); return { publishRoomUpdate: (roomId: RoomId, room: RoomUpdatePayload) => { emitToRoom(roomId, protocol.SocketEvents.ROOM_UPDATE, room); }, - publishJoinRejected: () => { - return; - }, }; }; diff --git a/apps/server/src/network/handlers/room/handleRoomDisconnect.ts b/apps/server/src/network/handlers/room/handleRoomDisconnect.ts index c711d20..c0f1bd1 100644 --- a/apps/server/src/network/handlers/room/handleRoomDisconnect.ts +++ b/apps/server/src/network/handlers/room/handleRoomDisconnect.ts @@ -18,6 +18,6 @@ roomDisconnectUseCase({ roomManager, socketId: socket.id, - publishRoomUpdate: roomDisconnectPublisher.publishRoomUpdate, + output: roomDisconnectPublisher, }); }; diff --git a/apps/server/src/network/handlers/room/registerRoomHandlers.ts b/apps/server/src/network/handlers/room/registerRoomHandlers.ts index d1000ce..ebca36a 100644 --- a/apps/server/src/network/handlers/room/registerRoomHandlers.ts +++ b/apps/server/src/network/handlers/room/registerRoomHandlers.ts @@ -5,7 +5,6 @@ import { Server, Socket } from "socket.io"; import { RoomManager } from "@server/domains/room/RoomManager"; import { protocol } from "@repo/shared"; -import type { roomTypes } from "@repo/shared"; import { joinRoomUseCase } from "@server/domains/room/application/useCases/joinRoomUseCase"; import { createCommonHandlerContext } from "@server/network/handlers/CommonHandler"; import { createRoomEventPublisher } from "./createRoomEventPublisher"; @@ -33,24 +32,17 @@ } const { roomId } = data; - let joinedRoom: roomTypes.Room | null = null; const joinResult = joinRoomUseCase({ roomManager, socketId: socket.id, data, - publishRoomUpdate: (_roomId, room) => { - joinedRoom = room; - }, + output: roomPublisher, }); // 参加拒否時は理由を通知する switch (joinResult.status) { case "full": - roomPublisher.publishJoinRejected({ - roomId, - reason: "full", - }); logEvent("Network", { event: "JOIN_ROOM", result: "rejected_room_full", @@ -60,10 +52,6 @@ return; case "duplicate": - roomPublisher.publishJoinRejected({ - roomId, - reason: "duplicate", - }); logEvent("Network", { event: "JOIN_ROOM", result: "rejected_duplicate",