diff --git a/apps/server/src/network/SocketManager.ts b/apps/server/src/network/SocketManager.ts index 2498bdf..65dec7a 100644 --- a/apps/server/src/network/SocketManager.ts +++ b/apps/server/src/network/SocketManager.ts @@ -8,7 +8,7 @@ SocketConnectionRoomPort, SocketConnectionRuntimePort, } from "./types/connectionPorts"; -import { registerConnectionHandlers } from "./handlers/registerConnectionHandlers"; +import { registerConnectionHandlers } from "./handlers"; /** Socket.IOの接続ハンドラ登録を統括する */ export class SocketManager { diff --git a/apps/server/src/network/handlers/GameHandler.ts b/apps/server/src/network/handlers/GameHandler.ts deleted file mode 100644 index f317903..0000000 --- a/apps/server/src/network/handlers/GameHandler.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * GameHandler - * ゲーム関連ハンドラの公開窓口を提供する再エクスポートファイル - * ネットワーク層の import 経路を統一する - */ -/** ゲームイベント受信ハンドラ登録関数を外部参照向けに再公開 */ -export { registerGameHandlers } from "./game/registerGameHandlers"; diff --git a/apps/server/src/network/handlers/RoomHandler.ts b/apps/server/src/network/handlers/RoomHandler.ts deleted file mode 100644 index d3d8254..0000000 --- a/apps/server/src/network/handlers/RoomHandler.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * RoomHandler - * ルーム関連ハンドラの公開窓口を提供する再エクスポートファイル - * ネットワーク層の import 経路を統一する - */ -/** ルームイベント受信ハンドラ登録関数を外部参照向けに再公開 */ -export { registerRoomHandlers } from "./room/registerRoomHandlers"; diff --git a/apps/server/src/network/handlers/eventDefinitionRegistrar.ts b/apps/server/src/network/handlers/eventDefinitionRegistrar.ts index 196816b..4ad728c 100644 --- a/apps/server/src/network/handlers/eventDefinitionRegistrar.ts +++ b/apps/server/src/network/handlers/eventDefinitionRegistrar.ts @@ -68,25 +68,21 @@ }; /** 検証不要イベント定義を登録する */ -export const registerUnguardedEvents = ( +export const registerUnguardedEvent = ( subscribe: (event: TEvent, callback: () => void) => void, - definitions: UnguardedEventDefinition[], + definition: UnguardedEventDefinition, ): void => { - definitions.forEach((definition) => { - subscribe(definition.event, () => { - void definition.orchestrate(); - }); + subscribe(definition.event, () => { + void definition.orchestrate(); }); }; /** 汎用イベント定義を登録する */ -export const registerEvents = ( +export const registerEvent = ( subscribe: (event: TEvent, callback: (payload: TPayload) => void) => void, - definitions: EventDefinition[], + definition: EventDefinition, ): void => { - definitions.forEach((definition) => { - subscribe(definition.event, (payload) => { - void definition.orchestrate(payload); - }); + subscribe(definition.event, (payload) => { + void definition.orchestrate(payload); }); }; diff --git a/apps/server/src/network/handlers/game/registerGameHandlers.ts b/apps/server/src/network/handlers/game/registerGameHandlers.ts index 39107ec..22b807c 100644 --- a/apps/server/src/network/handlers/game/registerGameHandlers.ts +++ b/apps/server/src/network/handlers/game/registerGameHandlers.ts @@ -15,8 +15,7 @@ isPlaceBombPayload, isStartGamePayload, } from "@server/network/validation/socketPayloadValidators"; -import { createServerSocketOnBridge } from "@server/network/handlers/socketEventBridge"; -import { createPayloadGuard } from "@server/network/handlers/payloadGuard"; +import { createSocketRegistrationContext } from "@server/network/handlers/registration"; import type { GameOutputAdapter } from "./createGameOutputAdapter"; import { type BombHitReportEventPayload, @@ -35,7 +34,7 @@ import { registerGuardedEvent, registerSelfValidatedEvent, - registerUnguardedEvents, + registerUnguardedEvent, type GuardedEventDefinition, type SelfValidatedEventDefinition, type UnguardedEventDefinition, @@ -168,8 +167,7 @@ runtimeRegistry, gameOutputAdapter, ); - const { onEvent } = createServerSocketOnBridge(socket); - const { guardOnEvent } = createPayloadGuard(socket.id); + const { onEvent, guardOnEvent } = createSocketRegistrationContext(socket); // 検証が必要なイベントを宣言的に登録する const pingEventDefinition = createPingEventDefinition(orchestratorDeps); @@ -188,9 +186,8 @@ registerSelfValidatedEvent(onEvent, startGameEventDefinition); // 検証不要イベントを宣言的に登録する - const unguardedGameEventDefinitions: ReadyForGameEventDefinition[] = [ - createReadyForGameEventDefinition(orchestratorDeps), - ]; + const readyForGameEventDefinition: ReadyForGameEventDefinition = + createReadyForGameEventDefinition(orchestratorDeps); - registerUnguardedEvents(onEvent, unguardedGameEventDefinitions); + registerUnguardedEvent(onEvent, readyForGameEventDefinition); }; diff --git a/apps/server/src/network/handlers/index.ts b/apps/server/src/network/handlers/index.ts new file mode 100644 index 0000000..079d360 --- /dev/null +++ b/apps/server/src/network/handlers/index.ts @@ -0,0 +1,13 @@ +/** + * index + * handlers配下の公開APIを集約して再公開する + */ + +/** 接続イベントの共通ハンドラ登録関数を再公開する */ +export { registerConnectionHandlers } from "./registerConnectionHandlers"; + +/** ゲームイベント受信ハンドラ登録関数を再公開する */ +export { registerGameHandlers } from "./game/registerGameHandlers"; + +/** ルームイベント受信ハンドラ登録関数を再公開する */ +export { registerRoomHandlers } from "./room/registerRoomHandlers"; diff --git a/apps/server/src/network/handlers/registerConnectionHandlers.ts b/apps/server/src/network/handlers/registerConnectionHandlers.ts index 859ef6a..aa4b953 100644 --- a/apps/server/src/network/handlers/registerConnectionHandlers.ts +++ b/apps/server/src/network/handlers/registerConnectionHandlers.ts @@ -5,16 +5,18 @@ import { Server, Socket } from "socket.io"; import { protocol } from "@repo/shared"; import { disconnectCoordinator } from "@server/application/coordinators/disconnectCoordinator"; -import { registerGameHandlers } from "./GameHandler"; -import { registerRoomHandlers } from "./RoomHandler"; +import { registerGameHandlers } from "./game/registerGameHandlers"; +import { registerRoomHandlers } from "./room/registerRoomHandlers"; import { createDisconnectOutputAdapters, - createSocketOutputAdapters, } from "./createOutputAdapters"; import { logConnected, logDisconnected } from "./connectionEventLogger"; import { - registerEvents, - registerUnguardedEvents, + createConnectionRegistrationContext, +} from "./registration"; +import { + registerEvent, + registerUnguardedEvent, type EventDefinition, type UnguardedEventDefinition, } from "./eventDefinitionRegistrar"; @@ -22,25 +24,6 @@ RegisterConnectionHandlersParams, } from "../types/connectionPorts"; -/** 接続イベント調停で利用する依存束 */ -type ConnectionHandlerDeps = { - io: Server; - socket: Socket; -} & Omit; - -/** 接続ハンドラで利用する依存束を生成する */ -const createConnectionHandlerDeps = ( - params: RegisterConnectionHandlersParams, - socket: Socket, -): ConnectionHandlerDeps => { - return { - io: params.io, - socket, - roomManager: params.roomManager, - runtimeRegistry: params.runtimeRegistry, - }; -}; - /** ソケット接続と切断イベントに対する共通ハンドラを登録する */ export const registerConnectionHandlers = ({ io, @@ -50,76 +33,71 @@ const disconnectOutputAdapters = createDisconnectOutputAdapters(io); // CONNECTイベントを宣言的に登録する - const onConnectEventDefinitions: EventDefinition< + const onConnectEventDefinition: EventDefinition< typeof protocol.SocketEvents.CONNECT, Socket - >[] = [ - { - event: protocol.SocketEvents.CONNECT, - orchestrate: (socket) => { - const deps = createConnectionHandlerDeps( - { - io, - roomManager, - runtimeRegistry, - }, - socket, - ); - const socketOutputAdapters = createSocketOutputAdapters(deps.io, deps.socket); +> = { + event: protocol.SocketEvents.CONNECT, + orchestrate: (socket) => { + const { deps, socketOutputAdapters } = createConnectionRegistrationContext( + { + io, + roomManager, + runtimeRegistry, + }, + socket, + ); - // 接続ログを記録してドメイン別ハンドラを登録する - logConnected(deps.socket.id); + // 接続ログを記録してドメイン別ハンドラを登録する + logConnected(deps.socket.id); - registerRoomHandlers( - deps.socket, - deps.roomManager, - deps.runtimeRegistry, - socketOutputAdapters.room, - ); - registerGameHandlers( - deps.socket, - deps.roomManager, - deps.runtimeRegistry, - socketOutputAdapters.game, - ); + registerRoomHandlers( + deps.socket, + deps.roomManager, + deps.runtimeRegistry, + socketOutputAdapters.room, + ); + registerGameHandlers( + deps.socket, + deps.roomManager, + deps.runtimeRegistry, + socketOutputAdapters.game, + ); - // ソケット単位イベントを宣言的に登録する - const perSocketEventDefinitions: UnguardedEventDefinition< - typeof protocol.SocketEvents.DISCONNECT - >[] = [ - { - event: protocol.SocketEvents.DISCONNECT, - orchestrate: () => { - // 切断ログ記録後にドメイン別の後処理を実行する - logDisconnected(deps.socket.id); + // ソケット単位イベントを宣言的に登録する + const perSocketEventDefinition: UnguardedEventDefinition< + typeof protocol.SocketEvents.DISCONNECT + > = { + event: protocol.SocketEvents.DISCONNECT, + orchestrate: () => { + // 切断ログ記録後にドメイン別の後処理を実行する + logDisconnected(deps.socket.id); - disconnectCoordinator({ - socketId: deps.socket.id, - roomManager: deps.roomManager, - runtimeRegistry: deps.runtimeRegistry, - gameOutput: disconnectOutputAdapters.game, - roomOutput: disconnectOutputAdapters.room, - }); - }, - }, - ]; + disconnectCoordinator({ + socketId: deps.socket.id, + roomManager: deps.roomManager, + runtimeRegistry: deps.runtimeRegistry, + gameOutput: disconnectOutputAdapters.game, + roomOutput: disconnectOutputAdapters.room, + }); + }, + }; - registerUnguardedEvents( - (event, callback) => { - deps.socket.on(event, callback); - }, - perSocketEventDefinitions, - ); - }, + registerUnguardedEvent( + (event, callback) => { + deps.socket.on(event, callback); + }, + perSocketEventDefinition, + ); }, - ]; + }; - registerEvents( + registerEvent( (event, callback) => { io.on(event, (socket) => { callback(socket); }); }, - onConnectEventDefinitions, + onConnectEventDefinition, ); }; diff --git a/apps/server/src/network/handlers/registration/createConnectionRegistrationContext.ts b/apps/server/src/network/handlers/registration/createConnectionRegistrationContext.ts new file mode 100644 index 0000000..2a087a6 --- /dev/null +++ b/apps/server/src/network/handlers/registration/createConnectionRegistrationContext.ts @@ -0,0 +1,40 @@ +/** + * createConnectionRegistrationContext + * 接続イベント登録で利用する依存束と送信アダプタを生成する + */ +import type { Server, Socket } from "socket.io"; +import type { RegisterConnectionHandlersParams } from "../../types/connectionPorts"; +import { + createSocketOutputAdapters, + type SocketOutputAdapters, +} from "../createOutputAdapters"; + +/** 接続イベント調停で利用する依存束 */ +export type ConnectionHandlerDeps = { + io: Server; + socket: Socket; +} & Omit; + +/** 接続イベント登録で利用する共通コンテキスト */ +export type ConnectionRegistrationContext = { + deps: ConnectionHandlerDeps; + socketOutputAdapters: SocketOutputAdapters; +}; + +/** 接続イベント登録で利用する共通コンテキストを生成する */ +export const createConnectionRegistrationContext = ( + params: RegisterConnectionHandlersParams, + socket: Socket, +): ConnectionRegistrationContext => { + const deps: ConnectionHandlerDeps = { + io: params.io, + socket, + roomManager: params.roomManager, + runtimeRegistry: params.runtimeRegistry, + }; + + return { + deps, + socketOutputAdapters: createSocketOutputAdapters(deps.io, deps.socket), + }; +}; diff --git a/apps/server/src/network/handlers/registration/createSocketRegistrationContext.ts b/apps/server/src/network/handlers/registration/createSocketRegistrationContext.ts new file mode 100644 index 0000000..1eb2d3e --- /dev/null +++ b/apps/server/src/network/handlers/registration/createSocketRegistrationContext.ts @@ -0,0 +1,26 @@ +/** + * createSocketRegistrationContext + * ソケット受信イベント登録で利用する共通コンテキストを生成する + */ +import type { Socket } from "socket.io"; +import { createPayloadGuard } from "../payloadGuard"; +import { createServerSocketOnBridge } from "../socketEventBridge"; + +/** 受信イベント登録で利用する共通コンテキスト */ +export type SocketRegistrationContext = { + onEvent: ReturnType["onEvent"]; + guardOnEvent: ReturnType["guardOnEvent"]; +}; + +/** ソケット受信イベント登録で利用する共通コンテキストを生成する */ +export const createSocketRegistrationContext = ( + socket: Socket, +): SocketRegistrationContext => { + const { onEvent } = createServerSocketOnBridge(socket); + const { guardOnEvent } = createPayloadGuard(socket.id); + + return { + onEvent, + guardOnEvent, + }; +}; diff --git a/apps/server/src/network/handlers/registration/index.ts b/apps/server/src/network/handlers/registration/index.ts new file mode 100644 index 0000000..d66cde1 --- /dev/null +++ b/apps/server/src/network/handlers/registration/index.ts @@ -0,0 +1,21 @@ +/** + * index + * registration配下の公開APIを集約して再公開する + */ + +/** ソケット受信イベント登録コンテキストを再公開する */ +export { + createSocketRegistrationContext, +} from "./createSocketRegistrationContext"; +export type { + SocketRegistrationContext, +} from "./createSocketRegistrationContext"; + +/** 接続イベント登録コンテキストを再公開する */ +export { + createConnectionRegistrationContext, +} from "./createConnectionRegistrationContext"; +export type { + ConnectionHandlerDeps, + ConnectionRegistrationContext, +} from "./createConnectionRegistrationContext"; diff --git a/apps/server/src/network/handlers/room/registerRoomHandlers.ts b/apps/server/src/network/handlers/room/registerRoomHandlers.ts index 5264d12..7fdd565 100644 --- a/apps/server/src/network/handlers/room/registerRoomHandlers.ts +++ b/apps/server/src/network/handlers/room/registerRoomHandlers.ts @@ -8,12 +8,12 @@ JoinRoomEventRoomUseCasePort, JoinRoomEventRuntimeUseCasePort, } from "@server/network/types/connectionPorts"; -import { createPayloadGuard } from "@server/network/handlers/payloadGuard"; -import { createServerSocketOnBridge } from "@server/network/handlers/socketEventBridge"; +import { createSocketRegistrationContext } from "@server/network/handlers/registration"; import { isJoinRoomPayload } from "@server/network/validation/socketPayloadValidators"; import type { RoomOutputAdapter } from "./createRoomOutputAdapter"; import { handleJoinRoomEvent, + type JoinRoomEventPayload, type JoinRoomOrchestratorDeps, } from "./roomEventOrchestrators"; import { @@ -23,7 +23,7 @@ type JoinRoomEventDefinition = GuardedEventDefinition< typeof protocol.SocketEvents.JOIN_ROOM, - Parameters[1] + JoinRoomEventPayload >; /** ルーム受信イベントごとの入力検証関数を保持するテーブル */ @@ -75,8 +75,7 @@ runtimeRegistry, roomOutputAdapter, ); - const { onEvent } = createServerSocketOnBridge(socket); - const { guardOnEvent } = createPayloadGuard(socket.id); + const { onEvent, guardOnEvent } = createSocketRegistrationContext(socket); // 検証が必要なイベントを宣言的に登録する const joinRoomEventDefinition = createJoinRoomEventDefinition( diff --git a/apps/server/src/network/handlers/room/roomEventOrchestrators.ts b/apps/server/src/network/handlers/room/roomEventOrchestrators.ts index 7b13c35..3de3c7a 100644 --- a/apps/server/src/network/handlers/room/roomEventOrchestrators.ts +++ b/apps/server/src/network/handlers/room/roomEventOrchestrators.ts @@ -23,6 +23,9 @@ joinRoom: (roomId: string) => Promise; }; +/** JOIN_ROOMイベントの入力ペイロード型 */ +export type JoinRoomEventPayload = Parameters[1]; + /** JOIN_ROOMイベントを調停して参加ユースケースを実行する */ export const handleJoinRoomEvent = async ( deps: JoinRoomOrchestratorDeps,