Newer
Older
PixelPaintWar / apps / server / src / logging / logEvents.ts
/**
 * logEvents
 * アプリケーションログで利用するイベント名定数を提供する
 */
import { protocol } from "@repo/shared";

/** ログ出力で利用するスコープ名の共通定数 */
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];

type ValueOf<T> = T[keyof T];

/** Networkスコープで利用可能なイベント名型 */
export type NetworkLogEvent = ValueOf<typeof protocol.SocketEvents>;

/** Networkスコープで利用可能な結果値型 */
export type NetworkLogResult =
  | "connected"
  | "disconnected"
  | "rejected_room_full"
  | "rejected_duplicate"
  | "ignored_invalid_payload";

/** GameUseCaseスコープで利用可能なイベント名型 */
export type GameUseCaseLogEvent =
  | "start-game"
  | "ready-for-game"
  | "game-start"
  | "game-end"
  | "disconnect";

/** GameUseCaseスコープで利用可能な結果値型 */
export type GameUseCaseLogResult =
  | "ignored_no_room"
  | "ignored_already_playing"
  | "ignored_room_not_found"
  | "ignored_missing_room"
  | "accepted"
  | "received"
  | "emitted"
  | "player_removed";

/** RoomUseCaseスコープで利用可能なイベント名型 */
export type RoomUseCaseLogEvent =
  | "join-room"
  | "disconnect"
  | "room-update";

/** RoomUseCaseスコープで利用可能な結果値型 */
export type RoomUseCaseLogResult =
  | "received"
  | "rejected"
  | "processed"
  | "emitted";

/** GameLoopスコープで利用可能なイベント名型 */
export type GameLoopLogEvent = "GAME_LOOP";

/** GameLoopスコープで利用可能な結果値型 */
export type GameLoopLogResult =
  | "started"
  | "stopped";

/** GameRoomSessionスコープで利用可能なイベント名型 */
export type GameRoomSessionLogEvent = "move";

/** GameRoomSessionスコープで利用可能な結果値型 */
export type GameRoomSessionLogResult =
  | "ignored_player_not_found"
  | "ignored_invalid_payload";

/** GamePlayerOperationServiceスコープで利用可能なイベント名型 */
export type GamePlayerOperationServiceLogEvent =
  | "PLAYER_MOVE"
  | "PLAYER_REMOVE";

/** GamePlayerOperationServiceスコープで利用可能な結果値型 */
export type GamePlayerOperationServiceLogResult =
  | "ignored_player_not_in_session"
  | "session_disposed_empty_room";

/** GameSessionLifecycleServiceスコープで利用可能なイベント名型 */
export type GameSessionLifecycleServiceLogEvent = "SESSION_START";

/** GameSessionLifecycleServiceスコープで利用可能な結果値型 */
export type GameSessionLifecycleServiceLogResult =
  | "ignored_already_running"
  | "started";

/** RoomJoinServiceスコープで利用可能なイベント名型 */
export type RoomJoinServiceLogEvent =
  | "ROOM_CREATE"
  | "PLAYER_JOIN";

/** RoomJoinServiceスコープで利用可能な結果値型 */
export type RoomJoinServiceLogResult =
  | "created"
  | "ignored_duplicate"
  | "ignored_room_full"
  | "joined";

/** RoomExitServiceスコープで利用可能なイベント名型 */
export type RoomExitServiceLogEvent =
  | "PLAYER_LEAVE"
  | "ROOM_DELETE"
  | "OWNER_TRANSFER";

/** RoomExitServiceスコープで利用可能な結果値型 */
export type RoomExitServiceLogResult =
  | "removed"
  | "deleted"
  | "transferred";

/** スコープごとの event/result 型契約 */
export type LogPayloadByScope = {
  [logScopes.NETWORK]: {
    event: NetworkLogEvent;
    result: NetworkLogResult;
  };
  [logScopes.GAME_USE_CASE]: {
    event: GameUseCaseLogEvent;
    result: GameUseCaseLogResult;
  };
  [logScopes.ROOM_USE_CASE]: {
    event: RoomUseCaseLogEvent;
    result: RoomUseCaseLogResult;
  };
  [logScopes.GAME_LOOP]: {
    event: GameLoopLogEvent;
    result: GameLoopLogResult;
  };
  [logScopes.GAME_ROOM_SESSION]: {
    event: GameRoomSessionLogEvent;
    result: GameRoomSessionLogResult;
  };
  [logScopes.GAME_PLAYER_OPERATION_SERVICE]: {
    event: GamePlayerOperationServiceLogEvent;
    result: GamePlayerOperationServiceLogResult;
  };
  [logScopes.GAME_SESSION_LIFECYCLE_SERVICE]: {
    event: GameSessionLifecycleServiceLogEvent;
    result: GameSessionLifecycleServiceLogResult;
  };
  [logScopes.ROOM_JOIN_SERVICE]: {
    event: RoomJoinServiceLogEvent;
    result: RoomJoinServiceLogResult;
  };
  [logScopes.ROOM_EXIT_SERVICE]: {
    event: RoomExitServiceLogEvent;
    result: RoomExitServiceLogResult;
  };
};

/** スコープごとの必須追加フィールド型契約 */
export type LogRequiredFieldsByScope = {
  [logScopes.NETWORK]: {
    socketId: string;
  };
  [logScopes.GAME_USE_CASE]: {
    socketId?: string;
    roomId?: string;
  };
  [logScopes.ROOM_USE_CASE]: {
    socketId: string;
    roomId?: string;
  };
  [logScopes.GAME_LOOP]: {
    roomId: string;
  };
  [logScopes.GAME_ROOM_SESSION]: {
    roomId: string;
    socketId: string;
  };
  [logScopes.GAME_PLAYER_OPERATION_SERVICE]: {
    socketId: string;
    roomId?: string;
  };
  [logScopes.GAME_SESSION_LIFECYCLE_SERVICE]: {
    roomId: string;
  };
  [logScopes.ROOM_JOIN_SERVICE]: {
    roomId: string;
    socketId: string;
  };
  [logScopes.ROOM_EXIT_SERVICE]: {
    roomId: string;
    socketId: string;
  };
};

/** 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;

/** ログ出力で利用する結果値の共通定数 */
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;