diff --git a/apps/client/src/hooks/useAppFlow.ts b/apps/client/src/hooks/useAppFlow.ts index 66b9b40..b27d4c2 100644 --- a/apps/client/src/hooks/useAppFlow.ts +++ b/apps/client/src/hooks/useAppFlow.ts @@ -1,9 +1,15 @@ +/** + * useAppFlow + * アプリ全体の画面遷移と参加フロー状態を管理するフック + * 参加要求の成功失敗と接続状態を統合してシーンへ渡す + */ import { useCallback, useReducer, useRef, useState } from "react"; import { socketManager } from "@client/network/SocketManager"; import { appConsts, config } from "@repo/shared"; import type { appTypes, roomTypes } from "@repo/shared"; import { useSocketSubscriptions } from "./useSocketSubscriptions"; +/** アプリフロー管理フックの公開状態と操作を表す型 */ type AppFlowState = { scenePhase: appTypes.ScenePhase; room: roomTypes.Room | null; @@ -52,6 +58,7 @@ return state; }; +/** アプリ全体のシーン状態と参加要求フローを管理するフック */ export const useAppFlow = (): AppFlowState => { const [scenePhase, setScenePhase] = useState(appConsts.ScenePhase.TITLE); const [room, setRoom] = useState(null); diff --git a/apps/client/src/hooks/useSocketSubscriptions.ts b/apps/client/src/hooks/useSocketSubscriptions.ts index a43f0b9..fdd75ef 100644 --- a/apps/client/src/hooks/useSocketSubscriptions.ts +++ b/apps/client/src/hooks/useSocketSubscriptions.ts @@ -1,3 +1,8 @@ +/** + * useSocketSubscriptions + * アプリ共通で必要なソケット購読を登録するフック + * 接続,ルーム更新,ゲーム開始の購読と解除を一元化する + */ import { useEffect } from "react"; import { socketManager } from "@client/network/SocketManager"; import { appConsts } from "@repo/shared"; @@ -10,6 +15,7 @@ setScenePhase: (phase: appTypes.ScenePhase) => void; }; +/** アプリ共通のソケット購読を登録しクリーンアップするフック */ export const useSocketSubscriptions = ({ completeJoinRequest, setMyId, diff --git a/apps/client/src/network/handlers/CommonHandler.ts b/apps/client/src/network/handlers/CommonHandler.ts index a9820f7..9f08170 100644 --- a/apps/client/src/network/handlers/CommonHandler.ts +++ b/apps/client/src/network/handlers/CommonHandler.ts @@ -1,13 +1,20 @@ +/** + * CommonHandler + * 接続イベントの購読と解除を扱う共通ハンドラを提供する + * connect イベントをアプリ用の id 通知に変換する + */ import type { Socket } from "socket.io-client"; import { protocol } from "@repo/shared"; import type { ConnectionLifecyclePayloadOf } from "@repo/shared"; import { createClientSocketEventBridge } from "./socketEventBridge"; +/** 接続イベントを購読解除する共通ハンドラ契約 */ type CommonHandler = { onConnect: (callback: (id: string) => void) => void; offConnect: (callback: (id: string) => void) => void; }; +/** 接続イベント向けの共通ハンドラを生成する */ export const createCommonHandler = (socket: Socket): CommonHandler => { const connectListenerMap = new Map< (id: string) => void, @@ -39,4 +46,5 @@ }; }; +/** 接続イベント向けの共通ハンドラ型を再公開 */ export type { CommonHandler }; diff --git a/apps/client/src/network/handlers/LobbyHandler.ts b/apps/client/src/network/handlers/LobbyHandler.ts index 031ed4c..ca0cb41 100644 --- a/apps/client/src/network/handlers/LobbyHandler.ts +++ b/apps/client/src/network/handlers/LobbyHandler.ts @@ -1,8 +1,14 @@ +/** + * LobbyHandler + * ロビー画面で利用するソケット購読と送信を扱うハンドラ + * ルーム更新購読とゲーム開始要求送信を提供する + */ import type { Socket } from "socket.io-client"; import { protocol } from "@repo/shared"; import type { ServerToClientPayloadOf } from "@repo/shared"; import { createClientSocketEventBridge } from "./socketEventBridge"; +/** ロビー画面で利用する通信操作の契約 */ type LobbyHandler = { onRoomUpdate: (callback: (room: ServerToClientPayloadOf) => void) => void; onceRoomUpdate: (callback: (room: ServerToClientPayloadOf) => void) => void; @@ -10,6 +16,7 @@ startGame: () => void; }; +/** ロビー画面向けのソケットハンドラを生成する */ export const createLobbyHandler = (socket: Socket): LobbyHandler => { const { onEvent, onceEvent, offEvent, emitEvent } = createClientSocketEventBridge(socket); @@ -29,4 +36,5 @@ }; }; +/** ロビー画面向けの通信ハンドラ型を再公開 */ export type { LobbyHandler }; diff --git a/apps/client/src/network/handlers/TitleHandler.ts b/apps/client/src/network/handlers/TitleHandler.ts index d3c23ad..06b18d8 100644 --- a/apps/client/src/network/handlers/TitleHandler.ts +++ b/apps/client/src/network/handlers/TitleHandler.ts @@ -1,8 +1,14 @@ +/** + * TitleHandler + * タイトル画面で利用する参加要求送信と拒否購読を扱うハンドラ + * ルーム参加フローの送受信イベントを集約する + */ import type { Socket } from "socket.io-client"; import { protocol } from "@repo/shared"; import type { ClientToServerPayloadOf, ServerToClientPayloadOf } from "@repo/shared"; import { createClientSocketEventBridge } from "./socketEventBridge"; +/** タイトル画面で利用する通信操作の契約 */ type TitleHandler = { joinRoom: (payload: ClientToServerPayloadOf) => void; onJoinRejected: (callback: (payload: ServerToClientPayloadOf) => void) => void; @@ -10,6 +16,7 @@ offJoinRejected: (callback: (payload: ServerToClientPayloadOf) => void) => void; }; +/** タイトル画面向けのソケットハンドラを生成する */ export const createTitleHandler = (socket: Socket): TitleHandler => { const { onEvent, onceEvent, offEvent, emitEvent } = createClientSocketEventBridge(socket); @@ -29,4 +36,5 @@ }; }; +/** タイトル画面向けの通信ハンドラ型を再公開 */ export type { TitleHandler }; diff --git a/apps/client/src/network/handlers/socketEventBridge.ts b/apps/client/src/network/handlers/socketEventBridge.ts index c7daa19..143fe00 100644 --- a/apps/client/src/network/handlers/socketEventBridge.ts +++ b/apps/client/src/network/handlers/socketEventBridge.ts @@ -1,3 +1,8 @@ +/** + * socketEventBridge + * クライアント向けソケットイベント bridge を生成する + * 受信イベントと送信イベントの型境界を統一する + */ import type { Socket } from "socket.io-client"; import { createSocketEventBridge, @@ -10,6 +15,7 @@ & ConnectionLifecycleEventPayloadMap & ServerToClientEventPayloadMap; +/** クライアント向けの型付きソケットイベント bridge を生成する */ export const createClientSocketEventBridge = (socket: Socket) => { const { onEvent, onceEvent, offEvent, emitEvent } = createSocketEventBridge< ClientInboundEventPayloadMap, diff --git a/apps/server/src/network/adapters/socketEmitters.ts b/apps/server/src/network/adapters/socketEmitters.ts index e6b7e4d..4d75643 100644 --- a/apps/server/src/network/adapters/socketEmitters.ts +++ b/apps/server/src/network/adapters/socketEmitters.ts @@ -25,6 +25,7 @@ (event: TEvent, payload: ServerToClientPayloadOf): void; }; +/** ペイロード有無に応じて emit 呼び出しシグネチャを切り替える共通関数 */ const emitWithOptionalPayload = ( emit: (event: SocketEventName, payload?: unknown) => void, event: SocketEventName, diff --git a/apps/server/src/network/handlers/GameHandler.ts b/apps/server/src/network/handlers/GameHandler.ts index c2be16e..f317903 100644 --- a/apps/server/src/network/handlers/GameHandler.ts +++ b/apps/server/src/network/handlers/GameHandler.ts @@ -1,6 +1,7 @@ /** * 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 index 9710aaa..d3d8254 100644 --- a/apps/server/src/network/handlers/RoomHandler.ts +++ b/apps/server/src/network/handlers/RoomHandler.ts @@ -1,6 +1,7 @@ /** * RoomHandler - * ルーム関連ハンドラを外部公開する再エクスポート定義 + * ルーム関連ハンドラの公開窓口を提供する再エクスポートファイル + * ネットワーク層の import 経路を統一する */ -/** ルームイベント受信ハンドラ登録関数を再公開する */ +/** ルームイベント受信ハンドラ登録関数を外部参照向けに再公開 */ export { registerRoomHandlers } from "./room/registerRoomHandlers"; diff --git a/apps/server/src/network/handlers/game/registerGameHandlers.ts b/apps/server/src/network/handlers/game/registerGameHandlers.ts index da086c4..f96235d 100644 --- a/apps/server/src/network/handlers/game/registerGameHandlers.ts +++ b/apps/server/src/network/handlers/game/registerGameHandlers.ts @@ -21,6 +21,7 @@ import { createServerSocketOnBridge } from "@server/network/handlers/socketEventBridge"; import { createGameOutputAdapter } from "./createGameOutputAdapter"; +/** ゲーム受信イベントごとの入力検証関数を保持するテーブル */ const gamePayloadValidators = { [protocol.SocketEvents.PING]: isPingPayload, [protocol.SocketEvents.MOVE]: isMovePayload, diff --git a/apps/server/src/network/handlers/room/registerRoomHandlers.ts b/apps/server/src/network/handlers/room/registerRoomHandlers.ts index 8c3bdbd..5c0145f 100644 --- a/apps/server/src/network/handlers/room/registerRoomHandlers.ts +++ b/apps/server/src/network/handlers/room/registerRoomHandlers.ts @@ -12,6 +12,7 @@ import { isJoinRoomPayload } from "@server/network/validation/socketPayloadValidators"; import { createRoomOutputAdapter } from "./createRoomOutputAdapter"; +/** ルーム受信イベントごとの入力検証関数を保持するテーブル */ const roomPayloadValidators = { [protocol.SocketEvents.JOIN_ROOM]: isJoinRoomPayload, } as const; diff --git a/apps/server/src/network/handlers/socketEventBridge.ts b/apps/server/src/network/handlers/socketEventBridge.ts index e3a6a0d..2facfe6 100644 --- a/apps/server/src/network/handlers/socketEventBridge.ts +++ b/apps/server/src/network/handlers/socketEventBridge.ts @@ -1,3 +1,8 @@ +/** + * socketEventBridge + * サーバー向けソケットイベント bridge を生成する + * クライアント受信イベントを型安全に購読する入口を提供する + */ import type { Socket } from "socket.io"; import { createSocketEventBridge, @@ -5,6 +10,7 @@ type ServerToClientEventPayloadMap, } from "@repo/shared"; +/** サーバー向けの型付きソケットイベント bridge を生成する */ export const createServerSocketOnBridge = (socket: Socket) => { const { onEvent, onceEvent } = createSocketEventBridge< ClientToServerEventPayloadMap, diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index f911328..f7973ac 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -1,31 +1,45 @@ -// shared パッケージ公開 API +/** + * index + * shared パッケージの公開 API を集約して再公開するエントリ + * ドメイン型,プロトコル型,設定値を外部利用向けに束ねる + */ +/** グリッドマップ関連の型定義を再公開 */ export * as gridMapTypes from "./domains/gridMap/gridMap.type"; +/** グリッドマップ関連のロジックを再公開 */ export * as gridMapLogic from "./domains/gridMap/gridMap.logic"; +/** プレイヤー関連の型定義を再公開 */ export * as playerTypes from "./domains/player/player.type"; +/** ゲーム関連の型定義を再公開 */ export * as gameTypes from "./domains/game/game.type"; +/** アプリ状態関連の型定義を再公開 */ export * as appTypes from "./domains/app/app.type"; +/** アプリ状態関連の定数を再公開 */ export * as appConsts from "./domains/app/app.const"; +/** ルーム関連の型定義を再公開 */ export * as roomTypes from "./domains/room/room.type"; +/** ルーム関連の定数を再公開 */ export * as roomConsts from "./domains/room/room.const"; +/** ソケットイベント定義を再公開 */ export * as protocol from "./protocol/events"; +/** ソケットイベント関連の共有型を再公開 */ export type { - ClientToServerEventPayloadMap, - ClientToServerPayloadOf, ConnectionLifecycleEventPayloadMap, ConnectionLifecyclePayloadOf, + ClientToServerEventPayloadMap, + ClientToServerPayloadOf, + ServerToClientEventPayloadMap, + ServerToClientPayloadOf, CurrentPlayersPayload, GameStartPayload, MovePayload, NewPlayerPayload, - PayloadOf, PingPayload, PongPayload, RemovePlayerPayload, - ServerToClientEventPayloadMap, - ServerToClientPayloadOf, - SocketPayloadMap, UpdateMapCellsPayload, UpdatePlayersPayload, } from "./protocol/events"; +/** ソケットイベントブリッジ生成関数を再公開 */ export { createSocketEventBridge } from "./protocol/socketEventBridge"; +/** 共有設定値を再公開 */ export * as config from "./config"; \ No newline at end of file diff --git a/packages/shared/src/protocol/events.ts b/packages/shared/src/protocol/events.ts index 7a88555..f1f207e 100644 --- a/packages/shared/src/protocol/events.ts +++ b/packages/shared/src/protocol/events.ts @@ -36,6 +36,12 @@ GAME_END: "game-end", // 3分経過時のゲーム終了通知 } as const; +/** + * ------------------------------------------------------------ + * ペイロード型定義 + * ------------------------------------------------------------ + */ + /** UPDATE_PLAYERS イベントで送受信するプレイヤー差分配列 */ export type UpdatePlayersPayload = TickData["playerUpdates"]; @@ -66,7 +72,13 @@ serverTime: number; }; -/** ソケットイベントごとのペイロード対応表 */ +/** + * ------------------------------------------------------------ + * イベント方向ごとのペイロード対応表 + * ------------------------------------------------------------ + */ + +/** 接続ライフサイクルイベントのペイロード対応表 */ export type ConnectionLifecycleEventPayloadMap = { [SocketEvents.CONNECT]: undefined; [SocketEvents.DISCONNECT]: undefined; @@ -95,11 +107,15 @@ [SocketEvents.GAME_END]: undefined; }; -/** 後方互換のための統合イベントマップ */ -export type SocketPayloadMap = - & ConnectionLifecycleEventPayloadMap - & ClientToServerEventPayloadMap - & ServerToClientEventPayloadMap; +/** + * ------------------------------------------------------------ + * イベント名からペイロード型を引くユーティリティ + * ------------------------------------------------------------ + */ + +/** 接続ライフサイクルイベントのペイロード型を取得するユーティリティ */ +export type ConnectionLifecyclePayloadOf = + ConnectionLifecycleEventPayloadMap[TEvent]; /** クライアント送信イベントのペイロード型を取得するユーティリティ */ export type ClientToServerPayloadOf = @@ -108,10 +124,3 @@ /** サーバー送信イベントのペイロード型を取得するユーティリティ */ export type ServerToClientPayloadOf = ServerToClientEventPayloadMap[TEvent]; - -/** 接続ライフサイクルイベントのペイロード型を取得するユーティリティ */ -export type ConnectionLifecyclePayloadOf = - ConnectionLifecycleEventPayloadMap[TEvent]; - -/** 指定イベント名に対応するペイロード型を取得するユーティリティ */ -export type PayloadOf = SocketPayloadMap[TEvent];