/** * Transient State Schemas - SINGLE SOURCE OF TRUTH * * Define transient fields here ONCE. Both TypeScript types and runtime operations * derive from these schemas, ensuring DRY compliance. * * To add a new transient field: * 1. Add it to the appropriate schema below * 2. That's it! All preserve/restore/strip operations automatically include it */ /** * Transient Session Fields Schema * These fields are never persisted to the database */ export const TRANSIENT_SESSION_SCHEMA = { ws: undefined as any, keepAlive: undefined as NodeJS.Timeout | undefined, pingInterval: undefined as NodeJS.Timeout | undefined, lastPong: undefined as number | undefined, initialSnapshotSent: undefined as boolean | undefined, _getBatch: undefined as { fields: Set; timer?: any } | undefined, _pendingMessage: undefined as any, _pendingTimeout: undefined as any, live: false as boolean, hasAudio: undefined as boolean | undefined, audio: undefined as any, video: undefined as any, ping: undefined as number | undefined, }; /** * Transient Game Fields Schema * These fields are never persisted to the database */ export const TRANSIENT_GAME_SCHEMA = { turnTimer: undefined as any, unselected: undefined as any[] | undefined, }; // Derive runtime key arrays from schemas export const TRANSIENT_SESSION_KEYS = Object.keys(TRANSIENT_SESSION_SCHEMA) as (keyof typeof TRANSIENT_SESSION_SCHEMA)[]; export const TRANSIENT_GAME_KEYS = Object.keys(TRANSIENT_GAME_SCHEMA) as (keyof typeof TRANSIENT_GAME_SCHEMA)[]; // Export TypeScript types derived from schemas export type TransientSessionState = { [K in keyof typeof TRANSIENT_SESSION_SCHEMA]?: typeof TRANSIENT_SESSION_SCHEMA[K]; }; export type TransientGameState = { [K in keyof typeof TRANSIENT_GAME_SCHEMA]?: typeof TRANSIENT_GAME_SCHEMA[K]; };