diff --git a/apps/client/src/network/handlers/CommonHandler.ts b/apps/client/src/network/handlers/CommonHandler.ts index 61b35d2..76b798a 100644 --- a/apps/client/src/network/handlers/CommonHandler.ts +++ b/apps/client/src/network/handlers/CommonHandler.ts @@ -1,8 +1,7 @@ import type { Socket } from "socket.io-client"; import { protocol } from "@repo/shared"; -import type { PayloadOf, SocketPayloadMap } from "@repo/shared"; - -type SocketEventName = keyof SocketPayloadMap; +import type { PayloadOf } from "@repo/shared"; +import { createClientSocketEventBridge } from "./socketEventBridge"; type CommonHandler = { onConnect: (callback: (id: string) => void) => void; @@ -15,19 +14,7 @@ (payload: PayloadOf) => void >(); - const onEvent = ( - event: TEvent, - callback: (payload: PayloadOf) => void - ) => { - (socket as any).on(event, callback); - }; - - const offEvent = ( - event: TEvent, - callback: (payload: PayloadOf) => void - ) => { - (socket as any).off(event, callback); - }; + const { onEvent, offEvent } = createClientSocketEventBridge(socket); return { onConnect: (callback: (id: string) => void) => { diff --git a/apps/client/src/network/handlers/GameHandler.ts b/apps/client/src/network/handlers/GameHandler.ts index 597f7e3..926875c 100644 --- a/apps/client/src/network/handlers/GameHandler.ts +++ b/apps/client/src/network/handlers/GameHandler.ts @@ -10,14 +10,11 @@ GameStartPayload, MovePayload, NewPlayerPayload, - PayloadOf, RemovePlayerPayload, - SocketPayloadMap, UpdateMapCellsPayload, UpdatePlayersPayload, } from "@repo/shared"; - -type SocketEventName = Exclude; +import { createClientSocketEventBridge } from "./socketEventBridge"; /** ゲームシーンが利用するソケット操作の契約 */ export type GameHandler = { @@ -39,30 +36,7 @@ /** ソケットインスタンスからゲーム向けハンドラを生成する */ export const createGameHandler = (socket: Socket): GameHandler => { - const onEvent = ( - event: TEvent, - callback: (payload: PayloadOf) => void - ) => { - (socket as any).on(event, callback); - }; - - const offEvent = ( - event: TEvent, - callback: (payload: PayloadOf) => void - ) => { - (socket as any).off(event, callback); - }; - - function emitEvent(event: TEvent): void; - function emitEvent(event: TEvent, payload: PayloadOf): void; - function emitEvent(event: TEvent, payload?: PayloadOf): void { - if (payload === undefined) { - (socket as any).emit(event); - return; - } - - (socket as any).emit(event, payload); - } + const { onEvent, offEvent, emitEvent } = createClientSocketEventBridge(socket); return { onCurrentPlayers: (callback) => { diff --git a/apps/client/src/network/handlers/LobbyHandler.ts b/apps/client/src/network/handlers/LobbyHandler.ts index 0a7cad1..338b2e8 100644 --- a/apps/client/src/network/handlers/LobbyHandler.ts +++ b/apps/client/src/network/handlers/LobbyHandler.ts @@ -1,8 +1,7 @@ import type { Socket } from "socket.io-client"; import { protocol } from "@repo/shared"; -import type { PayloadOf, SocketPayloadMap } from "@repo/shared"; - -type SocketEventName = Exclude; +import type { PayloadOf } from "@repo/shared"; +import { createClientSocketEventBridge } from "./socketEventBridge"; type LobbyHandler = { onRoomUpdate: (callback: (room: PayloadOf) => void) => void; @@ -11,30 +10,7 @@ }; export const createLobbyHandler = (socket: Socket): LobbyHandler => { - const onEvent = ( - event: TEvent, - callback: (payload: PayloadOf) => void - ) => { - (socket as any).on(event, callback); - }; - - const offEvent = ( - event: TEvent, - callback: (payload: PayloadOf) => void - ) => { - (socket as any).off(event, callback); - }; - - function emitEvent(event: TEvent): void; - function emitEvent(event: TEvent, payload: PayloadOf): void; - function emitEvent(event: TEvent, payload?: PayloadOf): void { - if (payload === undefined) { - (socket as any).emit(event); - return; - } - - (socket as any).emit(event, payload); - } + const { onEvent, offEvent, emitEvent } = createClientSocketEventBridge(socket); return { onRoomUpdate: (callback) => { diff --git a/apps/client/src/network/handlers/TitleHandler.ts b/apps/client/src/network/handlers/TitleHandler.ts index d91da27..bdf970e 100644 --- a/apps/client/src/network/handlers/TitleHandler.ts +++ b/apps/client/src/network/handlers/TitleHandler.ts @@ -1,8 +1,7 @@ import type { Socket } from "socket.io-client"; import { protocol } from "@repo/shared"; -import type { PayloadOf, SocketPayloadMap } from "@repo/shared"; - -type SocketEventName = Exclude; +import type { PayloadOf } from "@repo/shared"; +import { createClientSocketEventBridge } from "./socketEventBridge"; type TitleHandler = { joinRoom: (payload: PayloadOf) => void; @@ -11,30 +10,7 @@ }; export const createTitleHandler = (socket: Socket): TitleHandler => { - const onEvent = ( - event: TEvent, - callback: (payload: PayloadOf) => void - ) => { - (socket as any).on(event, callback); - }; - - const offEvent = ( - event: TEvent, - callback: (payload: PayloadOf) => void - ) => { - (socket as any).off(event, callback); - }; - - function emitEvent(event: TEvent): void; - function emitEvent(event: TEvent, payload: PayloadOf): void; - function emitEvent(event: TEvent, payload?: PayloadOf): void { - if (payload === undefined) { - (socket as any).emit(event); - return; - } - - (socket as any).emit(event, payload); - } + const { onEvent, offEvent, emitEvent } = createClientSocketEventBridge(socket); return { joinRoom: (payload) => { diff --git a/apps/client/src/network/handlers/socketEventBridge.ts b/apps/client/src/network/handlers/socketEventBridge.ts new file mode 100644 index 0000000..56615ad --- /dev/null +++ b/apps/client/src/network/handlers/socketEventBridge.ts @@ -0,0 +1,37 @@ +import type { Socket } from "socket.io-client"; +import type { PayloadOf, SocketPayloadMap } from "@repo/shared"; + +type SocketEventName = keyof SocketPayloadMap; + +export const createClientSocketEventBridge = (socket: Socket) => { + const onEvent = ( + event: TEvent, + callback: (payload: PayloadOf) => void + ) => { + (socket as any).on(event, callback); + }; + + const offEvent = ( + event: TEvent, + callback: (payload: PayloadOf) => void + ) => { + (socket as any).off(event, callback); + }; + + function emitEvent(event: TEvent): void; + function emitEvent(event: TEvent, payload: PayloadOf): void; + function emitEvent(event: TEvent, payload?: PayloadOf): void { + if (payload === undefined) { + (socket as any).emit(event); + return; + } + + (socket as any).emit(event, payload); + } + + return { + onEvent, + offEvent, + emitEvent, + }; +}; diff --git a/apps/server/src/network/handlers/game/registerGameHandlers.ts b/apps/server/src/network/handlers/game/registerGameHandlers.ts index 302daf7..5b1b631 100644 --- a/apps/server/src/network/handlers/game/registerGameHandlers.ts +++ b/apps/server/src/network/handlers/game/registerGameHandlers.ts @@ -4,7 +4,6 @@ */ import { Server, Socket } from "socket.io"; import { protocol } from "@repo/shared"; -import type { PayloadOf, SocketPayloadMap } from "@repo/shared"; import { readyForGameCoordinator } from "@server/application/coordinators/readyForGameCoordinator"; import { startGameCoordinator } from "@server/application/coordinators/startGameCoordinator"; import type { @@ -19,10 +18,9 @@ import { logEvent } from "@server/logging/logEvent"; import { createCommonHandlerContext } from "@server/network/handlers/CommonHandler"; import { isMovePayload, isPingPayload } from "@server/network/validation/socketPayloadValidators"; +import { createServerSocketOnBridge } from "@server/network/handlers/socketEventBridge"; import { createGameOutputAdapter } from "./createGameOutputAdapter"; -type SocketEventName = Exclude; - /** ゲームイベントの購読とユースケース呼び出しを設定する */ export const registerGameHandlers = ( io: Server, @@ -32,13 +30,7 @@ ) => { const common = createCommonHandlerContext(io, socket); const gameOutputAdapter = createGameOutputAdapter(common); - - const onEvent = ( - event: TEvent, - callback: (payload: PayloadOf) => void - ) => { - (socket as any).on(event, callback); - }; + const { onEvent } = createServerSocketOnBridge(socket); // 遅延計測用のPINGを検証しPONGを返す onEvent(protocol.SocketEvents.PING, (clientTime) => { diff --git a/apps/server/src/network/handlers/room/registerRoomHandlers.ts b/apps/server/src/network/handlers/room/registerRoomHandlers.ts index 459305c..e799931 100644 --- a/apps/server/src/network/handlers/room/registerRoomHandlers.ts +++ b/apps/server/src/network/handlers/room/registerRoomHandlers.ts @@ -4,16 +4,14 @@ */ import { Server, Socket } from "socket.io"; import { protocol } from "@repo/shared"; -import type { PayloadOf, SocketPayloadMap } from "@repo/shared"; import type { JoinRoomPort } from "@server/domains/room/application/ports/roomUseCasePorts"; import { joinRoomUseCase } from "@server/domains/room/application/useCases/joinRoomUseCase"; import { logEvent } from "@server/logging/logEvent"; import { createCommonHandlerContext } from "@server/network/handlers/CommonHandler"; +import { createServerSocketOnBridge } from "@server/network/handlers/socketEventBridge"; import { isJoinRoomPayload } from "@server/network/validation/socketPayloadValidators"; import { createRoomOutputAdapter } from "./createRoomOutputAdapter"; -type SocketEventName = Exclude; - /** ルーム参加イベントを検証して参加ユースケースへ連携する */ export const registerRoomHandlers = ( io: Server, @@ -22,13 +20,7 @@ ) => { const common = createCommonHandlerContext(io, socket); const roomOutputAdapter = createRoomOutputAdapter(common); - - const onEvent = ( - event: TEvent, - callback: (payload: PayloadOf) => void - ) => { - (socket as any).on(event, callback); - }; + const { onEvent } = createServerSocketOnBridge(socket); // 参加要求のペイロード検証と参加処理を実行する onEvent(protocol.SocketEvents.JOIN_ROOM, async (data) => { diff --git a/apps/server/src/network/handlers/socketEventBridge.ts b/apps/server/src/network/handlers/socketEventBridge.ts new file mode 100644 index 0000000..54d0369 --- /dev/null +++ b/apps/server/src/network/handlers/socketEventBridge.ts @@ -0,0 +1,17 @@ +import type { Socket } from "socket.io"; +import type { PayloadOf, SocketPayloadMap } from "@repo/shared"; + +type SocketEventName = Exclude; + +export const createServerSocketOnBridge = (socket: Socket) => { + const onEvent = ( + event: TEvent, + callback: (payload: PayloadOf) => void + ) => { + (socket as any).on(event, callback); + }; + + return { + onEvent, + }; +};