diff --git a/apps/server/src/application/coordinators/startGameCoordinator.ts b/apps/server/src/application/coordinators/startGameCoordinator.ts index c94dadf..c8edccb 100644 --- a/apps/server/src/application/coordinators/startGameCoordinator.ts +++ b/apps/server/src/application/coordinators/startGameCoordinator.ts @@ -8,8 +8,8 @@ type StartGameRoomPort, } from "@server/domains/game/application/ports/gameUseCasePorts"; import { startGameUseCase } from "@server/domains/game/application/useCases/startGameUseCase"; -import { logEvent } from "@server/logging/logEvent"; -import { gameUseCaseLogEvents, logResults, logScopes } from "@server/logging/logEvents"; +import { logEvent } from "@server/logging/logger"; +import { gameUseCaseLogEvents, logResults, logScopes } from "@server/logging/index"; import { roomConsts } from "@repo/shared"; type StartGameCoordinatorParams = { diff --git a/apps/server/src/domains/game/application/services/GamePlayerOperationService.ts b/apps/server/src/domains/game/application/services/GamePlayerOperationService.ts index 4637e2b..a5437d3 100644 --- a/apps/server/src/domains/game/application/services/GamePlayerOperationService.ts +++ b/apps/server/src/domains/game/application/services/GamePlayerOperationService.ts @@ -2,8 +2,8 @@ * GamePlayerOperationService * ゲームセッション内のプレイヤー移動と離脱操作を管理する */ -import { logEvent } from "@server/logging/logEvent"; -import { gameDomainLogEvents, logResults, logScopes } from "@server/logging/logEvents"; +import { logEvent } from "@server/logging/logger"; +import { gameDomainLogEvents, logResults, logScopes } from "@server/logging/index"; import { GameRoomSession } from "./GameRoomSession"; type SessionStore = Map; diff --git a/apps/server/src/domains/game/application/services/GameRoomSession.ts b/apps/server/src/domains/game/application/services/GameRoomSession.ts index 5bb119b..bc77b27 100644 --- a/apps/server/src/domains/game/application/services/GameRoomSession.ts +++ b/apps/server/src/domains/game/application/services/GameRoomSession.ts @@ -2,8 +2,8 @@ * GameRoomSession * 1ルーム分のゲーム進行状態とゲームループ実行を管理する */ -import { logEvent } from "@server/logging/logEvent"; -import { gameDomainLogEvents, logResults, logScopes } from "@server/logging/logEvents"; +import { logEvent } from "@server/logging/logger"; +import { gameDomainLogEvents, logResults, logScopes } from "@server/logging/index"; import type { gameTypes } from "@repo/shared"; import { GameLoop } from "../../loop/GameLoop"; import { Player } from "../../entities/player/Player.js"; diff --git a/apps/server/src/domains/game/application/services/GameSessionLifecycleService.ts b/apps/server/src/domains/game/application/services/GameSessionLifecycleService.ts index 815539d..8eb3670 100644 --- a/apps/server/src/domains/game/application/services/GameSessionLifecycleService.ts +++ b/apps/server/src/domains/game/application/services/GameSessionLifecycleService.ts @@ -4,8 +4,8 @@ */ import { config } from "@repo/shared"; import type { gameTypes } from "@repo/shared"; -import { logEvent } from "@server/logging/logEvent"; -import { gameDomainLogEvents, logResults, logScopes } from "@server/logging/logEvents"; +import { logEvent } from "@server/logging/logger"; +import { gameDomainLogEvents, logResults, logScopes } from "@server/logging/index"; import { GameRoomSession } from "./GameRoomSession"; type SessionStore = Map; diff --git a/apps/server/src/domains/game/application/useCases/disconnectUseCase.ts b/apps/server/src/domains/game/application/useCases/disconnectUseCase.ts index c6111be..c762160 100644 --- a/apps/server/src/domains/game/application/useCases/disconnectUseCase.ts +++ b/apps/server/src/domains/game/application/useCases/disconnectUseCase.ts @@ -3,8 +3,8 @@ * 切断したプレイヤーをゲーム状態から除外し,必要に応じて通知を行う */ import type { DisconnectPlayerPort, GameOutputPort } from "../ports/gameUseCasePorts"; -import { logEvent } from "@server/logging/logEvent"; -import { gameUseCaseLogEvents, logResults, logScopes } from "@server/logging/logEvents"; +import { logEvent } from "@server/logging/logger"; +import { gameUseCaseLogEvents, logResults, logScopes } from "@server/logging/index"; type DisconnectUseCaseParams = { gameManager: DisconnectPlayerPort; diff --git a/apps/server/src/domains/game/application/useCases/readyForGameUseCase.ts b/apps/server/src/domains/game/application/useCases/readyForGameUseCase.ts index 351e7db..6961ae2 100644 --- a/apps/server/src/domains/game/application/useCases/readyForGameUseCase.ts +++ b/apps/server/src/domains/game/application/useCases/readyForGameUseCase.ts @@ -4,8 +4,8 @@ */ import type { ReadyForGamePort } from "../ports/gameUseCasePorts"; import type { GameOutputPort } from "../ports/gameUseCasePorts"; -import { logEvent } from "@server/logging/logEvent"; -import { gameUseCaseLogEvents, logResults, logScopes } from "@server/logging/logEvents"; +import { logEvent } from "@server/logging/logger"; +import { gameUseCaseLogEvents, logResults, logScopes } from "@server/logging/index"; type ReadyForGameUseCaseParams = { socketId: string; diff --git a/apps/server/src/domains/game/application/useCases/startGameUseCase.ts b/apps/server/src/domains/game/application/useCases/startGameUseCase.ts index 5c802f7..e7bfd81 100644 --- a/apps/server/src/domains/game/application/useCases/startGameUseCase.ts +++ b/apps/server/src/domains/game/application/useCases/startGameUseCase.ts @@ -3,8 +3,8 @@ * ルーム内プレイヤーでゲームセッションを開始し,進行イベントを通知する */ import type { GameOutputPort, StartGamePort } from "../ports/gameUseCasePorts"; -import { logEvent } from "@server/logging/logEvent"; -import { gameUseCaseLogEvents, logResults, logScopes } from "@server/logging/logEvents"; +import { logEvent } from "@server/logging/logger"; +import { gameUseCaseLogEvents, logResults, logScopes } from "@server/logging/index"; type StartGameUseCaseParams = { roomId: string; diff --git a/apps/server/src/domains/game/loop/GameLoop.ts b/apps/server/src/domains/game/loop/GameLoop.ts index 8aa3d1e..425395b 100644 --- a/apps/server/src/domains/game/loop/GameLoop.ts +++ b/apps/server/src/domains/game/loop/GameLoop.ts @@ -7,8 +7,8 @@ import { getPlayerGridIndex } from "../entities/player/playerPosition.js"; import { config } from "@repo/shared"; import type { gameTypes } from "@repo/shared"; -import { logEvent } from "@server/logging/logEvent"; -import { gameDomainLogEvents, logResults, logScopes } from "@server/logging/logEvents"; +import { logEvent } from "@server/logging/logger"; +import { gameDomainLogEvents, logResults, logScopes } from "@server/logging/index"; /** ルーム内ゲーム進行を定周期で実行するループ管理クラス */ export class GameLoop { diff --git a/apps/server/src/domains/room/application/services/RoomExitService.ts b/apps/server/src/domains/room/application/services/RoomExitService.ts index 5127e79..15a3e64 100644 --- a/apps/server/src/domains/room/application/services/RoomExitService.ts +++ b/apps/server/src/domains/room/application/services/RoomExitService.ts @@ -3,8 +3,8 @@ * ルーム退出処理とオーナー移譲処理を担うサービス */ import type { roomTypes } from "@repo/shared"; -import { logEvent } from "@server/logging/logEvent"; -import { logResults, logScopes, roomDomainLogEvents } from "@server/logging/logEvents"; +import { logEvent } from "@server/logging/logger"; +import { logResults, logScopes, roomDomainLogEvents } from "@server/logging/index"; /** 退出要求に応じてプレイヤー削除とルーム整理を行うサービス */ export class RoomExitService { diff --git a/apps/server/src/domains/room/application/services/RoomJoinService.ts b/apps/server/src/domains/room/application/services/RoomJoinService.ts index c51c690..0a06116 100644 --- a/apps/server/src/domains/room/application/services/RoomJoinService.ts +++ b/apps/server/src/domains/room/application/services/RoomJoinService.ts @@ -4,8 +4,8 @@ */ import { config, roomConsts } from "@repo/shared"; import type { roomTypes } from "@repo/shared"; -import { logEvent } from "@server/logging/logEvent"; -import { logResults, logScopes, roomDomainLogEvents } from "@server/logging/logEvents"; +import { logEvent } from "@server/logging/logger"; +import { logResults, logScopes, roomDomainLogEvents } from "@server/logging/index"; import type { JoinRoomResult } from "../ports/roomUseCasePorts"; /** 参加要求に応じてルーム作成と参加者追加を行うサービス */ diff --git a/apps/server/src/domains/room/application/useCases/joinRoomUseCase.ts b/apps/server/src/domains/room/application/useCases/joinRoomUseCase.ts index ec29519..d1ddd59 100644 --- a/apps/server/src/domains/room/application/useCases/joinRoomUseCase.ts +++ b/apps/server/src/domains/room/application/useCases/joinRoomUseCase.ts @@ -8,8 +8,8 @@ JoinRoomResult, RoomOutputPort, } from "../ports/roomUseCasePorts"; -import { logEvent } from "@server/logging/logEvent"; -import { logResults, logScopes, roomUseCaseLogEvents } from "@server/logging/logEvents"; +import { logEvent } from "@server/logging/logger"; +import { logResults, logScopes, roomUseCaseLogEvents } from "@server/logging/index"; type JoinRoomUseCaseParams = { roomManager: JoinRoomPort; diff --git a/apps/server/src/domains/room/application/useCases/roomDisconnectUseCase.ts b/apps/server/src/domains/room/application/useCases/roomDisconnectUseCase.ts index 57f292c..f534d14 100644 --- a/apps/server/src/domains/room/application/useCases/roomDisconnectUseCase.ts +++ b/apps/server/src/domains/room/application/useCases/roomDisconnectUseCase.ts @@ -4,8 +4,8 @@ */ import type { DisconnectRoomPort } from "../ports/roomUseCasePorts"; import type { RoomOutputPort } from "../ports/roomUseCasePorts"; -import { logEvent } from "@server/logging/logEvent"; -import { logResults, logScopes, roomUseCaseLogEvents } from "@server/logging/logEvents"; +import { logEvent } from "@server/logging/logger"; +import { logResults, logScopes, roomUseCaseLogEvents } from "@server/logging/index"; type RoomDisconnectUseCaseParams = { roomManager: DisconnectRoomPort; diff --git a/apps/server/src/logging/constants/eventNames.ts b/apps/server/src/logging/constants/eventNames.ts new file mode 100644 index 0000000..fdeeb92 --- /dev/null +++ b/apps/server/src/logging/constants/eventNames.ts @@ -0,0 +1,39 @@ +/** + * eventNames + * ログ出力で利用するイベント名定数群を提供する + */ +import { protocol } from "@repo/shared"; + +/** GameUseCaseログで利用するイベント名定数 */ +export const gameUseCaseLogEvents = { + START_GAME: protocol.SocketEvents.START_GAME, + READY_FOR_GAME: protocol.SocketEvents.READY_FOR_GAME, + GAME_START: protocol.SocketEvents.GAME_START, + GAME_END: protocol.SocketEvents.GAME_END, + DISCONNECT: protocol.SocketEvents.DISCONNECT, +} as const; + +/** RoomUseCaseログで利用するイベント名定数 */ +export const roomUseCaseLogEvents = { + JOIN_ROOM: protocol.SocketEvents.JOIN_ROOM, + DISCONNECT: protocol.SocketEvents.DISCONNECT, + ROOM_UPDATE: protocol.SocketEvents.ROOM_UPDATE, +} as const; + +/** Gameドメインサービスとループログで利用するイベント名定数 */ +export const gameDomainLogEvents = { + MOVE: protocol.SocketEvents.MOVE, + SESSION_START: "SESSION_START", + PLAYER_MOVE: "PLAYER_MOVE", + PLAYER_REMOVE: "PLAYER_REMOVE", + GAME_LOOP: "GAME_LOOP", +} as const; + +/** Roomドメインサービスログで利用するイベント名定数 */ +export const roomDomainLogEvents = { + ROOM_CREATE: "ROOM_CREATE", + PLAYER_JOIN: "PLAYER_JOIN", + PLAYER_LEAVE: "PLAYER_LEAVE", + ROOM_DELETE: "ROOM_DELETE", + OWNER_TRANSFER: "OWNER_TRANSFER", +} as const; diff --git a/apps/server/src/logging/constants/results.ts b/apps/server/src/logging/constants/results.ts new file mode 100644 index 0000000..f5ff65f --- /dev/null +++ b/apps/server/src/logging/constants/results.ts @@ -0,0 +1,36 @@ +/** + * results + * ログ出力で利用する結果値定数を提供する + */ + +/** ログ出力で利用する結果値の共通定数 */ +export const logResults = { + ACCEPTED: "accepted", + CONNECTED: "connected", + CREATED: "created", + DELETED: "deleted", + DISCONNECTED: "disconnected", + EMITTED: "emitted", + IGNORED_ALREADY_PLAYING: "ignored_already_playing", + IGNORED_ALREADY_RUNNING: "ignored_already_running", + IGNORED_DUPLICATE: "ignored_duplicate", + IGNORED_INVALID_PAYLOAD: "ignored_invalid_payload", + IGNORED_MISSING_ROOM: "ignored_missing_room", + IGNORED_NO_ROOM: "ignored_no_room", + IGNORED_PLAYER_NOT_FOUND: "ignored_player_not_found", + IGNORED_PLAYER_NOT_IN_SESSION: "ignored_player_not_in_session", + IGNORED_ROOM_FULL: "ignored_room_full", + IGNORED_ROOM_NOT_FOUND: "ignored_room_not_found", + JOINED: "joined", + PLAYER_REMOVED: "player_removed", + PROCESSED: "processed", + RECEIVED: "received", + REJECTED: "rejected", + REJECTED_DUPLICATE: "rejected_duplicate", + REJECTED_ROOM_FULL: "rejected_room_full", + REMOVED: "removed", + SESSION_DISPOSED_EMPTY_ROOM: "session_disposed_empty_room", + STARTED: "started", + STOPPED: "stopped", + TRANSFERRED: "transferred", +} as const; diff --git a/apps/server/src/logging/constants/scopes.ts b/apps/server/src/logging/constants/scopes.ts new file mode 100644 index 0000000..ca01c98 --- /dev/null +++ b/apps/server/src/logging/constants/scopes.ts @@ -0,0 +1,20 @@ +/** + * scopes + * ログ出力で利用するスコープ名定数と型を提供する + */ + +/** ログ出力で利用するスコープ名の共通定数 */ +export const logScopes = { + NETWORK: "Network", + GAME_USE_CASE: "GameUseCase", + ROOM_USE_CASE: "RoomUseCase", + GAME_LOOP: "GameLoop", + GAME_ROOM_SESSION: "GameRoomSession", + GAME_PLAYER_OPERATION_SERVICE: "GamePlayerOperationService", + GAME_SESSION_LIFECYCLE_SERVICE: "GameSessionLifecycleService", + ROOM_JOIN_SERVICE: "RoomJoinService", + ROOM_EXIT_SERVICE: "RoomExitService", +} as const; + +/** ログ出力で利用するスコープ名型 */ +export type LogScope = (typeof logScopes)[keyof typeof logScopes]; diff --git a/apps/server/src/logging/contracts/payloadByScope.ts b/apps/server/src/logging/contracts/payloadByScope.ts new file mode 100644 index 0000000..8bb3fb5 --- /dev/null +++ b/apps/server/src/logging/contracts/payloadByScope.ts @@ -0,0 +1,258 @@ +/** + * payloadByScope + * スコープごとのログペイロード型契約を提供する + */ +import { protocol } from "@repo/shared"; +import { gameDomainLogEvents, gameUseCaseLogEvents, roomDomainLogEvents, roomUseCaseLogEvents } from "../constants/eventNames"; +import { logResults } from "../constants/results"; +import { logScopes, type LogScope } from "../constants/scopes"; + +/** Network接続確立ログの契約 */ +type NetworkConnectLogPayload = { + event: typeof protocol.SocketEvents.CONNECT; + result: typeof logResults.CONNECTED; + socketId: string; +}; + +/** Network切断ログの契約 */ +type NetworkDisconnectLogPayload = { + event: typeof protocol.SocketEvents.DISCONNECT; + result: typeof logResults.DISCONNECTED; + socketId: string; +}; + +/** Network参加要求ログの契約 */ +type NetworkJoinRoomLogPayload = { + event: typeof protocol.SocketEvents.JOIN_ROOM; + result: + | typeof logResults.REJECTED_ROOM_FULL + | typeof logResults.REJECTED_DUPLICATE + | typeof logResults.IGNORED_INVALID_PAYLOAD; + socketId: string; + roomId?: string; +}; + +/** NetworkのPING不正ペイロードログ契約 */ +type NetworkPingLogPayload = { + event: typeof protocol.SocketEvents.PING; + result: typeof logResults.IGNORED_INVALID_PAYLOAD; + socketId: string; +}; + +/** NetworkのMOVE不正ペイロードログ契約 */ +type NetworkMoveLogPayload = { + event: typeof protocol.SocketEvents.MOVE; + result: typeof logResults.IGNORED_INVALID_PAYLOAD; + socketId: string; +}; + +/** Networkスコープのログ契約ユニオン */ +type NetworkLogPayload = + | NetworkConnectLogPayload + | NetworkDisconnectLogPayload + | NetworkJoinRoomLogPayload + | NetworkPingLogPayload + | NetworkMoveLogPayload; + +/** GameUseCaseのSTART_GAMEログ契約 */ +type GameUseCaseStartGameLogPayload = { + event: typeof gameUseCaseLogEvents.START_GAME; + result: + | typeof logResults.IGNORED_NO_ROOM + | typeof logResults.IGNORED_ALREADY_PLAYING + | typeof logResults.IGNORED_ROOM_NOT_FOUND + | typeof logResults.ACCEPTED; + socketId: string; + roomId?: string; +}; + +/** GameUseCaseのREADY_FOR_GAMEログ契約 */ +type GameUseCaseReadyForGameLogPayload = { + event: typeof gameUseCaseLogEvents.READY_FOR_GAME; + result: + | typeof logResults.IGNORED_MISSING_ROOM + | typeof logResults.RECEIVED; + socketId: string; + roomId?: string; +}; + +/** GameUseCaseのGAME_STARTログ契約 */ +type GameUseCaseGameStartLogPayload = { + event: typeof gameUseCaseLogEvents.GAME_START; + result: typeof logResults.EMITTED; + socketId: string; + roomId: string; +}; + +/** GameUseCaseのGAME_ENDログ契約 */ +type GameUseCaseGameEndLogPayload = { + event: typeof gameUseCaseLogEvents.GAME_END; + result: typeof logResults.EMITTED; + roomId: string; +}; + +/** GameUseCaseのDISCONNECTログ契約 */ +type GameUseCaseDisconnectLogPayload = { + event: typeof gameUseCaseLogEvents.DISCONNECT; + result: typeof logResults.PLAYER_REMOVED; + socketId: string; +}; + +/** GameUseCaseスコープのログ契約ユニオン */ +type GameUseCaseLogPayload = + | GameUseCaseStartGameLogPayload + | GameUseCaseReadyForGameLogPayload + | GameUseCaseGameStartLogPayload + | GameUseCaseGameEndLogPayload + | GameUseCaseDisconnectLogPayload; + +/** RoomUseCaseのJOIN_ROOMログ契約 */ +type RoomUseCaseJoinRoomLogPayload = { + event: typeof roomUseCaseLogEvents.JOIN_ROOM; + result: + | typeof logResults.RECEIVED + | typeof logResults.REJECTED; + socketId: string; + roomId: string; +}; + +/** RoomUseCaseのDISCONNECTログ契約 */ +type RoomUseCaseDisconnectLogPayload = { + event: typeof roomUseCaseLogEvents.DISCONNECT; + result: typeof logResults.PROCESSED; + socketId: string; +}; + +/** RoomUseCaseのROOM_UPDATEログ契約 */ +type RoomUseCaseRoomUpdateLogPayload = { + event: typeof roomUseCaseLogEvents.ROOM_UPDATE; + result: typeof logResults.EMITTED; + socketId: string; + roomId: string; +}; + +/** RoomUseCaseスコープのログ契約ユニオン */ +type RoomUseCaseLogPayload = + | RoomUseCaseJoinRoomLogPayload + | RoomUseCaseDisconnectLogPayload + | RoomUseCaseRoomUpdateLogPayload; + +/** GamePlayerOperationServiceのPLAYER_MOVEログ契約 */ +type GamePlayerOperationServiceMoveLogPayload = { + event: typeof gameDomainLogEvents.PLAYER_MOVE; + result: typeof logResults.IGNORED_PLAYER_NOT_IN_SESSION; + socketId: string; +}; + +/** GamePlayerOperationServiceのPLAYER_REMOVEログ契約 */ +type GamePlayerOperationServiceRemoveLogPayload = { + event: typeof gameDomainLogEvents.PLAYER_REMOVE; + result: + | typeof logResults.IGNORED_PLAYER_NOT_IN_SESSION + | typeof logResults.SESSION_DISPOSED_EMPTY_ROOM; + socketId: string; + roomId?: string; +}; + +/** GamePlayerOperationServiceスコープのログ契約ユニオン */ +type GamePlayerOperationServiceLogPayload = + | GamePlayerOperationServiceMoveLogPayload + | GamePlayerOperationServiceRemoveLogPayload; + +/** GameLoopスコープのログ契約 */ +type GameLoopLogPayload = { + event: typeof gameDomainLogEvents.GAME_LOOP; + result: + | typeof logResults.STARTED + | typeof logResults.STOPPED; + roomId: string; +}; + +/** GameRoomSessionスコープのログ契約 */ +type GameRoomSessionLogPayload = { + event: typeof gameDomainLogEvents.MOVE; + result: + | typeof logResults.IGNORED_PLAYER_NOT_FOUND + | typeof logResults.IGNORED_INVALID_PAYLOAD; + roomId: string; + socketId: string; +}; + +/** GameSessionLifecycleServiceスコープのログ契約 */ +type GameSessionLifecycleServiceLogPayload = { + event: typeof gameDomainLogEvents.SESSION_START; + result: + | typeof logResults.IGNORED_ALREADY_RUNNING + | typeof logResults.STARTED; + roomId: string; +}; + +/** RoomJoinServiceのROOM_CREATEログ契約 */ +type RoomJoinServiceRoomCreateLogPayload = { + event: typeof roomDomainLogEvents.ROOM_CREATE; + result: typeof logResults.CREATED; + roomId: string; + socketId: string; +}; + +/** RoomJoinServiceのPLAYER_JOINログ契約 */ +type RoomJoinServicePlayerJoinLogPayload = { + event: typeof roomDomainLogEvents.PLAYER_JOIN; + result: + | typeof logResults.IGNORED_DUPLICATE + | typeof logResults.IGNORED_ROOM_FULL + | typeof logResults.JOINED; + roomId: string; + socketId: string; +}; + +/** RoomJoinServiceスコープのログ契約ユニオン */ +type RoomJoinServiceLogPayload = + | RoomJoinServiceRoomCreateLogPayload + | RoomJoinServicePlayerJoinLogPayload; + +/** RoomExitServiceのPLAYER_LEAVEログ契約 */ +type RoomExitServicePlayerLeaveLogPayload = { + event: typeof roomDomainLogEvents.PLAYER_LEAVE; + result: typeof logResults.REMOVED; + roomId: string; + socketId: string; +}; + +/** RoomExitServiceのROOM_DELETEログ契約 */ +type RoomExitServiceRoomDeleteLogPayload = { + event: typeof roomDomainLogEvents.ROOM_DELETE; + result: typeof logResults.DELETED; + roomId: string; + socketId: string; +}; + +/** RoomExitServiceのOWNER_TRANSFERログ契約 */ +type RoomExitServiceOwnerTransferLogPayload = { + event: typeof roomDomainLogEvents.OWNER_TRANSFER; + result: typeof logResults.TRANSFERRED; + roomId: string; + socketId: string; +}; + +/** RoomExitServiceスコープのログ契約ユニオン */ +type RoomExitServiceLogPayload = + | RoomExitServicePlayerLeaveLogPayload + | RoomExitServiceRoomDeleteLogPayload + | RoomExitServiceOwnerTransferLogPayload; + +/** スコープごとの event/result と必須項目の型契約 */ +export type LogPayloadByScope = { + [logScopes.NETWORK]: NetworkLogPayload; + [logScopes.GAME_USE_CASE]: GameUseCaseLogPayload; + [logScopes.ROOM_USE_CASE]: RoomUseCaseLogPayload; + [logScopes.GAME_LOOP]: GameLoopLogPayload; + [logScopes.GAME_ROOM_SESSION]: GameRoomSessionLogPayload; + [logScopes.GAME_PLAYER_OPERATION_SERVICE]: GamePlayerOperationServiceLogPayload; + [logScopes.GAME_SESSION_LIFECYCLE_SERVICE]: GameSessionLifecycleServiceLogPayload; + [logScopes.ROOM_JOIN_SERVICE]: RoomJoinServiceLogPayload; + [logScopes.ROOM_EXIT_SERVICE]: RoomExitServiceLogPayload; +}; + +/** スコープごとのログペイロード型を参照するユーティリティ */ +export type LogPayloadOf = LogPayloadByScope[TScope]; diff --git a/apps/server/src/logging/index.ts b/apps/server/src/logging/index.ts new file mode 100644 index 0000000..af0031a --- /dev/null +++ b/apps/server/src/logging/index.ts @@ -0,0 +1,25 @@ +/** + * index + * logging配下の公開APIを集約して再公開する + */ + +/** ログ出力関数を再公開 */ +export { logEvent } from "./logger"; + +/** ログスコープ定数と型を再公開 */ +export { logScopes } from "./constants/scopes"; +export type { LogScope } from "./constants/scopes"; + +/** ログ結果値定数を再公開 */ +export { logResults } from "./constants/results"; + +/** ログイベント名定数群を再公開 */ +export { + gameUseCaseLogEvents, + roomUseCaseLogEvents, + gameDomainLogEvents, + roomDomainLogEvents, +} from "./constants/eventNames"; + +/** ログペイロード契約型を再公開 */ +export type { LogPayloadByScope, LogPayloadOf } from "./contracts/payloadByScope"; diff --git a/apps/server/src/logging/logEvent.ts b/apps/server/src/logging/logEvent.ts deleted file mode 100644 index 90c67cd..0000000 --- a/apps/server/src/logging/logEvent.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * logEvent - * 共通ログ出力で利用するイベントログ関数を提供する - */ -import type { LogPayloadByScope, LogScope } from "./logEvents"; - -type LogEventPayload = { - socketId?: string; - roomId?: string; - [key: string]: unknown; -}; - -/** スコープ名とイベント情報を標準出力へ記録する */ -export const logEvent = < - TScope extends LogScope, ->( - scope: TScope, - payload: LogEventPayload & LogPayloadByScope[TScope] -) => { - console.log(`[${scope}]`, payload); -}; diff --git a/apps/server/src/logging/logEventGroups.ts b/apps/server/src/logging/logEventGroups.ts deleted file mode 100644 index 450e7f1..0000000 --- a/apps/server/src/logging/logEventGroups.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * logEventGroups - * ログ出力で利用するイベント名定数群を提供する - */ -import { protocol } from "@repo/shared"; - -/** GameUseCaseログで利用するイベント名定数 */ -export const gameUseCaseLogEvents = { - START_GAME: protocol.SocketEvents.START_GAME, - READY_FOR_GAME: protocol.SocketEvents.READY_FOR_GAME, - GAME_START: protocol.SocketEvents.GAME_START, - GAME_END: protocol.SocketEvents.GAME_END, - DISCONNECT: protocol.SocketEvents.DISCONNECT, -} as const; - -/** RoomUseCaseログで利用するイベント名定数 */ -export const roomUseCaseLogEvents = { - JOIN_ROOM: protocol.SocketEvents.JOIN_ROOM, - DISCONNECT: protocol.SocketEvents.DISCONNECT, - ROOM_UPDATE: protocol.SocketEvents.ROOM_UPDATE, -} as const; - -/** Gameドメインサービスとループログで利用するイベント名定数 */ -export const gameDomainLogEvents = { - MOVE: protocol.SocketEvents.MOVE, - SESSION_START: "SESSION_START", - PLAYER_MOVE: "PLAYER_MOVE", - PLAYER_REMOVE: "PLAYER_REMOVE", - GAME_LOOP: "GAME_LOOP", -} as const; - -/** Roomドメインサービスログで利用するイベント名定数 */ -export const roomDomainLogEvents = { - ROOM_CREATE: "ROOM_CREATE", - PLAYER_JOIN: "PLAYER_JOIN", - PLAYER_LEAVE: "PLAYER_LEAVE", - ROOM_DELETE: "ROOM_DELETE", - OWNER_TRANSFER: "OWNER_TRANSFER", -} as const; diff --git a/apps/server/src/logging/logEvents.ts b/apps/server/src/logging/logEvents.ts deleted file mode 100644 index 12cc4ad..0000000 --- a/apps/server/src/logging/logEvents.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * logEvents - * ログ関連の定数と型契約を集約して再公開する - */ - -/** ログスコープ定数と型を再公開 */ -export { logScopes } from "./logScopes"; -export type { LogScope } from "./logScopes"; - -/** ログイベント定数群を再公開 */ -export { - gameUseCaseLogEvents, - roomUseCaseLogEvents, - gameDomainLogEvents, - roomDomainLogEvents, -} from "./logEventGroups"; - -/** ログ結果値定数を再公開 */ -export { logResults } from "./logResults"; - -/** ログペイロード契約型を再公開 */ -export type { LogPayloadByScope, LogPayloadOf } from "./logPayloadContracts"; diff --git a/apps/server/src/logging/logPayloadContracts.ts b/apps/server/src/logging/logPayloadContracts.ts deleted file mode 100644 index ed2eeb1..0000000 --- a/apps/server/src/logging/logPayloadContracts.ts +++ /dev/null @@ -1,171 +0,0 @@ -/** - * logPayloadContracts - * スコープごとのログペイロード型契約を提供する - */ -import { protocol } from "@repo/shared"; -import { gameDomainLogEvents, gameUseCaseLogEvents, roomDomainLogEvents, roomUseCaseLogEvents } from "./logEventGroups"; -import { logResults } from "./logResults"; -import { logScopes, type LogScope } from "./logScopes"; - -/** スコープごとの event/result と必須項目の型契約 */ -export type LogPayloadByScope = { - [logScopes.NETWORK]: - | { - event: typeof protocol.SocketEvents.CONNECT; - result: typeof logResults.CONNECTED; - socketId: string; - } - | { - event: typeof protocol.SocketEvents.DISCONNECT; - result: typeof logResults.DISCONNECTED; - socketId: string; - } - | { - event: typeof protocol.SocketEvents.JOIN_ROOM; - result: - | typeof logResults.REJECTED_ROOM_FULL - | typeof logResults.REJECTED_DUPLICATE - | typeof logResults.IGNORED_INVALID_PAYLOAD; - socketId: string; - roomId?: string; - } - | { - event: typeof protocol.SocketEvents.PING; - result: typeof logResults.IGNORED_INVALID_PAYLOAD; - socketId: string; - } - | { - event: typeof protocol.SocketEvents.MOVE; - result: typeof logResults.IGNORED_INVALID_PAYLOAD; - socketId: string; - }; - [logScopes.GAME_USE_CASE]: - | { - event: typeof gameUseCaseLogEvents.START_GAME; - result: - | typeof logResults.IGNORED_NO_ROOM - | typeof logResults.IGNORED_ALREADY_PLAYING - | typeof logResults.IGNORED_ROOM_NOT_FOUND - | typeof logResults.ACCEPTED; - socketId: string; - roomId?: string; - } - | { - event: typeof gameUseCaseLogEvents.READY_FOR_GAME; - result: - | typeof logResults.IGNORED_MISSING_ROOM - | typeof logResults.RECEIVED; - socketId: string; - roomId?: string; - } - | { - event: typeof gameUseCaseLogEvents.GAME_START; - result: typeof logResults.EMITTED; - socketId: string; - roomId: string; - } - | { - event: typeof gameUseCaseLogEvents.GAME_END; - result: typeof logResults.EMITTED; - roomId: string; - } - | { - event: typeof gameUseCaseLogEvents.DISCONNECT; - result: typeof logResults.PLAYER_REMOVED; - socketId: string; - }; - [logScopes.ROOM_USE_CASE]: - | { - event: typeof roomUseCaseLogEvents.JOIN_ROOM; - result: - | typeof logResults.RECEIVED - | typeof logResults.REJECTED; - socketId: string; - roomId: string; - } - | { - event: typeof roomUseCaseLogEvents.DISCONNECT; - result: typeof logResults.PROCESSED; - socketId: string; - } - | { - event: typeof roomUseCaseLogEvents.ROOM_UPDATE; - result: typeof logResults.EMITTED; - socketId: string; - roomId: string; - }; - [logScopes.GAME_LOOP]: { - event: typeof gameDomainLogEvents.GAME_LOOP; - result: - | typeof logResults.STARTED - | typeof logResults.STOPPED; - roomId: string; - }; - [logScopes.GAME_ROOM_SESSION]: { - event: typeof gameDomainLogEvents.MOVE; - result: - | typeof logResults.IGNORED_PLAYER_NOT_FOUND - | typeof logResults.IGNORED_INVALID_PAYLOAD; - roomId: string; - socketId: string; - }; - [logScopes.GAME_PLAYER_OPERATION_SERVICE]: - | { - event: typeof gameDomainLogEvents.PLAYER_MOVE; - result: typeof logResults.IGNORED_PLAYER_NOT_IN_SESSION; - socketId: string; - } - | { - event: typeof gameDomainLogEvents.PLAYER_REMOVE; - result: - | typeof logResults.IGNORED_PLAYER_NOT_IN_SESSION - | typeof logResults.SESSION_DISPOSED_EMPTY_ROOM; - socketId: string; - roomId?: string; - }; - [logScopes.GAME_SESSION_LIFECYCLE_SERVICE]: { - event: typeof gameDomainLogEvents.SESSION_START; - result: - | typeof logResults.IGNORED_ALREADY_RUNNING - | typeof logResults.STARTED; - roomId: string; - }; - [logScopes.ROOM_JOIN_SERVICE]: - | { - event: typeof roomDomainLogEvents.ROOM_CREATE; - result: typeof logResults.CREATED; - roomId: string; - socketId: string; - } - | { - event: typeof roomDomainLogEvents.PLAYER_JOIN; - result: - | typeof logResults.IGNORED_DUPLICATE - | typeof logResults.IGNORED_ROOM_FULL - | typeof logResults.JOINED; - roomId: string; - socketId: string; - }; - [logScopes.ROOM_EXIT_SERVICE]: - | { - event: typeof roomDomainLogEvents.PLAYER_LEAVE; - result: typeof logResults.REMOVED; - roomId: string; - socketId: string; - } - | { - event: typeof roomDomainLogEvents.ROOM_DELETE; - result: typeof logResults.DELETED; - roomId: string; - socketId: string; - } - | { - event: typeof roomDomainLogEvents.OWNER_TRANSFER; - result: typeof logResults.TRANSFERRED; - roomId: string; - socketId: string; - }; -}; - -/** スコープごとのログペイロード型を参照するユーティリティ */ -export type LogPayloadOf = LogPayloadByScope[TScope]; diff --git a/apps/server/src/logging/logResults.ts b/apps/server/src/logging/logResults.ts deleted file mode 100644 index b666332..0000000 --- a/apps/server/src/logging/logResults.ts +++ /dev/null @@ -1,36 +0,0 @@ -/** - * logResults - * ログ出力で利用する結果値定数を提供する - */ - -/** ログ出力で利用する結果値の共通定数 */ -export const logResults = { - ACCEPTED: "accepted", - CONNECTED: "connected", - CREATED: "created", - DELETED: "deleted", - DISCONNECTED: "disconnected", - EMITTED: "emitted", - IGNORED_ALREADY_PLAYING: "ignored_already_playing", - IGNORED_ALREADY_RUNNING: "ignored_already_running", - IGNORED_DUPLICATE: "ignored_duplicate", - IGNORED_INVALID_PAYLOAD: "ignored_invalid_payload", - IGNORED_MISSING_ROOM: "ignored_missing_room", - IGNORED_NO_ROOM: "ignored_no_room", - IGNORED_PLAYER_NOT_FOUND: "ignored_player_not_found", - IGNORED_PLAYER_NOT_IN_SESSION: "ignored_player_not_in_session", - IGNORED_ROOM_FULL: "ignored_room_full", - IGNORED_ROOM_NOT_FOUND: "ignored_room_not_found", - JOINED: "joined", - PLAYER_REMOVED: "player_removed", - PROCESSED: "processed", - RECEIVED: "received", - REJECTED: "rejected", - REJECTED_DUPLICATE: "rejected_duplicate", - REJECTED_ROOM_FULL: "rejected_room_full", - REMOVED: "removed", - SESSION_DISPOSED_EMPTY_ROOM: "session_disposed_empty_room", - STARTED: "started", - STOPPED: "stopped", - TRANSFERRED: "transferred", -} as const; diff --git a/apps/server/src/logging/logScopes.ts b/apps/server/src/logging/logScopes.ts deleted file mode 100644 index 7005f4a..0000000 --- a/apps/server/src/logging/logScopes.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * logScopes - * ログ出力で利用するスコープ名定数と型を提供する - */ - -/** ログ出力で利用するスコープ名の共通定数 */ -export const logScopes = { - NETWORK: "Network", - GAME_USE_CASE: "GameUseCase", - ROOM_USE_CASE: "RoomUseCase", - GAME_LOOP: "GameLoop", - GAME_ROOM_SESSION: "GameRoomSession", - GAME_PLAYER_OPERATION_SERVICE: "GamePlayerOperationService", - GAME_SESSION_LIFECYCLE_SERVICE: "GameSessionLifecycleService", - ROOM_JOIN_SERVICE: "RoomJoinService", - ROOM_EXIT_SERVICE: "RoomExitService", -} as const; - -/** ログ出力で利用するスコープ名型 */ -export type LogScope = (typeof logScopes)[keyof typeof logScopes]; diff --git a/apps/server/src/logging/logger.ts b/apps/server/src/logging/logger.ts new file mode 100644 index 0000000..a4dac46 --- /dev/null +++ b/apps/server/src/logging/logger.ts @@ -0,0 +1,22 @@ +/** + * logger + * 共通ログ出力で利用するイベントログ関数を提供する + */ +import type { LogPayloadByScope } from "./contracts/payloadByScope"; +import type { LogScope } from "./constants/scopes"; + +type LoggerPayload = { + socketId?: string; + roomId?: string; + [key: string]: unknown; +}; + +/** スコープ名とイベント情報を標準出力へ記録する */ +export const logEvent = < + TScope extends LogScope, +>( + scope: TScope, + payload: LoggerPayload & LogPayloadByScope[TScope] +) => { + console.log(`[${scope}]`, payload); +}; diff --git a/apps/server/src/network/handlers/payloadGuard.ts b/apps/server/src/network/handlers/payloadGuard.ts index 21852ea..dc308c4 100644 --- a/apps/server/src/network/handlers/payloadGuard.ts +++ b/apps/server/src/network/handlers/payloadGuard.ts @@ -3,8 +3,8 @@ * 受信ペイロード検証と不正時ログ記録を共通化するガード生成を担う */ import { protocol } from "@repo/shared"; -import { logEvent } from "@server/logging/logEvent"; -import { logResults, logScopes } from "@server/logging/logEvents"; +import { logEvent } from "@server/logging/logger"; +import { logResults, logScopes } from "@server/logging/index"; type PayloadValidator = (value: unknown) => value is TPayload; type PayloadGuardEventName = diff --git a/apps/server/src/network/handlers/registerConnectionHandlers.ts b/apps/server/src/network/handlers/registerConnectionHandlers.ts index f01c8ba..66850a8 100644 --- a/apps/server/src/network/handlers/registerConnectionHandlers.ts +++ b/apps/server/src/network/handlers/registerConnectionHandlers.ts @@ -5,8 +5,8 @@ import { Server, Socket } from "socket.io"; import { protocol } from "@repo/shared"; import { disconnectCoordinator } from "@server/application/coordinators/disconnectCoordinator"; -import { logEvent } from "@server/logging/logEvent"; -import { logResults, logScopes } from "@server/logging/logEvents"; +import { logEvent } from "@server/logging/logger"; +import { logResults, logScopes } from "@server/logging/index"; import { registerGameHandlers } from "./GameHandler"; import { registerRoomHandlers } from "./RoomHandler"; import { createGameDisconnectOutputAdapter } from "./game/createGameOutputAdapter"; diff --git a/apps/server/src/network/handlers/room/registerRoomHandlers.ts b/apps/server/src/network/handlers/room/registerRoomHandlers.ts index d7a6edf..3f1e989 100644 --- a/apps/server/src/network/handlers/room/registerRoomHandlers.ts +++ b/apps/server/src/network/handlers/room/registerRoomHandlers.ts @@ -6,8 +6,8 @@ import { protocol } 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 { logResults, logScopes } from "@server/logging/logEvents"; +import { logEvent } from "@server/logging/logger"; +import { logResults, logScopes } from "@server/logging/index"; import { createCommonHandlerContext } from "@server/network/handlers/CommonHandler"; import { createPayloadGuard } from "@server/network/handlers/payloadGuard"; import { createServerSocketOnBridge } from "@server/network/handlers/socketEventBridge";