@fluxstack/live 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/rooms/RoomEventBus.ts","../src/debug/LiveLogger.ts","../src/protocol/constants.ts","../src/rooms/LiveRoomManager.ts","../src/debug/LiveDebugger.ts","../src/auth/LiveAuthContext.ts","../src/auth/LiveAuthManager.ts","../src/security/StateSignature.ts","../src/monitoring/PerformanceMonitor.ts","../src/upload/FileUploadManager.ts","../src/connection/WebSocketConnectionManager.ts","../src/component/context.ts","../src/component/LiveComponent.ts","../src/component/ComponentRegistry.ts","../src/connection/RateLimiter.ts","../src/protocol/binary.ts","../src/server/LiveServer.ts","../src/rooms/RoomStateManager.ts"],"names":["EventEmitter","signedState","result"],"mappings":"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","file":"index.js","sourcesContent":["// @fluxstack/live - Room Event Bus (Pub/Sub server-side)\r\n\r\ntype EventHandler<T = any> = (data: T) => void\r\n\r\ninterface RoomSubscription {\r\n roomType: string\r\n roomId: string\r\n event: string\r\n handler: EventHandler\r\n componentId: string\r\n}\r\n\r\nexport function createTypedRoomEventBus<TRoomEvents extends Record<string, Record<string, any>>>() {\r\n const subscriptions = new Map<string, Set<RoomSubscription>>()\r\n\r\n const getKey = (roomType: string, roomId: string, event: string) =>\r\n `${roomType}:${roomId}:${event}`\r\n\r\n const getRoomKey = (roomType: string, roomId: string) =>\r\n `${roomType}:${roomId}`\r\n\r\n return {\r\n on<K extends keyof TRoomEvents, E extends keyof TRoomEvents[K]>(\r\n roomType: K,\r\n roomId: string,\r\n event: E,\r\n componentId: string,\r\n handler: EventHandler<TRoomEvents[K][E]>\r\n ): () => void {\r\n const key = getKey(roomType as string, roomId, event as string)\r\n\r\n if (!subscriptions.has(key)) {\r\n subscriptions.set(key, new Set())\r\n }\r\n\r\n const subscription: RoomSubscription = {\r\n roomType: roomType as string,\r\n roomId,\r\n event: event as string,\r\n handler,\r\n componentId\r\n }\r\n\r\n subscriptions.get(key)!.add(subscription)\r\n\r\n return () => {\r\n subscriptions.get(key)?.delete(subscription)\r\n if (subscriptions.get(key)?.size === 0) {\r\n subscriptions.delete(key)\r\n }\r\n }\r\n },\r\n\r\n emit<K extends keyof TRoomEvents, E extends keyof TRoomEvents[K]>(\r\n roomType: K,\r\n roomId: string,\r\n event: E,\r\n data: TRoomEvents[K][E],\r\n excludeComponentId?: string\r\n ): number {\r\n const key = getKey(roomType as string, roomId, event as string)\r\n const subs = subscriptions.get(key)\r\n\r\n if (!subs || subs.size === 0) return 0\r\n\r\n let notified = 0\r\n for (const sub of subs) {\r\n if (excludeComponentId && sub.componentId === excludeComponentId) continue\r\n\r\n try {\r\n sub.handler(data)\r\n notified++\r\n } catch (error) {\r\n console.error(`[RoomEventBus] Error in handler [${key}]:`, error)\r\n }\r\n }\r\n\r\n return notified\r\n },\r\n\r\n unsubscribeAll(componentId: string): number {\r\n let removed = 0\r\n\r\n for (const [key, subs] of subscriptions) {\r\n for (const sub of subs) {\r\n if (sub.componentId === componentId) {\r\n subs.delete(sub)\r\n removed++\r\n }\r\n }\r\n if (subs.size === 0) {\r\n subscriptions.delete(key)\r\n }\r\n }\r\n\r\n return removed\r\n },\r\n\r\n clearRoom<K extends keyof TRoomEvents>(roomType: K, roomId: string): number {\r\n const prefix = getRoomKey(roomType as string, roomId)\r\n let removed = 0\r\n\r\n for (const key of subscriptions.keys()) {\r\n if (key.startsWith(prefix)) {\r\n removed += subscriptions.get(key)?.size ?? 0\r\n subscriptions.delete(key)\r\n }\r\n }\r\n\r\n return removed\r\n },\r\n\r\n getStats(): { totalSubscriptions: number; rooms: Record<string, { events: Record<string, number> }> } {\r\n const rooms: Record<string, { events: Record<string, number> }> = {}\r\n let total = 0\r\n\r\n for (const [key, subs] of subscriptions) {\r\n const parts = key.split(':')\r\n const roomKey = `${parts[0]}:${parts[1]}`\r\n const event = parts[2] ?? ''\r\n\r\n if (!rooms[roomKey]) {\r\n rooms[roomKey] = { events: {} }\r\n }\r\n\r\n rooms[roomKey]!.events[event] = subs.size\r\n total += subs.size\r\n }\r\n\r\n return { totalSubscriptions: total, rooms }\r\n }\r\n }\r\n}\r\n\r\nexport class RoomEventBus {\r\n private subscriptions = new Map<string, Set<RoomSubscription>>()\r\n\r\n private getKey(roomType: string, roomId: string, event: string): string {\r\n return `${roomType}:${roomId}:${event}`\r\n }\r\n\r\n on(roomType: string, roomId: string, event: string, componentId: string, handler: EventHandler): () => void {\r\n const key = this.getKey(roomType, roomId, event)\r\n\r\n if (!this.subscriptions.has(key)) {\r\n this.subscriptions.set(key, new Set())\r\n }\r\n\r\n const subscription: RoomSubscription = { roomType, roomId, event, handler, componentId }\r\n this.subscriptions.get(key)!.add(subscription)\r\n\r\n return () => {\r\n this.subscriptions.get(key)?.delete(subscription)\r\n if (this.subscriptions.get(key)?.size === 0) {\r\n this.subscriptions.delete(key)\r\n }\r\n }\r\n }\r\n\r\n emit(roomType: string, roomId: string, event: string, data: any, excludeComponentId?: string): number {\r\n const key = this.getKey(roomType, roomId, event)\r\n const subs = this.subscriptions.get(key)\r\n\r\n if (!subs || subs.size === 0) return 0\r\n\r\n let notified = 0\r\n for (const sub of subs) {\r\n if (excludeComponentId && sub.componentId === excludeComponentId) continue\r\n\r\n try {\r\n sub.handler(data)\r\n notified++\r\n } catch (error) {\r\n console.error(`[RoomEventBus] Error in handler [${key}]:`, error)\r\n }\r\n }\r\n\r\n return notified\r\n }\r\n\r\n unsubscribeAll(componentId: string): number {\r\n let removed = 0\r\n\r\n for (const [key, subs] of this.subscriptions) {\r\n for (const sub of subs) {\r\n if (sub.componentId === componentId) {\r\n subs.delete(sub)\r\n removed++\r\n }\r\n }\r\n if (subs.size === 0) {\r\n this.subscriptions.delete(key)\r\n }\r\n }\r\n\r\n return removed\r\n }\r\n\r\n clearRoom(roomType: string, roomId: string): number {\r\n const prefix = `${roomType}:${roomId}`\r\n let removed = 0\r\n\r\n for (const key of this.subscriptions.keys()) {\r\n if (key.startsWith(prefix)) {\r\n removed += this.subscriptions.get(key)?.size ?? 0\r\n this.subscriptions.delete(key)\r\n }\r\n }\r\n\r\n return removed\r\n }\r\n\r\n getStats() {\r\n const rooms: Record<string, { events: Record<string, number> }> = {}\r\n let total = 0\r\n\r\n for (const [key, subs] of this.subscriptions) {\r\n const parts = key.split(':')\r\n const roomKey = `${parts[0]}:${parts[1]}`\r\n const event = parts[2] ?? ''\r\n\r\n if (!rooms[roomKey]) {\r\n rooms[roomKey] = { events: {} }\r\n }\r\n\r\n rooms[roomKey]!.events[event] = subs.size\r\n total += subs.size\r\n }\r\n\r\n return { totalSubscriptions: total, rooms }\r\n }\r\n}\r\n\r\nexport type { EventHandler, RoomSubscription }\r\n","// @fluxstack/live - Per-component logging control\r\n//\r\n// Silent by default - opt-in via static logging property.\r\n//\r\n// Usage in LiveComponent subclass:\r\n// static logging = true // all categories\r\n// static logging = ['lifecycle', 'messages'] // specific categories only\r\n// // (omit or set false -> silent)\r\n//\r\n// Categories:\r\n// lifecycle - mount, unmount, rehydration, recovery, migration\r\n// messages - received/sent WebSocket messages, file uploads\r\n// state - signing, backup, compression, encryption, validation\r\n// performance - monitoring init, alerts, optimization suggestions\r\n// rooms - room create/join/leave, emit, broadcast\r\n// websocket - connection open/close, auth\r\n//\r\n// Console output controlled by LIVE_LOGGING env var:\r\n// LIVE_LOGGING=true -> all global logs to console\r\n// LIVE_LOGGING=lifecycle,rooms -> only these categories to console\r\n// (unset or 'false') -> silent console (default)\r\n//\r\n// Debug panel: All liveLog/liveWarn calls are always forwarded to the Live Debugger\r\n// (when available) as LOG events, regardless of LIVE_LOGGING setting.\r\n\r\nexport type LiveLogCategory = 'lifecycle' | 'messages' | 'state' | 'performance' | 'rooms' | 'websocket'\r\n\r\nexport type LiveLogConfig = boolean | readonly LiveLogCategory[]\r\n\r\n// Registry: componentId -> resolved logging config\r\nconst componentConfigs = new Map<string, LiveLogConfig>()\r\n\r\n// Parse global config from env (lazy, cached)\r\nlet globalConfigParsed = false\r\nlet globalConfig: LiveLogConfig = false\r\n\r\nfunction parseGlobalConfig(): LiveLogConfig {\r\n if (globalConfigParsed) return globalConfig\r\n globalConfigParsed = true\r\n\r\n const envValue = typeof process !== 'undefined' ? process.env?.LIVE_LOGGING : undefined\r\n if (!envValue || envValue === 'false') {\r\n globalConfig = false\r\n } else if (envValue === 'true') {\r\n globalConfig = true\r\n } else {\r\n // Comma-separated categories: \"lifecycle,rooms,messages\"\r\n globalConfig = envValue.split(',').map(s => s.trim()).filter(Boolean) as LiveLogCategory[]\r\n }\r\n return globalConfig\r\n}\r\n\r\n/**\r\n * Register a component's logging config (called on mount)\r\n */\r\nexport function registerComponentLogging(componentId: string, config: LiveLogConfig | undefined): void {\r\n if (config !== undefined && config !== false) {\r\n componentConfigs.set(componentId, config)\r\n }\r\n}\r\n\r\n/**\r\n * Unregister component logging (called on unmount/cleanup)\r\n */\r\nexport function unregisterComponentLogging(componentId: string): void {\r\n componentConfigs.delete(componentId)\r\n}\r\n\r\n/**\r\n * Check if a log should be emitted for a given component + category\r\n */\r\nfunction shouldLog(componentId: string | null, category: LiveLogCategory): boolean {\r\n if (componentId) {\r\n const config = componentConfigs.get(componentId)\r\n if (config === undefined || config === false) return false\r\n if (config === true) return true\r\n return config.includes(category)\r\n }\r\n // Global log (no specific component)\r\n const cfg = parseGlobalConfig()\r\n if (cfg === false) return false\r\n if (cfg === true) return true\r\n return cfg.includes(category)\r\n}\r\n\r\n// ===== Debugger Integration (injectable) =====\r\n// The debugger is injected lazily to avoid circular dependencies.\r\n\r\ninterface LiveDebuggerLike {\r\n enabled: boolean\r\n emit(type: string, componentId: string | null, componentName: string | null, data: Record<string, unknown>): void\r\n}\r\n\r\nlet _debugger: LiveDebuggerLike | null = null\r\n\r\n/** @internal Inject debugger instance for log forwarding */\r\nexport function _setLoggerDebugger(dbg: LiveDebuggerLike): void {\r\n _debugger = dbg\r\n}\r\n\r\n/**\r\n * Forward a log entry to the Live Debugger as a LOG event.\r\n * Always emits when the debugger is enabled, regardless of console logging config.\r\n */\r\nfunction emitToDebugger(category: LiveLogCategory, level: 'info' | 'warn', componentId: string | null, message: string, args: unknown[]): void {\r\n if (!_debugger?.enabled) return\r\n\r\n const data: Record<string, unknown> = { category, level, message }\r\n if (args.length === 1 && typeof args[0] === 'object' && args[0] !== null) {\r\n data.details = args[0]\r\n } else if (args.length > 0) {\r\n data.details = args\r\n }\r\n\r\n _debugger.emit('LOG', componentId, null, data)\r\n}\r\n\r\n/**\r\n * Log a message gated by the component's logging config.\r\n * Always forwarded to the Live Debugger when active.\r\n */\r\nexport function liveLog(category: LiveLogCategory, componentId: string | null, message: string, ...args: unknown[]): void {\r\n // Always forward to debug panel\r\n emitToDebugger(category, 'info', componentId, message, args)\r\n\r\n // Console output gated by config\r\n if (shouldLog(componentId, category)) {\r\n if (args.length > 0) {\r\n console.log(message, ...args)\r\n } else {\r\n console.log(message)\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Warn-level log gated by config.\r\n * Always forwarded to the Live Debugger when active.\r\n */\r\nexport function liveWarn(category: LiveLogCategory, componentId: string | null, message: string, ...args: unknown[]): void {\r\n // Always forward to debug panel\r\n emitToDebugger(category, 'warn', componentId, message, args)\r\n\r\n // Console output gated by config\r\n if (shouldLog(componentId, category)) {\r\n if (args.length > 0) {\r\n console.warn(message, ...args)\r\n } else {\r\n console.warn(message)\r\n }\r\n }\r\n}\r\n","// @fluxstack/live - Protocol Constants\r\n\r\n/** Current protocol version */\r\nexport const PROTOCOL_VERSION = 1\r\n\r\n/** Default WebSocket path */\r\nexport const DEFAULT_WS_PATH = '/api/live/ws'\r\n\r\n/** Default chunk size for file uploads (64KB) */\r\nexport const DEFAULT_CHUNK_SIZE = 64 * 1024\r\n\r\n/** Default rate limit: max tokens per connection */\r\nexport const DEFAULT_RATE_LIMIT_MAX_TOKENS = 100\r\n\r\n/** Default rate limit: tokens refilled per second */\r\nexport const DEFAULT_RATE_LIMIT_REFILL_RATE = 50\r\n\r\n/** Maximum room state size (10MB) */\r\nexport const MAX_ROOM_STATE_SIZE = 10 * 1024 * 1024\r\n\r\n/** Maximum room name length */\r\nexport const MAX_ROOM_NAME_LENGTH = 64\r\n\r\n/** Room name validation regex */\r\nexport const ROOM_NAME_REGEX = /^[a-zA-Z0-9_:.-]{1,64}$/\r\n","// @fluxstack/live - Live Room Manager\r\n//\r\n// Manages rooms for Live Components. Uses RoomEventBus for server-side pub/sub.\r\n\r\nimport type { RoomEventBus } from './RoomEventBus'\r\nimport type { GenericWebSocket } from '../transport/types'\r\nimport { liveLog } from '../debug/LiveLogger'\r\nimport { MAX_ROOM_STATE_SIZE } from '../protocol/constants'\r\n\r\nexport interface RoomMessage {\r\n type: 'ROOM_JOIN' | 'ROOM_LEAVE' | 'ROOM_EMIT' | 'ROOM_STATE_SET' | 'ROOM_STATE_GET'\r\n componentId: string\r\n roomId: string\r\n event?: string\r\n data?: any\r\n requestId?: string\r\n timestamp: number\r\n}\r\n\r\ninterface RoomMember {\r\n componentId: string\r\n ws: GenericWebSocket\r\n joinedAt: number\r\n}\r\n\r\ninterface Room<TState = any> {\r\n id: string\r\n state: TState\r\n members: Map<string, RoomMember>\r\n createdAt: number\r\n lastActivity: number\r\n}\r\n\r\nexport class LiveRoomManager {\r\n private rooms = new Map<string, Room>()\r\n private componentRooms = new Map<string, Set<string>>() // componentId -> roomIds\r\n\r\n constructor(private roomEvents: RoomEventBus) {}\r\n\r\n /**\r\n * Component joins a room\r\n */\r\n joinRoom<TState = any>(componentId: string, roomId: string, ws: GenericWebSocket, initialState?: TState): { state: TState } {\r\n // Validate room name format\r\n if (!roomId || !/^[a-zA-Z0-9_:.-]{1,64}$/.test(roomId)) {\r\n throw new Error('Invalid room name. Must be 1-64 alphanumeric characters, hyphens, underscores, dots, or colons.')\r\n }\r\n\r\n // Create room if it doesn't exist\r\n if (!this.rooms.has(roomId)) {\r\n this.rooms.set(roomId, {\r\n id: roomId,\r\n state: initialState || {},\r\n members: new Map(),\r\n createdAt: Date.now(),\r\n lastActivity: Date.now()\r\n })\r\n liveLog('rooms', componentId, `Room '${roomId}' created`)\r\n }\r\n\r\n const room = this.rooms.get(roomId)!\r\n\r\n // Add member\r\n room.members.set(componentId, {\r\n componentId,\r\n ws,\r\n joinedAt: Date.now()\r\n })\r\n room.lastActivity = Date.now()\r\n\r\n // Track component rooms\r\n if (!this.componentRooms.has(componentId)) {\r\n this.componentRooms.set(componentId, new Set())\r\n }\r\n this.componentRooms.get(componentId)!.add(roomId)\r\n\r\n liveLog('rooms', componentId, `Component '${componentId}' joined room '${roomId}' (${room.members.size} members)`)\r\n\r\n // Notify other members\r\n this.broadcastToRoom(roomId, {\r\n type: 'ROOM_SYSTEM',\r\n componentId,\r\n roomId,\r\n event: '$sub:join',\r\n data: {\r\n subscriberId: componentId,\r\n count: room.members.size\r\n },\r\n timestamp: Date.now()\r\n }, componentId)\r\n\r\n return { state: room.state }\r\n }\r\n\r\n /**\r\n * Component leaves a room\r\n */\r\n leaveRoom(componentId: string, roomId: string): void {\r\n const room = this.rooms.get(roomId)\r\n if (!room) return\r\n\r\n room.members.delete(componentId)\r\n room.lastActivity = Date.now()\r\n\r\n this.componentRooms.get(componentId)?.delete(roomId)\r\n\r\n liveLog('rooms', componentId, `Component '${componentId}' left room '${roomId}' (${room.members.size} members)`)\r\n\r\n // Notify other members\r\n this.broadcastToRoom(roomId, {\r\n type: 'ROOM_SYSTEM',\r\n componentId,\r\n roomId,\r\n event: '$sub:leave',\r\n data: {\r\n subscriberId: componentId,\r\n count: room.members.size\r\n },\r\n timestamp: Date.now()\r\n })\r\n\r\n // Cleanup empty room after delay\r\n if (room.members.size === 0) {\r\n setTimeout(() => {\r\n const currentRoom = this.rooms.get(roomId)\r\n if (currentRoom && currentRoom.members.size === 0) {\r\n this.rooms.delete(roomId)\r\n liveLog('rooms', null, `Room '${roomId}' destroyed (empty)`)\r\n }\r\n }, 5 * 60 * 1000)\r\n }\r\n }\r\n\r\n /**\r\n * Component disconnects - leave all rooms\r\n */\r\n cleanupComponent(componentId: string): void {\r\n const rooms = this.componentRooms.get(componentId)\r\n if (!rooms) return\r\n\r\n for (const roomId of rooms) {\r\n this.leaveRoom(componentId, roomId)\r\n }\r\n\r\n this.componentRooms.delete(componentId)\r\n }\r\n\r\n /**\r\n * Emit event to all members in a room\r\n */\r\n emitToRoom(roomId: string, event: string, data: any, excludeComponentId?: string): number {\r\n const room = this.rooms.get(roomId)\r\n if (!room) return 0\r\n\r\n room.lastActivity = Date.now()\r\n\r\n // 1. Emit on RoomEventBus for server-side handlers\r\n this.roomEvents.emit('room', roomId, event, data, excludeComponentId)\r\n\r\n // 2. Broadcast via WebSocket to frontends\r\n return this.broadcastToRoom(roomId, {\r\n type: 'ROOM_EVENT',\r\n componentId: '',\r\n roomId,\r\n event,\r\n data,\r\n timestamp: Date.now()\r\n }, excludeComponentId)\r\n }\r\n\r\n /**\r\n * Update room state\r\n */\r\n setRoomState(roomId: string, updates: any, excludeComponentId?: string): void {\r\n const room = this.rooms.get(roomId)\r\n if (!room) return\r\n\r\n const newState = { ...room.state, ...updates }\r\n\r\n // Validate state size\r\n const stateSize = Buffer.byteLength(JSON.stringify(newState), 'utf8')\r\n if (stateSize > MAX_ROOM_STATE_SIZE) {\r\n throw new Error('Room state exceeds maximum size limit')\r\n }\r\n\r\n room.state = newState\r\n room.lastActivity = Date.now()\r\n\r\n this.broadcastToRoom(roomId, {\r\n type: 'ROOM_STATE',\r\n componentId: '',\r\n roomId,\r\n event: '$state:update',\r\n data: { state: updates },\r\n timestamp: Date.now()\r\n }, excludeComponentId)\r\n }\r\n\r\n /**\r\n * Get room state\r\n */\r\n getRoomState<TState = any>(roomId: string): TState {\r\n return (this.rooms.get(roomId)?.state || {}) as TState\r\n }\r\n\r\n /**\r\n * Broadcast to all members in a room\r\n */\r\n private broadcastToRoom(roomId: string, message: any, excludeComponentId?: string): number {\r\n const room = this.rooms.get(roomId)\r\n if (!room) return 0\r\n\r\n let sent = 0\r\n for (const [componentId, member] of room.members) {\r\n if (excludeComponentId && componentId === excludeComponentId) continue\r\n\r\n try {\r\n if (member.ws && member.ws.readyState === 1) {\r\n member.ws.send(JSON.stringify({\r\n ...message,\r\n componentId\r\n }))\r\n sent++\r\n }\r\n } catch (error) {\r\n console.error(`Failed to send to ${componentId}:`, error)\r\n }\r\n }\r\n\r\n return sent\r\n }\r\n\r\n /**\r\n * Check if component is in a room\r\n */\r\n isInRoom(componentId: string, roomId: string): boolean {\r\n return this.rooms.get(roomId)?.members.has(componentId) ?? false\r\n }\r\n\r\n /**\r\n * Get rooms for a component\r\n */\r\n getComponentRooms(componentId: string): string[] {\r\n return Array.from(this.componentRooms.get(componentId) || [])\r\n }\r\n\r\n /**\r\n * Get statistics\r\n */\r\n getStats(): {\r\n totalRooms: number\r\n rooms: Record<string, { members: number; createdAt: number; lastActivity: number }>\r\n } {\r\n const rooms: Record<string, { members: number; createdAt: number; lastActivity: number }> = {}\r\n\r\n for (const [id, room] of this.rooms) {\r\n rooms[id] = {\r\n members: room.members.size,\r\n createdAt: room.createdAt,\r\n lastActivity: room.lastActivity\r\n }\r\n }\r\n\r\n return {\r\n totalRooms: this.rooms.size,\r\n rooms\r\n }\r\n }\r\n}\r\n\r\nexport type { Room, RoomMember }\r\n","// @fluxstack/live - Live Component Debugger - Server-Side Event Bus\r\n//\r\n// Captures and streams debug events from the Live Components system.\r\n// Enabled via LiveServerOptions.debug or LIVE_DEBUG env var.\r\n//\r\n// Events captured:\r\n// - Component mount/unmount/rehydrate\r\n// - State changes (setState, proxy mutations)\r\n// - Action calls (name, payload, result, duration, errors)\r\n// - Room events (join, leave, emit)\r\n// - WebSocket connections/disconnections\r\n// - Errors\r\n\r\nimport type { GenericWebSocket } from '../transport/types'\r\n\r\n// ===== Types =====\r\n\r\nexport type DebugEventType =\r\n | 'COMPONENT_MOUNT'\r\n | 'COMPONENT_UNMOUNT'\r\n | 'COMPONENT_REHYDRATE'\r\n | 'STATE_CHANGE'\r\n | 'ACTION_CALL'\r\n | 'ACTION_RESULT'\r\n | 'ACTION_ERROR'\r\n | 'ROOM_JOIN'\r\n | 'ROOM_LEAVE'\r\n | 'ROOM_EMIT'\r\n | 'ROOM_EVENT_RECEIVED'\r\n | 'WS_CONNECT'\r\n | 'WS_DISCONNECT'\r\n | 'ERROR'\r\n | 'LOG'\r\n\r\nexport interface DebugEvent {\r\n id: string\r\n timestamp: number\r\n type: DebugEventType\r\n componentId: string | null\r\n componentName: string | null\r\n data: Record<string, unknown>\r\n}\r\n\r\nexport interface ComponentSnapshot {\r\n componentId: string\r\n componentName: string\r\n /** Developer-defined label for easier identification in the debugger */\r\n debugLabel?: string\r\n state: Record<string, unknown>\r\n rooms: string[]\r\n mountedAt: number\r\n lastActivity: number\r\n actionCount: number\r\n stateChangeCount: number\r\n errorCount: number\r\n}\r\n\r\nexport interface DebugSnapshot {\r\n components: ComponentSnapshot[]\r\n connections: number\r\n uptime: number\r\n totalEvents: number\r\n}\r\n\r\n// ===== Debug Message Types (sent to debug clients) =====\r\n\r\nexport interface DebugWsMessage {\r\n type: 'DEBUG_EVENT' | 'DEBUG_SNAPSHOT' | 'DEBUG_WELCOME' | 'DEBUG_DISABLED'\r\n event?: DebugEvent\r\n snapshot?: DebugSnapshot\r\n enabled?: boolean\r\n timestamp: number\r\n}\r\n\r\n// ===== LiveDebugger =====\r\n\r\nconst MAX_EVENTS = 500\r\nconst MAX_STATE_SIZE = 50_000\r\n\r\nexport class LiveDebugger {\r\n private events: DebugEvent[] = []\r\n private componentSnapshots = new Map<string, ComponentSnapshot>()\r\n private debugClients = new Set<GenericWebSocket>()\r\n private _enabled = false\r\n private startTime = Date.now()\r\n private eventCounter = 0\r\n\r\n constructor(enabled = false) {\r\n this._enabled = enabled\r\n }\r\n\r\n get enabled(): boolean {\r\n return this._enabled\r\n }\r\n\r\n set enabled(value: boolean) {\r\n this._enabled = value\r\n }\r\n\r\n // ===== Event Emission =====\r\n\r\n emit(\r\n type: DebugEventType | string,\r\n componentId: string | null,\r\n componentName: string | null,\r\n data: Record<string, unknown> = {}\r\n ): void {\r\n if (!this._enabled) return\r\n\r\n const event: DebugEvent = {\r\n id: `dbg-${++this.eventCounter}`,\r\n timestamp: Date.now(),\r\n type: type as DebugEventType,\r\n componentId,\r\n componentName,\r\n data: this.sanitizeData(data)\r\n }\r\n\r\n // Store in circular buffer\r\n this.events.push(event)\r\n if (this.events.length > MAX_EVENTS) {\r\n this.events.shift()\r\n }\r\n\r\n // Update component snapshot\r\n if (componentId) {\r\n this.updateSnapshot(event)\r\n }\r\n\r\n // Broadcast to debug clients\r\n this.broadcastEvent(event)\r\n }\r\n\r\n // ===== Component Tracking =====\r\n\r\n trackComponentMount(\r\n componentId: string,\r\n componentName: string,\r\n initialState: Record<string, unknown>,\r\n room?: string,\r\n debugLabel?: string\r\n ): void {\r\n if (!this._enabled) return\r\n\r\n const snapshot: ComponentSnapshot = {\r\n componentId,\r\n componentName,\r\n debugLabel,\r\n state: this.sanitizeState(initialState),\r\n rooms: room ? [room] : [],\r\n mountedAt: Date.now(),\r\n lastActivity: Date.now(),\r\n actionCount: 0,\r\n stateChangeCount: 0,\r\n errorCount: 0\r\n }\r\n\r\n this.componentSnapshots.set(componentId, snapshot)\r\n\r\n this.emit('COMPONENT_MOUNT', componentId, componentName, {\r\n initialState: snapshot.state,\r\n room: room ?? null,\r\n debugLabel: debugLabel ?? null\r\n })\r\n }\r\n\r\n trackComponentUnmount(componentId: string): void {\r\n if (!this._enabled) return\r\n\r\n const snapshot = this.componentSnapshots.get(componentId)\r\n const componentName = snapshot?.componentName ?? null\r\n\r\n this.emit('COMPONENT_UNMOUNT', componentId, componentName, {\r\n lifetime: snapshot ? Date.now() - snapshot.mountedAt : 0,\r\n totalActions: snapshot?.actionCount ?? 0,\r\n totalStateChanges: snapshot?.stateChangeCount ?? 0,\r\n totalErrors: snapshot?.errorCount ?? 0\r\n })\r\n\r\n this.componentSnapshots.delete(componentId)\r\n }\r\n\r\n trackStateChange(\r\n componentId: string,\r\n delta: Record<string, unknown>,\r\n fullState: Record<string, unknown>,\r\n source: 'proxy' | 'setState' | 'rehydrate' = 'setState'\r\n ): void {\r\n if (!this._enabled) return\r\n\r\n const snapshot = this.componentSnapshots.get(componentId)\r\n if (snapshot) {\r\n snapshot.state = this.sanitizeState(fullState)\r\n snapshot.stateChangeCount++\r\n snapshot.lastActivity = Date.now()\r\n }\r\n\r\n this.emit('STATE_CHANGE', componentId, snapshot?.componentName ?? null, {\r\n delta,\r\n fullState: this.sanitizeState(fullState),\r\n source\r\n })\r\n }\r\n\r\n trackActionCall(\r\n componentId: string,\r\n action: string,\r\n payload: unknown\r\n ): void {\r\n if (!this._enabled) return\r\n\r\n const snapshot = this.componentSnapshots.get(componentId)\r\n if (snapshot) {\r\n snapshot.actionCount++\r\n snapshot.lastActivity = Date.now()\r\n }\r\n\r\n this.emit('ACTION_CALL', componentId, snapshot?.componentName ?? null, {\r\n action,\r\n payload: this.sanitizeData({ payload }).payload\r\n })\r\n }\r\n\r\n trackActionResult(\r\n componentId: string,\r\n action: string,\r\n result: unknown,\r\n duration: number\r\n ): void {\r\n if (!this._enabled) return\r\n\r\n const snapshot = this.componentSnapshots.get(componentId)\r\n\r\n this.emit('ACTION_RESULT', componentId, snapshot?.componentName ?? null, {\r\n action,\r\n result: this.sanitizeData({ result }).result,\r\n duration\r\n })\r\n }\r\n\r\n trackActionError(\r\n componentId: string,\r\n action: string,\r\n error: string,\r\n duration: number\r\n ): void {\r\n if (!this._enabled) return\r\n\r\n const snapshot = this.componentSnapshots.get(componentId)\r\n if (snapshot) {\r\n snapshot.errorCount++\r\n }\r\n\r\n this.emit('ACTION_ERROR', componentId, snapshot?.componentName ?? null, {\r\n action,\r\n error,\r\n duration\r\n })\r\n }\r\n\r\n trackRoomJoin(componentId: string, roomId: string): void {\r\n if (!this._enabled) return\r\n\r\n const snapshot = this.componentSnapshots.get(componentId)\r\n if (snapshot && !snapshot.rooms.includes(roomId)) {\r\n snapshot.rooms.push(roomId)\r\n }\r\n\r\n this.emit('ROOM_JOIN', componentId, snapshot?.componentName ?? null, { roomId })\r\n }\r\n\r\n trackRoomLeave(componentId: string, roomId: string): void {\r\n if (!this._enabled) return\r\n\r\n const snapshot = this.componentSnapshots.get(componentId)\r\n if (snapshot) {\r\n snapshot.rooms = snapshot.rooms.filter(r => r !== roomId)\r\n }\r\n\r\n this.emit('ROOM_LEAVE', componentId, snapshot?.componentName ?? null, { roomId })\r\n }\r\n\r\n trackRoomEmit(componentId: string, roomId: string, event: string, data: unknown): void {\r\n if (!this._enabled) return\r\n\r\n const snapshot = this.componentSnapshots.get(componentId)\r\n\r\n this.emit('ROOM_EMIT', componentId, snapshot?.componentName ?? null, {\r\n roomId,\r\n event,\r\n data: this.sanitizeData({ data }).data\r\n })\r\n }\r\n\r\n trackConnection(connectionId: string): void {\r\n if (!this._enabled) return\r\n this.emit('WS_CONNECT', null, null, { connectionId })\r\n }\r\n\r\n trackDisconnection(connectionId: string, componentCount: number): void {\r\n if (!this._enabled) return\r\n this.emit('WS_DISCONNECT', null, null, { connectionId, componentCount })\r\n }\r\n\r\n trackError(componentId: string | null, error: string, context?: Record<string, unknown>): void {\r\n if (!this._enabled) return\r\n\r\n const snapshot = componentId ? this.componentSnapshots.get(componentId) : null\r\n if (snapshot) {\r\n snapshot.errorCount++\r\n }\r\n\r\n this.emit('ERROR', componentId, snapshot?.componentName ?? null, {\r\n error,\r\n ...context\r\n })\r\n }\r\n\r\n // ===== Debug Client Management =====\r\n\r\n registerDebugClient(ws: GenericWebSocket): void {\r\n if (!this._enabled) {\r\n const disabled: DebugWsMessage = {\r\n type: 'DEBUG_DISABLED',\r\n enabled: false,\r\n timestamp: Date.now()\r\n }\r\n ws.send(JSON.stringify(disabled))\r\n ws.close()\r\n return\r\n }\r\n\r\n this.debugClients.add(ws)\r\n\r\n // Send welcome with current snapshot\r\n const welcome: DebugWsMessage = {\r\n type: 'DEBUG_WELCOME',\r\n enabled: true,\r\n snapshot: this.getSnapshot(),\r\n timestamp: Date.now()\r\n }\r\n ws.send(JSON.stringify(welcome))\r\n\r\n // Send recent events\r\n for (const event of this.events.slice(-100)) {\r\n const msg: DebugWsMessage = {\r\n type: 'DEBUG_EVENT',\r\n event,\r\n timestamp: Date.now()\r\n }\r\n ws.send(JSON.stringify(msg))\r\n }\r\n }\r\n\r\n unregisterDebugClient(ws: GenericWebSocket): void {\r\n this.debugClients.delete(ws)\r\n }\r\n\r\n // ===== Snapshot =====\r\n\r\n getSnapshot(): DebugSnapshot {\r\n return {\r\n components: Array.from(this.componentSnapshots.values()),\r\n connections: this.debugClients.size,\r\n uptime: Date.now() - this.startTime,\r\n totalEvents: this.eventCounter\r\n }\r\n }\r\n\r\n getComponentState(componentId: string): ComponentSnapshot | null {\r\n return this.componentSnapshots.get(componentId) ?? null\r\n }\r\n\r\n getEvents(filter?: {\r\n componentId?: string\r\n type?: DebugEventType\r\n limit?: number\r\n }): DebugEvent[] {\r\n let filtered = this.events\r\n\r\n if (filter?.componentId) {\r\n filtered = filtered.filter(e => e.componentId === filter.componentId)\r\n }\r\n if (filter?.type) {\r\n filtered = filtered.filter(e => e.type === filter.type)\r\n }\r\n\r\n const limit = filter?.limit ?? 100\r\n return filtered.slice(-limit)\r\n }\r\n\r\n clearEvents(): void {\r\n this.events = []\r\n }\r\n\r\n // ===== Internal =====\r\n\r\n private broadcastEvent(event: DebugEvent): void {\r\n if (this.debugClients.size === 0) return\r\n\r\n const msg: DebugWsMessage = {\r\n type: 'DEBUG_EVENT',\r\n event,\r\n timestamp: Date.now()\r\n }\r\n const json = JSON.stringify(msg)\r\n\r\n for (const client of this.debugClients) {\r\n try {\r\n client.send(json)\r\n } catch {\r\n // Client disconnected, will be cleaned up\r\n this.debugClients.delete(client)\r\n }\r\n }\r\n }\r\n\r\n private sanitizeData(data: Record<string, unknown>): Record<string, unknown> {\r\n try {\r\n const json = JSON.stringify(data)\r\n if (json.length > MAX_STATE_SIZE) {\r\n return { _truncated: true, _size: json.length, _preview: json.slice(0, 500) + '...' }\r\n }\r\n return JSON.parse(json)\r\n } catch {\r\n return { _serialization_error: true }\r\n }\r\n }\r\n\r\n private sanitizeState(state: Record<string, unknown>): Record<string, unknown> {\r\n try {\r\n const json = JSON.stringify(state)\r\n if (json.length > MAX_STATE_SIZE) {\r\n return { _truncated: true, _size: json.length }\r\n }\r\n return JSON.parse(json)\r\n } catch {\r\n return { _serialization_error: true }\r\n }\r\n }\r\n\r\n private updateSnapshot(event: DebugEvent): void {\r\n if (!event.componentId) return\r\n\r\n const snapshot = this.componentSnapshots.get(event.componentId)\r\n if (snapshot) {\r\n snapshot.lastActivity = event.timestamp\r\n }\r\n }\r\n}\r\n","// @fluxstack/live - Auth Context Implementation\r\n\r\nimport type { LiveAuthContext, LiveAuthUser } from './types'\r\n\r\n/**\r\n * Auth context for authenticated users.\r\n * Provides type-safe helpers for role and permission checks.\r\n *\r\n * Used internally by the framework - devs access via this.$auth in LiveComponent.\r\n */\r\nexport class AuthenticatedContext implements LiveAuthContext {\r\n readonly authenticated = true\r\n readonly user: LiveAuthUser\r\n readonly token?: string\r\n readonly authenticatedAt: number\r\n\r\n constructor(user: LiveAuthUser, token?: string) {\r\n this.user = user\r\n this.token = token\r\n this.authenticatedAt = Date.now()\r\n }\r\n\r\n hasRole(role: string): boolean {\r\n return this.user.roles?.includes(role) ?? false\r\n }\r\n\r\n hasAnyRole(roles: string[]): boolean {\r\n if (!this.user.roles?.length) return false\r\n return roles.some(role => this.user.roles!.includes(role))\r\n }\r\n\r\n hasAllRoles(roles: string[]): boolean {\r\n if (!this.user.roles?.length) return roles.length === 0\r\n return roles.every(role => this.user.roles!.includes(role))\r\n }\r\n\r\n hasPermission(permission: string): boolean {\r\n return this.user.permissions?.includes(permission) ?? false\r\n }\r\n\r\n hasAllPermissions(permissions: string[]): boolean {\r\n if (!this.user.permissions?.length) return permissions.length === 0\r\n return permissions.every(perm => this.user.permissions!.includes(perm))\r\n }\r\n\r\n hasAnyPermission(permissions: string[]): boolean {\r\n if (!this.user.permissions?.length) return false\r\n return permissions.some(perm => this.user.permissions!.includes(perm))\r\n }\r\n}\r\n\r\n/**\r\n * Context for unauthenticated users (guest).\r\n * Returned when no credentials are provided or when auth fails.\r\n */\r\nexport class AnonymousContext implements LiveAuthContext {\r\n readonly authenticated = false\r\n readonly user = undefined\r\n readonly token = undefined\r\n readonly authenticatedAt = undefined\r\n\r\n hasRole(): boolean { return false }\r\n hasAnyRole(): boolean { return false }\r\n hasAllRoles(): boolean { return false }\r\n hasPermission(): boolean { return false }\r\n hasAllPermissions(): boolean { return false }\r\n hasAnyPermission(): boolean { return false }\r\n}\r\n\r\n/** Singleton for anonymous contexts */\r\nexport const ANONYMOUS_CONTEXT = new AnonymousContext()\r\n","// @fluxstack/live - Auth Manager\r\n//\r\n// Manages auth providers and executes auth checks.\r\n\r\nimport type {\r\n LiveAuthProvider,\r\n LiveAuthCredentials,\r\n LiveAuthContext,\r\n LiveComponentAuth,\r\n LiveActionAuth,\r\n LiveAuthResult,\r\n} from './types'\r\nimport { ANONYMOUS_CONTEXT } from './LiveAuthContext'\r\n\r\nexport class LiveAuthManager {\r\n private providers = new Map<string, LiveAuthProvider>()\r\n private defaultProviderName?: string\r\n\r\n /**\r\n * Register an auth provider.\r\n */\r\n register(provider: LiveAuthProvider): void {\r\n this.providers.set(provider.name, provider)\r\n\r\n if (!this.defaultProviderName) {\r\n this.defaultProviderName = provider.name\r\n }\r\n\r\n console.log(`[Auth] Provider registered: ${provider.name}`)\r\n }\r\n\r\n /**\r\n * Remove an auth provider.\r\n */\r\n unregister(name: string): void {\r\n this.providers.delete(name)\r\n if (this.defaultProviderName === name) {\r\n this.defaultProviderName = this.providers.keys().next().value\r\n }\r\n }\r\n\r\n /**\r\n * Set the default auth provider.\r\n */\r\n setDefault(name: string): void {\r\n if (!this.providers.has(name)) {\r\n throw new Error(`Auth provider '${name}' not registered`)\r\n }\r\n this.defaultProviderName = name\r\n }\r\n\r\n /**\r\n * Returns true if at least one provider is registered.\r\n */\r\n hasProviders(): boolean {\r\n return this.providers.size > 0\r\n }\r\n\r\n /**\r\n * Returns the default provider or undefined.\r\n */\r\n getDefaultProvider(): LiveAuthProvider | undefined {\r\n if (!this.defaultProviderName) return undefined\r\n return this.providers.get(this.defaultProviderName)\r\n }\r\n\r\n /**\r\n * Authenticate credentials using the specified provider, or try all providers.\r\n * Returns ANONYMOUS_CONTEXT if no credentials or no providers.\r\n */\r\n async authenticate(\r\n credentials: LiveAuthCredentials,\r\n providerName?: string\r\n ): Promise<LiveAuthContext> {\r\n if (!credentials || Object.keys(credentials).every(k => !credentials[k])) {\r\n return ANONYMOUS_CONTEXT\r\n }\r\n\r\n if (this.providers.size === 0) {\r\n return ANONYMOUS_CONTEXT\r\n }\r\n\r\n if (providerName) {\r\n const provider = this.providers.get(providerName)\r\n if (!provider) {\r\n console.warn(`[Auth] Provider '${providerName}' not found`)\r\n return ANONYMOUS_CONTEXT\r\n }\r\n try {\r\n const context = await provider.authenticate(credentials)\r\n return context || ANONYMOUS_CONTEXT\r\n } catch (error: any) {\r\n console.error(`[Auth] Failed via '${providerName}':`, error.message)\r\n return ANONYMOUS_CONTEXT\r\n }\r\n }\r\n\r\n // Try all providers (default first)\r\n const providersToTry: LiveAuthProvider[] = []\r\n\r\n if (this.defaultProviderName) {\r\n const defaultProvider = this.providers.get(this.defaultProviderName)\r\n if (defaultProvider) providersToTry.push(defaultProvider)\r\n }\r\n\r\n for (const [name, provider] of this.providers) {\r\n if (name !== this.defaultProviderName) {\r\n providersToTry.push(provider)\r\n }\r\n }\r\n\r\n for (const provider of providersToTry) {\r\n try {\r\n const context = await provider.authenticate(credentials)\r\n if (context && context.authenticated) {\r\n return context\r\n }\r\n } catch {\r\n // Silently continue to next provider\r\n }\r\n }\r\n\r\n return ANONYMOUS_CONTEXT\r\n }\r\n\r\n /**\r\n * Verify auth context meets component requirements.\r\n */\r\n authorizeComponent(\r\n authContext: LiveAuthContext,\r\n authConfig: LiveComponentAuth | undefined\r\n ): LiveAuthResult {\r\n if (!authConfig) {\r\n return { allowed: true }\r\n }\r\n\r\n if (authConfig.required && !authContext.authenticated) {\r\n return { allowed: false, reason: 'Authentication required' }\r\n }\r\n\r\n if (authConfig.roles?.length) {\r\n if (!authContext.authenticated) {\r\n return { allowed: false, reason: `Authentication required. Roles needed: ${authConfig.roles.join(', ')}` }\r\n }\r\n if (!authContext.hasAnyRole(authConfig.roles)) {\r\n return { allowed: false, reason: `Insufficient roles. Required one of: ${authConfig.roles.join(', ')}` }\r\n }\r\n }\r\n\r\n if (authConfig.permissions?.length) {\r\n if (!authContext.authenticated) {\r\n return { allowed: false, reason: `Authentication required. Permissions needed: ${authConfig.permissions.join(', ')}` }\r\n }\r\n if (!authContext.hasAllPermissions(authConfig.permissions)) {\r\n return { allowed: false, reason: `Insufficient permissions. Required all: ${authConfig.permissions.join(', ')}` }\r\n }\r\n }\r\n\r\n return { allowed: true }\r\n }\r\n\r\n /**\r\n * Verify auth context allows executing a specific action.\r\n */\r\n async authorizeAction(\r\n authContext: LiveAuthContext,\r\n componentName: string,\r\n action: string,\r\n actionAuth: LiveActionAuth | undefined,\r\n providerName?: string\r\n ): Promise<LiveAuthResult> {\r\n if (!actionAuth) {\r\n return { allowed: true }\r\n }\r\n\r\n if (actionAuth.roles?.length) {\r\n if (!authContext.authenticated) {\r\n return { allowed: false, reason: `Authentication required for action '${action}'` }\r\n }\r\n if (!authContext.hasAnyRole(actionAuth.roles)) {\r\n return { allowed: false, reason: `Insufficient roles for action '${action}'. Required one of: ${actionAuth.roles.join(', ')}` }\r\n }\r\n }\r\n\r\n if (actionAuth.permissions?.length) {\r\n if (!authContext.authenticated) {\r\n return { allowed: false, reason: `Authentication required for action '${action}'` }\r\n }\r\n if (!authContext.hasAllPermissions(actionAuth.permissions)) {\r\n return { allowed: false, reason: `Insufficient permissions for action '${action}'. Required all: ${actionAuth.permissions.join(', ')}` }\r\n }\r\n }\r\n\r\n const name = providerName || this.defaultProviderName\r\n if (name) {\r\n const provider = this.providers.get(name)\r\n if (provider?.authorizeAction) {\r\n const allowed = await provider.authorizeAction(authContext, componentName, action)\r\n if (!allowed) {\r\n return { allowed: false, reason: `Action '${action}' denied by auth provider '${name}'` }\r\n }\r\n }\r\n }\r\n\r\n return { allowed: true }\r\n }\r\n\r\n /**\r\n * Verify auth context allows joining a room.\r\n */\r\n async authorizeRoom(\r\n authContext: LiveAuthContext,\r\n roomId: string,\r\n providerName?: string\r\n ): Promise<LiveAuthResult> {\r\n const name = providerName || this.defaultProviderName\r\n if (!name) return { allowed: true }\r\n\r\n const provider = this.providers.get(name)\r\n if (!provider?.authorizeRoom) return { allowed: true }\r\n\r\n try {\r\n const allowed = await provider.authorizeRoom(authContext, roomId)\r\n if (!allowed) {\r\n return { allowed: false, reason: `Access to room '${roomId}' denied by auth provider '${name}'` }\r\n }\r\n return { allowed: true }\r\n } catch (error: any) {\r\n return { allowed: false, reason: `Room authorization error: ${error.message}` }\r\n }\r\n }\r\n\r\n /**\r\n * Get info about registered providers.\r\n */\r\n getInfo(): { providers: string[]; defaultProvider?: string } {\r\n return {\r\n providers: Array.from(this.providers.keys()),\r\n defaultProvider: this.defaultProviderName,\r\n }\r\n }\r\n}\r\n","// @fluxstack/live - State Signature (HMAC-SHA256)\r\n//\r\n// Cryptographic state signing for secure client-side persistence.\r\n// Supports: key rotation, compression (gzip), encryption (AES-256-CBC),\r\n// anti-replay nonces, state backups, and state migrations.\r\n\r\nimport { createHmac, createCipheriv, createDecipheriv, randomBytes } from 'crypto'\r\nimport { gzipSync, gunzipSync } from 'zlib'\r\nimport { liveLog, liveWarn } from '../debug/LiveLogger'\r\n\r\nexport interface SignedState {\r\n data: string\r\n signature: string\r\n timestamp: number\r\n version: number\r\n componentId: string\r\n nonce?: string\r\n compressed?: boolean\r\n encrypted?: boolean\r\n}\r\n\r\nexport interface StateSignatureConfig {\r\n /** HMAC secret for signing. Defaults to env LIVE_STATE_SECRET or a random key. */\r\n secret?: string\r\n /** Enable key rotation */\r\n rotationEnabled?: boolean\r\n /** Key rotation interval in ms */\r\n rotationInterval?: number\r\n /** Enable compression */\r\n compressionEnabled?: boolean\r\n /** Enable encryption */\r\n encryptionEnabled?: boolean\r\n /** Enable anti-replay nonces */\r\n nonceEnabled?: boolean\r\n /** Maximum state age in ms */\r\n maxStateAge?: number\r\n /** Enable state backups */\r\n backupEnabled?: boolean\r\n /** Max state backups to keep */\r\n maxBackups?: number\r\n}\r\n\r\ninterface StateBackup {\r\n signedState: SignedState\r\n backedUpAt: number\r\n}\r\n\r\nexport class StateSignatureManager {\r\n private secret: Buffer\r\n private previousSecrets: Buffer[] = []\r\n private rotationTimer?: ReturnType<typeof setInterval>\r\n private usedNonces = new Set<string>()\r\n private nonceCleanupTimer?: ReturnType<typeof setInterval>\r\n private stateBackups = new Map<string, StateBackup[]>()\r\n private config: Required<StateSignatureConfig>\r\n\r\n constructor(config: StateSignatureConfig = {}) {\r\n const defaultSecret = typeof process !== 'undefined'\r\n ? process.env?.LIVE_STATE_SECRET\r\n : undefined\r\n\r\n this.config = {\r\n secret: config.secret ?? defaultSecret ?? '',\r\n rotationEnabled: config.rotationEnabled ?? false,\r\n rotationInterval: config.rotationInterval ?? 24 * 60 * 60 * 1000,\r\n compressionEnabled: config.compressionEnabled ?? true,\r\n encryptionEnabled: config.encryptionEnabled ?? false,\r\n nonceEnabled: config.nonceEnabled ?? false,\r\n maxStateAge: config.maxStateAge ?? 7 * 24 * 60 * 60 * 1000,\r\n backupEnabled: config.backupEnabled ?? true,\r\n maxBackups: config.maxBackups ?? 3,\r\n }\r\n\r\n // Generate random secret if none provided\r\n if (!this.config.secret) {\r\n this.config.secret = randomBytes(32).toString('hex')\r\n liveWarn('state', null, 'No LIVE_STATE_SECRET provided. Using random key (state will not persist across restarts).')\r\n }\r\n\r\n this.secret = Buffer.from(this.config.secret, 'utf-8')\r\n\r\n if (this.config.rotationEnabled) {\r\n this.setupKeyRotation()\r\n }\r\n\r\n if (this.config.nonceEnabled) {\r\n this.nonceCleanupTimer = setInterval(() => this.cleanupNonces(), 60 * 60 * 1000)\r\n }\r\n }\r\n\r\n async signState(\r\n componentId: string,\r\n state: Record<string, unknown>,\r\n version: number,\r\n options?: { compress?: boolean; backup?: boolean }\r\n ): Promise<SignedState> {\r\n let dataStr = JSON.stringify(state)\r\n let compressed = false\r\n let encrypted = false\r\n\r\n // Compression\r\n if ((options?.compress ?? this.config.compressionEnabled) && dataStr.length > 1024) {\r\n const compressedBuf = gzipSync(Buffer.from(dataStr, 'utf-8'))\r\n const compressedB64 = compressedBuf.toString('base64')\r\n if (compressedB64.length < dataStr.length * 0.9) {\r\n dataStr = compressedB64\r\n compressed = true\r\n }\r\n }\r\n\r\n // Encryption\r\n if (this.config.encryptionEnabled) {\r\n const iv = randomBytes(16)\r\n const key = this.deriveEncryptionKey()\r\n const cipher = createCipheriv('aes-256-cbc', key, iv)\r\n let encryptedData = cipher.update(dataStr, 'utf-8', 'base64')\r\n encryptedData += cipher.final('base64')\r\n dataStr = iv.toString('base64') + ':' + encryptedData\r\n encrypted = true\r\n }\r\n\r\n // Nonce\r\n const nonce = this.config.nonceEnabled ? randomBytes(16).toString('hex') : undefined\r\n\r\n const signedState: SignedState = {\r\n data: dataStr,\r\n signature: '',\r\n timestamp: Date.now(),\r\n version,\r\n componentId,\r\n nonce,\r\n compressed,\r\n encrypted\r\n }\r\n\r\n signedState.signature = this.computeSignature(signedState)\r\n\r\n // Backup\r\n if (options?.backup ?? this.config.backupEnabled) {\r\n this.backupState(componentId, signedState)\r\n }\r\n\r\n return signedState\r\n }\r\n\r\n async validateState(signedState: SignedState): Promise<{ valid: boolean; error?: string }> {\r\n try {\r\n // Check max age\r\n const age = Date.now() - signedState.timestamp\r\n if (age > this.config.maxStateAge) {\r\n return { valid: false, error: 'State expired' }\r\n }\r\n\r\n // Check nonce\r\n if (signedState.nonce && this.config.nonceEnabled) {\r\n if (this.usedNonces.has(signedState.nonce)) {\r\n return { valid: false, error: 'Nonce already used (replay attempt)' }\r\n }\r\n }\r\n\r\n // Verify signature with current key\r\n const expectedSig = this.computeSignature(signedState)\r\n if (this.timingSafeEqual(signedState.signature, expectedSig)) {\r\n if (signedState.nonce) this.usedNonces.add(signedState.nonce)\r\n return { valid: true }\r\n }\r\n\r\n // Try previous keys (rotation)\r\n for (const prevSecret of this.previousSecrets) {\r\n const prevSig = this.computeSignatureWithKey(signedState, prevSecret)\r\n if (this.timingSafeEqual(signedState.signature, prevSig)) {\r\n if (signedState.nonce) this.usedNonces.add(signedState.nonce)\r\n return { valid: true }\r\n }\r\n }\r\n\r\n return { valid: false, error: 'Invalid signature' }\r\n } catch (error: any) {\r\n return { valid: false, error: error.message }\r\n }\r\n }\r\n\r\n async extractData(signedState: SignedState): Promise<Record<string, unknown>> {\r\n let dataStr = signedState.data\r\n\r\n // Decrypt\r\n if (signedState.encrypted) {\r\n const [ivB64, encryptedData] = dataStr.split(':')\r\n const iv = Buffer.from(ivB64, 'base64')\r\n const key = this.deriveEncryptionKey()\r\n const decipher = createDecipheriv('aes-256-cbc', key, iv)\r\n dataStr = decipher.update(encryptedData, 'base64', 'utf-8')\r\n dataStr += decipher.final('utf-8')\r\n }\r\n\r\n // Decompress\r\n if (signedState.compressed) {\r\n const decompressed = gunzipSync(Buffer.from(dataStr, 'base64'))\r\n dataStr = decompressed.toString('utf-8')\r\n }\r\n\r\n return JSON.parse(dataStr)\r\n }\r\n\r\n getBackups(componentId: string): SignedState[] {\r\n return (this.stateBackups.get(componentId) || []).map(b => b.signedState)\r\n }\r\n\r\n getLatestBackup(componentId: string): SignedState | null {\r\n const backups = this.stateBackups.get(componentId)\r\n if (!backups || backups.length === 0) return null\r\n return backups[backups.length - 1].signedState\r\n }\r\n\r\n private backupState(componentId: string, signedState: SignedState): void {\r\n if (!this.stateBackups.has(componentId)) {\r\n this.stateBackups.set(componentId, [])\r\n }\r\n\r\n const backups = this.stateBackups.get(componentId)!\r\n backups.push({ signedState, backedUpAt: Date.now() })\r\n\r\n while (backups.length > this.config.maxBackups) {\r\n backups.shift()\r\n }\r\n }\r\n\r\n private computeSignature(signedState: SignedState): string {\r\n return this.computeSignatureWithKey(signedState, this.secret)\r\n }\r\n\r\n private computeSignatureWithKey(signedState: SignedState, key: Buffer): string {\r\n const payload = `${signedState.componentId}:${signedState.version}:${signedState.timestamp}:${signedState.data}${signedState.nonce ? ':' + signedState.nonce : ''}`\r\n return createHmac('sha256', key).update(payload).digest('hex')\r\n }\r\n\r\n private timingSafeEqual(a: string, b: string): boolean {\r\n if (a.length !== b.length) return false\r\n const bufA = Buffer.from(a)\r\n const bufB = Buffer.from(b)\r\n try {\r\n const { timingSafeEqual: tse } = require('crypto')\r\n return tse(bufA, bufB)\r\n } catch {\r\n // Fallback (not timing-safe but functional)\r\n return a === b\r\n }\r\n }\r\n\r\n private deriveEncryptionKey(): Buffer {\r\n return createHmac('sha256', this.secret).update('encryption-key-derivation').digest()\r\n }\r\n\r\n private setupKeyRotation(): void {\r\n this.rotationTimer = setInterval(() => {\r\n this.previousSecrets.unshift(this.secret)\r\n if (this.previousSecrets.length > 3) {\r\n this.previousSecrets.pop()\r\n }\r\n this.secret = randomBytes(32)\r\n liveLog('state', null, 'Key rotation completed')\r\n }, this.config.rotationInterval)\r\n }\r\n\r\n private cleanupNonces(): void {\r\n // Simply clear old nonces periodically\r\n if (this.usedNonces.size > 100000) {\r\n this.usedNonces.clear()\r\n }\r\n }\r\n\r\n shutdown(): void {\r\n if (this.rotationTimer) clearInterval(this.rotationTimer)\r\n if (this.nonceCleanupTimer) clearInterval(this.nonceCleanupTimer)\r\n }\r\n}\r\n","// @fluxstack/live - Performance Monitor\r\n//\r\n// Tracks and reports on component performance metrics.\r\n\r\nimport { EventEmitter } from 'events'\r\nimport { liveLog, liveWarn } from '../debug/LiveLogger'\r\n\r\nexport interface ComponentPerformanceMetrics {\r\n componentId: string\r\n componentName: string\r\n mountTime: number\r\n actionTimes: Map<string, number[]>\r\n renderTimes: number[]\r\n stateChanges: number\r\n errorCount: number\r\n lastActivity: number\r\n}\r\n\r\nexport interface PerformanceAlert {\r\n type: 'slow_action' | 'slow_render' | 'high_error_rate' | 'memory_warning'\r\n componentId: string\r\n componentName: string\r\n message: string\r\n value: number\r\n threshold: number\r\n timestamp: number\r\n}\r\n\r\nexport interface PerformanceConfig {\r\n /** Threshold for slow action warnings (ms) */\r\n slowActionThreshold?: number\r\n /** Threshold for slow render warnings (ms) */\r\n slowRenderThreshold?: number\r\n /** Max errors before warning */\r\n highErrorRateThreshold?: number\r\n /** Enable performance alerts */\r\n alertsEnabled?: boolean\r\n}\r\n\r\nexport class PerformanceMonitor extends EventEmitter {\r\n private components = new Map<string, ComponentPerformanceMetrics>()\r\n private alerts: PerformanceAlert[] = []\r\n private config: Required<PerformanceConfig>\r\n\r\n constructor(config: PerformanceConfig = {}) {\r\n super()\r\n this.config = {\r\n slowActionThreshold: config.slowActionThreshold ?? 1000,\r\n slowRenderThreshold: config.slowRenderThreshold ?? 500,\r\n highErrorRateThreshold: config.highErrorRateThreshold ?? 10,\r\n alertsEnabled: config.alertsEnabled ?? true,\r\n }\r\n }\r\n\r\n initializeComponent(componentId: string, componentName: string): void {\r\n this.components.set(componentId, {\r\n componentId,\r\n componentName,\r\n mountTime: Date.now(),\r\n actionTimes: new Map(),\r\n renderTimes: [],\r\n stateChanges: 0,\r\n errorCount: 0,\r\n lastActivity: Date.now()\r\n })\r\n }\r\n\r\n recordRenderTime(componentId: string, time: number): void {\r\n const metrics = this.components.get(componentId)\r\n if (!metrics) return\r\n\r\n metrics.renderTimes.push(time)\r\n metrics.lastActivity = Date.now()\r\n\r\n if (this.config.alertsEnabled && time > this.config.slowRenderThreshold) {\r\n this.addAlert({\r\n type: 'slow_render',\r\n componentId,\r\n componentName: metrics.componentName,\r\n message: `Slow render: ${time}ms (threshold: ${this.config.slowRenderThreshold}ms)`,\r\n value: time,\r\n threshold: this.config.slowRenderThreshold,\r\n timestamp: Date.now()\r\n })\r\n }\r\n }\r\n\r\n recordActionTime(componentId: string, action: string, time: number, error?: Error): void {\r\n const metrics = this.components.get(componentId)\r\n if (!metrics) return\r\n\r\n if (!metrics.actionTimes.has(action)) {\r\n metrics.actionTimes.set(action, [])\r\n }\r\n metrics.actionTimes.get(action)!.push(time)\r\n metrics.lastActivity = Date.now()\r\n\r\n if (error) {\r\n metrics.errorCount++\r\n if (this.config.alertsEnabled && metrics.errorCount >= this.config.highErrorRateThreshold) {\r\n this.addAlert({\r\n type: 'high_error_rate',\r\n componentId,\r\n componentName: metrics.componentName,\r\n message: `High error rate: ${metrics.errorCount} errors`,\r\n value: metrics.errorCount,\r\n threshold: this.config.highErrorRateThreshold,\r\n timestamp: Date.now()\r\n })\r\n }\r\n }\r\n\r\n if (this.config.alertsEnabled && time > this.config.slowActionThreshold) {\r\n this.addAlert({\r\n type: 'slow_action',\r\n componentId,\r\n componentName: metrics.componentName,\r\n message: `Slow action '${action}': ${time}ms (threshold: ${this.config.slowActionThreshold}ms)`,\r\n value: time,\r\n threshold: this.config.slowActionThreshold,\r\n timestamp: Date.now()\r\n })\r\n }\r\n }\r\n\r\n recordStateChange(componentId: string): void {\r\n const metrics = this.components.get(componentId)\r\n if (metrics) {\r\n metrics.stateChanges++\r\n metrics.lastActivity = Date.now()\r\n }\r\n }\r\n\r\n removeComponent(componentId: string): void {\r\n this.components.delete(componentId)\r\n }\r\n\r\n getComponentMetrics(componentId: string): ComponentPerformanceMetrics | null {\r\n return this.components.get(componentId) ?? null\r\n }\r\n\r\n getAllMetrics(): ComponentPerformanceMetrics[] {\r\n return Array.from(this.components.values())\r\n }\r\n\r\n getAlerts(limit = 50): PerformanceAlert[] {\r\n return this.alerts.slice(-limit)\r\n }\r\n\r\n clearAlerts(): void {\r\n this.alerts = []\r\n }\r\n\r\n getStats() {\r\n return {\r\n totalComponents: this.components.size,\r\n totalAlerts: this.alerts.length,\r\n components: Array.from(this.components.entries()).map(([id, m]) => ({\r\n id,\r\n name: m.componentName,\r\n renderCount: m.renderTimes.length,\r\n avgRenderTime: m.renderTimes.length > 0\r\n ? m.renderTimes.reduce((a, b) => a + b, 0) / m.renderTimes.length\r\n : 0,\r\n actionCount: Array.from(m.actionTimes.values()).reduce((sum, times) => sum + times.length, 0),\r\n stateChanges: m.stateChanges,\r\n errorCount: m.errorCount,\r\n }))\r\n }\r\n }\r\n\r\n private addAlert(alert: PerformanceAlert): void {\r\n this.alerts.push(alert)\r\n if (this.alerts.length > 1000) {\r\n this.alerts = this.alerts.slice(-500)\r\n }\r\n liveWarn('performance', alert.componentId, alert.message)\r\n this.emit('alert', alert)\r\n }\r\n}\r\n","// @fluxstack/live - File Upload Manager\r\n//\r\n// Handles chunked file uploads over WebSocket with security validations.\r\n\r\nimport { liveLog, liveWarn } from '../debug/LiveLogger'\r\nimport type {\r\n ActiveUpload,\r\n FileUploadStartMessage,\r\n FileUploadChunkMessage,\r\n FileUploadCompleteMessage,\r\n FileUploadProgressResponse,\r\n FileUploadCompleteResponse\r\n} from '../protocol/messages'\r\n\r\n// Magic bytes mapping for content validation\r\nconst MAGIC_BYTES: Record<string, { bytes: number[]; offset?: number }[]> = {\r\n 'image/jpeg': [{ bytes: [0xFF, 0xD8, 0xFF] }],\r\n 'image/png': [{ bytes: [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A] }],\r\n 'image/gif': [\r\n { bytes: [0x47, 0x49, 0x46, 0x38, 0x37, 0x61] },\r\n { bytes: [0x47, 0x49, 0x46, 0x38, 0x39, 0x61] },\r\n ],\r\n 'image/webp': [{ bytes: [0x52, 0x49, 0x46, 0x46], offset: 0 }],\r\n 'application/pdf': [{ bytes: [0x25, 0x50, 0x44, 0x46] }],\r\n 'application/zip': [\r\n { bytes: [0x50, 0x4B, 0x03, 0x04] },\r\n { bytes: [0x50, 0x4B, 0x05, 0x06] },\r\n ],\r\n 'application/gzip': [{ bytes: [0x1F, 0x8B] }],\r\n}\r\n\r\nexport interface FileUploadConfig {\r\n maxUploadSize?: number\r\n chunkTimeout?: number\r\n maxBytesPerUser?: number\r\n quotaResetInterval?: number\r\n allowedTypes?: string[]\r\n blockedExtensions?: string[]\r\n uploadsDir?: string\r\n /** Custom file assembly handler - if not provided, uses default fs assembly */\r\n assembleFile?: (upload: ActiveUpload) => Promise<string>\r\n}\r\n\r\nexport class FileUploadManager {\r\n private activeUploads = new Map<string, ActiveUpload>()\r\n private readonly maxUploadSize: number\r\n private readonly chunkTimeout: number\r\n private userUploadBytes = new Map<string, number>()\r\n private readonly maxBytesPerUser: number\r\n private readonly quotaResetInterval: number\r\n private readonly allowedTypes: string[]\r\n private readonly blockedExtensions: Set<string>\r\n private readonly uploadsDir: string\r\n private readonly customAssembleFile?: (upload: ActiveUpload) => Promise<string>\r\n\r\n private cleanupTimer?: ReturnType<typeof setInterval>\r\n private quotaTimer?: ReturnType<typeof setInterval>\r\n\r\n constructor(config: FileUploadConfig = {}) {\r\n this.maxUploadSize = config.maxUploadSize ?? 50 * 1024 * 1024\r\n this.chunkTimeout = config.chunkTimeout ?? 30000\r\n this.maxBytesPerUser = config.maxBytesPerUser ?? 500 * 1024 * 1024\r\n this.quotaResetInterval = config.quotaResetInterval ?? 24 * 60 * 60 * 1000\r\n this.allowedTypes = config.allowedTypes ?? [\r\n 'image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml',\r\n 'application/pdf',\r\n 'text/plain', 'text/csv', 'text/markdown',\r\n 'application/json',\r\n 'application/zip', 'application/gzip',\r\n ]\r\n this.blockedExtensions = new Set(config.blockedExtensions ?? [\r\n '.exe', '.bat', '.cmd', '.com', '.msi', '.scr', '.pif',\r\n '.sh', '.bash', '.zsh', '.csh',\r\n '.ps1', '.psm1', '.psd1',\r\n '.vbs', '.vbe', '.js', '.jse', '.wsf', '.wsh',\r\n '.dll', '.sys', '.drv', '.so', '.dylib',\r\n ])\r\n this.uploadsDir = config.uploadsDir ?? './uploads'\r\n this.customAssembleFile = config.assembleFile\r\n\r\n this.cleanupTimer = setInterval(() => this.cleanupStaleUploads(), 5 * 60 * 1000)\r\n this.quotaTimer = setInterval(() => this.resetUploadQuotas(), this.quotaResetInterval)\r\n }\r\n\r\n async startUpload(message: FileUploadStartMessage, userId?: string): Promise<{ success: boolean; error?: string }> {\r\n try {\r\n const { uploadId, componentId, filename, fileType, fileSize, chunkSize = 64 * 1024 } = message\r\n\r\n if (fileSize > this.maxUploadSize) {\r\n throw new Error(`File too large: ${fileSize} bytes. Max: ${this.maxUploadSize} bytes`)\r\n }\r\n\r\n if (userId) {\r\n const currentUsage = this.userUploadBytes.get(userId) || 0\r\n if (currentUsage + fileSize > this.maxBytesPerUser) {\r\n throw new Error(`Upload quota exceeded for user.`)\r\n }\r\n }\r\n\r\n if (this.allowedTypes.length > 0 && !this.allowedTypes.includes(fileType)) {\r\n throw new Error(`File type not allowed: ${fileType}`)\r\n }\r\n\r\n // Sanitize filename\r\n const pathModule = await import('path')\r\n const safeBase = pathModule.basename(filename)\r\n const ext = pathModule.extname(safeBase).toLowerCase()\r\n if (this.blockedExtensions.has(ext)) {\r\n throw new Error(`File extension not allowed: ${ext}`)\r\n }\r\n\r\n // Double extension prevention\r\n const parts = safeBase.split('.')\r\n if (parts.length > 2) {\r\n for (let i = 1; i < parts.length - 1; i++) {\r\n const intermediateExt = '.' + parts[i].toLowerCase()\r\n if (this.blockedExtensions.has(intermediateExt)) {\r\n throw new Error(`Suspicious double extension detected: ${intermediateExt} in ${safeBase}`)\r\n }\r\n }\r\n }\r\n\r\n if (safeBase.length > 255) {\r\n throw new Error('Filename too long')\r\n }\r\n\r\n if (this.activeUploads.has(uploadId)) {\r\n throw new Error(`Upload ${uploadId} already in progress`)\r\n }\r\n\r\n const totalChunks = Math.ceil(fileSize / chunkSize)\r\n const upload: ActiveUpload = {\r\n uploadId,\r\n componentId,\r\n filename,\r\n fileType,\r\n fileSize,\r\n totalChunks,\r\n receivedChunks: new Map(),\r\n bytesReceived: 0,\r\n startTime: Date.now(),\r\n lastChunkTime: Date.now()\r\n }\r\n\r\n this.activeUploads.set(uploadId, upload)\r\n\r\n if (userId) {\r\n const currentUsage = this.userUploadBytes.get(userId) || 0\r\n this.userUploadBytes.set(userId, currentUsage + fileSize)\r\n }\r\n\r\n liveLog('messages', componentId, `Upload started: ${uploadId} (${filename}, ${fileSize} bytes)`)\r\n\r\n return { success: true }\r\n } catch (error: any) {\r\n return { success: false, error: error.message }\r\n }\r\n }\r\n\r\n async receiveChunk(message: FileUploadChunkMessage, binaryData: Buffer | null = null): Promise<FileUploadProgressResponse | null> {\r\n const { uploadId, chunkIndex, totalChunks, data } = message\r\n\r\n const upload = this.activeUploads.get(uploadId)\r\n if (!upload) throw new Error(`Upload ${uploadId} not found`)\r\n\r\n if (chunkIndex < 0 || chunkIndex >= totalChunks) {\r\n throw new Error(`Invalid chunk index: ${chunkIndex}`)\r\n }\r\n\r\n if (!upload.receivedChunks.has(chunkIndex)) {\r\n let chunkBytes: number\r\n if (binaryData) {\r\n upload.receivedChunks.set(chunkIndex, binaryData)\r\n chunkBytes = binaryData.length\r\n } else {\r\n upload.receivedChunks.set(chunkIndex, data as string)\r\n chunkBytes = Buffer.from(data as string, 'base64').length\r\n }\r\n upload.lastChunkTime = Date.now()\r\n upload.bytesReceived += chunkBytes\r\n }\r\n\r\n const progress = (upload.bytesReceived / upload.fileSize) * 100\r\n\r\n return {\r\n type: 'FILE_UPLOAD_PROGRESS',\r\n componentId: upload.componentId,\r\n uploadId: upload.uploadId,\r\n chunkIndex,\r\n totalChunks,\r\n bytesUploaded: Math.min(upload.bytesReceived, upload.fileSize),\r\n totalBytes: upload.fileSize,\r\n progress: Math.min(progress, 100),\r\n timestamp: Date.now()\r\n }\r\n }\r\n\r\n async completeUpload(message: FileUploadCompleteMessage): Promise<FileUploadCompleteResponse> {\r\n try {\r\n const { uploadId } = message\r\n\r\n const upload = this.activeUploads.get(uploadId)\r\n if (!upload) throw new Error(`Upload ${uploadId} not found`)\r\n\r\n if (upload.bytesReceived !== upload.fileSize) {\r\n throw new Error(`Incomplete upload: received ${upload.bytesReceived}/${upload.fileSize} bytes`)\r\n }\r\n\r\n this.validateContentMagicBytes(upload)\r\n\r\n const fileUrl = this.customAssembleFile\r\n ? await this.customAssembleFile(upload)\r\n : await this.defaultAssembleFile(upload)\r\n\r\n this.activeUploads.delete(uploadId)\r\n\r\n return {\r\n type: 'FILE_UPLOAD_COMPLETE',\r\n componentId: upload.componentId,\r\n uploadId: upload.uploadId,\r\n success: true,\r\n filename: upload.filename,\r\n fileUrl,\r\n timestamp: Date.now()\r\n }\r\n } catch (error: any) {\r\n return {\r\n type: 'FILE_UPLOAD_COMPLETE',\r\n componentId: '',\r\n uploadId: message.uploadId,\r\n success: false,\r\n error: error.message,\r\n timestamp: Date.now()\r\n }\r\n }\r\n }\r\n\r\n private async defaultAssembleFile(upload: ActiveUpload): Promise<string> {\r\n const { writeFile, mkdir } = await import('fs/promises')\r\n const { existsSync } = await import('fs')\r\n const { join, extname, basename } = await import('path')\r\n\r\n if (!existsSync(this.uploadsDir)) {\r\n await mkdir(this.uploadsDir, { recursive: true })\r\n }\r\n\r\n const extension = extname(basename(upload.filename)).toLowerCase()\r\n const safeFilename = `${crypto.randomUUID()}${extension}`\r\n const filePath = join(this.uploadsDir, safeFilename)\r\n\r\n const chunks: Buffer[] = []\r\n for (let i = 0; i < upload.totalChunks; i++) {\r\n const chunkData = upload.receivedChunks.get(i)\r\n if (chunkData) {\r\n if (Buffer.isBuffer(chunkData)) {\r\n chunks.push(chunkData)\r\n } else {\r\n chunks.push(Buffer.from(chunkData, 'base64'))\r\n }\r\n }\r\n }\r\n\r\n await writeFile(filePath, Buffer.concat(chunks))\r\n return `/uploads/${safeFilename}`\r\n }\r\n\r\n private validateContentMagicBytes(upload: ActiveUpload): void {\r\n const expectedSignatures = MAGIC_BYTES[upload.fileType]\r\n if (!expectedSignatures) return\r\n\r\n const firstChunk = upload.receivedChunks.get(0)\r\n if (!firstChunk) throw new Error('Cannot validate file content: first chunk missing')\r\n\r\n const headerBuffer = Buffer.isBuffer(firstChunk)\r\n ? firstChunk\r\n : Buffer.from(firstChunk, 'base64')\r\n\r\n let matched = false\r\n for (const sig of expectedSignatures) {\r\n const offset = sig.offset ?? 0\r\n if (headerBuffer.length < offset + sig.bytes.length) continue\r\n\r\n let sigMatches = true\r\n for (let i = 0; i < sig.bytes.length; i++) {\r\n if (headerBuffer[offset + i] !== sig.bytes[i]) {\r\n sigMatches = false\r\n break\r\n }\r\n }\r\n\r\n if (sigMatches) {\r\n matched = true\r\n break\r\n }\r\n }\r\n\r\n if (!matched) {\r\n throw new Error(\r\n `File content does not match claimed type '${upload.fileType}'. ` +\r\n `The file may be disguised as a different format.`\r\n )\r\n }\r\n }\r\n\r\n private cleanupStaleUploads(): void {\r\n const now = Date.now()\r\n for (const [uploadId, upload] of this.activeUploads) {\r\n if (now - upload.lastChunkTime > this.chunkTimeout * 2) {\r\n this.activeUploads.delete(uploadId)\r\n liveLog('messages', null, `Cleaned up stale upload: ${uploadId}`)\r\n }\r\n }\r\n }\r\n\r\n private resetUploadQuotas(): void {\r\n this.userUploadBytes.clear()\r\n }\r\n\r\n getUserUploadUsage(userId: string): { used: number; limit: number; remaining: number } {\r\n const used = this.userUploadBytes.get(userId) || 0\r\n return { used, limit: this.maxBytesPerUser, remaining: Math.max(0, this.maxBytesPerUser - used) }\r\n }\r\n\r\n getUploadStatus(uploadId: string): ActiveUpload | null {\r\n return this.activeUploads.get(uploadId) || null\r\n }\r\n\r\n getStats() {\r\n return {\r\n activeUploads: this.activeUploads.size,\r\n maxUploadSize: this.maxUploadSize,\r\n allowedTypes: this.allowedTypes\r\n }\r\n }\r\n\r\n shutdown(): void {\r\n if (this.cleanupTimer) clearInterval(this.cleanupTimer)\r\n if (this.quotaTimer) clearInterval(this.quotaTimer)\r\n }\r\n}\r\n","// @fluxstack/live - WebSocket Connection Manager\r\n//\r\n// Advanced connection management with pooling, load balancing, and health monitoring.\r\n\r\nimport { EventEmitter } from 'events'\r\nimport type { GenericWebSocket } from '../transport/types'\r\nimport { liveLog, liveWarn } from '../debug/LiveLogger'\r\n\r\nexport interface ConnectionConfig {\r\n maxConnections: number\r\n connectionTimeout: number\r\n heartbeatInterval: number\r\n reconnectAttempts: number\r\n reconnectDelay: number\r\n maxReconnectDelay: number\r\n jitterFactor: number\r\n loadBalancing: 'round-robin' | 'least-connections' | 'random'\r\n healthCheckInterval: number\r\n messageQueueSize: number\r\n offlineQueueEnabled: boolean\r\n}\r\n\r\nexport interface ConnectionMetrics {\r\n id: string\r\n connectedAt: Date\r\n lastActivity: Date\r\n messagesSent: number\r\n messagesReceived: number\r\n bytesTransferred: number\r\n latency: number\r\n status: 'connecting' | 'connected' | 'disconnecting' | 'disconnected' | 'error'\r\n errorCount: number\r\n reconnectCount: number\r\n}\r\n\r\nexport interface ConnectionHealth {\r\n id: string\r\n status: 'healthy' | 'degraded' | 'unhealthy'\r\n lastCheck: Date\r\n issues: string[]\r\n metrics: ConnectionMetrics\r\n}\r\n\r\nexport interface QueuedMessage {\r\n id: string\r\n message: any\r\n timestamp: number\r\n priority: number\r\n retryCount: number\r\n maxRetries: number\r\n}\r\n\r\nexport class WebSocketConnectionManager extends EventEmitter {\r\n private connections = new Map<string, GenericWebSocket>()\r\n private connectionMetrics = new Map<string, ConnectionMetrics>()\r\n private connectionPools = new Map<string, Set<string>>()\r\n private messageQueues = new Map<string, QueuedMessage[]>()\r\n private healthCheckTimer?: ReturnType<typeof setInterval>\r\n private heartbeatTimer?: ReturnType<typeof setInterval>\r\n private config: ConnectionConfig\r\n private loadBalancerIndex = 0\r\n\r\n constructor(config?: Partial<ConnectionConfig>) {\r\n super()\r\n this.config = {\r\n maxConnections: 10000,\r\n connectionTimeout: 30000,\r\n heartbeatInterval: 30000,\r\n reconnectAttempts: 5,\r\n reconnectDelay: 1000,\r\n maxReconnectDelay: 30000,\r\n jitterFactor: 0.1,\r\n loadBalancing: 'round-robin',\r\n healthCheckInterval: 60000,\r\n messageQueueSize: 1000,\r\n offlineQueueEnabled: true,\r\n ...config\r\n }\r\n\r\n this.setupHealthMonitoring()\r\n this.setupHeartbeat()\r\n }\r\n\r\n registerConnection(ws: GenericWebSocket, connectionId: string, poolId?: string): void {\r\n if (this.connections.size >= this.config.maxConnections) {\r\n throw new Error('Maximum connections exceeded')\r\n }\r\n\r\n const metrics: ConnectionMetrics = {\r\n id: connectionId,\r\n connectedAt: new Date(),\r\n lastActivity: new Date(),\r\n messagesSent: 0,\r\n messagesReceived: 0,\r\n bytesTransferred: 0,\r\n latency: 0,\r\n status: 'connected',\r\n errorCount: 0,\r\n reconnectCount: 0\r\n }\r\n\r\n this.connections.set(connectionId, ws)\r\n this.connectionMetrics.set(connectionId, metrics)\r\n\r\n if (poolId) {\r\n this.addToPool(connectionId, poolId)\r\n }\r\n\r\n this.messageQueues.set(connectionId, [])\r\n liveLog('websocket', null, `Connection registered: ${connectionId}`)\r\n this.emit('connectionRegistered', { connectionId, poolId })\r\n }\r\n\r\n addToPool(connectionId: string, poolId: string): void {\r\n if (!this.connectionPools.has(poolId)) {\r\n this.connectionPools.set(poolId, new Set())\r\n }\r\n this.connectionPools.get(poolId)!.add(connectionId)\r\n }\r\n\r\n removeFromPool(connectionId: string, poolId: string): void {\r\n const pool = this.connectionPools.get(poolId)\r\n if (pool) {\r\n pool.delete(connectionId)\r\n if (pool.size === 0) this.connectionPools.delete(poolId)\r\n }\r\n }\r\n\r\n cleanupConnection(connectionId: string): void {\r\n this.connections.delete(connectionId)\r\n this.connectionMetrics.delete(connectionId)\r\n this.messageQueues.delete(connectionId)\r\n\r\n for (const [poolId, pool] of this.connectionPools) {\r\n if (pool.has(connectionId)) {\r\n this.removeFromPool(connectionId, poolId)\r\n }\r\n }\r\n }\r\n\r\n getConnectionMetrics(connectionId: string): ConnectionMetrics | null {\r\n return this.connectionMetrics.get(connectionId) || null\r\n }\r\n\r\n getAllConnectionMetrics(): ConnectionMetrics[] {\r\n return Array.from(this.connectionMetrics.values())\r\n }\r\n\r\n getSystemStats() {\r\n const totalConnections = this.connections.size\r\n const activeConnections = Array.from(this.connections.values()).filter(ws => ws.readyState === 1).length\r\n const totalPools = this.connectionPools.size\r\n const totalQueuedMessages = Array.from(this.messageQueues.values()).reduce((sum, queue) => sum + queue.length, 0)\r\n\r\n return {\r\n totalConnections,\r\n activeConnections,\r\n totalPools,\r\n totalQueuedMessages,\r\n maxConnections: this.config.maxConnections,\r\n connectionUtilization: (totalConnections / this.config.maxConnections) * 100\r\n }\r\n }\r\n\r\n private setupHealthMonitoring(): void {\r\n this.healthCheckTimer = setInterval(() => this.performHealthChecks(), this.config.healthCheckInterval)\r\n }\r\n\r\n private setupHeartbeat(): void {\r\n this.heartbeatTimer = setInterval(() => {\r\n for (const [connectionId, ws] of this.connections) {\r\n if (ws.readyState === 1) {\r\n try {\r\n const wsAny = ws as any\r\n if (typeof wsAny.ping === 'function') {\r\n wsAny._pingTime = Date.now()\r\n wsAny.ping()\r\n }\r\n } catch {\r\n // Ignore heartbeat failures\r\n }\r\n }\r\n }\r\n }, this.config.heartbeatInterval)\r\n }\r\n\r\n private async performHealthChecks(): Promise<void> {\r\n const now = Date.now()\r\n const unhealthy: string[] = []\r\n\r\n for (const [connectionId, metrics] of this.connectionMetrics) {\r\n const ws = this.connections.get(connectionId)\r\n if (!ws || ws.readyState !== 1) {\r\n unhealthy.push(connectionId)\r\n continue\r\n }\r\n\r\n const timeSinceActivity = now - metrics.lastActivity.getTime()\r\n if (timeSinceActivity > this.config.heartbeatInterval * 2) {\r\n metrics.status = 'disconnected'\r\n }\r\n if (metrics.errorCount > 10) {\r\n unhealthy.push(connectionId)\r\n }\r\n }\r\n\r\n for (const connectionId of unhealthy) {\r\n const ws = this.connections.get(connectionId)\r\n if (ws) {\r\n try { ws.close() } catch { /* ignore */ }\r\n }\r\n this.cleanupConnection(connectionId)\r\n }\r\n }\r\n\r\n shutdown(): void {\r\n if (this.healthCheckTimer) clearInterval(this.healthCheckTimer)\r\n if (this.heartbeatTimer) clearInterval(this.heartbeatTimer)\r\n\r\n for (const [, ws] of this.connections) {\r\n try { ws.close() } catch { /* ignore */ }\r\n }\r\n\r\n this.connections.clear()\r\n this.connectionMetrics.clear()\r\n this.connectionPools.clear()\r\n this.messageQueues.clear()\r\n }\r\n}\r\n","// @fluxstack/live - Dependency Injection via Module-Level Setter\r\n//\r\n// The public API of LiveComponent does NOT change.\r\n// Internally, singletons (roomEvents, roomManager, etc.) are injected once at boot\r\n// via setLiveComponentContext(), called by LiveServer.start().\r\n\r\nimport type { RoomEventBus } from '../rooms/RoomEventBus'\r\nimport type { LiveDebugger } from '../debug/LiveDebugger'\r\n\r\n// ===== Room Manager Interface =====\r\n// Extracted to avoid circular dependency with LiveRoomManager\r\n\r\nexport interface LiveRoomManagerInterface {\r\n joinRoom<TState = any>(componentId: string, roomId: string, ws: any, initialState?: TState): { state: TState }\r\n leaveRoom(componentId: string, roomId: string): void\r\n cleanupComponent(componentId: string): void\r\n emitToRoom(roomId: string, event: string, data: any, excludeComponentId?: string): number\r\n setRoomState(roomId: string, updates: any, excludeComponentId?: string): void\r\n getRoomState<TState = any>(roomId: string): TState\r\n isInRoom(componentId: string, roomId: string): boolean\r\n getComponentRooms(componentId: string): string[]\r\n getStats(): any\r\n}\r\n\r\n// ===== Debugger Interface =====\r\n\r\nexport interface LiveDebuggerInterface {\r\n enabled: boolean\r\n trackStateChange(componentId: string, delta: Record<string, unknown>, fullState: Record<string, unknown>, source?: string): void\r\n trackActionCall(componentId: string, action: string, payload: unknown): void\r\n trackActionResult(componentId: string, action: string, result: unknown, duration: number): void\r\n trackActionError(componentId: string, action: string, error: string, duration: number): void\r\n trackRoomEmit(componentId: string, roomId: string, event: string, data: unknown): void\r\n}\r\n\r\n// ===== Logger Interface =====\r\n\r\nexport interface LiveLoggerInterface {\r\n log(category: string, componentId: string | null, message: string, ...args: unknown[]): void\r\n warn(category: string, componentId: string | null, message: string, ...args: unknown[]): void\r\n}\r\n\r\n// ===== Context =====\r\n\r\nexport interface LiveComponentContext {\r\n roomEvents: RoomEventBus\r\n roomManager: LiveRoomManagerInterface\r\n debugger?: LiveDebuggerInterface\r\n}\r\n\r\nlet _ctx: LiveComponentContext | null = null\r\n\r\n/**\r\n * Set the global Live Component context.\r\n * Called once by LiveServer.start() before any components are mounted.\r\n */\r\nexport function setLiveComponentContext(ctx: LiveComponentContext): void {\r\n _ctx = ctx\r\n}\r\n\r\n/**\r\n * Get the global Live Component context.\r\n * Throws if LiveServer.start() hasn't been called yet.\r\n */\r\nexport function getLiveComponentContext(): LiveComponentContext {\r\n if (!_ctx) throw new Error('@fluxstack/live: LiveServer.start() must be called before using LiveComponents')\r\n return _ctx\r\n}\r\n\r\n/**\r\n * Check if context has been initialized (for internal use).\r\n */\r\nexport function hasLiveComponentContext(): boolean {\r\n return _ctx !== null\r\n}\r\n","// @fluxstack/live - LiveComponent Base Class\r\n//\r\n// Framework-agnostic base class for server-side Live Components.\r\n// Uses getLiveComponentContext() for dependency injection instead of global singletons.\r\n\r\nimport { getLiveComponentContext } from './context'\r\nimport type { LiveDebuggerInterface } from './context'\r\nimport type { GenericWebSocket } from '../transport/types'\r\nimport type { LiveAuthContext, LiveComponentAuth, LiveActionAuthMap } from '../auth/types'\r\nimport { ANONYMOUS_CONTEXT } from '../auth/LiveAuthContext'\r\nimport { liveLog, liveWarn } from '../debug/LiveLogger'\r\nimport type { LiveMessage, BroadcastMessage, ComponentState, ServerRoomHandle, ServerRoomProxy } from '../protocol/messages'\r\n\r\n/** @internal Symbol key for singleton emit override */\r\nexport const EMIT_OVERRIDE_KEY = Symbol.for('fluxstack:emitOverride')\r\n\r\n// ===== Debug Instrumentation (injectable to avoid client-side import) =====\r\nlet _liveDebugger: LiveDebuggerInterface | null = null\r\n\r\n/** @internal Called by ComponentRegistry to inject the debugger instance */\r\nexport function _setLiveDebugger(dbg: LiveDebuggerInterface): void {\r\n _liveDebugger = dbg\r\n}\r\n\r\nexport abstract class LiveComponent<TState = ComponentState, TPrivate extends Record<string, any> = Record<string, any>> {\r\n /** Component name for registry lookup - must be defined in subclasses */\r\n static componentName: string\r\n /** Default state - must be defined in subclasses */\r\n static defaultState: any\r\n\r\n /**\r\n * Per-component logging control. Silent by default.\r\n *\r\n * @example\r\n * static logging = true // all categories\r\n * static logging = ['lifecycle', 'messages'] // specific categories\r\n */\r\n static logging?: boolean | readonly ('lifecycle' | 'messages' | 'state' | 'performance' | 'rooms' | 'websocket')[]\r\n\r\n /**\r\n * Component-level auth configuration.\r\n */\r\n static auth?: LiveComponentAuth\r\n\r\n /**\r\n * Per-action auth configuration.\r\n */\r\n static actionAuth?: LiveActionAuthMap\r\n\r\n /**\r\n * Data that survives HMR reloads.\r\n */\r\n static persistent?: Record<string, any>\r\n\r\n /**\r\n * When true, only ONE server-side instance exists for this component.\r\n * All clients share the same state.\r\n */\r\n static singleton?: boolean\r\n\r\n public readonly id: string\r\n private _state: TState\r\n public state: TState // Proxy wrapper\r\n protected ws: GenericWebSocket\r\n public room?: string\r\n public userId?: string\r\n public broadcastToRoom: (message: BroadcastMessage) => void = () => {}\r\n\r\n // Server-only private state (NEVER sent to client)\r\n private _privateState: TPrivate = {} as TPrivate\r\n\r\n // Auth context (injected by registry during mount)\r\n private _authContext: LiveAuthContext = ANONYMOUS_CONTEXT\r\n\r\n // Room event subscriptions (cleaned up on destroy)\r\n private roomEventUnsubscribers: (() => void)[] = []\r\n private joinedRooms: Set<string> = new Set()\r\n\r\n // Room type for typed events (override in subclass)\r\n protected roomType: string = 'default'\r\n\r\n // Cached room handles\r\n private roomHandles: Map<string, ServerRoomHandle> = new Map()\r\n\r\n // Guard against infinite recursion in onStateChange\r\n private _inStateChange = false\r\n\r\n // Singleton emit override\r\n public [EMIT_OVERRIDE_KEY]: ((type: string, payload: any) => void) | null = null\r\n\r\n constructor(initialState: Partial<TState>, ws: GenericWebSocket, options?: { room?: string; userId?: string }) {\r\n this.id = this.generateId()\r\n const ctor = this.constructor as typeof LiveComponent\r\n this._state = { ...ctor.defaultState, ...initialState } as TState\r\n\r\n // Create reactive proxy that auto-syncs on mutation\r\n this.state = this.createStateProxy(this._state)\r\n\r\n this.ws = ws\r\n this.room = options?.room\r\n this.userId = options?.userId\r\n\r\n // Auto-join default room if specified\r\n if (this.room) {\r\n this.joinedRooms.add(this.room)\r\n const ctx = getLiveComponentContext()\r\n ctx.roomManager.joinRoom(this.id, this.room, this.ws)\r\n }\r\n\r\n // Create direct property accessors (this.count instead of this.state.count)\r\n this.createDirectStateAccessors()\r\n }\r\n\r\n // Create getters/setters for each state property directly on `this`\r\n private createDirectStateAccessors() {\r\n const forbidden = new Set([\r\n ...Object.keys(this),\r\n ...Object.getOwnPropertyNames(Object.getPrototypeOf(this)),\r\n 'state', '_state', 'ws', 'id', 'room', 'userId', 'broadcastToRoom',\r\n '$private', '_privateState',\r\n '$room', '$rooms', 'roomType', 'roomHandles', 'joinedRooms', 'roomEventUnsubscribers'\r\n ])\r\n\r\n for (const key of Object.keys(this._state as object)) {\r\n if (!forbidden.has(key)) {\r\n Object.defineProperty(this, key, {\r\n get: () => (this._state as any)[key],\r\n set: (value) => { (this.state as any)[key] = value },\r\n enumerable: true,\r\n configurable: true\r\n })\r\n }\r\n }\r\n }\r\n\r\n // Create a Proxy that auto-emits STATE_DELTA on any mutation\r\n private createStateProxy(state: TState): TState {\r\n const self = this\r\n return new Proxy(state as object, {\r\n set(target, prop, value) {\r\n const oldValue = (target as any)[prop]\r\n if (oldValue !== value) {\r\n (target as any)[prop] = value\r\n const changes = { [prop]: value } as Partial<TState>\r\n self.emit('STATE_DELTA', { delta: changes })\r\n if (!self._inStateChange) {\r\n self._inStateChange = true\r\n try { self.onStateChange(changes) } catch (err: any) {\r\n console.error(`[${self.id}] onStateChange error:`, err?.message || err)\r\n } finally { self._inStateChange = false }\r\n }\r\n _liveDebugger?.trackStateChange(\r\n self.id,\r\n changes as Record<string, unknown>,\r\n target as Record<string, unknown>,\r\n 'proxy'\r\n )\r\n }\r\n return true\r\n },\r\n get(target, prop) {\r\n return (target as any)[prop]\r\n }\r\n }) as TState\r\n }\r\n\r\n // ========================================\r\n // $private - Server-Only State\r\n // ========================================\r\n\r\n public get $private(): TPrivate {\r\n return this._privateState\r\n }\r\n\r\n // ========================================\r\n // $room - Unified Room System\r\n // ========================================\r\n\r\n public get $room(): ServerRoomProxy {\r\n const self = this\r\n const ctx = getLiveComponentContext()\r\n\r\n const createHandle = (roomId: string): ServerRoomHandle => {\r\n if (this.roomHandles.has(roomId)) {\r\n return this.roomHandles.get(roomId)!\r\n }\r\n\r\n const handle: ServerRoomHandle = {\r\n get id() { return roomId },\r\n get state() { return ctx.roomManager.getRoomState(roomId) },\r\n\r\n join: (initialState?: any) => {\r\n if (self.joinedRooms.has(roomId)) return\r\n self.joinedRooms.add(roomId)\r\n ctx.roomManager.joinRoom(self.id, roomId, self.ws, initialState)\r\n try { self.onRoomJoin(roomId) } catch (err: any) {\r\n console.error(`[${self.id}] onRoomJoin error:`, err?.message || err)\r\n }\r\n },\r\n\r\n leave: () => {\r\n if (!self.joinedRooms.has(roomId)) return\r\n self.joinedRooms.delete(roomId)\r\n ctx.roomManager.leaveRoom(self.id, roomId)\r\n try { self.onRoomLeave(roomId) } catch (err: any) {\r\n console.error(`[${self.id}] onRoomLeave error:`, err?.message || err)\r\n }\r\n },\r\n\r\n emit: (event: string, data: any): number => {\r\n return ctx.roomManager.emitToRoom(roomId, event, data, self.id)\r\n },\r\n\r\n on: (event: string, handler: (data: any) => void): (() => void) => {\r\n const unsubscribe = ctx.roomEvents.on(\r\n 'room',\r\n roomId,\r\n event,\r\n self.id,\r\n handler\r\n )\r\n self.roomEventUnsubscribers.push(unsubscribe)\r\n return unsubscribe\r\n },\r\n\r\n setState: (updates: any) => {\r\n ctx.roomManager.setRoomState(roomId, updates, self.id)\r\n }\r\n }\r\n\r\n this.roomHandles.set(roomId, handle)\r\n return handle\r\n }\r\n\r\n const proxyFn = ((roomId: string) => createHandle(roomId)) as ServerRoomProxy\r\n\r\n const defaultHandle = this.room ? createHandle(this.room) : null\r\n\r\n Object.defineProperties(proxyFn, {\r\n id: { get: () => self.room },\r\n state: { get: () => defaultHandle?.state ?? {} },\r\n join: {\r\n value: (initialState?: any) => {\r\n if (!defaultHandle) throw new Error('No default room set')\r\n defaultHandle.join(initialState)\r\n }\r\n },\r\n leave: {\r\n value: () => {\r\n if (!defaultHandle) throw new Error('No default room set')\r\n defaultHandle.leave()\r\n }\r\n },\r\n emit: {\r\n value: (event: string, data: any) => {\r\n if (!defaultHandle) throw new Error('No default room set')\r\n return defaultHandle.emit(event, data)\r\n }\r\n },\r\n on: {\r\n value: (event: string, handler: (data: any) => void) => {\r\n if (!defaultHandle) throw new Error('No default room set')\r\n return defaultHandle.on(event, handler)\r\n }\r\n },\r\n setState: {\r\n value: (updates: any) => {\r\n if (!defaultHandle) throw new Error('No default room set')\r\n defaultHandle.setState(updates)\r\n }\r\n }\r\n })\r\n\r\n return proxyFn\r\n }\r\n\r\n /**\r\n * List of room IDs this component is participating in\r\n */\r\n public get $rooms(): string[] {\r\n return Array.from(this.joinedRooms)\r\n }\r\n\r\n // ========================================\r\n // $auth - Authentication Context\r\n // ========================================\r\n\r\n public get $auth(): LiveAuthContext {\r\n return this._authContext\r\n }\r\n\r\n /** @internal */\r\n public setAuthContext(context: LiveAuthContext): void {\r\n this._authContext = context\r\n if (context.authenticated && context.user?.id && !this.userId) {\r\n this.userId = context.user.id\r\n }\r\n }\r\n\r\n // ========================================\r\n // $persistent - HMR-Safe State\r\n // ========================================\r\n\r\n public get $persistent(): Record<string, any> {\r\n const ctor = this.constructor as typeof LiveComponent\r\n const name = ctor.componentName || ctor.name\r\n const key = `__fluxstack_persistent_${name}`\r\n\r\n if (!(globalThis as any)[key]) {\r\n (globalThis as any)[key] = { ...(ctor as any).persistent || {} }\r\n }\r\n\r\n return (globalThis as any)[key]\r\n }\r\n\r\n // ========================================\r\n // Lifecycle Hooks\r\n // ========================================\r\n\r\n protected onConnect(): void {}\r\n protected onMount(): void | Promise<void> {}\r\n protected onDisconnect(): void {}\r\n protected onDestroy(): void {}\r\n protected onStateChange(changes: Partial<TState>): void {}\r\n protected onRoomJoin(roomId: string): void {}\r\n protected onRoomLeave(roomId: string): void {}\r\n protected onRehydrate(previousState: TState): void {}\r\n protected onAction(action: string, payload: any): void | false | Promise<void | false> {}\r\n protected onClientJoin(connectionId: string, connectionCount: number): void {}\r\n protected onClientLeave(connectionId: string, connectionCount: number): void {}\r\n\r\n // ========================================\r\n // State Management\r\n // ========================================\r\n\r\n public setState(updates: Partial<TState> | ((prev: TState) => Partial<TState>)) {\r\n const newUpdates = typeof updates === 'function' ? updates(this._state) : updates\r\n\r\n const actualChanges: Partial<TState> = {} as Partial<TState>\r\n let hasChanges = false\r\n for (const key of Object.keys(newUpdates as object) as Array<keyof TState>) {\r\n if ((this._state as any)[key] !== (newUpdates as any)[key]) {\r\n (actualChanges as any)[key] = (newUpdates as any)[key]\r\n hasChanges = true\r\n }\r\n }\r\n\r\n if (!hasChanges) return\r\n\r\n Object.assign(this._state as object, actualChanges)\r\n this.emit('STATE_DELTA', { delta: actualChanges })\r\n if (!this._inStateChange) {\r\n this._inStateChange = true\r\n try { this.onStateChange(actualChanges) } catch (err: any) {\r\n console.error(`[${this.id}] onStateChange error:`, err?.message || err)\r\n } finally { this._inStateChange = false }\r\n }\r\n _liveDebugger?.trackStateChange(\r\n this.id,\r\n actualChanges as Record<string, unknown>,\r\n this._state as Record<string, unknown>,\r\n 'setState'\r\n )\r\n }\r\n\r\n public async setValue<K extends keyof TState>(payload: { key: K; value: TState[K] }): Promise<{ success: true; key: K; value: TState[K] }> {\r\n const { key, value } = payload\r\n const update = { [key]: value } as unknown as Partial<TState>\r\n this.setState(update)\r\n return { success: true, key, value }\r\n }\r\n\r\n // ========================================\r\n // Action Security\r\n // ========================================\r\n\r\n static publicActions?: readonly string[]\r\n\r\n private static readonly BLOCKED_ACTIONS: ReadonlySet<string> = new Set([\r\n 'constructor', 'destroy', 'executeAction', 'getSerializableState',\r\n 'onMount', 'onDestroy', 'onConnect', 'onDisconnect',\r\n 'onStateChange', 'onRoomJoin', 'onRoomLeave',\r\n 'onRehydrate', 'onAction',\r\n 'onClientJoin', 'onClientLeave',\r\n 'setState', 'emit', 'broadcast', 'broadcastToRoom',\r\n 'createStateProxy', 'createDirectStateAccessors', 'generateId',\r\n 'setAuthContext', '$auth',\r\n '$private', '_privateState',\r\n '$persistent',\r\n '_inStateChange',\r\n '$room', '$rooms', 'subscribeToRoom', 'unsubscribeFromRoom',\r\n 'emitRoomEvent', 'onRoomEvent', 'emitRoomEventWithState',\r\n ])\r\n\r\n public async executeAction(action: string, payload: any): Promise<any> {\r\n const actionStart = Date.now()\r\n try {\r\n if ((LiveComponent.BLOCKED_ACTIONS as Set<string>).has(action)) {\r\n throw new Error(`Action '${action}' is not callable`)\r\n }\r\n\r\n if (action.startsWith('_') || action.startsWith('#')) {\r\n throw new Error(`Action '${action}' is not callable`)\r\n }\r\n\r\n const componentClass = this.constructor as typeof LiveComponent\r\n const publicActions = componentClass.publicActions\r\n if (!publicActions) {\r\n console.warn(`[SECURITY] Component '${componentClass.componentName || componentClass.name}' has no publicActions defined. All remote actions are blocked.`)\r\n throw new Error(`Action '${action}' is not callable - component has no publicActions defined`)\r\n }\r\n if (!publicActions.includes(action)) {\r\n const methodExists = typeof (this as any)[action] === 'function'\r\n if (methodExists) {\r\n const name = componentClass.componentName || componentClass.name\r\n throw new Error(\r\n `Action '${action}' exists on '${name}' but is not listed in publicActions. ` +\r\n `Add it to: static publicActions = [..., '${action}']`\r\n )\r\n }\r\n throw new Error(`Action '${action}' is not callable`)\r\n }\r\n\r\n const method = (this as any)[action]\r\n if (typeof method !== 'function') {\r\n throw new Error(`Action '${action}' not found on component`)\r\n }\r\n\r\n if (Object.prototype.hasOwnProperty.call(Object.prototype, action)) {\r\n throw new Error(`Action '${action}' is not callable`)\r\n }\r\n\r\n _liveDebugger?.trackActionCall(this.id, action, payload)\r\n\r\n let hookResult: void | false | Promise<void | false>\r\n try {\r\n hookResult = await this.onAction(action, payload)\r\n } catch (hookError: any) {\r\n _liveDebugger?.trackActionError(this.id, action, hookError.message, Date.now() - actionStart)\r\n this.emit('ERROR', {\r\n action,\r\n error: `Action '${action}' failed pre-validation`\r\n })\r\n throw hookError\r\n }\r\n if (hookResult === false) {\r\n _liveDebugger?.trackActionError(this.id, action, 'Action cancelled', Date.now() - actionStart)\r\n throw new Error(`Action '${action}' was cancelled`)\r\n }\r\n\r\n const result = await method.call(this, payload)\r\n\r\n _liveDebugger?.trackActionResult(this.id, action, result, Date.now() - actionStart)\r\n\r\n return result\r\n } catch (error: any) {\r\n if (!error.message?.includes('was cancelled') && !error.message?.includes('pre-validation')) {\r\n _liveDebugger?.trackActionError(this.id, action, error.message, Date.now() - actionStart)\r\n\r\n this.emit('ERROR', {\r\n action,\r\n error: error.message\r\n })\r\n }\r\n throw error\r\n }\r\n }\r\n\r\n // ========================================\r\n // Messaging\r\n // ========================================\r\n\r\n protected emit(type: string, payload: any) {\r\n const override = this[EMIT_OVERRIDE_KEY]\r\n if (override) {\r\n override(type, payload)\r\n return\r\n }\r\n\r\n const message: LiveMessage = {\r\n type: type as any,\r\n componentId: this.id,\r\n payload,\r\n timestamp: Date.now(),\r\n userId: this.userId,\r\n room: this.room\r\n }\r\n\r\n if (this.ws && this.ws.send) {\r\n this.ws.send(JSON.stringify(message))\r\n }\r\n }\r\n\r\n protected broadcast(type: string, payload: any, excludeCurrentUser = false) {\r\n if (!this.room) {\r\n liveWarn('rooms', this.id, `[${this.id}] Cannot broadcast '${type}' - no room set`)\r\n return\r\n }\r\n\r\n const message: BroadcastMessage = {\r\n type,\r\n payload,\r\n room: this.room,\r\n excludeUser: excludeCurrentUser ? this.userId : undefined\r\n }\r\n\r\n liveLog('rooms', this.id, `[${this.id}] Broadcasting '${type}' to room '${this.room}'`)\r\n\r\n this.broadcastToRoom(message)\r\n }\r\n\r\n // ========================================\r\n // Room Events - Internal Server Events\r\n // ========================================\r\n\r\n protected emitRoomEvent(event: string, data: any, notifySelf = false): number {\r\n if (!this.room) {\r\n liveWarn('rooms', this.id, `[${this.id}] Cannot emit room event '${event}' - no room set`)\r\n return 0\r\n }\r\n\r\n const ctx = getLiveComponentContext()\r\n const excludeId = notifySelf ? undefined : this.id\r\n const notified = ctx.roomEvents.emit(this.roomType, this.room, event, data, excludeId)\r\n\r\n liveLog('rooms', this.id, `[${this.id}] Room event '${event}' -> ${notified} components`)\r\n\r\n _liveDebugger?.trackRoomEmit(this.id, this.room, event, data)\r\n\r\n return notified\r\n }\r\n\r\n protected onRoomEvent<T = any>(event: string, handler: (data: T) => void): void {\r\n if (!this.room) {\r\n liveWarn('rooms', this.id, `[${this.id}] Cannot subscribe to room event '${event}' - no room set`)\r\n return\r\n }\r\n\r\n const ctx = getLiveComponentContext()\r\n const unsubscribe = ctx.roomEvents.on(\r\n this.roomType,\r\n this.room,\r\n event,\r\n this.id,\r\n handler\r\n )\r\n\r\n this.roomEventUnsubscribers.push(unsubscribe)\r\n\r\n liveLog('rooms', this.id, `[${this.id}] Subscribed to room event '${event}'`)\r\n }\r\n\r\n protected emitRoomEventWithState(\r\n event: string,\r\n data: any,\r\n stateUpdates: Partial<TState>\r\n ): number {\r\n this.setState(stateUpdates)\r\n return this.emitRoomEvent(event, data, false)\r\n }\r\n\r\n protected async subscribeToRoom(roomId: string) {\r\n this.room = roomId\r\n }\r\n\r\n protected async unsubscribeFromRoom() {\r\n this.room = undefined\r\n }\r\n\r\n // ========================================\r\n // Internal\r\n // ========================================\r\n\r\n private generateId(): string {\r\n return `live-${crypto.randomUUID()}`\r\n }\r\n\r\n public destroy() {\r\n try {\r\n this.onDestroy()\r\n } catch (err: any) {\r\n console.error(`[${this.id}] onDestroy error:`, err?.message || err)\r\n }\r\n\r\n for (const unsubscribe of this.roomEventUnsubscribers) {\r\n unsubscribe()\r\n }\r\n this.roomEventUnsubscribers = []\r\n\r\n const ctx = getLiveComponentContext()\r\n for (const roomId of this.joinedRooms) {\r\n ctx.roomManager.leaveRoom(this.id, roomId)\r\n }\r\n this.joinedRooms.clear()\r\n this.roomHandles.clear()\r\n this._privateState = {} as TPrivate\r\n\r\n this.unsubscribeFromRoom()\r\n }\r\n\r\n public getSerializableState(): TState {\r\n return this.state\r\n }\r\n}\r\n","// @fluxstack/live - Component Registry\r\n//\r\n// Enhanced component registry with lifecycle management, health monitoring,\r\n// state signing, singleton support, and auto-discovery.\r\n\r\nimport type { LiveComponent } from './LiveComponent'\r\nimport { _setLiveDebugger, EMIT_OVERRIDE_KEY } from './LiveComponent'\r\nimport type { GenericWebSocket, LiveWSData } from '../transport/types'\r\nimport type { LiveMessage, BroadcastMessage, ComponentDefinition } from '../protocol/messages'\r\nimport type { LiveComponentAuth, LiveActionAuthMap } from '../auth/types'\r\nimport { ANONYMOUS_CONTEXT } from '../auth/LiveAuthContext'\r\nimport type { LiveAuthManager } from '../auth/LiveAuthManager'\r\nimport type { LiveDebugger } from '../debug/LiveDebugger'\r\nimport type { StateSignatureManager, SignedState } from '../security/StateSignature'\r\nimport type { PerformanceMonitor } from '../monitoring/PerformanceMonitor'\r\nimport { liveLog, registerComponentLogging, unregisterComponentLogging } from '../debug/LiveLogger'\r\n\r\nexport interface ComponentMetadata {\r\n id: string\r\n name: string\r\n version: string\r\n mountedAt: Date\r\n lastActivity: Date\r\n state: 'mounting' | 'active' | 'inactive' | 'error' | 'destroying'\r\n healthStatus: 'healthy' | 'degraded' | 'unhealthy'\r\n dependencies: string[]\r\n services: Map<string, any>\r\n metrics: ComponentMetrics\r\n migrationHistory: StateMigration[]\r\n}\r\n\r\nexport interface ComponentMetrics {\r\n renderCount: number\r\n actionCount: number\r\n errorCount: number\r\n averageRenderTime: number\r\n memoryUsage: number\r\n lastRenderTime?: number\r\n}\r\n\r\nexport interface StateMigration {\r\n fromVersion: string\r\n toVersion: string\r\n migratedAt: Date\r\n success: boolean\r\n error?: string\r\n}\r\n\r\nexport interface ComponentRegistryDeps {\r\n authManager: LiveAuthManager\r\n debugger: LiveDebugger\r\n stateSignature: StateSignatureManager\r\n performanceMonitor: PerformanceMonitor\r\n}\r\n\r\nexport class ComponentRegistry {\r\n private components = new Map<string, LiveComponent>()\r\n private definitions = new Map<string, ComponentDefinition<any>>()\r\n private metadata = new Map<string, ComponentMetadata>()\r\n private rooms = new Map<string, Set<string>>()\r\n private wsConnections = new Map<string, GenericWebSocket>()\r\n private autoDiscoveredComponents = new Map<string, new (initialState: any, ws: GenericWebSocket, options?: { room?: string; userId?: string }) => LiveComponent<any>>()\r\n private healthCheckInterval?: ReturnType<typeof setInterval>\r\n private singletons = new Map<string, { instance: LiveComponent; connections: Map<string, GenericWebSocket> }>()\r\n\r\n private authManager: LiveAuthManager\r\n private debugger: LiveDebugger\r\n private stateSignature: StateSignatureManager\r\n private performanceMonitor: PerformanceMonitor\r\n\r\n constructor(deps: ComponentRegistryDeps) {\r\n this.authManager = deps.authManager\r\n this.debugger = deps.debugger\r\n this.stateSignature = deps.stateSignature\r\n this.performanceMonitor = deps.performanceMonitor\r\n\r\n // Inject debugger into LiveComponent base class\r\n _setLiveDebugger(deps.debugger)\r\n\r\n this.setupHealthMonitoring()\r\n }\r\n\r\n private setupHealthMonitoring(): void {\r\n this.healthCheckInterval = setInterval(() => this.performHealthChecks(), 30000)\r\n }\r\n\r\n registerComponent<TState>(definition: ComponentDefinition<TState>) {\r\n this.definitions.set(definition.name, definition)\r\n liveLog('lifecycle', null, `Registered component: ${definition.name}`)\r\n }\r\n\r\n registerComponentClass(name: string, componentClass: new (initialState: any, ws: GenericWebSocket, options?: { room?: string; userId?: string }) => LiveComponent<any>) {\r\n this.autoDiscoveredComponents.set(name, componentClass)\r\n }\r\n\r\n async autoDiscoverComponents(componentsPath: string) {\r\n try {\r\n const fs = await import('fs')\r\n const path = await import('path')\r\n\r\n if (!fs.existsSync(componentsPath)) return\r\n\r\n const files = fs.readdirSync(componentsPath)\r\n\r\n for (const file of files) {\r\n if (file.endsWith('.ts') || file.endsWith('.js')) {\r\n try {\r\n const fullPath = path.join(componentsPath, file)\r\n const module = await import(fullPath)\r\n\r\n Object.keys(module).forEach(exportName => {\r\n const exportedItem = module[exportName]\r\n if (typeof exportedItem === 'function' &&\r\n exportedItem.prototype &&\r\n this.isLiveComponentClass(exportedItem)) {\r\n // Prefer static componentName over export name\r\n const componentName = exportedItem.componentName || exportName.replace(/Component$/, '')\r\n this.registerComponentClass(componentName, exportedItem)\r\n liveLog('lifecycle', null, `Auto-discovered component: ${componentName} (from ${file})`)\r\n }\r\n })\r\n } catch {\r\n // Silent\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n console.error('Auto-discovery failed:', error)\r\n }\r\n }\r\n\r\n private isLiveComponentClass(cls: any): boolean {\r\n try {\r\n // Most reliable: check for static componentName (all LiveComponent subclasses define it)\r\n if (typeof cls.componentName === 'string') return true\r\n\r\n // Check prototype chain for LiveComponent methods (bundler-safe)\r\n if (cls.prototype && typeof cls.prototype.executeAction === 'function' &&\r\n typeof cls.prototype.setState === 'function' &&\r\n typeof cls.prototype.getSerializableState === 'function') return true\r\n\r\n // Fallback: walk prototype chain checking class name\r\n // tsup/esbuild may rename LiveComponent to _LiveComponent in bundles\r\n let prototype = cls.prototype\r\n while (prototype) {\r\n const name = prototype.constructor.name\r\n if (name === 'LiveComponent' || name === '_LiveComponent') return true\r\n prototype = Object.getPrototypeOf(prototype)\r\n }\r\n return false\r\n } catch { return false }\r\n }\r\n\r\n async mountComponent(\r\n ws: GenericWebSocket,\r\n componentName: string,\r\n props: Record<string, unknown> = {},\r\n options?: { room?: string; userId?: string; version?: string; debugLabel?: string }\r\n ): Promise<{ componentId: string; initialState: unknown; signedState: unknown }> {\r\n const startTime = Date.now()\r\n\r\n try {\r\n const definition = this.definitions.get(componentName)\r\n let ComponentClass: (new (initialState: any, ws: GenericWebSocket, options?: { room?: string; userId?: string }) => LiveComponent<any>) | null = null\r\n let initialState: Record<string, unknown> = {}\r\n\r\n if (definition) {\r\n ComponentClass = definition.component\r\n initialState = definition.initialState as Record<string, unknown>\r\n } else {\r\n ComponentClass = this.autoDiscoveredComponents.get(componentName) ?? null\r\n if (!ComponentClass) {\r\n const variations = [\r\n componentName + 'Component',\r\n componentName.charAt(0).toUpperCase() + componentName.slice(1) + 'Component',\r\n componentName.charAt(0).toUpperCase() + componentName.slice(1)\r\n ]\r\n for (const variation of variations) {\r\n ComponentClass = this.autoDiscoveredComponents.get(variation) ?? null\r\n if (ComponentClass) break\r\n }\r\n }\r\n if (!ComponentClass) throw new Error(`Component '${componentName}' not found`)\r\n initialState = {}\r\n }\r\n\r\n // Auth check\r\n const authContext = ws.data?.authContext || ANONYMOUS_CONTEXT\r\n const componentAuth = (ComponentClass as any).auth as LiveComponentAuth | undefined\r\n const authResult = this.authManager.authorizeComponent(authContext, componentAuth)\r\n if (!authResult.allowed) throw new Error(`AUTH_DENIED: ${authResult.reason}`)\r\n\r\n // Singleton check\r\n const isSingleton = (ComponentClass as any).singleton === true\r\n if (isSingleton) {\r\n const existing = this.singletons.get(componentName)\r\n if (existing) {\r\n const connId = ws.data?.connectionId || `ws-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`\r\n existing.connections.set(connId, ws)\r\n this.ensureWsData(ws, options?.userId)\r\n ws.data.components.set(existing.instance.id, existing.instance)\r\n\r\n const signedState = await this.stateSignature.signState(existing.instance.id, {\r\n ...existing.instance.getSerializableState(),\r\n __componentName: componentName\r\n }, 1, { compress: true, backup: true })\r\n\r\n ws.send(JSON.stringify({\r\n type: 'STATE_UPDATE',\r\n componentId: existing.instance.id,\r\n payload: { state: existing.instance.getSerializableState(), signedState },\r\n timestamp: Date.now()\r\n }))\r\n\r\n try { (existing.instance as any).onClientJoin(connId, existing.connections.size) } catch { /* ignore */ }\r\n\r\n return { componentId: existing.instance.id, initialState: existing.instance.getSerializableState(), signedState }\r\n }\r\n }\r\n\r\n // Create component\r\n const component = new ComponentClass({ ...initialState, ...props }, ws, options)\r\n component.setAuthContext(authContext)\r\n component.broadcastToRoom = (message: BroadcastMessage) => {\r\n this.broadcastToRoom(message, component.id)\r\n }\r\n\r\n // Metadata\r\n const metadata = this.createComponentMetadata(component.id, componentName, options?.version)\r\n this.metadata.set(component.id, metadata)\r\n\r\n this.components.set(component.id, component)\r\n this.wsConnections.set(component.id, ws)\r\n\r\n if (options?.room) this.subscribeToRoom(component.id, options.room)\r\n\r\n this.ensureWsData(ws, options?.userId)\r\n ws.data.components.set(component.id, component)\r\n\r\n // Singleton broadcast setup\r\n if (isSingleton) {\r\n const connId = ws.data.connectionId || `ws-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`\r\n const connections = new Map<string, GenericWebSocket>()\r\n connections.set(connId, ws)\r\n this.singletons.set(componentName, { instance: component, connections })\r\n\r\n ;(component as any)[EMIT_OVERRIDE_KEY] = (type: string, payload: any) => {\r\n const message: LiveMessage = {\r\n type: type as any,\r\n componentId: component.id,\r\n payload,\r\n timestamp: Date.now(),\r\n userId: component.userId,\r\n room: component.room\r\n }\r\n const serialized = JSON.stringify(message)\r\n const singleton = this.singletons.get(componentName)\r\n if (singleton) {\r\n const dead: string[] = []\r\n for (const [cId, cWs] of singleton.connections) {\r\n try { cWs.send(serialized) } catch { dead.push(cId) }\r\n }\r\n for (const cId of dead) singleton.connections.delete(cId)\r\n }\r\n }\r\n\r\n try { (component as any).onClientJoin(connId, 1) } catch { /* ignore */ }\r\n }\r\n\r\n // Metrics & logging\r\n metadata.state = 'active'\r\n const renderTime = Date.now() - startTime\r\n this.recordComponentMetrics(component.id, renderTime)\r\n registerComponentLogging(component.id, (ComponentClass as any).logging)\r\n this.performanceMonitor.initializeComponent(component.id, componentName)\r\n this.performanceMonitor.recordRenderTime(component.id, renderTime)\r\n\r\n // Sign initial state\r\n const signedState = await this.stateSignature.signState(component.id, {\r\n ...component.getSerializableState(),\r\n __componentName: componentName\r\n }, 1, { compress: true, backup: true })\r\n\r\n ;(component as any).emit('STATE_UPDATE', {\r\n state: component.getSerializableState(),\r\n signedState\r\n })\r\n\r\n // Lifecycle hooks\r\n try { (component as any).onConnect() } catch { /* ignore */ }\r\n try { await (component as any).onMount() } catch (err: any) {\r\n ;(component as any).emit('ERROR', { action: 'onMount', error: `Mount initialization failed: ${err?.message || err}` })\r\n }\r\n\r\n this.debugger.trackComponentMount(\r\n component.id,\r\n componentName,\r\n component.getSerializableState() as Record<string, unknown>,\r\n options?.room,\r\n options?.debugLabel\r\n )\r\n\r\n return { componentId: component.id, initialState: component.getSerializableState(), signedState }\r\n } catch (error: any) {\r\n console.error(`Failed to mount component ${componentName}:`, error)\r\n throw error\r\n }\r\n }\r\n\r\n async rehydrateComponent(\r\n componentId: string,\r\n componentName: string,\r\n signedState: SignedState,\r\n ws: GenericWebSocket,\r\n options?: { room?: string; userId?: string }\r\n ): Promise<{ success: boolean; newComponentId?: string; error?: string }> {\r\n try {\r\n const validation = await this.stateSignature.validateState(signedState)\r\n if (!validation.valid) return { success: false, error: validation.error || 'Invalid state signature' }\r\n\r\n const definition = this.definitions.get(componentName)\r\n let ComponentClass: (new (initialState: any, ws: GenericWebSocket, options?: { room?: string; userId?: string }) => LiveComponent<any>) | null = null\r\n let initialState: Record<string, unknown> = {}\r\n\r\n if (definition) {\r\n ComponentClass = definition.component\r\n initialState = definition.initialState as Record<string, unknown>\r\n } else {\r\n ComponentClass = this.autoDiscoveredComponents.get(componentName) ?? null\r\n if (!ComponentClass) {\r\n const variations = [componentName + 'Component', componentName.charAt(0).toUpperCase() + componentName.slice(1) + 'Component', componentName.charAt(0).toUpperCase() + componentName.slice(1)]\r\n for (const variation of variations) {\r\n ComponentClass = this.autoDiscoveredComponents.get(variation) ?? null\r\n if (ComponentClass) break\r\n }\r\n }\r\n if (!ComponentClass) return { success: false, error: `Component '${componentName}' not found` }\r\n }\r\n\r\n // Auth check\r\n const authContext = ws.data?.authContext || ANONYMOUS_CONTEXT\r\n const componentAuth = (ComponentClass as any).auth as LiveComponentAuth | undefined\r\n const authResult = this.authManager.authorizeComponent(authContext, componentAuth)\r\n if (!authResult.allowed) return { success: false, error: `AUTH_DENIED: ${authResult.reason}` }\r\n\r\n const clientState = await this.stateSignature.extractData(signedState) as Record<string, any>\r\n\r\n if (clientState.__componentName && clientState.__componentName !== componentName) {\r\n return { success: false, error: 'Component class mismatch - state tampering detected' }\r\n }\r\n\r\n const { __componentName, ...cleanState } = clientState\r\n const finalState = definition ? { ...initialState, ...cleanState } : cleanState\r\n const component = new ComponentClass(finalState, ws, options)\r\n component.setAuthContext(authContext)\r\n\r\n this.components.set(component.id, component)\r\n this.wsConnections.set(component.id, ws)\r\n if (options?.room) this.subscribeToRoom(component.id, options.room)\r\n this.ensureWsData(ws, options?.userId)\r\n ws.data.components.set(component.id, component)\r\n registerComponentLogging(component.id, (ComponentClass as any).logging)\r\n\r\n const newSignedState = await this.stateSignature.signState(\r\n component.id,\r\n { ...component.getSerializableState(), __componentName: componentName },\r\n signedState.version + 1\r\n )\r\n\r\n ;(component as any).emit('STATE_REHYDRATED', {\r\n state: component.getSerializableState(),\r\n signedState: newSignedState,\r\n oldComponentId: componentId,\r\n newComponentId: component.id\r\n })\r\n\r\n try { (component as any).onConnect() } catch { /* ignore */ }\r\n try { (component as any).onRehydrate(clientState) } catch { /* ignore */ }\r\n try { await (component as any).onMount() } catch { /* ignore */ }\r\n\r\n return { success: true, newComponentId: component.id }\r\n } catch (error: any) {\r\n return { success: false, error: error.message }\r\n }\r\n }\r\n\r\n private ensureWsData(ws: GenericWebSocket, userId?: string): void {\r\n if (!ws.data) {\r\n (ws as { data: LiveWSData }).data = {\r\n connectionId: `ws-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\r\n components: new Map(),\r\n subscriptions: new Set(),\r\n connectedAt: new Date(),\r\n userId\r\n }\r\n }\r\n if (!ws.data.components) ws.data.components = new Map()\r\n }\r\n\r\n private isSingletonComponent(componentId: string): boolean {\r\n for (const [, s] of this.singletons) if (s.instance.id === componentId) return true\r\n return false\r\n }\r\n\r\n private removeSingletonConnection(componentId: string, connId?: string, context = 'unmount'): boolean {\r\n for (const [name, singleton] of this.singletons) {\r\n if (singleton.instance.id !== componentId) continue\r\n if (connId) singleton.connections.delete(connId)\r\n if (singleton.connections.size === 0) {\r\n try { (singleton.instance as any).onDisconnect() } catch { /* ignore */ }\r\n this.cleanupComponent(componentId)\r\n this.singletons.delete(name)\r\n }\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n async unmountComponent(componentId: string, ws?: GenericWebSocket) {\r\n const component = this.components.get(componentId)\r\n if (!component) return\r\n\r\n if (ws) {\r\n const connId = ws.data?.connectionId\r\n ws.data?.components?.delete(componentId)\r\n\r\n if (this.isSingletonComponent(componentId)) {\r\n const singleton = this.singletons.get(this.getSingletonName(componentId) || '')\r\n const remaining = singleton ? singleton.connections.size - 1 : 0\r\n try { (component as any).onClientLeave(connId || 'unknown', Math.max(0, remaining)) } catch { /* ignore */ }\r\n }\r\n\r\n if (this.removeSingletonConnection(componentId, connId, 'unmount')) return\r\n } else {\r\n if (this.removeSingletonConnection(componentId, undefined, 'unmount')) return\r\n }\r\n\r\n this.debugger.trackComponentUnmount(componentId)\r\n component.destroy?.()\r\n this.unsubscribeFromAllRooms(componentId)\r\n this.components.delete(componentId)\r\n this.wsConnections.delete(componentId)\r\n unregisterComponentLogging(componentId)\r\n }\r\n\r\n private getSingletonName(componentId: string): string | null {\r\n for (const [name, s] of this.singletons) {\r\n if (s.instance.id === componentId) return name\r\n }\r\n return null\r\n }\r\n\r\n async executeAction(componentId: string, action: string, payload: any): Promise<any> {\r\n const component = this.components.get(componentId)\r\n if (!component) throw new Error(`COMPONENT_REHYDRATION_REQUIRED:${componentId}`)\r\n\r\n const componentClass = component.constructor as any\r\n const actionAuthMap = componentClass.actionAuth as LiveActionAuthMap | undefined\r\n const actionAuth = actionAuthMap?.[action]\r\n\r\n if (actionAuth) {\r\n const authContext = (component as any).$auth || ANONYMOUS_CONTEXT\r\n const componentName = componentClass.componentName || componentClass.name\r\n const authResult = await this.authManager.authorizeAction(authContext, componentName, action, actionAuth)\r\n if (!authResult.allowed) throw new Error(`AUTH_DENIED: ${authResult.reason}`)\r\n }\r\n\r\n return await component.executeAction?.(action, payload)\r\n }\r\n\r\n updateProperty(componentId: string, property: string, value: any) {\r\n const component = this.components.get(componentId)\r\n if (!component) throw new Error(`Component '${componentId}' not found`)\r\n component.setState?.({ [property]: value })\r\n }\r\n\r\n subscribeToRoom(componentId: string, roomId: string) {\r\n if (!this.rooms.has(roomId)) this.rooms.set(roomId, new Set())\r\n this.rooms.get(roomId)!.add(componentId)\r\n }\r\n\r\n unsubscribeFromRoom(componentId: string, roomId: string) {\r\n const room = this.rooms.get(roomId)\r\n if (room) {\r\n room.delete(componentId)\r\n if (room.size === 0) this.rooms.delete(roomId)\r\n }\r\n }\r\n\r\n private unsubscribeFromAllRooms(componentId: string) {\r\n for (const [roomId, components] of Array.from(this.rooms.entries())) {\r\n if (components.has(componentId)) this.unsubscribeFromRoom(componentId, roomId)\r\n }\r\n }\r\n\r\n broadcastToRoom(message: BroadcastMessage, senderComponentId?: string) {\r\n if (!message.room) return\r\n const roomComponents = this.rooms.get(message.room)\r\n if (!roomComponents) return\r\n\r\n const broadcastMessage: LiveMessage = {\r\n type: 'BROADCAST',\r\n componentId: senderComponentId || 'system',\r\n payload: { type: message.type, data: message.payload },\r\n timestamp: Date.now(),\r\n room: message.room\r\n }\r\n\r\n for (const componentId of Array.from(roomComponents)) {\r\n const component = this.components.get(componentId)\r\n if (message.excludeUser && component?.userId === message.excludeUser) continue\r\n const ws = this.wsConnections.get(componentId)\r\n if (ws && ws.send) ws.send(JSON.stringify(broadcastMessage))\r\n }\r\n }\r\n\r\n async handleMessage(ws: GenericWebSocket, message: LiveMessage): Promise<{ success: boolean; result?: unknown; error?: string } | null> {\r\n try {\r\n if (message.componentId) this.updateComponentActivity(message.componentId)\r\n\r\n switch (message.type) {\r\n case 'COMPONENT_MOUNT':\r\n const mountResult = await this.mountComponent(ws, message.payload.component, message.payload.props, {\r\n room: message.payload.room,\r\n userId: message.userId,\r\n debugLabel: message.payload.debugLabel\r\n })\r\n return { success: true, result: mountResult }\r\n\r\n case 'COMPONENT_UNMOUNT':\r\n await this.unmountComponent(message.componentId, ws)\r\n return { success: true }\r\n\r\n case 'CALL_ACTION':\r\n this.recordComponentMetrics(message.componentId, undefined, message.action)\r\n const actionStart = Date.now()\r\n try {\r\n const actionResult = await this.executeAction(message.componentId, message.action!, message.payload)\r\n this.performanceMonitor.recordActionTime(message.componentId, message.action!, Date.now() - actionStart)\r\n if (message.expectResponse) return { success: true, result: actionResult }\r\n return null\r\n } catch (error: any) {\r\n this.performanceMonitor.recordActionTime(message.componentId, message.action!, Date.now() - actionStart, error)\r\n throw error\r\n }\r\n\r\n case 'PROPERTY_UPDATE':\r\n this.updateProperty(message.componentId, message.property!, message.payload.value)\r\n return { success: true }\r\n\r\n default:\r\n return { success: false, error: 'Unknown message type' }\r\n }\r\n } catch (error: any) {\r\n if (message.componentId) this.recordComponentError(message.componentId, error)\r\n return { success: false, error: error.message }\r\n }\r\n }\r\n\r\n cleanupConnection(ws: GenericWebSocket) {\r\n if (!ws.data?.components) return\r\n\r\n const componentsToCleanup = Array.from(ws.data.components.keys()) as string[]\r\n const connId = ws.data.connectionId\r\n\r\n for (const componentId of componentsToCleanup) {\r\n const component = this.components.get(componentId)\r\n if (component && !this.isSingletonComponent(componentId)) {\r\n try { (component as any).onDisconnect() } catch { /* ignore */ }\r\n }\r\n if (!this.removeSingletonConnection(componentId, connId || undefined, 'disconnect')) {\r\n this.cleanupComponent(componentId)\r\n }\r\n }\r\n\r\n ws.data.components.clear()\r\n }\r\n\r\n getStats() {\r\n return {\r\n components: this.components.size,\r\n definitions: this.definitions.size,\r\n rooms: this.rooms.size,\r\n connections: this.wsConnections.size,\r\n singletons: Object.fromEntries(\r\n Array.from(this.singletons.entries()).map(([name, s]) => [name, { componentId: s.instance.id, connections: s.connections.size }])\r\n ),\r\n roomDetails: Object.fromEntries(\r\n Array.from(this.rooms.entries()).map(([roomId, components]) => [roomId, components.size])\r\n )\r\n }\r\n }\r\n\r\n getRegisteredComponentNames(): string[] {\r\n return [...new Set([...this.definitions.keys(), ...this.autoDiscoveredComponents.keys()])]\r\n }\r\n\r\n getComponent(componentId: string): LiveComponent | undefined {\r\n return this.components.get(componentId)\r\n }\r\n\r\n getRoomComponents(roomId: string): LiveComponent[] {\r\n const componentIds = this.rooms.get(roomId) || new Set()\r\n return Array.from(componentIds).map(id => this.components.get(id)).filter(Boolean) as LiveComponent[]\r\n }\r\n\r\n private createComponentMetadata(componentId: string, componentName: string, version = '1.0.0'): ComponentMetadata {\r\n return {\r\n id: componentId,\r\n name: componentName,\r\n version,\r\n mountedAt: new Date(),\r\n lastActivity: new Date(),\r\n state: 'mounting',\r\n healthStatus: 'healthy',\r\n dependencies: [],\r\n services: new Map(),\r\n metrics: { renderCount: 0, actionCount: 0, errorCount: 0, averageRenderTime: 0, memoryUsage: 0 },\r\n migrationHistory: []\r\n }\r\n }\r\n\r\n updateComponentActivity(componentId: string): boolean {\r\n const metadata = this.metadata.get(componentId)\r\n if (metadata) { metadata.lastActivity = new Date(); metadata.state = 'active'; return true }\r\n return false\r\n }\r\n\r\n recordComponentMetrics(componentId: string, renderTime?: number, action?: string): void {\r\n const metadata = this.metadata.get(componentId)\r\n if (!metadata) return\r\n if (renderTime) {\r\n metadata.metrics.renderCount++\r\n metadata.metrics.averageRenderTime = (metadata.metrics.averageRenderTime * (metadata.metrics.renderCount - 1) + renderTime) / metadata.metrics.renderCount\r\n metadata.metrics.lastRenderTime = renderTime\r\n }\r\n if (action) metadata.metrics.actionCount++\r\n this.updateComponentActivity(componentId)\r\n }\r\n\r\n recordComponentError(componentId: string, error: Error): void {\r\n const metadata = this.metadata.get(componentId)\r\n if (metadata) {\r\n metadata.metrics.errorCount++\r\n metadata.healthStatus = metadata.metrics.errorCount > 5 ? 'unhealthy' : 'degraded'\r\n }\r\n }\r\n\r\n private async performHealthChecks(): Promise<void> {\r\n for (const [componentId, metadata] of this.metadata) {\r\n if (!this.components.get(componentId)) continue\r\n if (metadata.metrics.errorCount > 10) metadata.healthStatus = 'unhealthy'\r\n else if (Date.now() - metadata.lastActivity.getTime() > 300000) metadata.healthStatus = 'degraded'\r\n }\r\n }\r\n\r\n private cleanupComponent(componentId: string): void {\r\n const component = this.components.get(componentId)\r\n if (component) try { component.destroy?.() } catch { /* ignore */ }\r\n this.performanceMonitor.removeComponent(componentId)\r\n unregisterComponentLogging(componentId)\r\n this.components.delete(componentId)\r\n this.metadata.delete(componentId)\r\n this.wsConnections.delete(componentId)\r\n for (const [roomId, componentIds] of this.rooms) {\r\n componentIds.delete(componentId)\r\n if (componentIds.size === 0) this.rooms.delete(roomId)\r\n }\r\n }\r\n\r\n cleanup(): void {\r\n if (this.healthCheckInterval) clearInterval(this.healthCheckInterval)\r\n this.singletons.clear()\r\n for (const [componentId] of this.components) this.cleanupComponent(componentId)\r\n }\r\n}\r\n","// @fluxstack/live - Per-connection rate limiter\r\n//\r\n// Token bucket algorithm to prevent WebSocket message flooding.\r\n\r\nimport { DEFAULT_RATE_LIMIT_MAX_TOKENS, DEFAULT_RATE_LIMIT_REFILL_RATE } from '../protocol/constants'\r\n\r\nexport class ConnectionRateLimiter {\r\n private tokens: number\r\n private lastRefill: number\r\n private readonly maxTokens: number\r\n private readonly refillRate: number // tokens per second\r\n\r\n constructor(maxTokens = DEFAULT_RATE_LIMIT_MAX_TOKENS, refillRate = DEFAULT_RATE_LIMIT_REFILL_RATE) {\r\n this.maxTokens = maxTokens\r\n this.tokens = maxTokens\r\n this.refillRate = refillRate\r\n this.lastRefill = Date.now()\r\n }\r\n\r\n tryConsume(count = 1): boolean {\r\n this.refill()\r\n if (this.tokens >= count) {\r\n this.tokens -= count\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n private refill(): void {\r\n const now = Date.now()\r\n const elapsed = (now - this.lastRefill) / 1000\r\n this.tokens = Math.min(this.maxTokens, this.tokens + elapsed * this.refillRate)\r\n this.lastRefill = now\r\n }\r\n}\r\n\r\n/**\r\n * Manages rate limiters for all connections.\r\n */\r\nexport class RateLimiterRegistry {\r\n private limiters = new Map<string, ConnectionRateLimiter>()\r\n private maxTokens: number\r\n private refillRate: number\r\n\r\n constructor(maxTokens = DEFAULT_RATE_LIMIT_MAX_TOKENS, refillRate = DEFAULT_RATE_LIMIT_REFILL_RATE) {\r\n this.maxTokens = maxTokens\r\n this.refillRate = refillRate\r\n }\r\n\r\n /**\r\n * Get or create a rate limiter for a connection.\r\n */\r\n get(connectionId: string): ConnectionRateLimiter {\r\n let limiter = this.limiters.get(connectionId)\r\n if (!limiter) {\r\n limiter = new ConnectionRateLimiter(this.maxTokens, this.refillRate)\r\n this.limiters.set(connectionId, limiter)\r\n }\r\n return limiter\r\n }\r\n\r\n /**\r\n * Remove a rate limiter for a disconnected connection.\r\n */\r\n remove(connectionId: string): void {\r\n this.limiters.delete(connectionId)\r\n }\r\n}\r\n","// @fluxstack/live - Binary Protocol for File Uploads\r\n//\r\n// Wire format: [4 bytes headerLength (LE)][JSON header][binary data]\r\n\r\nimport type { BinaryChunkHeader } from './messages'\r\n\r\n/**\r\n * Encode a binary chunk message for transmission.\r\n * @param header - JSON metadata about the chunk\r\n * @param data - Raw binary data\r\n * @returns Combined buffer ready to send over WebSocket\r\n */\r\nexport function encodeBinaryChunk(header: BinaryChunkHeader, data: Buffer | Uint8Array): Buffer {\r\n const headerJson = JSON.stringify(header)\r\n const headerBuffer = Buffer.from(headerJson, 'utf-8')\r\n\r\n // Total: 4 bytes (header length) + header + data\r\n const result = Buffer.alloc(4 + headerBuffer.length + data.length)\r\n result.writeUInt32LE(headerBuffer.length, 0)\r\n headerBuffer.copy(result, 4)\r\n Buffer.from(data).copy(result, 4 + headerBuffer.length)\r\n\r\n return result\r\n}\r\n\r\n/**\r\n * Decode a binary chunk message received over WebSocket.\r\n * @param raw - Raw ArrayBuffer or Uint8Array from WebSocket\r\n * @returns Parsed header and binary chunk data\r\n */\r\nexport function decodeBinaryChunk(raw: ArrayBuffer | Uint8Array): { header: BinaryChunkHeader; data: Buffer } {\r\n const buffer = raw instanceof ArrayBuffer\r\n ? Buffer.from(raw)\r\n : Buffer.from(raw.buffer, raw.byteOffset, raw.byteLength)\r\n\r\n const headerLength = buffer.readUInt32LE(0)\r\n const headerJson = buffer.slice(4, 4 + headerLength).toString('utf-8')\r\n const header = JSON.parse(headerJson) as BinaryChunkHeader\r\n const data = buffer.slice(4 + headerLength)\r\n\r\n return { header, data }\r\n}\r\n","// @fluxstack/live - LiveServer Orchestrator\r\n//\r\n// Main entry point: wire up transport, create singletons, expose public API.\r\n// Usage:\r\n// const server = new LiveServer({ transport: new ElysiaTransport(app) })\r\n// await server.start()\r\n\r\nimport type { LiveTransport, GenericWebSocket, WebSocketConfig, HttpRouteDefinition } from '../transport/types'\r\nimport type { LiveMessage, WebSocketResponse } from '../protocol/messages'\r\nimport { RoomEventBus } from '../rooms/RoomEventBus'\r\nimport { LiveRoomManager } from '../rooms/LiveRoomManager'\r\nimport { LiveDebugger } from '../debug/LiveDebugger'\r\nimport { LiveAuthManager } from '../auth/LiveAuthManager'\r\nimport { StateSignatureManager, type StateSignatureConfig } from '../security/StateSignature'\r\nimport { PerformanceMonitor, type PerformanceConfig } from '../monitoring/PerformanceMonitor'\r\nimport { FileUploadManager, type FileUploadConfig } from '../upload/FileUploadManager'\r\nimport { WebSocketConnectionManager, type ConnectionConfig } from '../connection/WebSocketConnectionManager'\r\nimport { ComponentRegistry } from '../component/ComponentRegistry'\r\nimport { setLiveComponentContext } from '../component/context'\r\nimport { RateLimiterRegistry } from '../connection/RateLimiter'\r\nimport { liveLog, _setLoggerDebugger } from '../debug/LiveLogger'\r\nimport { decodeBinaryChunk } from '../protocol/binary'\r\nimport { DEFAULT_WS_PATH } from '../protocol/constants'\r\nimport type { LiveAuthProvider } from '../auth/types'\r\n\r\nexport interface LiveServerOptions {\r\n /** Transport adapter (Elysia, Express, etc.) */\r\n transport: LiveTransport\r\n /** WebSocket endpoint path. Defaults to '/api/live/ws' */\r\n wsPath?: string\r\n /** Enable debug mode. Defaults to false. */\r\n debug?: boolean\r\n /** State signature configuration */\r\n stateSignature?: StateSignatureConfig\r\n /** Performance monitor configuration */\r\n performance?: PerformanceConfig\r\n /** File upload configuration */\r\n fileUpload?: FileUploadConfig\r\n /** Connection manager configuration */\r\n connection?: Partial<ConnectionConfig>\r\n /** Rate limiter: max tokens per connection */\r\n rateLimitMaxTokens?: number\r\n /** Rate limiter: tokens refilled per second */\r\n rateLimitRefillRate?: number\r\n /** Components path for auto-discovery */\r\n componentsPath?: string\r\n /** HTTP monitoring routes prefix. Set to false to disable. Defaults to '/api/live' */\r\n httpPrefix?: string | false\r\n}\r\n\r\nexport class LiveServer {\r\n // Public singletons (accessible for transport adapters & advanced usage)\r\n public readonly roomEvents: RoomEventBus\r\n public readonly roomManager: LiveRoomManager\r\n public readonly debugger: LiveDebugger\r\n public readonly authManager: LiveAuthManager\r\n public readonly stateSignature: StateSignatureManager\r\n public readonly performanceMonitor: PerformanceMonitor\r\n public readonly fileUploadManager: FileUploadManager\r\n public readonly connectionManager: WebSocketConnectionManager\r\n public readonly registry: ComponentRegistry\r\n public readonly rateLimiter: RateLimiterRegistry\r\n\r\n private transport: LiveTransport\r\n private options: LiveServerOptions\r\n\r\n constructor(options: LiveServerOptions) {\r\n this.options = options\r\n this.transport = options.transport\r\n\r\n // Create all singletons\r\n this.roomEvents = new RoomEventBus()\r\n this.roomManager = new LiveRoomManager(this.roomEvents)\r\n this.debugger = new LiveDebugger(options.debug ?? false)\r\n this.authManager = new LiveAuthManager()\r\n this.stateSignature = new StateSignatureManager(options.stateSignature)\r\n this.performanceMonitor = new PerformanceMonitor(options.performance)\r\n this.fileUploadManager = new FileUploadManager(options.fileUpload)\r\n this.connectionManager = new WebSocketConnectionManager(options.connection)\r\n this.rateLimiter = new RateLimiterRegistry(options.rateLimitMaxTokens, options.rateLimitRefillRate)\r\n\r\n this.registry = new ComponentRegistry({\r\n authManager: this.authManager,\r\n debugger: this.debugger,\r\n stateSignature: this.stateSignature,\r\n performanceMonitor: this.performanceMonitor,\r\n })\r\n\r\n // Wire logger -> debugger\r\n _setLoggerDebugger(this.debugger)\r\n\r\n // Set global context for LiveComponent base class\r\n setLiveComponentContext({\r\n roomEvents: this.roomEvents,\r\n roomManager: this.roomManager,\r\n debugger: this.debugger,\r\n })\r\n }\r\n\r\n /**\r\n * Register an auth provider.\r\n */\r\n useAuth(provider: LiveAuthProvider): this {\r\n this.authManager.register(provider)\r\n return this\r\n }\r\n\r\n /**\r\n * Start the LiveServer: register WS + HTTP handlers on the transport.\r\n */\r\n async start(): Promise<void> {\r\n // Auto-discover components if path provided\r\n if (this.options.componentsPath) {\r\n await this.registry.autoDiscoverComponents(this.options.componentsPath)\r\n }\r\n\r\n // Register WebSocket handler\r\n const wsConfig: WebSocketConfig = {\r\n path: this.options.wsPath ?? DEFAULT_WS_PATH,\r\n onOpen: (ws) => this.handleOpen(ws),\r\n onMessage: (ws, message, isBinary) => this.handleMessage(ws, message, isBinary),\r\n onClose: (ws, code, reason) => this.handleClose(ws, code, reason),\r\n onError: (ws, error) => this.handleError(ws, error),\r\n }\r\n await this.transport.registerWebSocket(wsConfig)\r\n\r\n // Register HTTP routes\r\n if (this.options.httpPrefix !== false) {\r\n const prefix = this.options.httpPrefix ?? '/api/live'\r\n await this.transport.registerHttpRoutes(this.buildHttpRoutes(prefix))\r\n }\r\n\r\n // Transport startup hook\r\n if (this.transport.start) {\r\n await this.transport.start()\r\n }\r\n\r\n liveLog('lifecycle', null, `LiveServer started (ws: ${wsConfig.path})`)\r\n }\r\n\r\n /**\r\n * Graceful shutdown.\r\n */\r\n async shutdown(): Promise<void> {\r\n this.registry.cleanup()\r\n this.connectionManager.shutdown()\r\n this.fileUploadManager.shutdown()\r\n this.stateSignature.shutdown()\r\n if (this.transport.shutdown) await this.transport.shutdown()\r\n liveLog('lifecycle', null, 'LiveServer shut down')\r\n }\r\n\r\n // ===== WebSocket Handlers =====\r\n\r\n private handleOpen(ws: GenericWebSocket): void {\r\n const connectionId = `ws-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`\r\n\r\n ws.data = {\r\n connectionId,\r\n components: new Map(),\r\n subscriptions: new Set(),\r\n connectedAt: new Date(),\r\n }\r\n\r\n this.connectionManager.registerConnection(ws, connectionId)\r\n this.debugger.trackConnection(connectionId)\r\n\r\n ws.send(JSON.stringify({\r\n type: 'CONNECTION_ESTABLISHED',\r\n connectionId,\r\n timestamp: Date.now()\r\n }))\r\n\r\n liveLog('websocket', null, `Connection opened: ${connectionId}`)\r\n }\r\n\r\n private async handleMessage(ws: GenericWebSocket, rawMessage: unknown, isBinary: boolean): Promise<void> {\r\n // Rate limit\r\n const connectionId = ws.data?.connectionId\r\n if (connectionId) {\r\n const limiter = this.rateLimiter.get(connectionId)\r\n if (!limiter.tryConsume()) {\r\n ws.send(JSON.stringify({ type: 'ERROR', error: 'Rate limit exceeded', timestamp: Date.now() }))\r\n return\r\n }\r\n }\r\n\r\n // Binary protocol (file upload chunks)\r\n if (isBinary && rawMessage instanceof ArrayBuffer) {\r\n try {\r\n const { header, data } = decodeBinaryChunk(rawMessage)\r\n if (header.type === 'FILE_UPLOAD_CHUNK') {\r\n const chunkMessage = { ...header, data: '' } as any\r\n const progress = await this.fileUploadManager.receiveChunk(chunkMessage, data)\r\n if (progress) ws.send(JSON.stringify(progress))\r\n }\r\n } catch (error: any) {\r\n ws.send(JSON.stringify({ type: 'ERROR', error: error.message, timestamp: Date.now() }))\r\n }\r\n return\r\n }\r\n\r\n // JSON protocol\r\n let message: LiveMessage\r\n try {\r\n const str = typeof rawMessage === 'string' ? rawMessage : new TextDecoder().decode(rawMessage as ArrayBuffer)\r\n message = JSON.parse(str)\r\n } catch {\r\n ws.send(JSON.stringify({ type: 'ERROR', error: 'Invalid JSON', timestamp: Date.now() }))\r\n return\r\n }\r\n\r\n try {\r\n // Auth message\r\n if (message.type === 'AUTH') {\r\n const authContext = await this.authManager.authenticate(message.payload || {})\r\n if (ws.data) ws.data.authContext = authContext\r\n ws.send(JSON.stringify({\r\n type: 'AUTH_RESPONSE',\r\n success: authContext.authenticated,\r\n payload: authContext.authenticated ? { userId: authContext.user?.id } : { error: 'Authentication failed' },\r\n timestamp: Date.now()\r\n }))\r\n return\r\n }\r\n\r\n // Room messages\r\n if (message.type === 'ROOM_JOIN' || message.type === 'ROOM_LEAVE' || message.type === 'ROOM_EMIT' || message.type === 'ROOM_STATE_SET' || message.type === 'ROOM_STATE_GET') {\r\n await this.handleRoomMessage(ws, message)\r\n return\r\n }\r\n\r\n // File upload messages\r\n if (message.type === 'FILE_UPLOAD_START') {\r\n const result = await this.fileUploadManager.startUpload(message as any, ws.data?.userId)\r\n ws.send(JSON.stringify({\r\n type: 'FILE_UPLOAD_START_RESPONSE',\r\n componentId: message.componentId,\r\n uploadId: message.payload?.uploadId,\r\n success: result.success,\r\n error: result.error,\r\n requestId: message.requestId,\r\n timestamp: Date.now()\r\n }))\r\n return\r\n }\r\n\r\n if (message.type === 'FILE_UPLOAD_CHUNK') {\r\n const progress = await this.fileUploadManager.receiveChunk(message as any)\r\n if (progress) ws.send(JSON.stringify(progress))\r\n return\r\n }\r\n\r\n if (message.type === 'FILE_UPLOAD_COMPLETE') {\r\n const result = await this.fileUploadManager.completeUpload(message as any)\r\n ws.send(JSON.stringify(result))\r\n return\r\n }\r\n\r\n // Component rehydration\r\n if (message.type === 'COMPONENT_REHYDRATE') {\r\n const result = await this.registry.rehydrateComponent(\r\n message.componentId,\r\n message.payload.component,\r\n message.payload.signedState,\r\n ws,\r\n { room: message.payload.room, userId: message.userId }\r\n )\r\n ws.send(JSON.stringify({\r\n type: 'COMPONENT_REHYDRATED',\r\n componentId: message.componentId,\r\n success: result.success,\r\n result: result.success ? { newComponentId: result.newComponentId } : undefined,\r\n error: result.error,\r\n requestId: message.requestId,\r\n timestamp: Date.now()\r\n }))\r\n return\r\n }\r\n\r\n // Delegate to registry\r\n const result = await this.registry.handleMessage(ws, message)\r\n\r\n if (result !== null) {\r\n const response: WebSocketResponse = {\r\n type: message.type === 'CALL_ACTION' ? 'ACTION_RESPONSE' : 'MESSAGE_RESPONSE',\r\n originalType: message.type,\r\n componentId: message.componentId,\r\n success: result.success,\r\n result: result.result,\r\n error: result.error,\r\n requestId: message.requestId,\r\n responseId: message.responseId,\r\n timestamp: Date.now()\r\n }\r\n ws.send(JSON.stringify(response))\r\n }\r\n } catch (error: any) {\r\n ws.send(JSON.stringify({\r\n type: 'ERROR',\r\n componentId: message.componentId,\r\n error: error.message,\r\n requestId: message.requestId,\r\n timestamp: Date.now()\r\n }))\r\n }\r\n }\r\n\r\n private handleClose(ws: GenericWebSocket, code: number, reason: string): void {\r\n const connectionId = ws.data?.connectionId\r\n const componentCount = ws.data?.components?.size || 0\r\n\r\n this.registry.cleanupConnection(ws)\r\n this.roomManager.cleanupComponent(connectionId || '')\r\n if (connectionId) {\r\n this.connectionManager.cleanupConnection(connectionId)\r\n this.rateLimiter.remove(connectionId)\r\n }\r\n this.debugger.trackDisconnection(connectionId || '', componentCount)\r\n\r\n liveLog('websocket', null, `Connection closed: ${connectionId} (${componentCount} components)`)\r\n }\r\n\r\n private handleError(ws: GenericWebSocket, error: Error): void {\r\n console.error(`[LiveServer] WebSocket error:`, error.message)\r\n }\r\n\r\n // ===== Room Message Router =====\r\n\r\n private async handleRoomMessage(ws: GenericWebSocket, message: LiveMessage): Promise<void> {\r\n const { componentId } = message\r\n const roomId = (message as any).roomId || message.payload?.roomId\r\n\r\n switch (message.type) {\r\n case 'ROOM_JOIN': {\r\n const result = this.roomManager.joinRoom(componentId, roomId, ws, message.payload?.initialState)\r\n ws.send(JSON.stringify({\r\n type: 'ROOM_JOINED',\r\n componentId,\r\n payload: { roomId, state: result.state },\r\n requestId: message.requestId,\r\n timestamp: Date.now()\r\n }))\r\n break\r\n }\r\n case 'ROOM_LEAVE':\r\n this.roomManager.leaveRoom(componentId, roomId)\r\n ws.send(JSON.stringify({\r\n type: 'ROOM_LEFT',\r\n componentId,\r\n payload: { roomId },\r\n requestId: message.requestId,\r\n timestamp: Date.now()\r\n }))\r\n break\r\n case 'ROOM_EMIT':\r\n this.roomManager.emitToRoom(roomId, message.payload?.event, message.payload?.data, componentId)\r\n break\r\n case 'ROOM_STATE_SET':\r\n this.roomManager.setRoomState(roomId, message.payload?.state, componentId)\r\n break\r\n case 'ROOM_STATE_GET': {\r\n const state = this.roomManager.getRoomState(roomId)\r\n ws.send(JSON.stringify({\r\n type: 'ROOM_STATE',\r\n componentId,\r\n payload: { roomId, state },\r\n requestId: message.requestId,\r\n timestamp: Date.now()\r\n }))\r\n break\r\n }\r\n }\r\n }\r\n\r\n // ===== HTTP Monitoring Routes =====\r\n\r\n private buildHttpRoutes(prefix: string): HttpRouteDefinition[] {\r\n return [\r\n {\r\n method: 'GET',\r\n path: `${prefix}/stats`,\r\n handler: async () => ({\r\n body: {\r\n components: this.registry.getStats(),\r\n rooms: this.roomManager.getStats(),\r\n connections: this.connectionManager.getSystemStats(),\r\n uploads: this.fileUploadManager.getStats(),\r\n performance: this.performanceMonitor.getStats(),\r\n }\r\n }),\r\n metadata: { summary: 'Live Components system statistics', tags: ['live'] }\r\n },\r\n {\r\n method: 'GET',\r\n path: `${prefix}/components`,\r\n handler: async () => ({\r\n body: { names: this.registry.getRegisteredComponentNames() }\r\n }),\r\n metadata: { summary: 'List registered component names', tags: ['live'] }\r\n },\r\n {\r\n method: 'POST',\r\n path: `${prefix}/rooms/:roomId/messages`,\r\n handler: async (req) => {\r\n const roomId = req.params.roomId!\r\n this.roomManager.emitToRoom(roomId, 'message:new', req.body)\r\n return { body: { success: true, roomId } }\r\n },\r\n metadata: { summary: 'Send message to room via HTTP', tags: ['live', 'rooms'] }\r\n },\r\n {\r\n method: 'POST',\r\n path: `${prefix}/rooms/:roomId/emit`,\r\n handler: async (req) => {\r\n const roomId = req.params.roomId!\r\n const { event, data } = req.body as any\r\n this.roomManager.emitToRoom(roomId, event, data)\r\n return { body: { success: true, roomId, event } }\r\n },\r\n metadata: { summary: 'Emit custom event to room via HTTP', tags: ['live', 'rooms'] }\r\n },\r\n ]\r\n }\r\n}\r\n","// @fluxstack/live - Room State Manager (In-memory storage per room)\r\n\r\ntype RoomStateData = Record<string, any>\r\n\r\ninterface RoomInfo {\r\n state: RoomStateData\r\n componentCount: number\r\n createdAt: number\r\n lastUpdate: number\r\n}\r\n\r\nexport function createTypedRoomState<TRoomTypes extends Record<string, RoomStateData>>() {\r\n const rooms = new Map<string, RoomInfo>()\r\n const getKey = (type: string, roomId: string) => `${type}:${roomId}`\r\n\r\n return {\r\n get<K extends keyof TRoomTypes>(type: K, roomId: string, defaultState: TRoomTypes[K]): TRoomTypes[K] {\r\n const key = getKey(type as string, roomId)\r\n const room = rooms.get(key)\r\n\r\n if (room) return room.state as TRoomTypes[K]\r\n\r\n rooms.set(key, { state: defaultState, componentCount: 0, createdAt: Date.now(), lastUpdate: Date.now() })\r\n return defaultState\r\n },\r\n\r\n update<K extends keyof TRoomTypes>(type: K, roomId: string, updates: Partial<TRoomTypes[K]>): TRoomTypes[K] {\r\n const key = getKey(type as string, roomId)\r\n const room = rooms.get(key)\r\n\r\n if (room) {\r\n room.state = { ...room.state, ...updates }\r\n room.lastUpdate = Date.now()\r\n return room.state as TRoomTypes[K]\r\n }\r\n\r\n const newState = updates as TRoomTypes[K]\r\n rooms.set(key, { state: newState, componentCount: 0, createdAt: Date.now(), lastUpdate: Date.now() })\r\n return newState\r\n },\r\n\r\n set<K extends keyof TRoomTypes>(type: K, roomId: string, state: TRoomTypes[K]): void {\r\n const key = getKey(type as string, roomId)\r\n const room = rooms.get(key)\r\n\r\n if (room) {\r\n room.state = state\r\n room.lastUpdate = Date.now()\r\n } else {\r\n rooms.set(key, { state, componentCount: 0, createdAt: Date.now(), lastUpdate: Date.now() })\r\n }\r\n },\r\n\r\n join<K extends keyof TRoomTypes>(type: K, roomId: string): void {\r\n const room = rooms.get(getKey(type as string, roomId))\r\n if (room) room.componentCount++\r\n },\r\n\r\n leave<K extends keyof TRoomTypes>(type: K, roomId: string): void {\r\n const key = getKey(type as string, roomId)\r\n const room = rooms.get(key)\r\n if (room) {\r\n room.componentCount--\r\n if (room.componentCount <= 0) {\r\n setTimeout(() => {\r\n const current = rooms.get(key)\r\n if (current && current.componentCount <= 0) {\r\n rooms.delete(key)\r\n }\r\n }, 5 * 60 * 1000)\r\n }\r\n }\r\n },\r\n\r\n has<K extends keyof TRoomTypes>(type: K, roomId: string): boolean {\r\n return rooms.has(getKey(type as string, roomId))\r\n },\r\n\r\n delete<K extends keyof TRoomTypes>(type: K, roomId: string): boolean {\r\n return rooms.delete(getKey(type as string, roomId))\r\n },\r\n\r\n getStats(): { totalRooms: number; rooms: Record<string, { componentCount: number; stateKeys: string[] }> } {\r\n const roomStats: Record<string, { componentCount: number; stateKeys: string[] }> = {}\r\n for (const [key, info] of rooms) {\r\n roomStats[key] = { componentCount: info.componentCount, stateKeys: Object.keys(info.state) }\r\n }\r\n return { totalRooms: rooms.size, rooms: roomStats }\r\n }\r\n }\r\n}\r\n\r\nexport class RoomStateManager {\r\n private rooms = new Map<string, RoomInfo>()\r\n\r\n get<T extends RoomStateData>(roomId: string, defaultState?: T): T {\r\n const room = this.rooms.get(roomId)\r\n if (room) return room.state as T\r\n\r\n if (defaultState) {\r\n this.rooms.set(roomId, { state: defaultState, componentCount: 0, createdAt: Date.now(), lastUpdate: Date.now() })\r\n return defaultState\r\n }\r\n\r\n return {} as T\r\n }\r\n\r\n update<T extends RoomStateData>(roomId: string, updates: Partial<T>): T {\r\n const room = this.rooms.get(roomId)\r\n\r\n if (room) {\r\n room.state = { ...room.state, ...updates }\r\n room.lastUpdate = Date.now()\r\n return room.state as T\r\n }\r\n\r\n const newState = updates as T\r\n this.rooms.set(roomId, { state: newState, componentCount: 0, createdAt: Date.now(), lastUpdate: Date.now() })\r\n return newState\r\n }\r\n\r\n set<T extends RoomStateData>(roomId: string, state: T): void {\r\n const room = this.rooms.get(roomId)\r\n\r\n if (room) {\r\n room.state = state\r\n room.lastUpdate = Date.now()\r\n } else {\r\n this.rooms.set(roomId, { state, componentCount: 0, createdAt: Date.now(), lastUpdate: Date.now() })\r\n }\r\n }\r\n\r\n join(roomId: string): void {\r\n const room = this.rooms.get(roomId)\r\n if (room) room.componentCount++\r\n }\r\n\r\n leave(roomId: string): void {\r\n const room = this.rooms.get(roomId)\r\n if (room) {\r\n room.componentCount--\r\n if (room.componentCount <= 0) {\r\n setTimeout(() => {\r\n const current = this.rooms.get(roomId)\r\n if (current && current.componentCount <= 0) {\r\n this.rooms.delete(roomId)\r\n }\r\n }, 5 * 60 * 1000)\r\n }\r\n }\r\n }\r\n\r\n has(roomId: string): boolean {\r\n return this.rooms.has(roomId)\r\n }\r\n\r\n delete(roomId: string): boolean {\r\n return this.rooms.delete(roomId)\r\n }\r\n\r\n getStats(): { totalRooms: number; rooms: Record<string, { componentCount: number; stateKeys: string[] }> } {\r\n const rooms: Record<string, { componentCount: number; stateKeys: string[] }> = {}\r\n for (const [roomId, info] of this.rooms) {\r\n rooms[roomId] = { componentCount: info.componentCount, stateKeys: Object.keys(info.state) }\r\n }\r\n return { totalRooms: this.rooms.size, rooms }\r\n }\r\n}\r\n\r\nexport type { RoomStateData, RoomInfo }\r\n"]}
1
+ {"version":3,"sources":["../src/rooms/RoomEventBus.ts","../src/protocol/constants.ts","../src/transport/WsSendBatcher.ts","../src/debug/LiveLogger.ts","../src/utils/deepDiff.ts","../src/rooms/RoomCodec.ts","../src/rooms/LiveRoomManager.ts","../src/auth/LiveAuthContext.ts","../src/auth/LiveAuthManager.ts","../src/security/StateSignature.ts","../src/monitoring/PerformanceMonitor.ts","../src/upload/FileUploadManager.ts","../src/connection/WebSocketConnectionManager.ts","../src/component/context.ts","../src/component/managers/ComponentStateManager.ts","../src/component/managers/ComponentMessaging.ts","../src/component/managers/ActionSecurityManager.ts","../src/component/managers/ComponentRoomProxy.ts","../src/component/LiveComponent.ts","../src/component/ComponentRegistry.ts","../src/connection/RateLimiter.ts","../src/protocol/binary.ts","../src/security/sanitize.ts","../src/rooms/LiveRoom.ts","../src/rooms/RoomRegistry.ts","../src/server/LiveServer.ts","../src/rooms/RoomStateManager.ts","../src/rooms/InMemoryRoomAdapter.ts"],"names":["EventEmitter","encoder","result","signedState","_ctx"],"mappings":"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","file":"index.js","sourcesContent":["// @fluxstack/live - Room Event Bus (Pub/Sub server-side)\r\n\r\ntype EventHandler<T = any> = (data: T) => void\r\n\r\ninterface RoomSubscription {\r\n roomType: string\r\n roomId: string\r\n event: string\r\n handler: EventHandler\r\n componentId: string\r\n}\r\n\r\nexport function createTypedRoomEventBus<TRoomEvents extends Record<string, Record<string, any>>>() {\r\n const subscriptions = new Map<string, Set<RoomSubscription>>()\r\n /** Reverse index: componentId -> Set of subscription keys for O(1) unsubscribeAll */\r\n const componentIndex = new Map<string, Set<string>>()\r\n\r\n const getKey = (roomType: string, roomId: string, event: string) =>\r\n `${roomType}:${roomId}:${event}`\r\n\r\n const getRoomKey = (roomType: string, roomId: string) =>\r\n `${roomType}:${roomId}`\r\n\r\n return {\r\n on<K extends keyof TRoomEvents, E extends keyof TRoomEvents[K]>(\r\n roomType: K,\r\n roomId: string,\r\n event: E,\r\n componentId: string,\r\n handler: EventHandler<TRoomEvents[K][E]>\r\n ): () => void {\r\n const key = getKey(roomType as string, roomId, event as string)\r\n\r\n if (!subscriptions.has(key)) {\r\n subscriptions.set(key, new Set())\r\n }\r\n\r\n const subscription: RoomSubscription = {\r\n roomType: roomType as string,\r\n roomId,\r\n event: event as string,\r\n handler,\r\n componentId\r\n }\r\n\r\n subscriptions.get(key)!.add(subscription)\r\n\r\n // Update reverse index\r\n if (!componentIndex.has(componentId)) {\r\n componentIndex.set(componentId, new Set())\r\n }\r\n componentIndex.get(componentId)!.add(key)\r\n\r\n return () => {\r\n subscriptions.get(key)?.delete(subscription)\r\n if (subscriptions.get(key)?.size === 0) {\r\n subscriptions.delete(key)\r\n }\r\n }\r\n },\r\n\r\n emit<K extends keyof TRoomEvents, E extends keyof TRoomEvents[K]>(\r\n roomType: K,\r\n roomId: string,\r\n event: E,\r\n data: TRoomEvents[K][E],\r\n excludeComponentId?: string\r\n ): number {\r\n const key = getKey(roomType as string, roomId, event as string)\r\n const subs = subscriptions.get(key)\r\n\r\n if (!subs || subs.size === 0) return 0\r\n\r\n let notified = 0\r\n for (const sub of subs) {\r\n if (excludeComponentId && sub.componentId === excludeComponentId) continue\r\n\r\n try {\r\n sub.handler(data)\r\n notified++\r\n } catch (error) {\r\n console.error(`[RoomEventBus] Error in handler [${key}]:`, error)\r\n }\r\n }\r\n\r\n return notified\r\n },\r\n\r\n unsubscribeAll(componentId: string): number {\r\n const keys = componentIndex.get(componentId)\r\n if (!keys) return 0\r\n\r\n let removed = 0\r\n\r\n for (const key of keys) {\r\n const subs = subscriptions.get(key)\r\n if (!subs) continue\r\n\r\n for (const sub of subs) {\r\n if (sub.componentId === componentId) {\r\n subs.delete(sub)\r\n removed++\r\n }\r\n }\r\n\r\n if (subs.size === 0) {\r\n subscriptions.delete(key)\r\n }\r\n }\r\n\r\n componentIndex.delete(componentId)\r\n return removed\r\n },\r\n\r\n clearRoom<K extends keyof TRoomEvents>(roomType: K, roomId: string): number {\r\n const prefix = getRoomKey(roomType as string, roomId)\r\n let removed = 0\r\n\r\n for (const key of subscriptions.keys()) {\r\n if (key.startsWith(prefix)) {\r\n const subs = subscriptions.get(key)\r\n if (subs) {\r\n // Clean reverse index for all affected components\r\n for (const sub of subs) {\r\n componentIndex.get(sub.componentId)?.delete(key)\r\n }\r\n removed += subs.size\r\n }\r\n subscriptions.delete(key)\r\n }\r\n }\r\n\r\n return removed\r\n },\r\n\r\n getStats(): { totalSubscriptions: number; rooms: Record<string, { events: Record<string, number> }> } {\r\n const rooms: Record<string, { events: Record<string, number> }> = {}\r\n let total = 0\r\n\r\n for (const [key, subs] of subscriptions) {\r\n const parts = key.split(':')\r\n const roomKey = `${parts[0]}:${parts[1]}`\r\n const event = parts[2] ?? ''\r\n\r\n if (!rooms[roomKey]) {\r\n rooms[roomKey] = { events: {} }\r\n }\r\n\r\n rooms[roomKey]!.events[event] = subs.size\r\n total += subs.size\r\n }\r\n\r\n return { totalSubscriptions: total, rooms }\r\n }\r\n }\r\n}\r\n\r\nexport class RoomEventBus {\r\n private subscriptions = new Map<string, Set<RoomSubscription>>()\r\n /** Reverse index: componentId -> Set of subscription keys for O(1) unsubscribeAll */\r\n private componentIndex = new Map<string, Set<string>>()\r\n\r\n private getKey(roomType: string, roomId: string, event: string): string {\r\n return `${roomType}:${roomId}:${event}`\r\n }\r\n\r\n on(roomType: string, roomId: string, event: string, componentId: string, handler: EventHandler): () => void {\r\n const key = this.getKey(roomType, roomId, event)\r\n\r\n if (!this.subscriptions.has(key)) {\r\n this.subscriptions.set(key, new Set())\r\n }\r\n\r\n const subscription: RoomSubscription = { roomType, roomId, event, handler, componentId }\r\n this.subscriptions.get(key)!.add(subscription)\r\n\r\n // Update reverse index\r\n if (!this.componentIndex.has(componentId)) {\r\n this.componentIndex.set(componentId, new Set())\r\n }\r\n this.componentIndex.get(componentId)!.add(key)\r\n\r\n return () => {\r\n this.subscriptions.get(key)?.delete(subscription)\r\n if (this.subscriptions.get(key)?.size === 0) {\r\n this.subscriptions.delete(key)\r\n }\r\n // Cleanup reverse index (lazy: remove key entry only in unsubscribeAll)\r\n }\r\n }\r\n\r\n emit(roomType: string, roomId: string, event: string, data: any, excludeComponentId?: string): number {\r\n const key = this.getKey(roomType, roomId, event)\r\n const subs = this.subscriptions.get(key)\r\n\r\n if (!subs || subs.size === 0) return 0\r\n\r\n let notified = 0\r\n for (const sub of subs) {\r\n if (excludeComponentId && sub.componentId === excludeComponentId) continue\r\n\r\n try {\r\n sub.handler(data)\r\n notified++\r\n } catch (error) {\r\n console.error(`[RoomEventBus] Error in handler [${key}]:`, error)\r\n }\r\n }\r\n\r\n return notified\r\n }\r\n\r\n unsubscribeAll(componentId: string): number {\r\n const keys = this.componentIndex.get(componentId)\r\n if (!keys) return 0\r\n\r\n let removed = 0\r\n\r\n for (const key of keys) {\r\n const subs = this.subscriptions.get(key)\r\n if (!subs) continue\r\n\r\n for (const sub of subs) {\r\n if (sub.componentId === componentId) {\r\n subs.delete(sub)\r\n removed++\r\n }\r\n }\r\n\r\n if (subs.size === 0) {\r\n this.subscriptions.delete(key)\r\n }\r\n }\r\n\r\n this.componentIndex.delete(componentId)\r\n return removed\r\n }\r\n\r\n clearRoom(roomType: string, roomId: string): number {\r\n const prefix = `${roomType}:${roomId}`\r\n let removed = 0\r\n\r\n for (const key of this.subscriptions.keys()) {\r\n if (key.startsWith(prefix)) {\r\n const subs = this.subscriptions.get(key)\r\n if (subs) {\r\n // Clean reverse index for all affected components\r\n for (const sub of subs) {\r\n this.componentIndex.get(sub.componentId)?.delete(key)\r\n }\r\n removed += subs.size\r\n }\r\n this.subscriptions.delete(key)\r\n }\r\n }\r\n\r\n return removed\r\n }\r\n\r\n getStats() {\r\n const rooms: Record<string, { events: Record<string, number> }> = {}\r\n let total = 0\r\n\r\n for (const [key, subs] of this.subscriptions) {\r\n const parts = key.split(':')\r\n const roomKey = `${parts[0]}:${parts[1]}`\r\n const event = parts[2] ?? ''\r\n\r\n if (!rooms[roomKey]) {\r\n rooms[roomKey] = { events: {} }\r\n }\r\n\r\n rooms[roomKey]!.events[event] = subs.size\r\n total += subs.size\r\n }\r\n\r\n return { totalSubscriptions: total, rooms }\r\n }\r\n}\r\n\r\nexport type { EventHandler, RoomSubscription }\r\n","// @fluxstack/live - Protocol Constants\r\n\r\n/** Current protocol version */\r\nexport const PROTOCOL_VERSION = 1\r\n\r\n/** Default WebSocket path */\r\nexport const DEFAULT_WS_PATH = '/api/live/ws'\r\n\r\n/** Default chunk size for file uploads (64KB) */\r\nexport const DEFAULT_CHUNK_SIZE = 64 * 1024\r\n\r\n/** Default rate limit: max tokens per connection */\r\nexport const DEFAULT_RATE_LIMIT_MAX_TOKENS = 100\r\n\r\n/** Default rate limit: tokens refilled per second */\r\nexport const DEFAULT_RATE_LIMIT_REFILL_RATE = 50\r\n\r\n/** Maximum incoming WebSocket message size (100MB) */\r\nexport const MAX_MESSAGE_SIZE = 100 * 1024 * 1024\r\n\r\n/** Maximum room state size (10MB) */\r\nexport const MAX_ROOM_STATE_SIZE = 10 * 1024 * 1024\r\n\r\n/** Maximum rooms a single connection can create/join */\r\nexport const MAX_ROOMS_PER_CONNECTION = 50\r\n\r\n/** Maximum room name length */\r\nexport const MAX_ROOM_NAME_LENGTH = 64\r\n\r\n/** Room name validation regex */\r\nexport const ROOM_NAME_REGEX = /^[a-zA-Z0-9_:.-]{1,64}$/\r\n\r\n/** Maximum outgoing message queue size per WebSocket connection (backpressure) */\r\nexport const MAX_QUEUE_SIZE = 1000\r\n\r\n/** Default nonce TTL for state signature replay protection (5 minutes) */\r\nexport const DEFAULT_NONCE_TTL = 5 * 60 * 1000\r\n","// @fluxstack/live - WebSocket Send Batcher\r\n//\r\n// Batches outgoing WebSocket messages per connection using microtask scheduling.\r\n// Instead of N individual ws.send() calls per tick, accumulates messages and\r\n// sends a single JSON array per connection at the end of the synchronous tick.\r\n//\r\n// STATE_DELTA messages for the same componentId are deduplicated (merged).\r\n//\r\n// Pre-serialized messages (from room broadcasts) bypass JSON.stringify entirely.\r\n\r\nimport type { GenericWebSocket } from './types'\r\nimport { MAX_QUEUE_SIZE } from '../protocol/constants'\r\n\r\ninterface PendingMessage {\r\n type: string\r\n componentId: string\r\n payload: any\r\n timestamp: number\r\n userId?: string\r\n room?: string\r\n [key: string]: any\r\n}\r\n\r\n// A queued item is either an object (needs serialization) or a pre-serialized string\r\ntype QueueItem = PendingMessage | string\r\n\r\n// Global per-WS message queues\r\nconst wsQueues = new WeakMap<GenericWebSocket, QueueItem[]>()\r\n// Track which WS connections have a flush scheduled\r\nconst scheduledFlushes = new WeakSet<GenericWebSocket>()\r\n// Set of WS connections that need flushing (use array since WeakSet isn't iterable)\r\nlet pendingWs: GenericWebSocket[] = []\r\nlet globalFlushScheduled = false\r\n\r\nfunction scheduleWs(ws: GenericWebSocket): void {\r\n if (!scheduledFlushes.has(ws)) {\r\n scheduledFlushes.add(ws)\r\n pendingWs.push(ws)\r\n\r\n if (!globalFlushScheduled) {\r\n globalFlushScheduled = true\r\n queueMicrotask(flushAll)\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Queue a message to be sent on the next microtask flush.\r\n * Messages are batched per-WS and sent as a JSON array.\r\n */\r\nexport function queueWsMessage(ws: GenericWebSocket, message: PendingMessage): void {\r\n if (!ws || ws.readyState !== 1) return\r\n\r\n let queue = wsQueues.get(ws)\r\n if (!queue) {\r\n queue = []\r\n wsQueues.set(ws, queue)\r\n }\r\n\r\n // Backpressure: drop oldest messages when queue is full\r\n if (queue.length >= MAX_QUEUE_SIZE) {\r\n queue.shift()\r\n }\r\n\r\n queue.push(message)\r\n scheduleWs(ws)\r\n}\r\n\r\n/**\r\n * Queue a pre-serialized JSON string to be sent on the next microtask flush.\r\n * Bypasses JSON.stringify entirely — used for room broadcasts where the same\r\n * message is sent to many connections.\r\n */\r\nexport function queuePreSerialized(ws: GenericWebSocket, serialized: string): void {\r\n if (!ws || ws.readyState !== 1) return\r\n\r\n let queue = wsQueues.get(ws)\r\n if (!queue) {\r\n queue = []\r\n wsQueues.set(ws, queue)\r\n }\r\n\r\n // Backpressure: drop oldest messages when queue is full\r\n if (queue.length >= MAX_QUEUE_SIZE) {\r\n queue.shift()\r\n }\r\n\r\n queue.push(serialized)\r\n scheduleWs(ws)\r\n}\r\n\r\n/**\r\n * Flush all pending WS queues. Called once per microtask.\r\n */\r\nfunction flushAll(): void {\r\n globalFlushScheduled = false\r\n const connections = pendingWs\r\n pendingWs = []\r\n\r\n for (const ws of connections) {\r\n scheduledFlushes.delete(ws)\r\n const queue = wsQueues.get(ws)\r\n if (!queue || queue.length === 0) continue\r\n wsQueues.set(ws, [])\r\n\r\n if (ws.readyState !== 1) continue\r\n\r\n try {\r\n if (queue.length === 1) {\r\n const item = queue[0]\r\n if (typeof item === 'string') {\r\n // Pre-serialized — send directly\r\n ws.send(item)\r\n } else {\r\n // Single object message — serialize and send\r\n ws.send(JSON.stringify(item))\r\n }\r\n } else {\r\n // Multiple items — need to build array\r\n // Separate pre-serialized strings from objects that need dedup\r\n const objects: PendingMessage[] = []\r\n const preSerialized: string[] = []\r\n\r\n for (const item of queue) {\r\n if (typeof item === 'string') {\r\n preSerialized.push(item)\r\n } else {\r\n objects.push(item)\r\n }\r\n }\r\n\r\n // Send pre-serialized messages: if only pre-serialized, wrap in array\r\n // If mixed, we need to combine them\r\n if (objects.length === 0) {\r\n // All pre-serialized — build array manually without re-parsing\r\n ws.send('[' + preSerialized.join(',') + ']')\r\n } else if (preSerialized.length === 0) {\r\n // All objects — deduplicate and serialize\r\n const deduped = deduplicateDeltas(objects)\r\n ws.send(JSON.stringify(deduped))\r\n } else {\r\n // Mixed — serialize objects, build final string directly (no intermediate arrays)\r\n const deduped = deduplicateDeltas(objects)\r\n let result = '['\r\n for (let i = 0; i < deduped.length; i++) {\r\n if (i > 0) result += ','\r\n result += JSON.stringify(deduped[i])\r\n }\r\n for (const ps of preSerialized) {\r\n result += ',' + ps\r\n }\r\n result += ']'\r\n ws.send(result)\r\n }\r\n }\r\n } catch {\r\n // Connection may have closed between queue and flush\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Merge STATE_DELTA messages for the same componentId.\r\n * Other message types are preserved as-is.\r\n */\r\nfunction deduplicateDeltas(messages: PendingMessage[]): PendingMessage[] {\r\n // Track last STATE_DELTA index per componentId for merging\r\n const deltaIndices = new Map<string, number>()\r\n const result: PendingMessage[] = []\r\n\r\n for (const msg of messages) {\r\n if (msg.type === 'STATE_DELTA' && msg.componentId && msg.payload?.delta) {\r\n const existing = deltaIndices.get(msg.componentId)\r\n if (existing !== undefined) {\r\n // Merge delta into existing message\r\n const target = result[existing]\r\n target.payload = {\r\n delta: { ...target.payload.delta, ...msg.payload.delta }\r\n }\r\n target.timestamp = msg.timestamp // use latest timestamp\r\n } else {\r\n deltaIndices.set(msg.componentId, result.length)\r\n // Clone to avoid mutating original\r\n result.push({ ...msg, payload: { delta: { ...msg.payload.delta } } })\r\n }\r\n } else {\r\n result.push(msg)\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\n/**\r\n * Send a binary message immediately (bypass batching).\r\n * Binary frames are never batched — they are self-framing.\r\n */\r\nexport function sendBinaryImmediate(ws: GenericWebSocket, data: Uint8Array): void {\r\n if (ws && ws.readyState === 1) {\r\n ws.send(data)\r\n }\r\n}\r\n\r\n/**\r\n * Send a message immediately (bypass batching).\r\n * Used for ACTION_RESPONSE and other request-response patterns\r\n * where the client is awaiting an immediate response.\r\n */\r\nexport function sendImmediate(ws: GenericWebSocket, data: string): void {\r\n if (ws && ws.readyState === 1) {\r\n ws.send(data)\r\n }\r\n}\r\n","// @fluxstack/live - Per-component logging control\r\n//\r\n// Silent by default - opt-in via static logging property.\r\n//\r\n// Usage in LiveComponent subclass:\r\n// static logging = true // all categories\r\n// static logging = ['lifecycle', 'messages'] // specific categories only\r\n// // (omit or set false -> silent)\r\n//\r\n// Categories:\r\n// lifecycle - mount, unmount, rehydration, recovery, migration\r\n// messages - received/sent WebSocket messages, file uploads\r\n// state - signing, backup, compression, encryption, validation\r\n// performance - monitoring init, alerts, optimization suggestions\r\n// rooms - room create/join/leave, emit, broadcast\r\n// websocket - connection open/close, auth\r\n//\r\n// Console output controlled by LIVE_LOGGING env var:\r\n// LIVE_LOGGING=true -> all global logs to console\r\n// LIVE_LOGGING=lifecycle,rooms -> only these categories to console\r\n// (unset or 'false') -> silent console (default)\r\n\r\nexport type LiveLogCategory = 'lifecycle' | 'messages' | 'state' | 'performance' | 'rooms' | 'websocket'\r\n\r\nexport type LiveLogConfig = boolean | readonly LiveLogCategory[]\r\n\r\n// Registry: componentId -> resolved logging config\r\nconst componentConfigs = new Map<string, LiveLogConfig>()\r\n\r\n// Parse global config from env (lazy, cached)\r\nlet globalConfigParsed = false\r\nlet globalConfig: LiveLogConfig = false\r\n\r\nfunction parseGlobalConfig(): LiveLogConfig {\r\n if (globalConfigParsed) return globalConfig\r\n globalConfigParsed = true\r\n\r\n const envValue = typeof process !== 'undefined' ? process.env?.LIVE_LOGGING : undefined\r\n if (!envValue || envValue === 'false') {\r\n globalConfig = false\r\n } else if (envValue === 'true') {\r\n globalConfig = true\r\n } else {\r\n // Comma-separated categories: \"lifecycle,rooms,messages\"\r\n globalConfig = envValue.split(',').map(s => s.trim()).filter(Boolean) as LiveLogCategory[]\r\n }\r\n return globalConfig\r\n}\r\n\r\n/**\r\n * Register a component's logging config (called on mount)\r\n */\r\nexport function registerComponentLogging(componentId: string, config: LiveLogConfig | undefined): void {\r\n if (config !== undefined && config !== false) {\r\n componentConfigs.set(componentId, config)\r\n }\r\n}\r\n\r\n/**\r\n * Unregister component logging (called on unmount/cleanup)\r\n */\r\nexport function unregisterComponentLogging(componentId: string): void {\r\n componentConfigs.delete(componentId)\r\n}\r\n\r\n/**\r\n * Check if a log should be emitted for a given component + category\r\n */\r\nfunction shouldLog(componentId: string | null, category: LiveLogCategory): boolean {\r\n if (componentId) {\r\n const config = componentConfigs.get(componentId)\r\n if (config === undefined || config === false) return false\r\n if (config === true) return true\r\n return config.includes(category)\r\n }\r\n // Global log (no specific component)\r\n const cfg = parseGlobalConfig()\r\n if (cfg === false) return false\r\n if (cfg === true) return true\r\n return cfg.includes(category)\r\n}\r\n\r\n/**\r\n * Log a message gated by the component's logging config.\r\n */\r\nexport function liveLog(category: LiveLogCategory, componentId: string | null, message: string, ...args: unknown[]): void {\r\n if (shouldLog(componentId, category)) {\r\n if (args.length > 0) {\r\n console.log(message, ...args)\r\n } else {\r\n console.log(message)\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Warn-level log gated by config.\r\n */\r\nexport function liveWarn(category: LiveLogCategory, componentId: string | null, message: string, ...args: unknown[]): void {\r\n if (shouldLog(componentId, category)) {\r\n if (args.length > 0) {\r\n console.warn(message, ...args)\r\n } else {\r\n console.warn(message)\r\n }\r\n }\r\n}\r\n","// @fluxstack/live - Deep Diff Utilities\r\n//\r\n// Shared functions for deep-diffing plain objects in state updates.\r\n// Used by ComponentStateManager (component state) and LiveRoomManager (room state).\r\n//\r\n// Both computeDeepDiff and deepAssign are safe against circular references:\r\n// they track visited objects with a Set and skip cycles.\r\n\r\nexport function isPlainObject(v: unknown): v is Record<string, unknown> {\r\n return v !== null && typeof v === 'object' && !Array.isArray(v)\r\n && Object.getPrototypeOf(v) === Object.prototype\r\n}\r\n\r\n/**\r\n * Recursively compute the diff between two plain objects.\r\n * Returns null if nothing changed, or an object with only the changed keys.\r\n * Arrays are compared by reference (===).\r\n * Safe against circular references (tracked via `seen` Set).\r\n *\r\n * @param maxDepth - Maximum recursion depth (default: 3). Beyond this, falls back to reference equality.\r\n */\r\nexport function computeDeepDiff(\r\n prev: Record<string, unknown>,\r\n next: Record<string, unknown>,\r\n depth: number = 0,\r\n maxDepth: number = 3,\r\n seen?: Set<object>,\r\n): Record<string, unknown> | null {\r\n if (depth > maxDepth) return prev === next ? null : next\r\n\r\n // Circular reference guard\r\n if (!seen) seen = new Set()\r\n if (seen.has(next)) return prev === next ? null : next\r\n seen.add(next)\r\n\r\n let result: Record<string, unknown> | null = null\r\n for (const key of Object.keys(next)) {\r\n const oldVal = prev[key]\r\n const newVal = next[key]\r\n\r\n if (oldVal === newVal) continue\r\n\r\n if (isPlainObject(oldVal) && isPlainObject(newVal)) {\r\n const nested = computeDeepDiff(oldVal, newVal, depth + 1, maxDepth, seen)\r\n if (nested !== null) {\r\n result ??= {}\r\n result[key] = nested\r\n }\r\n } else {\r\n result ??= {}\r\n result[key] = newVal\r\n }\r\n }\r\n return result\r\n}\r\n\r\n/**\r\n * Recursively merge source into target (mutates target).\r\n * Plain objects are merged recursively; everything else is overwritten.\r\n * Safe against circular references (tracked via `seen` Set).\r\n */\r\nexport function deepAssign(target: any, source: any, seen?: Set<object>): void {\r\n if (!seen) seen = new Set()\r\n if (seen.has(source)) return\r\n seen.add(source)\r\n\r\n for (const key of Object.keys(source)) {\r\n if (isPlainObject(target[key]) && isPlainObject(source[key])) {\r\n deepAssign(target[key], source[key], seen)\r\n } else {\r\n target[key] = source[key]\r\n }\r\n }\r\n}\r\n","// @fluxstack/live - Room Codec System\r\n//\r\n// Binary serialization for room messages. Built-in MessagePack codec (zero deps)\r\n// with support for custom codecs.\r\n//\r\n// Wire format for binary room frames:\r\n// [frameType:u8][compIdLen:u8][compId:utf8][roomIdLen:u8][roomId:utf8][eventLen:u16BE][event:utf8][payload]\r\n//\r\n// Frame types:\r\n// 0x01 = BINARY_STATE_DELTA (existing, component-level)\r\n// 0x02 = BINARY_ROOM_EVENT\r\n// 0x03 = BINARY_ROOM_STATE\r\n\r\n// ===== Binary Frame Constants =====\r\n\r\nexport const BINARY_STATE_DELTA = 0x01\r\nexport const BINARY_ROOM_EVENT = 0x02\r\nexport const BINARY_ROOM_STATE = 0x03\r\n\r\n// ===== Codec Interface =====\r\n\r\nexport interface RoomCodec {\r\n encode(data: unknown): Uint8Array\r\n decode(buf: Uint8Array): unknown\r\n}\r\n\r\n// ===== Built-in MessagePack Codec =====\r\n\r\n// Lightweight msgpack encoder/decoder covering:\r\n// null, boolean, int (positive fixint, negative fixint, uint8/16/32, int8/16/32),\r\n// float64, string, binary (Uint8Array), array, map (plain objects).\r\n// ~200 lines, zero external dependencies.\r\n\r\nconst encoder = new TextEncoder()\r\nconst decoder = new TextDecoder()\r\n\r\nfunction msgpackEncode(value: unknown): Uint8Array {\r\n const parts: Uint8Array[] = []\r\n encode(value, parts)\r\n // Merge parts into a single buffer\r\n let totalLen = 0\r\n for (const p of parts) totalLen += p.length\r\n const result = new Uint8Array(totalLen)\r\n let offset = 0\r\n for (const p of parts) {\r\n result.set(p, offset)\r\n offset += p.length\r\n }\r\n return result\r\n}\r\n\r\nfunction encode(value: unknown, parts: Uint8Array[]): void {\r\n if (value === null || value === undefined) {\r\n parts.push(new Uint8Array([0xc0])) // nil\r\n return\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n parts.push(new Uint8Array([value ? 0xc3 : 0xc2]))\r\n return\r\n }\r\n\r\n if (typeof value === 'number') {\r\n if (Number.isInteger(value)) {\r\n encodeInt(value, parts)\r\n } else {\r\n // float 64\r\n const buf = new Uint8Array(9)\r\n buf[0] = 0xcb\r\n new DataView(buf.buffer).setFloat64(1, value, false)\r\n parts.push(buf)\r\n }\r\n return\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const encoded = encoder.encode(value)\r\n const len = encoded.length\r\n if (len < 32) {\r\n parts.push(new Uint8Array([0xa0 | len]))\r\n } else if (len < 0x100) {\r\n parts.push(new Uint8Array([0xd9, len]))\r\n } else if (len < 0x10000) {\r\n parts.push(new Uint8Array([0xda, len >> 8, len & 0xff]))\r\n } else {\r\n parts.push(new Uint8Array([0xdb, (len >> 24) & 0xff, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff]))\r\n }\r\n parts.push(encoded)\r\n return\r\n }\r\n\r\n if (value instanceof Uint8Array) {\r\n const len = value.length\r\n if (len < 0x100) {\r\n parts.push(new Uint8Array([0xc4, len]))\r\n } else if (len < 0x10000) {\r\n parts.push(new Uint8Array([0xc5, len >> 8, len & 0xff]))\r\n } else {\r\n parts.push(new Uint8Array([0xc6, (len >> 24) & 0xff, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff]))\r\n }\r\n parts.push(value)\r\n return\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n const len = value.length\r\n if (len < 16) {\r\n parts.push(new Uint8Array([0x90 | len]))\r\n } else if (len < 0x10000) {\r\n parts.push(new Uint8Array([0xdc, len >> 8, len & 0xff]))\r\n } else {\r\n parts.push(new Uint8Array([0xdd, (len >> 24) & 0xff, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff]))\r\n }\r\n for (const item of value) {\r\n encode(item, parts)\r\n }\r\n return\r\n }\r\n\r\n if (typeof value === 'object') {\r\n const keys = Object.keys(value as Record<string, unknown>)\r\n const len = keys.length\r\n if (len < 16) {\r\n parts.push(new Uint8Array([0x80 | len]))\r\n } else if (len < 0x10000) {\r\n parts.push(new Uint8Array([0xde, len >> 8, len & 0xff]))\r\n } else {\r\n parts.push(new Uint8Array([0xdf, (len >> 24) & 0xff, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff]))\r\n }\r\n for (const key of keys) {\r\n encode(key, parts)\r\n encode((value as Record<string, unknown>)[key], parts)\r\n }\r\n return\r\n }\r\n\r\n // Fallback: encode as null\r\n parts.push(new Uint8Array([0xc0]))\r\n}\r\n\r\nfunction encodeInt(value: number, parts: Uint8Array[]): void {\r\n if (value >= 0) {\r\n if (value < 128) {\r\n parts.push(new Uint8Array([value])) // positive fixint\r\n } else if (value < 0x100) {\r\n parts.push(new Uint8Array([0xcc, value])) // uint 8\r\n } else if (value < 0x10000) {\r\n parts.push(new Uint8Array([0xcd, value >> 8, value & 0xff])) // uint 16\r\n } else if (value < 0x100000000) {\r\n parts.push(new Uint8Array([0xce, (value >> 24) & 0xff, (value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff])) // uint 32\r\n } else {\r\n // Fall back to float64 for large integers\r\n const buf = new Uint8Array(9)\r\n buf[0] = 0xcb\r\n new DataView(buf.buffer).setFloat64(1, value, false)\r\n parts.push(buf)\r\n }\r\n } else {\r\n if (value >= -32) {\r\n parts.push(new Uint8Array([value & 0xff])) // negative fixint\r\n } else if (value >= -128) {\r\n parts.push(new Uint8Array([0xd0, value & 0xff])) // int 8\r\n } else if (value >= -32768) {\r\n const buf = new Uint8Array(3)\r\n buf[0] = 0xd1\r\n new DataView(buf.buffer).setInt16(1, value, false)\r\n parts.push(buf)\r\n } else if (value >= -2147483648) {\r\n const buf = new Uint8Array(5)\r\n buf[0] = 0xd2\r\n new DataView(buf.buffer).setInt32(1, value, false)\r\n parts.push(buf)\r\n } else {\r\n // Fall back to float64\r\n const buf = new Uint8Array(9)\r\n buf[0] = 0xcb\r\n new DataView(buf.buffer).setFloat64(1, value, false)\r\n parts.push(buf)\r\n }\r\n }\r\n}\r\n\r\nfunction msgpackDecode(buf: Uint8Array): unknown {\r\n const result = decodeAt(buf, 0)\r\n return result.value\r\n}\r\n\r\nfunction decodeAt(buf: Uint8Array, offset: number): { value: unknown; offset: number } {\r\n if (offset >= buf.length) return { value: null, offset }\r\n\r\n const byte = buf[offset]\r\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\r\n\r\n // Positive fixint (0x00 - 0x7f)\r\n if (byte < 0x80) return { value: byte, offset: offset + 1 }\r\n\r\n // Fixmap (0x80 - 0x8f)\r\n if (byte >= 0x80 && byte <= 0x8f) return decodeMap(buf, offset + 1, byte & 0x0f)\r\n\r\n // Fixarray (0x90 - 0x9f)\r\n if (byte >= 0x90 && byte <= 0x9f) return decodeArray(buf, offset + 1, byte & 0x0f)\r\n\r\n // Fixstr (0xa0 - 0xbf)\r\n if (byte >= 0xa0 && byte <= 0xbf) {\r\n const len = byte & 0x1f\r\n const str = decoder.decode(buf.subarray(offset + 1, offset + 1 + len))\r\n return { value: str, offset: offset + 1 + len }\r\n }\r\n\r\n // Negative fixint (0xe0 - 0xff)\r\n if (byte >= 0xe0) return { value: byte - 256, offset: offset + 1 }\r\n\r\n switch (byte) {\r\n // nil\r\n case 0xc0: return { value: null, offset: offset + 1 }\r\n // false\r\n case 0xc2: return { value: false, offset: offset + 1 }\r\n // true\r\n case 0xc3: return { value: true, offset: offset + 1 }\r\n\r\n // bin 8\r\n case 0xc4: {\r\n const len = buf[offset + 1]\r\n return { value: buf.slice(offset + 2, offset + 2 + len), offset: offset + 2 + len }\r\n }\r\n // bin 16\r\n case 0xc5: {\r\n const len = view.getUint16(offset + 1, false)\r\n return { value: buf.slice(offset + 3, offset + 3 + len), offset: offset + 3 + len }\r\n }\r\n // bin 32\r\n case 0xc6: {\r\n const len = view.getUint32(offset + 1, false)\r\n return { value: buf.slice(offset + 5, offset + 5 + len), offset: offset + 5 + len }\r\n }\r\n\r\n // float 64\r\n case 0xcb: return { value: view.getFloat64(offset + 1, false), offset: offset + 9 }\r\n\r\n // uint 8\r\n case 0xcc: return { value: buf[offset + 1], offset: offset + 2 }\r\n // uint 16\r\n case 0xcd: return { value: view.getUint16(offset + 1, false), offset: offset + 3 }\r\n // uint 32\r\n case 0xce: return { value: view.getUint32(offset + 1, false), offset: offset + 5 }\r\n\r\n // int 8\r\n case 0xd0: return { value: view.getInt8(offset + 1), offset: offset + 2 }\r\n // int 16\r\n case 0xd1: return { value: view.getInt16(offset + 1, false), offset: offset + 3 }\r\n // int 32\r\n case 0xd2: return { value: view.getInt32(offset + 1, false), offset: offset + 5 }\r\n\r\n // str 8\r\n case 0xd9: {\r\n const len = buf[offset + 1]\r\n return { value: decoder.decode(buf.subarray(offset + 2, offset + 2 + len)), offset: offset + 2 + len }\r\n }\r\n // str 16\r\n case 0xda: {\r\n const len = view.getUint16(offset + 1, false)\r\n return { value: decoder.decode(buf.subarray(offset + 3, offset + 3 + len)), offset: offset + 3 + len }\r\n }\r\n // str 32\r\n case 0xdb: {\r\n const len = view.getUint32(offset + 1, false)\r\n return { value: decoder.decode(buf.subarray(offset + 5, offset + 5 + len)), offset: offset + 5 + len }\r\n }\r\n\r\n // array 16\r\n case 0xdc: return decodeArray(buf, offset + 3, view.getUint16(offset + 1, false))\r\n // array 32\r\n case 0xdd: return decodeArray(buf, offset + 5, view.getUint32(offset + 1, false))\r\n\r\n // map 16\r\n case 0xde: return decodeMap(buf, offset + 3, view.getUint16(offset + 1, false))\r\n // map 32\r\n case 0xdf: return decodeMap(buf, offset + 5, view.getUint32(offset + 1, false))\r\n }\r\n\r\n // Unknown type — skip\r\n return { value: null, offset: offset + 1 }\r\n}\r\n\r\nfunction decodeArray(buf: Uint8Array, offset: number, count: number): { value: unknown[]; offset: number } {\r\n const arr: unknown[] = new Array(count)\r\n for (let i = 0; i < count; i++) {\r\n const result = decodeAt(buf, offset)\r\n arr[i] = result.value\r\n offset = result.offset\r\n }\r\n return { value: arr, offset }\r\n}\r\n\r\nfunction decodeMap(buf: Uint8Array, offset: number, count: number): { value: Record<string, unknown>; offset: number } {\r\n const obj: Record<string, unknown> = {}\r\n for (let i = 0; i < count; i++) {\r\n const keyResult = decodeAt(buf, offset)\r\n offset = keyResult.offset\r\n const valResult = decodeAt(buf, offset)\r\n offset = valResult.offset\r\n obj[String(keyResult.value)] = valResult.value\r\n }\r\n return { value: obj, offset }\r\n}\r\n\r\n// ===== Exported Codec Instances =====\r\n\r\nexport const msgpackCodec: RoomCodec = {\r\n encode: msgpackEncode,\r\n decode: msgpackDecode,\r\n}\r\n\r\nexport const jsonCodec: RoomCodec = {\r\n encode(data: unknown): Uint8Array {\r\n return encoder.encode(JSON.stringify(data))\r\n },\r\n decode(buf: Uint8Array): unknown {\r\n return JSON.parse(decoder.decode(buf))\r\n },\r\n}\r\n\r\n// ===== Codec Resolution =====\r\n\r\nexport type RoomCodecOption = 'msgpack' | 'json' | RoomCodec\r\n\r\nexport function resolveCodec(option?: RoomCodecOption): RoomCodec {\r\n if (!option || option === 'msgpack') return msgpackCodec\r\n if (option === 'json') return jsonCodec\r\n return option // custom codec\r\n}\r\n\r\n// ===== Binary Frame Builders =====\r\n\r\nconst textEncoder = encoder // reuse\r\n\r\n/**\r\n * Build a binary room frame.\r\n * Format: [frameType:u8][compIdLen:u8][compId:utf8][roomIdLen:u8][roomId:utf8][eventLen:u16BE][event:utf8][payload]\r\n */\r\nexport function buildRoomFrame(\r\n frameType: number,\r\n componentId: string,\r\n roomId: string,\r\n event: string,\r\n payload: Uint8Array,\r\n): Uint8Array {\r\n const compIdBytes = textEncoder.encode(componentId)\r\n const roomIdBytes = textEncoder.encode(roomId)\r\n const eventBytes = textEncoder.encode(event)\r\n\r\n const totalLen = 1 + 1 + compIdBytes.length + 1 + roomIdBytes.length + 2 + eventBytes.length + payload.length\r\n const frame = new Uint8Array(totalLen)\r\n let offset = 0\r\n\r\n frame[offset++] = frameType\r\n frame[offset++] = compIdBytes.length\r\n frame.set(compIdBytes, offset); offset += compIdBytes.length\r\n frame[offset++] = roomIdBytes.length\r\n frame.set(roomIdBytes, offset); offset += roomIdBytes.length\r\n frame[offset++] = (eventBytes.length >> 8) & 0xff\r\n frame[offset++] = eventBytes.length & 0xff\r\n frame.set(eventBytes, offset); offset += eventBytes.length\r\n frame.set(payload, offset)\r\n\r\n return frame\r\n}\r\n\r\n/**\r\n * Build frame tail (roomId + event + payload) that is shared across all members.\r\n * Per-member: prepend [frameType:u8][compIdLen:u8][compId:utf8].\r\n */\r\nexport function buildRoomFrameTail(\r\n roomId: string,\r\n event: string,\r\n payload: Uint8Array,\r\n): Uint8Array {\r\n const roomIdBytes = textEncoder.encode(roomId)\r\n const eventBytes = textEncoder.encode(event)\r\n\r\n const tailLen = 1 + roomIdBytes.length + 2 + eventBytes.length + payload.length\r\n const tail = new Uint8Array(tailLen)\r\n let offset = 0\r\n\r\n tail[offset++] = roomIdBytes.length\r\n tail.set(roomIdBytes, offset); offset += roomIdBytes.length\r\n tail[offset++] = (eventBytes.length >> 8) & 0xff\r\n tail[offset++] = eventBytes.length & 0xff\r\n tail.set(eventBytes, offset); offset += eventBytes.length\r\n tail.set(payload, offset)\r\n\r\n return tail\r\n}\r\n\r\n/**\r\n * Prepend per-member header to a shared tail.\r\n * Header: [frameType:u8][compIdLen:u8][compId:utf8]\r\n */\r\nexport function prependMemberHeader(\r\n frameType: number,\r\n componentId: string,\r\n tail: Uint8Array,\r\n): Uint8Array {\r\n const compIdBytes = textEncoder.encode(componentId)\r\n const frame = new Uint8Array(1 + 1 + compIdBytes.length + tail.length)\r\n frame[0] = frameType\r\n frame[1] = compIdBytes.length\r\n frame.set(compIdBytes, 2)\r\n frame.set(tail, 2 + compIdBytes.length)\r\n return frame\r\n}\r\n\r\n/**\r\n * Parse a binary room frame header (client-side).\r\n * Returns parsed fields and the payload offset.\r\n */\r\nexport function parseRoomFrame(buf: Uint8Array): {\r\n frameType: number\r\n componentId: string\r\n roomId: string\r\n event: string\r\n payload: Uint8Array\r\n} | null {\r\n if (buf.length < 6) return null\r\n\r\n let offset = 0\r\n const frameType = buf[offset++]\r\n\r\n const compIdLen = buf[offset++]\r\n if (offset + compIdLen > buf.length) return null\r\n const componentId = decoder.decode(buf.subarray(offset, offset + compIdLen))\r\n offset += compIdLen\r\n\r\n const roomIdLen = buf[offset++]\r\n if (offset + roomIdLen > buf.length) return null\r\n const roomId = decoder.decode(buf.subarray(offset, offset + roomIdLen))\r\n offset += roomIdLen\r\n\r\n if (offset + 2 > buf.length) return null\r\n const eventLen = (buf[offset] << 8) | buf[offset + 1]\r\n offset += 2\r\n\r\n if (offset + eventLen > buf.length) return null\r\n const event = decoder.decode(buf.subarray(offset, offset + eventLen))\r\n offset += eventLen\r\n\r\n const payload = buf.subarray(offset)\r\n\r\n return { frameType, componentId, roomId, event, payload }\r\n}\r\n","// @fluxstack/live - Live Room Manager\r\n//\r\n// Manages rooms for Live Components. Uses RoomEventBus for server-side pub/sub.\r\n\r\nimport type { RoomEventBus } from './RoomEventBus'\r\nimport type { GenericWebSocket } from '../transport/types'\r\nimport { queueWsMessage, queuePreSerialized, sendBinaryImmediate } from '../transport/WsSendBatcher'\r\nimport { liveLog } from '../debug/LiveLogger'\r\nimport { MAX_ROOM_STATE_SIZE, ROOM_NAME_REGEX } from '../protocol/constants'\r\nimport type { IRoomPubSubAdapter } from './adapters'\r\nimport { computeDeepDiff, deepAssign } from '../utils/deepDiff'\r\nimport type { LiveRoom } from './LiveRoom'\r\nimport type { RoomRegistry } from './RoomRegistry'\r\nimport {\r\n resolveCodec,\r\n buildRoomFrameTail,\r\n prependMemberHeader,\r\n BINARY_ROOM_EVENT,\r\n BINARY_ROOM_STATE,\r\n type RoomCodec,\r\n} from './RoomCodec'\r\n\r\nexport interface RoomMessage {\r\n type: 'ROOM_JOIN' | 'ROOM_LEAVE' | 'ROOM_EMIT' | 'ROOM_STATE_SET' | 'ROOM_STATE_GET'\r\n componentId: string\r\n roomId: string\r\n event?: string\r\n data?: any\r\n requestId?: string\r\n timestamp: number\r\n}\r\n\r\ninterface RoomMember {\r\n componentId: string\r\n ws: GenericWebSocket\r\n joinedAt: number\r\n}\r\n\r\ninterface Room<TState = any> {\r\n id: string\r\n state: TState\r\n members: Map<string, RoomMember>\r\n createdAt: number\r\n lastActivity: number\r\n /** Estimated serialized state size in bytes (for size limit checks) */\r\n stateSize?: number\r\n /** Whether deep diff is enabled for this room's state. Default: true */\r\n deepDiff: boolean\r\n /** Max recursion depth for deep diff. Default: 3 */\r\n deepDiffDepth: number\r\n /** When true, only server-side code can set room state. Client ROOM_STATE_SET is rejected. Default: false */\r\n serverOnlyState: boolean\r\n /** LiveRoom instance when backed by a typed room class */\r\n instance?: LiveRoom<any, any, any>\r\n /** Resolved binary codec for this room. null = JSON text mode (legacy rooms). */\r\n codec: RoomCodec | null\r\n}\r\n\r\nexport class LiveRoomManager {\r\n private rooms = new Map<string, Room>()\r\n private componentRooms = new Map<string, Set<string>>() // componentId -> roomIds\r\n\r\n /** Room registry for LiveRoom class lookup. Set by LiveServer. */\r\n public roomRegistry?: RoomRegistry\r\n\r\n /**\r\n * @param roomEvents - Local server-side event bus\r\n * @param pubsub - Optional cross-instance pub/sub adapter (e.g. Redis).\r\n * When provided, room events/state/membership are propagated\r\n * to other server instances in the background.\r\n */\r\n constructor(\r\n private roomEvents: RoomEventBus,\r\n private pubsub?: IRoomPubSubAdapter,\r\n ) {}\r\n\r\n /**\r\n * Component joins a room.\r\n * @param options.deepDiff - Enable/disable deep diff for this room's state. Default: true\r\n * @param joinContext - Optional context for LiveRoom lifecycle hooks (userId, payload)\r\n */\r\n joinRoom<TState = any>(\r\n componentId: string,\r\n roomId: string,\r\n ws: GenericWebSocket,\r\n initialState?: TState,\r\n options?: { deepDiff?: boolean; deepDiffDepth?: number; serverOnlyState?: boolean },\r\n joinContext?: { userId?: string; payload?: any },\r\n ): { state: TState; rejected?: false } | { rejected: true; reason: string } {\r\n // Validate room name format (uses pre-compiled regex from constants)\r\n if (!roomId || !ROOM_NAME_REGEX.test(roomId)) {\r\n throw new Error('Invalid room name. Must be 1-64 alphanumeric characters, hyphens, underscores, dots, or colons.')\r\n }\r\n\r\n const now = Date.now()\r\n\r\n // Create room if it doesn't exist\r\n let room = this.rooms.get(roomId)\r\n let isNewRoom = false\r\n\r\n if (!room) {\r\n isNewRoom = true\r\n\r\n // Check if a LiveRoom class is registered for this room type\r\n const roomClass = this.roomRegistry?.resolveFromId(roomId)\r\n\r\n if (roomClass) {\r\n const instance = new roomClass(roomId, this as any)\r\n const opts = roomClass.$options ?? {}\r\n\r\n room = {\r\n id: roomId,\r\n state: instance.state,\r\n members: new Map(),\r\n createdAt: now,\r\n lastActivity: now,\r\n deepDiff: opts.deepDiff ?? true,\r\n deepDiffDepth: opts.deepDiffDepth ?? 3,\r\n serverOnlyState: true, // LiveRoom-backed rooms are always server-only\r\n instance,\r\n codec: resolveCodec(opts.codec),\r\n }\r\n } else {\r\n // Legacy untyped room — no binary codec (JSON text mode)\r\n room = {\r\n id: roomId,\r\n state: (initialState || {}) as TState,\r\n members: new Map(),\r\n createdAt: now,\r\n lastActivity: now,\r\n deepDiff: options?.deepDiff ?? true,\r\n deepDiffDepth: options?.deepDiffDepth ?? 3,\r\n serverOnlyState: options?.serverOnlyState ?? false,\r\n codec: null,\r\n }\r\n }\r\n\r\n this.rooms.set(roomId, room)\r\n liveLog('rooms', componentId, `Room '${roomId}' created`)\r\n }\r\n\r\n // Check maxMembers limit for LiveRoom-backed rooms\r\n if (room.instance) {\r\n const ctor = room.instance.constructor as typeof LiveRoom & { $options?: { maxMembers?: number } }\r\n const maxMembers = ctor.$options?.maxMembers\r\n if (maxMembers && room.members.size >= maxMembers) {\r\n return { rejected: true, reason: 'Room is full' }\r\n }\r\n }\r\n\r\n // Call onJoin lifecycle hook for LiveRoom-backed rooms\r\n if (room.instance) {\r\n const result = room.instance.onJoin({\r\n componentId,\r\n userId: joinContext?.userId,\r\n payload: joinContext?.payload,\r\n })\r\n\r\n // Handle sync rejection\r\n if (result === false) {\r\n // If this was a new room and join was rejected, clean up\r\n if (isNewRoom) {\r\n this.rooms.delete(roomId)\r\n }\r\n return { rejected: true, reason: 'Join rejected by room' }\r\n }\r\n\r\n // Note: async onJoin is also supported but result is checked synchronously here.\r\n // For async validation, use await in the component action before calling join.\r\n }\r\n\r\n // Call onCreate for new LiveRoom instances (after onJoin succeeds)\r\n if (isNewRoom && room.instance) {\r\n room.instance.onCreate()\r\n }\r\n\r\n // Add member\r\n room.members.set(componentId, {\r\n componentId,\r\n ws,\r\n joinedAt: now\r\n })\r\n room.lastActivity = now\r\n\r\n // Track component rooms\r\n let compRooms = this.componentRooms.get(componentId)\r\n if (!compRooms) {\r\n compRooms = new Set()\r\n this.componentRooms.set(componentId, compRooms)\r\n }\r\n compRooms.add(roomId)\r\n\r\n const memberCount = room.members.size\r\n liveLog('rooms', componentId, `Component '${componentId}' joined room '${roomId}' (${memberCount} members)`)\r\n\r\n // Notify other members\r\n this.broadcastToRoom(roomId, {\r\n type: 'ROOM_SYSTEM',\r\n componentId,\r\n roomId,\r\n event: '$sub:join',\r\n data: {\r\n subscriberId: componentId,\r\n count: memberCount\r\n },\r\n timestamp: now\r\n }, componentId)\r\n\r\n // Propagate to other instances (fire-and-forget)\r\n this.pubsub?.publishMembership(roomId, 'join', componentId)?.catch(() => {})\r\n\r\n return { state: room.state }\r\n }\r\n\r\n /**\r\n * Component leaves a room\r\n * @param leaveReason - Why the component is leaving. Default: 'leave'\r\n */\r\n leaveRoom(componentId: string, roomId: string, leaveReason: 'leave' | 'disconnect' | 'cleanup' = 'leave'): void {\r\n const room = this.rooms.get(roomId)\r\n if (!room) return\r\n\r\n // Call onLeave lifecycle hook for LiveRoom-backed rooms\r\n if (room.instance) {\r\n room.instance.onLeave({\r\n componentId,\r\n reason: leaveReason,\r\n })\r\n }\r\n\r\n room.members.delete(componentId)\r\n\r\n const now = Date.now()\r\n room.lastActivity = now\r\n\r\n this.componentRooms.get(componentId)?.delete(roomId)\r\n\r\n const memberCount = room.members.size\r\n liveLog('rooms', componentId, `Component '${componentId}' left room '${roomId}' (${memberCount} members)`)\r\n\r\n // Notify other members\r\n this.broadcastToRoom(roomId, {\r\n type: 'ROOM_SYSTEM',\r\n componentId,\r\n roomId,\r\n event: '$sub:leave',\r\n data: {\r\n subscriberId: componentId,\r\n count: memberCount\r\n },\r\n timestamp: now\r\n })\r\n\r\n // Propagate to other instances (fire-and-forget)\r\n this.pubsub?.publishMembership(roomId, 'leave', componentId)?.catch(() => {})\r\n\r\n // Cleanup empty room after delay\r\n if (memberCount === 0) {\r\n setTimeout(() => {\r\n const currentRoom = this.rooms.get(roomId)\r\n if (currentRoom && currentRoom.members.size === 0) {\r\n // Call onDestroy for LiveRoom-backed rooms\r\n if (currentRoom.instance) {\r\n const result = currentRoom.instance.onDestroy()\r\n if (result === false) return // Room wants to stay alive\r\n }\r\n this.rooms.delete(roomId)\r\n liveLog('rooms', null, `Room '${roomId}' destroyed (empty)`)\r\n }\r\n }, 5 * 60 * 1000)\r\n }\r\n }\r\n\r\n /**\r\n * Component disconnects - leave all rooms.\r\n * Batches removals: calls onLeave hooks, removes member from all rooms,\r\n * then sends leave notifications in bulk.\r\n */\r\n cleanupComponent(componentId: string): void {\r\n const roomIds = this.componentRooms.get(componentId)\r\n if (!roomIds || roomIds.size === 0) return\r\n\r\n const now = Date.now()\r\n const notifications: { roomId: string; count: number }[] = []\r\n\r\n // Phase 1: Call onLeave hooks + remove member from all rooms (no broadcasts yet)\r\n for (const roomId of roomIds) {\r\n const room = this.rooms.get(roomId)\r\n if (!room) continue\r\n\r\n // Call onLeave lifecycle hook for LiveRoom-backed rooms\r\n if (room.instance) {\r\n room.instance.onLeave({\r\n componentId,\r\n reason: 'disconnect',\r\n })\r\n }\r\n\r\n room.members.delete(componentId)\r\n room.lastActivity = now\r\n const memberCount = room.members.size\r\n\r\n // Collect notification data\r\n if (memberCount > 0) {\r\n notifications.push({ roomId, count: memberCount })\r\n } else {\r\n // Schedule empty room cleanup\r\n setTimeout(() => {\r\n const currentRoom = this.rooms.get(roomId)\r\n if (currentRoom && currentRoom.members.size === 0) {\r\n // Call onDestroy for LiveRoom-backed rooms\r\n if (currentRoom.instance) {\r\n const result = currentRoom.instance.onDestroy()\r\n if (result === false) return // Room wants to stay alive\r\n }\r\n this.rooms.delete(roomId)\r\n liveLog('rooms', null, `Room '${roomId}' destroyed (empty)`)\r\n }\r\n }, 5 * 60 * 1000)\r\n }\r\n }\r\n\r\n // Phase 2: Send leave notifications in batch\r\n for (const { roomId, count } of notifications) {\r\n this.broadcastToRoom(roomId, {\r\n type: 'ROOM_SYSTEM',\r\n componentId,\r\n roomId,\r\n event: '$sub:leave',\r\n data: {\r\n subscriberId: componentId,\r\n count\r\n },\r\n timestamp: now\r\n })\r\n }\r\n\r\n this.componentRooms.delete(componentId)\r\n }\r\n\r\n /**\r\n * Emit event to all members in a room.\r\n * For LiveRoom-backed rooms, calls onEvent() hook before broadcasting.\r\n */\r\n emitToRoom(roomId: string, event: string, data: any, excludeComponentId?: string): number {\r\n const room = this.rooms.get(roomId)\r\n if (!room) return 0\r\n\r\n const now = Date.now()\r\n room.lastActivity = now\r\n\r\n // 0. Call onEvent lifecycle hook for LiveRoom-backed rooms\r\n if (room.instance) {\r\n room.instance.onEvent(event, data, {\r\n componentId: excludeComponentId ?? '',\r\n })\r\n }\r\n\r\n // 1. Emit on RoomEventBus for server-side handlers\r\n this.roomEvents.emit('room', roomId, event, data, excludeComponentId)\r\n\r\n // 2. Propagate to other instances (fire-and-forget)\r\n this.pubsub?.publish(roomId, event, data)?.catch(() => {})\r\n\r\n // 3. Broadcast via WebSocket to frontends\r\n return this.broadcastToRoom(roomId, {\r\n type: 'ROOM_EVENT',\r\n componentId: '',\r\n roomId,\r\n event,\r\n data,\r\n timestamp: now\r\n }, excludeComponentId)\r\n }\r\n\r\n /**\r\n * Update room state.\r\n * When deepDiff is enabled (default), deep-diffs plain objects to send only changed fields.\r\n * When disabled, uses shallow diff (reference equality) like classic behavior.\r\n */\r\n setRoomState(roomId: string, updates: any, excludeComponentId?: string): void {\r\n const room = this.rooms.get(roomId)\r\n if (!room) return\r\n\r\n let actualChanges: Record<string, unknown>\r\n\r\n if (room.deepDiff) {\r\n // Deep diff: only send fields that actually changed\r\n const diff = computeDeepDiff(\r\n room.state as Record<string, unknown>,\r\n updates as Record<string, unknown>,\r\n 0,\r\n room.deepDiffDepth,\r\n )\r\n if (diff === null) return // nothing changed\r\n actualChanges = diff\r\n\r\n // Mutate in-place with recursive merge\r\n deepAssign(room.state, actualChanges)\r\n } else {\r\n // Shallow diff: reference equality\r\n actualChanges = {}\r\n let hasChanges = false\r\n for (const key of Object.keys(updates)) {\r\n if (room.state[key] !== updates[key]) {\r\n actualChanges[key] = updates[key]\r\n hasChanges = true\r\n }\r\n }\r\n if (!hasChanges) return\r\n\r\n Object.assign(room.state, actualChanges)\r\n }\r\n\r\n // Size check: estimate via update delta instead of full state re-serialization.\r\n if (room.stateSize === undefined) {\r\n const fullJson = JSON.stringify(room.state)\r\n room.stateSize = fullJson.length\r\n if (room.stateSize > MAX_ROOM_STATE_SIZE) {\r\n throw new Error('Room state exceeds maximum size limit')\r\n }\r\n } else {\r\n const deltaSize = JSON.stringify(actualChanges).length\r\n room.stateSize += deltaSize\r\n if (room.stateSize > MAX_ROOM_STATE_SIZE) {\r\n // Re-check precisely if we're near the limit\r\n const precise = JSON.stringify(room.state).length\r\n room.stateSize = precise\r\n if (precise > MAX_ROOM_STATE_SIZE) {\r\n throw new Error('Room state exceeds maximum size limit')\r\n }\r\n }\r\n }\r\n\r\n const now = Date.now()\r\n room.lastActivity = now\r\n\r\n // Propagate state change to other instances (fire-and-forget)\r\n this.pubsub?.publishStateChange(roomId, actualChanges)?.catch(() => {})\r\n\r\n this.broadcastToRoom(roomId, {\r\n type: 'ROOM_STATE',\r\n componentId: '',\r\n roomId,\r\n event: '$state:update',\r\n data: { state: actualChanges },\r\n timestamp: now\r\n }, excludeComponentId)\r\n }\r\n\r\n /**\r\n * Get room state\r\n */\r\n getRoomState<TState = any>(roomId: string): TState {\r\n return (this.rooms.get(roomId)?.state || {}) as TState\r\n }\r\n\r\n /**\r\n * Broadcast to all members in a room.\r\n *\r\n * When the room has a binary codec (LiveRoom-backed), builds a binary frame\r\n * once (encode payload + frame tail), then prepends per-member componentId header.\r\n *\r\n * When no codec (legacy rooms), uses JSON with serialize-once optimization:\r\n * builds the JSON string template once, then inserts each member's componentId.\r\n */\r\n private broadcastToRoom(roomId: string, message: any, excludeComponentId?: string): number {\r\n const room = this.rooms.get(roomId)\r\n if (!room || room.members.size === 0) return 0\r\n\r\n let sent = 0\r\n\r\n if (room.codec) {\r\n // Binary path: encode payload once, build shared tail, prepend per-member header\r\n const frameType = message.type === 'ROOM_EVENT' || message.type === 'ROOM_SYSTEM'\r\n ? BINARY_ROOM_EVENT\r\n : BINARY_ROOM_STATE\r\n const event = message.event ?? ''\r\n const payload = room.codec.encode(message.data)\r\n const tail = buildRoomFrameTail(roomId, event, payload)\r\n\r\n for (const [memberComponentId, member] of room.members) {\r\n if (memberComponentId === excludeComponentId) continue\r\n if (member.ws.readyState !== 1) continue\r\n const frame = prependMemberHeader(frameType, memberComponentId, tail)\r\n sendBinaryImmediate(member.ws, frame)\r\n sent++\r\n }\r\n } else {\r\n // JSON text path: serialize once without componentId, then splice per member\r\n // Build template: {\"type\":\"...\",\"componentId\":\"\",\"roomId\":\"...\",\"event\":\"...\",\"data\":...,\"timestamp\":...}\r\n const { componentId: _, ...rest } = message\r\n const jsonBody = JSON.stringify(rest)\r\n // Insert componentId field after the opening brace\r\n // Template: '{\"componentId\":\"<PLACEHOLDER>\",...rest}'\r\n const prefix = '{\"componentId\":\"'\r\n const suffix = '\",' + jsonBody.slice(1) // skip the opening brace of rest\r\n\r\n for (const [memberComponentId, member] of room.members) {\r\n if (memberComponentId === excludeComponentId) continue\r\n if (member.ws.readyState !== 1) continue\r\n queuePreSerialized(member.ws, prefix + memberComponentId + suffix)\r\n sent++\r\n }\r\n }\r\n\r\n return sent\r\n }\r\n\r\n /**\r\n * Check if component is in a room\r\n */\r\n isInRoom(componentId: string, roomId: string): boolean {\r\n return this.rooms.get(roomId)?.members.has(componentId) ?? false\r\n }\r\n\r\n /**\r\n * Check if room state is server-only (no client writes)\r\n */\r\n isServerOnlyState(roomId: string): boolean {\r\n return this.rooms.get(roomId)?.serverOnlyState ?? false\r\n }\r\n\r\n /**\r\n * Get rooms for a component\r\n */\r\n getComponentRooms(componentId: string): string[] {\r\n return Array.from(this.componentRooms.get(componentId) || [])\r\n }\r\n\r\n /**\r\n * Get member count for a room\r\n */\r\n getMemberCount(roomId: string): number {\r\n return this.rooms.get(roomId)?.members.size ?? 0\r\n }\r\n\r\n /**\r\n * Get the LiveRoom instance for a room (if backed by a typed room class).\r\n * Used by ComponentRoomProxy to expose custom methods.\r\n */\r\n getRoomInstance(roomId: string): LiveRoom<any, any, any> | undefined {\r\n return this.rooms.get(roomId)?.instance\r\n }\r\n\r\n /**\r\n * Get statistics\r\n */\r\n getStats(): {\r\n totalRooms: number\r\n rooms: Record<string, { members: number; createdAt: number; lastActivity: number }>\r\n } {\r\n const rooms: Record<string, { members: number; createdAt: number; lastActivity: number }> = {}\r\n\r\n for (const [id, room] of this.rooms) {\r\n rooms[id] = {\r\n members: room.members.size,\r\n createdAt: room.createdAt,\r\n lastActivity: room.lastActivity\r\n }\r\n }\r\n\r\n return {\r\n totalRooms: this.rooms.size,\r\n rooms\r\n }\r\n }\r\n}\r\n\r\nexport type { Room, RoomMember }\r\n","// @fluxstack/live - Auth Context Implementation\r\n\r\nimport type { LiveAuthContext, LiveAuthUser } from './types'\r\n\r\n/**\r\n * Auth context for authenticated users.\r\n * Provides type-safe helpers for role and permission checks.\r\n *\r\n * Used internally by the framework - devs access via this.$auth in LiveComponent.\r\n */\r\nexport class AuthenticatedContext implements LiveAuthContext {\r\n readonly authenticated = true\r\n readonly user: LiveAuthUser\r\n readonly token?: string\r\n readonly authenticatedAt: number\r\n\r\n constructor(user: LiveAuthUser, token?: string) {\r\n this.user = user\r\n this.token = token\r\n this.authenticatedAt = Date.now()\r\n }\r\n\r\n hasRole(role: string): boolean {\r\n return this.user.roles?.includes(role) ?? false\r\n }\r\n\r\n hasAnyRole(roles: string[]): boolean {\r\n if (!this.user.roles?.length) return false\r\n return roles.some(role => this.user.roles!.includes(role))\r\n }\r\n\r\n hasAllRoles(roles: string[]): boolean {\r\n if (!this.user.roles?.length) return roles.length === 0\r\n return roles.every(role => this.user.roles!.includes(role))\r\n }\r\n\r\n hasPermission(permission: string): boolean {\r\n return this.user.permissions?.includes(permission) ?? false\r\n }\r\n\r\n hasAllPermissions(permissions: string[]): boolean {\r\n if (!this.user.permissions?.length) return permissions.length === 0\r\n return permissions.every(perm => this.user.permissions!.includes(perm))\r\n }\r\n\r\n hasAnyPermission(permissions: string[]): boolean {\r\n if (!this.user.permissions?.length) return false\r\n return permissions.some(perm => this.user.permissions!.includes(perm))\r\n }\r\n}\r\n\r\n/**\r\n * Context for unauthenticated users (guest).\r\n * Returned when no credentials are provided or when auth fails.\r\n */\r\nexport class AnonymousContext implements LiveAuthContext {\r\n readonly authenticated = false\r\n readonly user = undefined\r\n readonly token = undefined\r\n readonly authenticatedAt = undefined\r\n\r\n hasRole(): boolean { return false }\r\n hasAnyRole(): boolean { return false }\r\n hasAllRoles(): boolean { return false }\r\n hasPermission(): boolean { return false }\r\n hasAllPermissions(): boolean { return false }\r\n hasAnyPermission(): boolean { return false }\r\n}\r\n\r\n/** Singleton for anonymous contexts */\r\nexport const ANONYMOUS_CONTEXT = new AnonymousContext()\r\n","// @fluxstack/live - Auth Manager\r\n//\r\n// Manages auth providers and executes auth checks.\r\n\r\nimport type {\r\n LiveAuthProvider,\r\n LiveAuthCredentials,\r\n LiveAuthContext,\r\n LiveComponentAuth,\r\n LiveActionAuth,\r\n LiveAuthResult,\r\n} from './types'\r\nimport { ANONYMOUS_CONTEXT } from './LiveAuthContext'\r\n\r\nexport class LiveAuthManager {\r\n private providers = new Map<string, LiveAuthProvider>()\r\n private defaultProviderName?: string\r\n\r\n /**\r\n * Register an auth provider.\r\n */\r\n register(provider: LiveAuthProvider): void {\r\n this.providers.set(provider.name, provider)\r\n\r\n if (!this.defaultProviderName) {\r\n this.defaultProviderName = provider.name\r\n }\r\n\r\n console.log(`[Auth] Provider registered: ${provider.name}`)\r\n }\r\n\r\n /**\r\n * Remove an auth provider.\r\n */\r\n unregister(name: string): void {\r\n this.providers.delete(name)\r\n if (this.defaultProviderName === name) {\r\n this.defaultProviderName = this.providers.keys().next().value\r\n }\r\n }\r\n\r\n /**\r\n * Set the default auth provider.\r\n */\r\n setDefault(name: string): void {\r\n if (!this.providers.has(name)) {\r\n throw new Error(`Auth provider '${name}' not registered`)\r\n }\r\n this.defaultProviderName = name\r\n }\r\n\r\n /**\r\n * Returns true if at least one provider is registered.\r\n */\r\n hasProviders(): boolean {\r\n return this.providers.size > 0\r\n }\r\n\r\n /**\r\n * Returns the default provider or undefined.\r\n */\r\n getDefaultProvider(): LiveAuthProvider | undefined {\r\n if (!this.defaultProviderName) return undefined\r\n return this.providers.get(this.defaultProviderName)\r\n }\r\n\r\n /**\r\n * Authenticate credentials using the specified provider, or try all providers.\r\n * Returns ANONYMOUS_CONTEXT if no credentials or no providers.\r\n */\r\n async authenticate(\r\n credentials: LiveAuthCredentials,\r\n providerName?: string\r\n ): Promise<LiveAuthContext> {\r\n if (!credentials || Object.keys(credentials).every(k => !credentials[k])) {\r\n return ANONYMOUS_CONTEXT\r\n }\r\n\r\n if (this.providers.size === 0) {\r\n return ANONYMOUS_CONTEXT\r\n }\r\n\r\n if (providerName) {\r\n const provider = this.providers.get(providerName)\r\n if (!provider) {\r\n console.warn(`[Auth] Provider '${providerName}' not found`)\r\n return ANONYMOUS_CONTEXT\r\n }\r\n try {\r\n const context = await provider.authenticate(credentials)\r\n return context || ANONYMOUS_CONTEXT\r\n } catch (error: any) {\r\n console.error(`[Auth] Failed via '${providerName}':`, error.message)\r\n return ANONYMOUS_CONTEXT\r\n }\r\n }\r\n\r\n // Try all providers (default first)\r\n const providersToTry: LiveAuthProvider[] = []\r\n\r\n if (this.defaultProviderName) {\r\n const defaultProvider = this.providers.get(this.defaultProviderName)\r\n if (defaultProvider) providersToTry.push(defaultProvider)\r\n }\r\n\r\n for (const [name, provider] of this.providers) {\r\n if (name !== this.defaultProviderName) {\r\n providersToTry.push(provider)\r\n }\r\n }\r\n\r\n const errors: Array<{ provider: string; error: Error }> = []\r\n\r\n for (const provider of providersToTry) {\r\n try {\r\n const context = await provider.authenticate(credentials)\r\n if (context && context.authenticated) {\r\n return context\r\n }\r\n } catch (error: any) {\r\n console.warn(`[Auth] Provider '${provider.name}' threw during authentication:`, error.message)\r\n errors.push({ provider: provider.name, error })\r\n }\r\n }\r\n\r\n if (errors.length > 0) {\r\n console.warn(`[Auth] All ${providersToTry.length} provider(s) failed. Errors: ${errors.map(e => `${e.provider}: ${e.error.message}`).join('; ')}`)\r\n }\r\n\r\n return ANONYMOUS_CONTEXT\r\n }\r\n\r\n /**\r\n * Verify auth context meets component requirements.\r\n */\r\n authorizeComponent(\r\n authContext: LiveAuthContext,\r\n authConfig: LiveComponentAuth | undefined\r\n ): LiveAuthResult {\r\n if (!authConfig) {\r\n return { allowed: true }\r\n }\r\n\r\n if (authConfig.required && !authContext.authenticated) {\r\n return { allowed: false, reason: 'Authentication required' }\r\n }\r\n\r\n if (authConfig.roles?.length) {\r\n if (!authContext.authenticated) {\r\n return { allowed: false, reason: `Authentication required. Roles needed: ${authConfig.roles.join(', ')}` }\r\n }\r\n if (!authContext.hasAnyRole(authConfig.roles)) {\r\n return { allowed: false, reason: `Insufficient roles. Required one of: ${authConfig.roles.join(', ')}` }\r\n }\r\n }\r\n\r\n if (authConfig.permissions?.length) {\r\n if (!authContext.authenticated) {\r\n return { allowed: false, reason: `Authentication required. Permissions needed: ${authConfig.permissions.join(', ')}` }\r\n }\r\n if (!authContext.hasAllPermissions(authConfig.permissions)) {\r\n return { allowed: false, reason: `Insufficient permissions. Required all: ${authConfig.permissions.join(', ')}` }\r\n }\r\n }\r\n\r\n return { allowed: true }\r\n }\r\n\r\n /**\r\n * Verify auth context allows executing a specific action.\r\n */\r\n async authorizeAction(\r\n authContext: LiveAuthContext,\r\n componentName: string,\r\n action: string,\r\n actionAuth: LiveActionAuth | undefined,\r\n providerName?: string\r\n ): Promise<LiveAuthResult> {\r\n if (!actionAuth) {\r\n return { allowed: true }\r\n }\r\n\r\n if (actionAuth.roles?.length) {\r\n if (!authContext.authenticated) {\r\n return { allowed: false, reason: `Authentication required for action '${action}'` }\r\n }\r\n if (!authContext.hasAnyRole(actionAuth.roles)) {\r\n return { allowed: false, reason: `Insufficient roles for action '${action}'. Required one of: ${actionAuth.roles.join(', ')}` }\r\n }\r\n }\r\n\r\n if (actionAuth.permissions?.length) {\r\n if (!authContext.authenticated) {\r\n return { allowed: false, reason: `Authentication required for action '${action}'` }\r\n }\r\n if (!authContext.hasAllPermissions(actionAuth.permissions)) {\r\n return { allowed: false, reason: `Insufficient permissions for action '${action}'. Required all: ${actionAuth.permissions.join(', ')}` }\r\n }\r\n }\r\n\r\n const name = providerName || this.defaultProviderName\r\n if (name) {\r\n const provider = this.providers.get(name)\r\n if (provider?.authorizeAction) {\r\n const allowed = await provider.authorizeAction(authContext, componentName, action)\r\n if (!allowed) {\r\n return { allowed: false, reason: `Action '${action}' denied by auth provider '${name}'` }\r\n }\r\n }\r\n }\r\n\r\n return { allowed: true }\r\n }\r\n\r\n /**\r\n * Verify auth context allows joining a room.\r\n */\r\n async authorizeRoom(\r\n authContext: LiveAuthContext,\r\n roomId: string,\r\n providerName?: string\r\n ): Promise<LiveAuthResult> {\r\n const name = providerName || this.defaultProviderName\r\n if (!name) return { allowed: true }\r\n\r\n const provider = this.providers.get(name)\r\n if (!provider?.authorizeRoom) return { allowed: true }\r\n\r\n try {\r\n const allowed = await provider.authorizeRoom(authContext, roomId)\r\n if (!allowed) {\r\n return { allowed: false, reason: `Access to room '${roomId}' denied by auth provider '${name}'` }\r\n }\r\n return { allowed: true }\r\n } catch (error: any) {\r\n return { allowed: false, reason: `Room authorization error: ${error.message}` }\r\n }\r\n }\r\n\r\n /**\r\n * Get info about registered providers.\r\n */\r\n getInfo(): { providers: string[]; defaultProvider?: string } {\r\n return {\r\n providers: Array.from(this.providers.keys()),\r\n defaultProvider: this.defaultProviderName,\r\n }\r\n }\r\n}\r\n","// @fluxstack/live - State Signature (HMAC-SHA256)\r\n//\r\n// Cryptographic state signing for secure client-side persistence.\r\n// Supports: key rotation, compression (gzip), encryption (AES-256-CBC),\r\n// hybrid anti-replay nonces (stateless HMAC + replay detection), state backups, and state migrations.\r\n\r\nimport { createHmac, createCipheriv, createDecipheriv, randomBytes, scryptSync } from 'crypto'\r\nimport { gzipSync, gunzipSync } from 'zlib'\r\nimport { liveLog, liveWarn } from '../debug/LiveLogger'\r\n\r\nexport interface SignedState {\r\n data: string\r\n signature: string\r\n timestamp: number\r\n version: number\r\n componentId: string\r\n nonce?: string\r\n compressed?: boolean\r\n encrypted?: boolean\r\n}\r\n\r\nexport interface StateSignatureConfig {\r\n /** HMAC secret for signing. Defaults to env LIVE_STATE_SECRET or a random key. */\r\n secret?: string\r\n /** Enable key rotation */\r\n rotationEnabled?: boolean\r\n /** Key rotation interval in ms */\r\n rotationInterval?: number\r\n /** Enable compression */\r\n compressionEnabled?: boolean\r\n /** Enable encryption */\r\n encryptionEnabled?: boolean\r\n /** Enable anti-replay nonces (hybrid: stateless HMAC + replay detection) */\r\n nonceEnabled?: boolean\r\n /** Maximum state age in ms. Default: 1800000 (30 minutes) */\r\n maxStateAge?: number\r\n /** Enable state backups */\r\n backupEnabled?: boolean\r\n /** Max state backups to keep */\r\n maxBackups?: number\r\n /** Nonce TTL in ms. Nonces older than this are rejected. Default: 10000 (10 seconds) */\r\n nonceTTL?: number\r\n}\r\n\r\ninterface StateBackup {\r\n signedState: SignedState\r\n backedUpAt: number\r\n}\r\n\r\nexport class StateSignatureManager {\r\n private secret: Buffer\r\n private previousSecrets: Buffer[] = []\r\n private rotationTimer?: ReturnType<typeof setInterval>\r\n private stateBackups = new Map<string, StateBackup[]>()\r\n private config: Required<StateSignatureConfig>\r\n private encryptionSalt: Buffer\r\n private cachedEncryptionKey: Buffer | null = null\r\n /** Replay detection: nonce → timestamp when it was first seen. Cleaned every 60s. */\r\n private usedNonces = new Map<string, number>()\r\n private nonceCleanupTimer?: ReturnType<typeof setInterval>\r\n\r\n constructor(config: StateSignatureConfig = {}) {\r\n const defaultSecret = typeof process !== 'undefined'\r\n ? process.env?.LIVE_STATE_SECRET\r\n : undefined\r\n\r\n this.config = {\r\n secret: config.secret ?? defaultSecret ?? '',\r\n rotationEnabled: config.rotationEnabled ?? false,\r\n rotationInterval: config.rotationInterval ?? 24 * 60 * 60 * 1000,\r\n compressionEnabled: config.compressionEnabled ?? true,\r\n encryptionEnabled: config.encryptionEnabled ?? false,\r\n nonceEnabled: config.nonceEnabled ?? false,\r\n maxStateAge: config.maxStateAge ?? 30 * 60 * 1000,\r\n backupEnabled: config.backupEnabled ?? true,\r\n maxBackups: config.maxBackups ?? 3,\r\n nonceTTL: config.nonceTTL ?? 5 * 60 * 1000,\r\n }\r\n\r\n // Generate random secret if none provided\r\n if (!this.config.secret) {\r\n this.config.secret = randomBytes(32).toString('hex')\r\n liveWarn('state', null, 'No LIVE_STATE_SECRET provided. Using random key (state will not persist across restarts).')\r\n }\r\n\r\n this.secret = Buffer.from(this.config.secret, 'utf-8')\r\n this.encryptionSalt = randomBytes(16)\r\n\r\n if (this.config.rotationEnabled) {\r\n this.setupKeyRotation()\r\n }\r\n\r\n if (this.config.nonceEnabled) {\r\n this.nonceCleanupTimer = setInterval(() => this.cleanupNonces(), this.config.nonceTTL + 10 * 1000)\r\n }\r\n }\r\n\r\n /**\r\n * Generate a hybrid nonce: `timestamp:random:HMAC(timestamp:random, secret)`\r\n * Self-validating via HMAC, unique via random bytes, replay-tracked via Map.\r\n */\r\n private generateNonce(): string {\r\n const ts = Date.now().toString()\r\n const rand = randomBytes(8).toString('hex')\r\n const payload = `${ts}:${rand}`\r\n const mac = createHmac('sha256', this.secret).update(payload).digest('hex').slice(0, 16)\r\n return `${ts}:${rand}:${mac}`\r\n }\r\n\r\n /**\r\n * Validate a hybrid nonce: check format, HMAC, and TTL.\r\n */\r\n private validateNonce(nonce: string): { valid: boolean; error?: string } {\r\n const parts = nonce.split(':')\r\n if (parts.length !== 3) return { valid: false, error: 'Malformed nonce' }\r\n\r\n const [ts, rand, mac] = parts\r\n const timestamp = Number(ts)\r\n\r\n if (isNaN(timestamp)) return { valid: false, error: 'Malformed nonce timestamp' }\r\n\r\n // Check TTL\r\n const age = Date.now() - timestamp\r\n if (age > this.config.nonceTTL) {\r\n return { valid: false, error: 'Nonce expired' }\r\n }\r\n if (age < -30000) {\r\n // Nonce from the future (>30s clock skew) — reject\r\n return { valid: false, error: 'Nonce timestamp in the future' }\r\n }\r\n\r\n // Verify HMAC — try current key first, then previous keys (rotation)\r\n const payload = `${ts}:${rand}`\r\n const expectedMac = createHmac('sha256', this.secret).update(payload).digest('hex').slice(0, 16)\r\n if (this.timingSafeEqual(mac, expectedMac)) {\r\n return { valid: true }\r\n }\r\n\r\n for (const prevSecret of this.previousSecrets) {\r\n const prevMac = createHmac('sha256', prevSecret).update(payload).digest('hex').slice(0, 16)\r\n if (this.timingSafeEqual(mac, prevMac)) {\r\n return { valid: true }\r\n }\r\n }\r\n\r\n return { valid: false, error: 'Invalid nonce signature' }\r\n }\r\n\r\n signState(\r\n componentId: string,\r\n state: Record<string, unknown>,\r\n version: number,\r\n options?: { compress?: boolean; backup?: boolean }\r\n ): SignedState {\r\n let dataStr = JSON.stringify(state)\r\n let compressed = false\r\n let encrypted = false\r\n\r\n // Compression\r\n if ((options?.compress ?? this.config.compressionEnabled) && dataStr.length > 1024) {\r\n const compressedBuf = gzipSync(Buffer.from(dataStr, 'utf-8'))\r\n const compressedB64 = compressedBuf.toString('base64')\r\n if (compressedB64.length < dataStr.length * 0.9) {\r\n dataStr = compressedB64\r\n compressed = true\r\n }\r\n }\r\n\r\n // Encryption\r\n if (this.config.encryptionEnabled) {\r\n const iv = randomBytes(16)\r\n const key = this.deriveEncryptionKey()\r\n const cipher = createCipheriv('aes-256-cbc', key, iv)\r\n let encryptedData = cipher.update(dataStr, 'utf-8', 'base64')\r\n encryptedData += cipher.final('base64')\r\n dataStr = iv.toString('base64') + ':' + encryptedData\r\n encrypted = true\r\n }\r\n\r\n // Stateless nonce\r\n const nonce = this.config.nonceEnabled ? this.generateNonce() : undefined\r\n\r\n const signedState: SignedState = {\r\n data: dataStr,\r\n signature: '',\r\n timestamp: Date.now(),\r\n version,\r\n componentId,\r\n nonce,\r\n compressed,\r\n encrypted\r\n }\r\n\r\n signedState.signature = this.computeSignature(signedState)\r\n\r\n // Backup\r\n if (options?.backup ?? this.config.backupEnabled) {\r\n this.backupState(componentId, signedState)\r\n }\r\n\r\n return signedState\r\n }\r\n\r\n validateState(signedState: SignedState, options?: { skipNonce?: boolean }): { valid: boolean; error?: string } {\r\n try {\r\n // Check max age\r\n const age = Date.now() - signedState.timestamp\r\n if (age > this.config.maxStateAge) {\r\n return { valid: false, error: 'State expired' }\r\n }\r\n\r\n // Check stateless nonce (HMAC + TTL) — skipped for rehydration\r\n if (signedState.nonce && this.config.nonceEnabled && !options?.skipNonce) {\r\n const nonceResult = this.validateNonce(signedState.nonce)\r\n if (!nonceResult.valid) {\r\n return { valid: false, error: nonceResult.error }\r\n }\r\n\r\n // Replay detection: reject if nonce was already used\r\n if (this.usedNonces.has(signedState.nonce)) {\r\n return { valid: false, error: 'Nonce already used' }\r\n }\r\n }\r\n\r\n // Verify signature with current key\r\n const expectedSig = this.computeSignature(signedState)\r\n if (this.timingSafeEqual(signedState.signature, expectedSig)) {\r\n if (signedState.nonce && this.config.nonceEnabled) {\r\n this.usedNonces.set(signedState.nonce, Date.now())\r\n }\r\n return { valid: true }\r\n }\r\n\r\n // Try previous keys (rotation)\r\n for (const prevSecret of this.previousSecrets) {\r\n const prevSig = this.computeSignatureWithKey(signedState, prevSecret)\r\n if (this.timingSafeEqual(signedState.signature, prevSig)) {\r\n if (signedState.nonce && this.config.nonceEnabled) {\r\n this.usedNonces.set(signedState.nonce, Date.now())\r\n }\r\n return { valid: true }\r\n }\r\n }\r\n\r\n return { valid: false, error: 'Invalid signature' }\r\n } catch (error: any) {\r\n return { valid: false, error: error.message }\r\n }\r\n }\r\n\r\n extractData(signedState: SignedState): Record<string, unknown> {\r\n let dataStr = signedState.data\r\n\r\n // Decrypt\r\n if (signedState.encrypted) {\r\n const [ivB64, encryptedData] = dataStr.split(':')\r\n const iv = Buffer.from(ivB64, 'base64')\r\n const key = this.deriveEncryptionKey()\r\n const decipher = createDecipheriv('aes-256-cbc', key, iv)\r\n dataStr = decipher.update(encryptedData, 'base64', 'utf-8')\r\n dataStr += decipher.final('utf-8')\r\n }\r\n\r\n // Decompress\r\n if (signedState.compressed) {\r\n const decompressed = gunzipSync(Buffer.from(dataStr, 'base64'))\r\n dataStr = decompressed.toString('utf-8')\r\n }\r\n\r\n return JSON.parse(dataStr)\r\n }\r\n\r\n getBackups(componentId: string): SignedState[] {\r\n return (this.stateBackups.get(componentId) || []).map(b => b.signedState)\r\n }\r\n\r\n getLatestBackup(componentId: string): SignedState | null {\r\n const backups = this.stateBackups.get(componentId)\r\n if (!backups || backups.length === 0) return null\r\n return backups[backups.length - 1].signedState\r\n }\r\n\r\n private backupState(componentId: string, signedState: SignedState): void {\r\n if (!this.stateBackups.has(componentId)) {\r\n this.stateBackups.set(componentId, [])\r\n }\r\n\r\n const backups = this.stateBackups.get(componentId)!\r\n backups.push({ signedState, backedUpAt: Date.now() })\r\n\r\n while (backups.length > this.config.maxBackups) {\r\n backups.shift()\r\n }\r\n }\r\n\r\n private computeSignature(signedState: SignedState): string {\r\n return this.computeSignatureWithKey(signedState, this.secret)\r\n }\r\n\r\n private computeSignatureWithKey(signedState: SignedState, key: Buffer): string {\r\n const payload = `${signedState.componentId}:${signedState.version}:${signedState.timestamp}:${signedState.data}${signedState.nonce ? ':' + signedState.nonce : ''}`\r\n return createHmac('sha256', key).update(payload).digest('hex')\r\n }\r\n\r\n private timingSafeEqual(a: string, b: string): boolean {\r\n if (a.length !== b.length) return false\r\n const bufA = Buffer.from(a)\r\n const bufB = Buffer.from(b)\r\n try {\r\n const { timingSafeEqual: tse } = require('crypto')\r\n return tse(bufA, bufB)\r\n } catch {\r\n // Fallback (not timing-safe but functional)\r\n return a === b\r\n }\r\n }\r\n\r\n private deriveEncryptionKey(): Buffer {\r\n if (this.cachedEncryptionKey) return this.cachedEncryptionKey\r\n this.cachedEncryptionKey = scryptSync(this.secret, this.encryptionSalt, 32) as Buffer\r\n return this.cachedEncryptionKey\r\n }\r\n\r\n private setupKeyRotation(): void {\r\n this.rotationTimer = setInterval(() => {\r\n this.previousSecrets.unshift(this.secret)\r\n if (this.previousSecrets.length > 3) {\r\n this.previousSecrets.pop()\r\n }\r\n this.secret = randomBytes(32)\r\n this.cachedEncryptionKey = null\r\n liveLog('state', null, 'Key rotation completed')\r\n }, this.config.rotationInterval)\r\n }\r\n\r\n /** Remove nonces older than nonceTTL + 10s from the replay detection map. */\r\n private cleanupNonces(): void {\r\n const cutoff = Date.now() - (this.config.nonceTTL + 10 * 1000)\r\n for (const [nonce, ts] of this.usedNonces) {\r\n if (ts < cutoff) this.usedNonces.delete(nonce)\r\n }\r\n }\r\n\r\n shutdown(): void {\r\n if (this.rotationTimer) clearInterval(this.rotationTimer)\r\n if (this.nonceCleanupTimer) clearInterval(this.nonceCleanupTimer)\r\n }\r\n}\r\n","// @fluxstack/live - Performance Monitor\r\n//\r\n// Tracks and reports on component performance metrics.\r\n\r\nimport { EventEmitter } from 'events'\r\nimport { liveLog, liveWarn } from '../debug/LiveLogger'\r\n\r\nexport interface ComponentPerformanceMetrics {\r\n componentId: string\r\n componentName: string\r\n mountTime: number\r\n actionTimes: Map<string, number[]>\r\n renderTimes: number[]\r\n stateChanges: number\r\n errorCount: number\r\n lastActivity: number\r\n}\r\n\r\nexport interface PerformanceAlert {\r\n type: 'slow_action' | 'slow_render' | 'high_error_rate' | 'memory_warning'\r\n componentId: string\r\n componentName: string\r\n message: string\r\n value: number\r\n threshold: number\r\n timestamp: number\r\n}\r\n\r\nexport interface PerformanceConfig {\r\n /** Threshold for slow action warnings (ms) */\r\n slowActionThreshold?: number\r\n /** Threshold for slow render warnings (ms) */\r\n slowRenderThreshold?: number\r\n /** Max errors before warning */\r\n highErrorRateThreshold?: number\r\n /** Enable performance alerts */\r\n alertsEnabled?: boolean\r\n}\r\n\r\nexport class PerformanceMonitor extends EventEmitter {\r\n private components = new Map<string, ComponentPerformanceMetrics>()\r\n private alerts: PerformanceAlert[] = []\r\n private config: Required<PerformanceConfig>\r\n\r\n constructor(config: PerformanceConfig = {}) {\r\n super()\r\n this.config = {\r\n slowActionThreshold: config.slowActionThreshold ?? 1000,\r\n slowRenderThreshold: config.slowRenderThreshold ?? 500,\r\n highErrorRateThreshold: config.highErrorRateThreshold ?? 10,\r\n alertsEnabled: config.alertsEnabled ?? true,\r\n }\r\n }\r\n\r\n initializeComponent(componentId: string, componentName: string): void {\r\n this.components.set(componentId, {\r\n componentId,\r\n componentName,\r\n mountTime: Date.now(),\r\n actionTimes: new Map(),\r\n renderTimes: [],\r\n stateChanges: 0,\r\n errorCount: 0,\r\n lastActivity: Date.now()\r\n })\r\n }\r\n\r\n recordRenderTime(componentId: string, time: number): void {\r\n const metrics = this.components.get(componentId)\r\n if (!metrics) return\r\n\r\n metrics.renderTimes.push(time)\r\n metrics.lastActivity = Date.now()\r\n\r\n if (this.config.alertsEnabled && time > this.config.slowRenderThreshold) {\r\n this.addAlert({\r\n type: 'slow_render',\r\n componentId,\r\n componentName: metrics.componentName,\r\n message: `Slow render: ${time}ms (threshold: ${this.config.slowRenderThreshold}ms)`,\r\n value: time,\r\n threshold: this.config.slowRenderThreshold,\r\n timestamp: Date.now()\r\n })\r\n }\r\n }\r\n\r\n recordActionTime(componentId: string, action: string, time: number, error?: Error): void {\r\n const metrics = this.components.get(componentId)\r\n if (!metrics) return\r\n\r\n if (!metrics.actionTimes.has(action)) {\r\n metrics.actionTimes.set(action, [])\r\n }\r\n metrics.actionTimes.get(action)!.push(time)\r\n metrics.lastActivity = Date.now()\r\n\r\n if (error) {\r\n metrics.errorCount++\r\n if (this.config.alertsEnabled && metrics.errorCount >= this.config.highErrorRateThreshold) {\r\n this.addAlert({\r\n type: 'high_error_rate',\r\n componentId,\r\n componentName: metrics.componentName,\r\n message: `High error rate: ${metrics.errorCount} errors`,\r\n value: metrics.errorCount,\r\n threshold: this.config.highErrorRateThreshold,\r\n timestamp: Date.now()\r\n })\r\n }\r\n }\r\n\r\n if (this.config.alertsEnabled && time > this.config.slowActionThreshold) {\r\n this.addAlert({\r\n type: 'slow_action',\r\n componentId,\r\n componentName: metrics.componentName,\r\n message: `Slow action '${action}': ${time}ms (threshold: ${this.config.slowActionThreshold}ms)`,\r\n value: time,\r\n threshold: this.config.slowActionThreshold,\r\n timestamp: Date.now()\r\n })\r\n }\r\n }\r\n\r\n recordStateChange(componentId: string): void {\r\n const metrics = this.components.get(componentId)\r\n if (metrics) {\r\n metrics.stateChanges++\r\n metrics.lastActivity = Date.now()\r\n }\r\n }\r\n\r\n removeComponent(componentId: string): void {\r\n this.components.delete(componentId)\r\n }\r\n\r\n getComponentMetrics(componentId: string): ComponentPerformanceMetrics | null {\r\n return this.components.get(componentId) ?? null\r\n }\r\n\r\n getAllMetrics(): ComponentPerformanceMetrics[] {\r\n return Array.from(this.components.values())\r\n }\r\n\r\n getAlerts(limit = 50): PerformanceAlert[] {\r\n return this.alerts.slice(-limit)\r\n }\r\n\r\n clearAlerts(): void {\r\n this.alerts = []\r\n }\r\n\r\n getStats() {\r\n return {\r\n totalComponents: this.components.size,\r\n totalAlerts: this.alerts.length,\r\n components: Array.from(this.components.entries()).map(([id, m]) => ({\r\n id,\r\n name: m.componentName,\r\n renderCount: m.renderTimes.length,\r\n avgRenderTime: m.renderTimes.length > 0\r\n ? m.renderTimes.reduce((a, b) => a + b, 0) / m.renderTimes.length\r\n : 0,\r\n actionCount: Array.from(m.actionTimes.values()).reduce((sum, times) => sum + times.length, 0),\r\n stateChanges: m.stateChanges,\r\n errorCount: m.errorCount,\r\n }))\r\n }\r\n }\r\n\r\n private addAlert(alert: PerformanceAlert): void {\r\n this.alerts.push(alert)\r\n if (this.alerts.length > 1000) {\r\n this.alerts = this.alerts.slice(-500)\r\n }\r\n liveWarn('performance', alert.componentId, alert.message)\r\n this.emit('alert', alert)\r\n }\r\n}\r\n","// @fluxstack/live - File Upload Manager\r\n//\r\n// Handles chunked file uploads over WebSocket with security validations.\r\n\r\nimport { liveLog, liveWarn } from '../debug/LiveLogger'\r\nimport type {\r\n ActiveUpload,\r\n FileUploadStartMessage,\r\n FileUploadChunkMessage,\r\n FileUploadCompleteMessage,\r\n FileUploadProgressResponse,\r\n FileUploadCompleteResponse\r\n} from '../protocol/messages'\r\n\r\n// Magic bytes mapping for content validation\r\nconst MAGIC_BYTES: Record<string, { bytes: number[]; offset?: number }[]> = {\r\n 'image/jpeg': [{ bytes: [0xFF, 0xD8, 0xFF] }],\r\n 'image/png': [{ bytes: [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A] }],\r\n 'image/gif': [\r\n { bytes: [0x47, 0x49, 0x46, 0x38, 0x37, 0x61] },\r\n { bytes: [0x47, 0x49, 0x46, 0x38, 0x39, 0x61] },\r\n ],\r\n 'image/webp': [{ bytes: [0x52, 0x49, 0x46, 0x46], offset: 0 }],\r\n 'application/pdf': [{ bytes: [0x25, 0x50, 0x44, 0x46] }],\r\n 'application/zip': [\r\n { bytes: [0x50, 0x4B, 0x03, 0x04] },\r\n { bytes: [0x50, 0x4B, 0x05, 0x06] },\r\n ],\r\n 'application/gzip': [{ bytes: [0x1F, 0x8B] }],\r\n}\r\n\r\nexport interface FileUploadConfig {\r\n maxUploadSize?: number\r\n chunkTimeout?: number\r\n maxBytesPerUser?: number\r\n quotaResetInterval?: number\r\n allowedTypes?: string[]\r\n blockedExtensions?: string[]\r\n uploadsDir?: string\r\n /** Custom file assembly handler - if not provided, uses default fs assembly */\r\n assembleFile?: (upload: ActiveUpload) => Promise<string>\r\n}\r\n\r\nexport class FileUploadManager {\r\n private activeUploads = new Map<string, ActiveUpload>()\r\n private readonly maxUploadSize: number\r\n private readonly chunkTimeout: number\r\n private userUploadBytes = new Map<string, number>()\r\n private readonly maxBytesPerUser: number\r\n private readonly quotaResetInterval: number\r\n private readonly allowedTypes: string[]\r\n private readonly blockedExtensions: Set<string>\r\n private readonly uploadsDir: string\r\n private readonly customAssembleFile?: (upload: ActiveUpload) => Promise<string>\r\n\r\n private cleanupTimer?: ReturnType<typeof setInterval>\r\n private quotaTimer?: ReturnType<typeof setInterval>\r\n\r\n constructor(config: FileUploadConfig = {}) {\r\n this.maxUploadSize = config.maxUploadSize ?? 50 * 1024 * 1024\r\n this.chunkTimeout = config.chunkTimeout ?? 30000\r\n this.maxBytesPerUser = config.maxBytesPerUser ?? 500 * 1024 * 1024\r\n this.quotaResetInterval = config.quotaResetInterval ?? 24 * 60 * 60 * 1000\r\n this.allowedTypes = config.allowedTypes ?? [\r\n 'image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml',\r\n 'application/pdf',\r\n 'text/plain', 'text/csv', 'text/markdown',\r\n 'application/json',\r\n 'application/zip', 'application/gzip',\r\n ]\r\n this.blockedExtensions = new Set(config.blockedExtensions ?? [\r\n '.exe', '.bat', '.cmd', '.com', '.msi', '.scr', '.pif',\r\n '.sh', '.bash', '.zsh', '.csh',\r\n '.ps1', '.psm1', '.psd1',\r\n '.vbs', '.vbe', '.js', '.jse', '.wsf', '.wsh',\r\n '.dll', '.sys', '.drv', '.so', '.dylib',\r\n ])\r\n this.uploadsDir = config.uploadsDir ?? './uploads'\r\n this.customAssembleFile = config.assembleFile\r\n\r\n this.cleanupTimer = setInterval(() => this.cleanupStaleUploads(), 5 * 60 * 1000)\r\n this.quotaTimer = setInterval(() => this.resetUploadQuotas(), this.quotaResetInterval)\r\n }\r\n\r\n async startUpload(message: FileUploadStartMessage, userId?: string): Promise<{ success: boolean; error?: string }> {\r\n try {\r\n const { uploadId, componentId, filename, fileType, fileSize, chunkSize = 64 * 1024 } = message\r\n\r\n if (fileSize > this.maxUploadSize) {\r\n throw new Error(`File too large: ${fileSize} bytes. Max: ${this.maxUploadSize} bytes`)\r\n }\r\n\r\n if (userId) {\r\n const currentUsage = this.userUploadBytes.get(userId) || 0\r\n if (currentUsage + fileSize > this.maxBytesPerUser) {\r\n throw new Error(`Upload quota exceeded for user.`)\r\n }\r\n }\r\n\r\n if (this.allowedTypes.length > 0 && !this.allowedTypes.includes(fileType)) {\r\n throw new Error(`File type not allowed: ${fileType}`)\r\n }\r\n\r\n // Sanitize filename\r\n const pathModule = await import('path')\r\n const safeBase = pathModule.basename(filename)\r\n const ext = pathModule.extname(safeBase).toLowerCase()\r\n if (this.blockedExtensions.has(ext)) {\r\n throw new Error(`File extension not allowed: ${ext}`)\r\n }\r\n\r\n // Double extension prevention\r\n const parts = safeBase.split('.')\r\n if (parts.length > 2) {\r\n for (let i = 1; i < parts.length - 1; i++) {\r\n const intermediateExt = '.' + parts[i].toLowerCase()\r\n if (this.blockedExtensions.has(intermediateExt)) {\r\n throw new Error(`Suspicious double extension detected: ${intermediateExt} in ${safeBase}`)\r\n }\r\n }\r\n }\r\n\r\n if (safeBase.length > 255) {\r\n throw new Error('Filename too long')\r\n }\r\n\r\n if (this.activeUploads.has(uploadId)) {\r\n throw new Error(`Upload ${uploadId} already in progress`)\r\n }\r\n\r\n const totalChunks = Math.ceil(fileSize / chunkSize)\r\n const upload: ActiveUpload = {\r\n uploadId,\r\n componentId,\r\n filename,\r\n fileType,\r\n fileSize,\r\n totalChunks,\r\n receivedChunks: new Map(),\r\n bytesReceived: 0,\r\n startTime: Date.now(),\r\n lastChunkTime: Date.now()\r\n }\r\n\r\n this.activeUploads.set(uploadId, upload)\r\n\r\n if (userId) {\r\n const currentUsage = this.userUploadBytes.get(userId) || 0\r\n this.userUploadBytes.set(userId, currentUsage + fileSize)\r\n }\r\n\r\n liveLog('messages', componentId, `Upload started: ${uploadId} (${filename}, ${fileSize} bytes)`)\r\n\r\n return { success: true }\r\n } catch (error: any) {\r\n return { success: false, error: error.message }\r\n }\r\n }\r\n\r\n async receiveChunk(message: FileUploadChunkMessage, binaryData: Buffer | null = null): Promise<FileUploadProgressResponse | null> {\r\n const { uploadId, chunkIndex, totalChunks, data } = message\r\n\r\n const upload = this.activeUploads.get(uploadId)\r\n if (!upload) throw new Error(`Upload ${uploadId} not found`)\r\n\r\n if (chunkIndex < 0 || chunkIndex >= totalChunks) {\r\n throw new Error(`Invalid chunk index: ${chunkIndex}`)\r\n }\r\n\r\n if (!upload.receivedChunks.has(chunkIndex)) {\r\n let chunkBytes: number\r\n if (binaryData) {\r\n upload.receivedChunks.set(chunkIndex, binaryData)\r\n chunkBytes = binaryData.length\r\n } else {\r\n upload.receivedChunks.set(chunkIndex, data as string)\r\n chunkBytes = Buffer.from(data as string, 'base64').length\r\n }\r\n upload.lastChunkTime = Date.now()\r\n upload.bytesReceived += chunkBytes\r\n }\r\n\r\n const progress = (upload.bytesReceived / upload.fileSize) * 100\r\n\r\n return {\r\n type: 'FILE_UPLOAD_PROGRESS',\r\n componentId: upload.componentId,\r\n uploadId: upload.uploadId,\r\n chunkIndex,\r\n totalChunks,\r\n bytesUploaded: Math.min(upload.bytesReceived, upload.fileSize),\r\n totalBytes: upload.fileSize,\r\n progress: Math.min(progress, 100),\r\n timestamp: Date.now()\r\n }\r\n }\r\n\r\n async completeUpload(message: FileUploadCompleteMessage): Promise<FileUploadCompleteResponse> {\r\n try {\r\n const { uploadId } = message\r\n\r\n const upload = this.activeUploads.get(uploadId)\r\n if (!upload) throw new Error(`Upload ${uploadId} not found`)\r\n\r\n if (upload.bytesReceived !== upload.fileSize) {\r\n throw new Error(`Incomplete upload: received ${upload.bytesReceived}/${upload.fileSize} bytes`)\r\n }\r\n\r\n this.validateContentMagicBytes(upload)\r\n\r\n const fileUrl = this.customAssembleFile\r\n ? await this.customAssembleFile(upload)\r\n : await this.defaultAssembleFile(upload)\r\n\r\n this.activeUploads.delete(uploadId)\r\n\r\n return {\r\n type: 'FILE_UPLOAD_COMPLETE',\r\n componentId: upload.componentId,\r\n uploadId: upload.uploadId,\r\n success: true,\r\n filename: upload.filename,\r\n fileUrl,\r\n timestamp: Date.now()\r\n }\r\n } catch (error: any) {\r\n return {\r\n type: 'FILE_UPLOAD_COMPLETE',\r\n componentId: '',\r\n uploadId: message.uploadId,\r\n success: false,\r\n error: error.message,\r\n timestamp: Date.now()\r\n }\r\n }\r\n }\r\n\r\n private async defaultAssembleFile(upload: ActiveUpload): Promise<string> {\r\n const { writeFile, mkdir } = await import('fs/promises')\r\n const { existsSync } = await import('fs')\r\n const { join, extname, basename } = await import('path')\r\n\r\n if (!existsSync(this.uploadsDir)) {\r\n await mkdir(this.uploadsDir, { recursive: true })\r\n }\r\n\r\n const extension = extname(basename(upload.filename)).toLowerCase()\r\n const safeFilename = `${crypto.randomUUID()}${extension}`\r\n const filePath = join(this.uploadsDir, safeFilename)\r\n\r\n const chunks: Buffer[] = []\r\n for (let i = 0; i < upload.totalChunks; i++) {\r\n const chunkData = upload.receivedChunks.get(i)\r\n if (chunkData) {\r\n if (Buffer.isBuffer(chunkData)) {\r\n chunks.push(chunkData)\r\n } else {\r\n chunks.push(Buffer.from(chunkData, 'base64'))\r\n }\r\n }\r\n }\r\n\r\n await writeFile(filePath, Buffer.concat(chunks))\r\n return `/uploads/${safeFilename}`\r\n }\r\n\r\n private validateContentMagicBytes(upload: ActiveUpload): void {\r\n const expectedSignatures = MAGIC_BYTES[upload.fileType]\r\n if (!expectedSignatures) return\r\n\r\n const firstChunk = upload.receivedChunks.get(0)\r\n if (!firstChunk) throw new Error('Cannot validate file content: first chunk missing')\r\n\r\n const headerBuffer = Buffer.isBuffer(firstChunk)\r\n ? firstChunk\r\n : Buffer.from(firstChunk, 'base64')\r\n\r\n let matched = false\r\n for (const sig of expectedSignatures) {\r\n const offset = sig.offset ?? 0\r\n if (headerBuffer.length < offset + sig.bytes.length) continue\r\n\r\n let sigMatches = true\r\n for (let i = 0; i < sig.bytes.length; i++) {\r\n if (headerBuffer[offset + i] !== sig.bytes[i]) {\r\n sigMatches = false\r\n break\r\n }\r\n }\r\n\r\n if (sigMatches) {\r\n matched = true\r\n break\r\n }\r\n }\r\n\r\n if (!matched) {\r\n throw new Error(\r\n `File content does not match claimed type '${upload.fileType}'. ` +\r\n `The file may be disguised as a different format.`\r\n )\r\n }\r\n }\r\n\r\n private cleanupStaleUploads(): void {\r\n const now = Date.now()\r\n for (const [uploadId, upload] of this.activeUploads) {\r\n if (now - upload.lastChunkTime > this.chunkTimeout * 2) {\r\n this.activeUploads.delete(uploadId)\r\n liveLog('messages', null, `Cleaned up stale upload: ${uploadId}`)\r\n }\r\n }\r\n }\r\n\r\n private resetUploadQuotas(): void {\r\n this.userUploadBytes.clear()\r\n }\r\n\r\n getUserUploadUsage(userId: string): { used: number; limit: number; remaining: number } {\r\n const used = this.userUploadBytes.get(userId) || 0\r\n return { used, limit: this.maxBytesPerUser, remaining: Math.max(0, this.maxBytesPerUser - used) }\r\n }\r\n\r\n getUploadStatus(uploadId: string): ActiveUpload | null {\r\n return this.activeUploads.get(uploadId) || null\r\n }\r\n\r\n getStats() {\r\n return {\r\n activeUploads: this.activeUploads.size,\r\n maxUploadSize: this.maxUploadSize,\r\n allowedTypes: this.allowedTypes\r\n }\r\n }\r\n\r\n shutdown(): void {\r\n if (this.cleanupTimer) clearInterval(this.cleanupTimer)\r\n if (this.quotaTimer) clearInterval(this.quotaTimer)\r\n }\r\n}\r\n","// @fluxstack/live - WebSocket Connection Manager\r\n//\r\n// Advanced connection management with pooling, load balancing, and health monitoring.\r\n\r\nimport { EventEmitter } from 'events'\r\nimport type { GenericWebSocket } from '../transport/types'\r\nimport { liveLog, liveWarn } from '../debug/LiveLogger'\r\n\r\nexport interface ConnectionConfig {\r\n maxConnections: number\r\n connectionTimeout: number\r\n heartbeatInterval: number\r\n reconnectAttempts: number\r\n reconnectDelay: number\r\n maxReconnectDelay: number\r\n jitterFactor: number\r\n loadBalancing: 'round-robin' | 'least-connections' | 'random'\r\n healthCheckInterval: number\r\n messageQueueSize: number\r\n offlineQueueEnabled: boolean\r\n}\r\n\r\nexport interface ConnectionMetrics {\r\n id: string\r\n connectedAt: Date\r\n lastActivity: Date\r\n messagesSent: number\r\n messagesReceived: number\r\n bytesTransferred: number\r\n latency: number\r\n status: 'connecting' | 'connected' | 'disconnecting' | 'disconnected' | 'error'\r\n errorCount: number\r\n reconnectCount: number\r\n}\r\n\r\nexport interface ConnectionHealth {\r\n id: string\r\n status: 'healthy' | 'degraded' | 'unhealthy'\r\n lastCheck: Date\r\n issues: string[]\r\n metrics: ConnectionMetrics\r\n}\r\n\r\nexport interface QueuedMessage {\r\n id: string\r\n message: any\r\n timestamp: number\r\n priority: number\r\n retryCount: number\r\n maxRetries: number\r\n}\r\n\r\nexport class WebSocketConnectionManager extends EventEmitter {\r\n private connections = new Map<string, GenericWebSocket>()\r\n private connectionMetrics = new Map<string, ConnectionMetrics>()\r\n private connectionPools = new Map<string, Set<string>>()\r\n /** Reverse index: connectionId -> Set of poolIds for O(1) cleanup */\r\n private connectionPoolIndex = new Map<string, Set<string>>()\r\n private messageQueues = new Map<string, QueuedMessage[]>()\r\n private healthCheckTimer?: ReturnType<typeof setInterval>\r\n private heartbeatTimer?: ReturnType<typeof setInterval>\r\n private config: ConnectionConfig\r\n private loadBalancerIndex = 0\r\n\r\n constructor(config?: Partial<ConnectionConfig>) {\r\n super()\r\n this.config = {\r\n maxConnections: 10000,\r\n connectionTimeout: 30000,\r\n heartbeatInterval: 30000,\r\n reconnectAttempts: 5,\r\n reconnectDelay: 1000,\r\n maxReconnectDelay: 30000,\r\n jitterFactor: 0.1,\r\n loadBalancing: 'round-robin',\r\n healthCheckInterval: 60000,\r\n messageQueueSize: 1000,\r\n offlineQueueEnabled: true,\r\n ...config\r\n }\r\n\r\n this.setupHealthMonitoring()\r\n this.setupHeartbeat()\r\n }\r\n\r\n registerConnection(ws: GenericWebSocket, connectionId: string, poolId?: string): void {\r\n if (this.connections.size >= this.config.maxConnections) {\r\n throw new Error('Maximum connections exceeded')\r\n }\r\n\r\n const metrics: ConnectionMetrics = {\r\n id: connectionId,\r\n connectedAt: new Date(),\r\n lastActivity: new Date(),\r\n messagesSent: 0,\r\n messagesReceived: 0,\r\n bytesTransferred: 0,\r\n latency: 0,\r\n status: 'connected',\r\n errorCount: 0,\r\n reconnectCount: 0\r\n }\r\n\r\n this.connections.set(connectionId, ws)\r\n this.connectionMetrics.set(connectionId, metrics)\r\n\r\n if (poolId) {\r\n this.addToPool(connectionId, poolId)\r\n }\r\n\r\n this.messageQueues.set(connectionId, [])\r\n liveLog('websocket', null, `Connection registered: ${connectionId}`)\r\n this.emit('connectionRegistered', { connectionId, poolId })\r\n }\r\n\r\n addToPool(connectionId: string, poolId: string): void {\r\n if (!this.connectionPools.has(poolId)) {\r\n this.connectionPools.set(poolId, new Set())\r\n }\r\n this.connectionPools.get(poolId)!.add(connectionId)\r\n\r\n // Update reverse index\r\n if (!this.connectionPoolIndex.has(connectionId)) {\r\n this.connectionPoolIndex.set(connectionId, new Set())\r\n }\r\n this.connectionPoolIndex.get(connectionId)!.add(poolId)\r\n }\r\n\r\n removeFromPool(connectionId: string, poolId: string): void {\r\n const pool = this.connectionPools.get(poolId)\r\n if (pool) {\r\n pool.delete(connectionId)\r\n if (pool.size === 0) this.connectionPools.delete(poolId)\r\n }\r\n // Update reverse index\r\n this.connectionPoolIndex.get(connectionId)?.delete(poolId)\r\n }\r\n\r\n cleanupConnection(connectionId: string): void {\r\n this.connections.delete(connectionId)\r\n this.connectionMetrics.delete(connectionId)\r\n this.messageQueues.delete(connectionId)\r\n\r\n // Use reverse index for O(1) pool cleanup instead of scanning all pools\r\n const poolIds = this.connectionPoolIndex.get(connectionId)\r\n if (poolIds) {\r\n for (const poolId of poolIds) {\r\n const pool = this.connectionPools.get(poolId)\r\n if (pool) {\r\n pool.delete(connectionId)\r\n if (pool.size === 0) this.connectionPools.delete(poolId)\r\n }\r\n }\r\n this.connectionPoolIndex.delete(connectionId)\r\n }\r\n }\r\n\r\n getConnectionMetrics(connectionId: string): ConnectionMetrics | null {\r\n return this.connectionMetrics.get(connectionId) || null\r\n }\r\n\r\n getAllConnectionMetrics(): ConnectionMetrics[] {\r\n return Array.from(this.connectionMetrics.values())\r\n }\r\n\r\n getSystemStats() {\r\n const totalConnections = this.connections.size\r\n const activeConnections = Array.from(this.connections.values()).filter(ws => ws.readyState === 1).length\r\n const totalPools = this.connectionPools.size\r\n const totalQueuedMessages = Array.from(this.messageQueues.values()).reduce((sum, queue) => sum + queue.length, 0)\r\n\r\n return {\r\n totalConnections,\r\n activeConnections,\r\n totalPools,\r\n totalQueuedMessages,\r\n maxConnections: this.config.maxConnections,\r\n connectionUtilization: (totalConnections / this.config.maxConnections) * 100\r\n }\r\n }\r\n\r\n private setupHealthMonitoring(): void {\r\n this.healthCheckTimer = setInterval(() => this.performHealthChecks(), this.config.healthCheckInterval)\r\n }\r\n\r\n private setupHeartbeat(): void {\r\n this.heartbeatTimer = setInterval(() => {\r\n for (const [connectionId, ws] of this.connections) {\r\n if (ws.readyState === 1) {\r\n try {\r\n const wsAny = ws as any\r\n if (typeof wsAny.ping === 'function') {\r\n wsAny._pingTime = Date.now()\r\n wsAny.ping()\r\n }\r\n } catch {\r\n // Ignore heartbeat failures\r\n }\r\n }\r\n }\r\n }, this.config.heartbeatInterval)\r\n }\r\n\r\n private async performHealthChecks(): Promise<void> {\r\n const now = Date.now()\r\n const unhealthy: string[] = []\r\n\r\n for (const [connectionId, metrics] of this.connectionMetrics) {\r\n const ws = this.connections.get(connectionId)\r\n if (!ws || ws.readyState !== 1) {\r\n unhealthy.push(connectionId)\r\n continue\r\n }\r\n\r\n const timeSinceActivity = now - metrics.lastActivity.getTime()\r\n if (timeSinceActivity > this.config.heartbeatInterval * 2) {\r\n metrics.status = 'disconnected'\r\n }\r\n if (metrics.errorCount > 10) {\r\n unhealthy.push(connectionId)\r\n }\r\n }\r\n\r\n for (const connectionId of unhealthy) {\r\n const ws = this.connections.get(connectionId)\r\n if (ws) {\r\n try { ws.close() } catch { /* ignore */ }\r\n }\r\n this.cleanupConnection(connectionId)\r\n }\r\n }\r\n\r\n shutdown(): void {\r\n if (this.healthCheckTimer) clearInterval(this.healthCheckTimer)\r\n if (this.heartbeatTimer) clearInterval(this.heartbeatTimer)\r\n\r\n for (const [, ws] of this.connections) {\r\n try { ws.close() } catch { /* ignore */ }\r\n }\r\n\r\n this.connections.clear()\r\n this.connectionMetrics.clear()\r\n this.connectionPools.clear()\r\n this.connectionPoolIndex.clear()\r\n this.messageQueues.clear()\r\n }\r\n}\r\n","// @fluxstack/live - Dependency Injection via Module-Level Setter\r\n//\r\n// The public API of LiveComponent does NOT change.\r\n// Internally, singletons (roomEvents, roomManager, etc.) are injected once at boot\r\n// via setLiveComponentContext(), called by LiveServer.start().\r\n\r\nimport type { RoomEventBus } from '../rooms/RoomEventBus'\r\n\r\n// ===== Room Manager Interface =====\r\n// Extracted to avoid circular dependency with LiveRoomManager\r\n\r\nexport interface LiveRoomManagerInterface {\r\n joinRoom<TState = any>(componentId: string, roomId: string, ws: any, initialState?: TState, options?: { deepDiff?: boolean; deepDiffDepth?: number; serverOnlyState?: boolean }, joinContext?: { userId?: string; payload?: any }): { state: TState; rejected?: false } | { rejected: true; reason: string }\r\n leaveRoom(componentId: string, roomId: string, leaveReason?: 'leave' | 'disconnect' | 'cleanup'): void\r\n cleanupComponent(componentId: string): void\r\n emitToRoom(roomId: string, event: string, data: any, excludeComponentId?: string): number\r\n setRoomState(roomId: string, updates: any, excludeComponentId?: string): void\r\n getRoomState<TState = any>(roomId: string): TState\r\n isInRoom(componentId: string, roomId: string): boolean\r\n getComponentRooms(componentId: string): string[]\r\n getMemberCount?(roomId: string): number\r\n getRoomInstance?(roomId: string): import('../rooms/LiveRoom').LiveRoom<any, any, any> | undefined\r\n getStats(): any\r\n}\r\n\r\n// ===== Logger Interface =====\r\n\r\nexport interface LiveLoggerInterface {\r\n log(category: string, componentId: string | null, message: string, ...args: unknown[]): void\r\n warn(category: string, componentId: string | null, message: string, ...args: unknown[]): void\r\n}\r\n\r\n// ===== Context =====\r\n\r\nexport interface LiveComponentContext {\r\n roomEvents: RoomEventBus\r\n roomManager: LiveRoomManagerInterface\r\n}\r\n\r\nlet _ctx: LiveComponentContext | null = null\r\n\r\n/**\r\n * Set the global Live Component context.\r\n * Called once by LiveServer.start() before any components are mounted.\r\n */\r\nexport function setLiveComponentContext(ctx: LiveComponentContext): void {\r\n _ctx = ctx\r\n}\r\n\r\n/**\r\n * Get the global Live Component context.\r\n * Throws if LiveServer.start() hasn't been called yet.\r\n */\r\nexport function getLiveComponentContext(): LiveComponentContext {\r\n if (!_ctx) throw new Error('@fluxstack/live: LiveServer.start() must be called before using LiveComponents')\r\n return _ctx\r\n}\r\n\r\n/**\r\n * Check if context has been initialized (for internal use).\r\n */\r\nexport function hasLiveComponentContext(): boolean {\r\n return _ctx !== null\r\n}\r\n","// @fluxstack/live - Component State Manager\r\n//\r\n// Handles reactive state proxy, setState, sendBinaryDelta, direct accessors.\r\n// Extracted from LiveComponent for single-responsibility.\r\n\r\nimport type { GenericWebSocket } from '../../transport/types'\r\nimport type { ComponentState } from '../../protocol/messages'\r\nimport { computeDeepDiff, deepAssign } from '../../utils/deepDiff'\r\n\r\n/** Per-class cache for forbidden property names in createDirectStateAccessors */\r\nconst _forbiddenSetCache = new WeakMap<Function, Set<string>>()\r\n\r\nexport interface StateManagerOptions<TState> {\r\n componentId: string\r\n initialState: TState\r\n ws: GenericWebSocket\r\n emitFn: (type: string, payload: any) => void\r\n onStateChangeFn: (changes: Partial<TState>) => void\r\n deepDiff?: boolean\r\n deepDiffDepth?: number\r\n}\r\n\r\nexport class ComponentStateManager<TState = ComponentState> {\r\n private _state: TState\r\n private _proxyState: TState\r\n private _inStateChange = false\r\n private _idBytes: Uint8Array | null = null\r\n private _deepDiff: boolean\r\n private _deepDiffDepth: number\r\n\r\n private componentId: string\r\n private ws: GenericWebSocket\r\n private emitFn: (type: string, payload: any) => void\r\n private onStateChangeFn: (changes: Partial<TState>) => void\r\n\r\n constructor(opts: StateManagerOptions<TState>) {\r\n this.componentId = opts.componentId\r\n this.ws = opts.ws\r\n this.emitFn = opts.emitFn\r\n this.onStateChangeFn = opts.onStateChangeFn\r\n this._deepDiff = opts.deepDiff ?? false\r\n this._deepDiffDepth = opts.deepDiffDepth ?? 3\r\n // When deepDiff is enabled, deep-clone initialState so deepAssign\r\n // doesn't mutate shared references (e.g. static defaultState).\r\n this._state = this._deepDiff\r\n ? structuredClone(opts.initialState)\r\n : opts.initialState\r\n this._proxyState = this.createStateProxy(this._state)\r\n }\r\n\r\n get rawState(): TState { return this._state }\r\n get proxyState(): TState { return this._proxyState }\r\n\r\n /** Guard flag — prevents infinite recursion in onStateChange */\r\n get inStateChange(): boolean { return this._inStateChange }\r\n\r\n private createStateProxy(state: TState): TState {\r\n const self = this\r\n return new Proxy(state as object, {\r\n set(target, prop, value) {\r\n const oldValue = (target as any)[prop]\r\n if (oldValue !== value) {\r\n (target as any)[prop] = value\r\n const changes = { [prop]: value } as Partial<TState>\r\n self.emitFn('STATE_DELTA', { delta: changes })\r\n if (!self._inStateChange) {\r\n self._inStateChange = true\r\n try { self.onStateChangeFn(changes) } catch (err: any) {\r\n console.error(`[${self.componentId}] onStateChange error:`, err?.message || err)\r\n } finally { self._inStateChange = false }\r\n }\r\n }\r\n return true\r\n },\r\n get(target, prop) {\r\n return (target as any)[prop]\r\n }\r\n }) as TState\r\n }\r\n\r\n setState(updates: Partial<TState> | ((prev: TState) => Partial<TState>)): void {\r\n const newUpdates = typeof updates === 'function' ? updates(this._state) : updates\r\n\r\n let actualChanges: Partial<TState>\r\n let hasChanges: boolean\r\n\r\n if (this._deepDiff) {\r\n // Deep diff: recursively compare plain objects, reference-compare everything else\r\n const diff = computeDeepDiff(\r\n this._state as Record<string, unknown>,\r\n newUpdates as Record<string, unknown>,\r\n 0,\r\n this._deepDiffDepth,\r\n )\r\n if (diff === null) return\r\n actualChanges = diff as Partial<TState>\r\n hasChanges = true\r\n } else {\r\n // Shallow diff: reference equality (original behavior)\r\n actualChanges = {} as Partial<TState>\r\n hasChanges = false\r\n for (const key of Object.keys(newUpdates as object) as Array<keyof TState>) {\r\n if ((this._state as any)[key] !== (newUpdates as any)[key]) {\r\n (actualChanges as any)[key] = (newUpdates as any)[key]\r\n hasChanges = true\r\n }\r\n }\r\n }\r\n\r\n if (!hasChanges) return\r\n\r\n // Apply changes to internal state\r\n if (this._deepDiff) {\r\n deepAssign(this._state, actualChanges)\r\n } else {\r\n Object.assign(this._state as object, actualChanges)\r\n }\r\n\r\n this.emitFn('STATE_DELTA', { delta: actualChanges })\r\n if (!this._inStateChange) {\r\n this._inStateChange = true\r\n try { this.onStateChangeFn(actualChanges) } catch (err: any) {\r\n console.error(`[${this.componentId}] onStateChange error:`, err?.message || err)\r\n } finally { this._inStateChange = false }\r\n }\r\n }\r\n\r\n sendBinaryDelta(\r\n delta: Partial<TState>,\r\n encoder: (delta: Partial<TState>) => Uint8Array\r\n ): void {\r\n const actualChanges: Partial<TState> = {} as Partial<TState>\r\n let hasChanges = false\r\n for (const key of Object.keys(delta as object) as Array<keyof TState>) {\r\n if ((this._state as any)[key] !== (delta as any)[key]) {\r\n (actualChanges as any)[key] = (delta as any)[key]\r\n hasChanges = true\r\n }\r\n }\r\n\r\n if (!hasChanges) return\r\n\r\n Object.assign(this._state as object, actualChanges)\r\n\r\n const payload = encoder(actualChanges)\r\n\r\n if (!this._idBytes) {\r\n this._idBytes = new TextEncoder().encode(this.componentId)\r\n }\r\n const idBytes = this._idBytes\r\n const frame = new Uint8Array(1 + 1 + idBytes.length + payload.length)\r\n frame[0] = 0x01 // BINARY_STATE_DELTA\r\n frame[1] = idBytes.length\r\n frame.set(idBytes, 2)\r\n frame.set(payload, 2 + idBytes.length)\r\n\r\n if (this.ws && this.ws.readyState === 1) {\r\n this.ws.send(frame)\r\n }\r\n }\r\n\r\n setValue<K extends keyof TState>(payload: { key: K; value: TState[K] }): { success: true; key: K; value: TState[K] } {\r\n const { key, value } = payload\r\n const update = { [key]: value } as unknown as Partial<TState>\r\n this.setState(update)\r\n return { success: true, key, value }\r\n }\r\n\r\n getSerializableState(): TState {\r\n return this._proxyState\r\n }\r\n\r\n /**\r\n * Create getters/setters for each state property directly on `target`.\r\n * This allows `this.count` instead of `this.state.count` in subclasses.\r\n */\r\n applyDirectAccessors(target: any, constructorFn: Function): void {\r\n let forbidden = _forbiddenSetCache.get(constructorFn)\r\n if (!forbidden) {\r\n forbidden = new Set([\r\n ...Object.keys(target),\r\n ...Object.getOwnPropertyNames(Object.getPrototypeOf(target)),\r\n 'state', '_state', 'ws', 'id', 'room', 'userId', 'broadcastToRoom',\r\n '$private', '_privateState',\r\n '$room', '$rooms', 'roomType', 'roomHandles', 'joinedRooms', 'roomEventUnsubscribers',\r\n // Internal manager fields\r\n '_stateManager', '_roomProxyManager', '_actionSecurity', '_messaging',\r\n ])\r\n _forbiddenSetCache.set(constructorFn, forbidden)\r\n }\r\n\r\n for (const key of Object.keys(this._state as object)) {\r\n if (!forbidden.has(key)) {\r\n Object.defineProperty(target, key, {\r\n get: () => (this._state as any)[key],\r\n set: (value) => { (this._proxyState as any)[key] = value },\r\n enumerable: true,\r\n configurable: true\r\n })\r\n }\r\n }\r\n }\r\n\r\n /** Release cached resources */\r\n cleanup(): void {\r\n this._idBytes = null\r\n }\r\n}\r\n","// @fluxstack/live - Component Messaging Manager\r\n//\r\n// Handles emit() and broadcast() for LiveComponent.\r\n// Extracted from LiveComponent for single-responsibility.\r\n\r\nimport type { GenericWebSocket } from '../../transport/types'\r\nimport { queueWsMessage } from '../../transport/WsSendBatcher'\r\nimport { liveLog, liveWarn } from '../../debug/LiveLogger'\r\nimport type { LiveMessage, BroadcastMessage } from '../../protocol/messages'\r\n\r\n/** Symbol key for singleton emit override */\r\nexport const EMIT_OVERRIDE_KEY = Symbol.for('fluxstack:emitOverride')\r\n\r\nexport interface ComponentMessagingContext {\r\n componentId: string\r\n ws: GenericWebSocket\r\n getUserId: () => string | undefined\r\n getRoom: () => string | undefined\r\n getBroadcastToRoom: () => (message: BroadcastMessage) => void\r\n getEmitOverride: () => ((type: string, payload: any) => void) | null\r\n}\r\n\r\nexport class ComponentMessaging {\r\n constructor(private ctx: ComponentMessagingContext) {}\r\n\r\n emit(type: string, payload: any): void {\r\n const override = this.ctx.getEmitOverride()\r\n if (override) {\r\n override(type, payload)\r\n return\r\n }\r\n\r\n const message: LiveMessage = {\r\n type: type as any,\r\n componentId: this.ctx.componentId,\r\n payload,\r\n timestamp: Date.now(),\r\n userId: this.ctx.getUserId(),\r\n room: this.ctx.getRoom()\r\n }\r\n\r\n if (this.ctx.ws) {\r\n queueWsMessage(this.ctx.ws, message as any)\r\n }\r\n }\r\n\r\n broadcast(type: string, payload: any, excludeCurrentUser = false): void {\r\n const room = this.ctx.getRoom()\r\n if (!room) {\r\n liveWarn('rooms', this.ctx.componentId, `[${this.ctx.componentId}] Cannot broadcast '${type}' - no room set`)\r\n return\r\n }\r\n\r\n const message: BroadcastMessage = {\r\n type,\r\n payload,\r\n room,\r\n excludeUser: excludeCurrentUser ? this.ctx.getUserId() : undefined\r\n }\r\n\r\n liveLog('rooms', this.ctx.componentId, `[${this.ctx.componentId}] Broadcasting '${type}' to room '${room}'`)\r\n\r\n this.ctx.getBroadcastToRoom()(message)\r\n }\r\n}\r\n","// @fluxstack/live - Action Security Manager\r\n//\r\n// Handles action validation, blocked actions, publicActions, rate limiting, Zod schemas.\r\n// Extracted from LiveComponent for single-responsibility.\r\n\r\nconst BLOCKED_ACTIONS: ReadonlySet<string> = new Set([\r\n 'constructor', 'destroy', 'executeAction', 'getSerializableState',\r\n 'onMount', 'onDestroy', 'onConnect', 'onDisconnect',\r\n 'onStateChange', 'onRoomJoin', 'onRoomLeave',\r\n 'onRehydrate', 'onAction',\r\n 'onClientJoin', 'onClientLeave',\r\n 'setState', 'sendBinaryDelta', 'emit', 'broadcast', 'broadcastToRoom',\r\n 'createStateProxy', 'createDirectStateAccessors', 'generateId',\r\n 'setAuthContext', '_resetAuthContext', '$auth',\r\n '$private', '_privateState',\r\n '$persistent',\r\n '_inStateChange',\r\n '$room', '$rooms', 'subscribeToRoom', 'unsubscribeFromRoom',\r\n 'emitRoomEvent', 'onRoomEvent', 'emitRoomEventWithState',\r\n])\r\n\r\nexport interface ActionSecurityContext {\r\n /** The component instance to execute the action on */\r\n component: any\r\n /** Component class (constructor) for reading static properties */\r\n componentClass: {\r\n componentName?: string\r\n name: string\r\n publicActions?: readonly string[]\r\n actionSchemas?: Record<string, { safeParse: (data: unknown) => { success: boolean; error?: any; data?: any } }>\r\n actionRateLimit?: { maxCalls: number; windowMs: number; perAction?: boolean }\r\n }\r\n /** Component id for debugging */\r\n componentId: string\r\n /** Emit function for sending ERROR messages */\r\n emitFn: (type: string, payload: any) => void\r\n}\r\n\r\nexport class ActionSecurityManager {\r\n private _actionCalls = new Map<string, { count: number; windowStart: number }>()\r\n\r\n async validateAndExecute(\r\n action: string,\r\n payload: any,\r\n ctx: ActionSecurityContext\r\n ): Promise<any> {\r\n const actionStart = Date.now()\r\n const { component, componentClass, componentId } = ctx\r\n\r\n try {\r\n // Blocked actions check\r\n if ((BLOCKED_ACTIONS as Set<string>).has(action)) {\r\n throw new Error(`Action '${action}' is not callable`)\r\n }\r\n\r\n // Private prefix check\r\n if (action.startsWith('_') || action.startsWith('#')) {\r\n throw new Error(`Action '${action}' is not callable`)\r\n }\r\n\r\n // publicActions check\r\n const publicActions = componentClass.publicActions\r\n if (!publicActions) {\r\n console.warn(`[SECURITY] Component '${componentClass.componentName || componentClass.name}' has no publicActions defined. All remote actions are blocked.`)\r\n throw new Error(`Action '${action}' is not callable - component has no publicActions defined`)\r\n }\r\n if (!publicActions.includes(action)) {\r\n const methodExists = typeof component[action] === 'function'\r\n if (methodExists) {\r\n const name = componentClass.componentName || componentClass.name\r\n throw new Error(\r\n `Action '${action}' exists on '${name}' but is not listed in publicActions. ` +\r\n `Add it to: static publicActions = [..., '${action}']`\r\n )\r\n }\r\n throw new Error(`Action '${action}' is not callable`)\r\n }\r\n\r\n // Method existence check\r\n const method = component[action]\r\n if (typeof method !== 'function') {\r\n throw new Error(`Action '${action}' not found on component`)\r\n }\r\n\r\n // Prototype pollution guard\r\n if (Object.prototype.hasOwnProperty.call(Object.prototype, action)) {\r\n throw new Error(`Action '${action}' is not callable`)\r\n }\r\n\r\n // Rate limiting\r\n const rateLimit = componentClass.actionRateLimit\r\n if (rateLimit) {\r\n const now = Date.now()\r\n const key = rateLimit.perAction ? action : '*'\r\n let entry = this._actionCalls.get(key)\r\n if (!entry || now - entry.windowStart >= rateLimit.windowMs) {\r\n entry = { count: 0, windowStart: now }\r\n this._actionCalls.set(key, entry)\r\n }\r\n entry.count++\r\n if (entry.count > rateLimit.maxCalls) {\r\n throw new Error(`Action rate limit exceeded (max ${rateLimit.maxCalls} calls per ${rateLimit.windowMs}ms)`)\r\n }\r\n }\r\n\r\n // Zod schema validation\r\n const schemas = componentClass.actionSchemas\r\n if (schemas && schemas[action]) {\r\n const result = schemas[action].safeParse(payload)\r\n if (!result.success) {\r\n const errorMsg = result.error?.message || result.error?.issues?.map((i: any) => i.message).join(', ') || 'Invalid payload'\r\n throw new Error(`Action '${action}' payload validation failed: ${errorMsg}`)\r\n }\r\n payload = result.data ?? payload\r\n }\r\n\r\n // onAction hook\r\n let hookResult: void | false | Promise<void | false>\r\n try {\r\n hookResult = await component.onAction(action, payload)\r\n } catch (hookError: any) {\r\n ctx.emitFn('ERROR', {\r\n action,\r\n error: `Action '${action}' failed pre-validation`\r\n })\r\n throw hookError\r\n }\r\n if (hookResult === false) {\r\n throw new Error(`Action '${action}' was cancelled`)\r\n }\r\n\r\n // Execute action\r\n const result = await method.call(component, payload)\r\n\r\n return result\r\n } catch (error: any) {\r\n if (!error.message?.includes('was cancelled') && !error.message?.includes('pre-validation')) {\r\n ctx.emitFn('ERROR', {\r\n action,\r\n error: error.message\r\n })\r\n }\r\n throw error\r\n }\r\n }\r\n}\r\n","// @fluxstack/live - Component Room Proxy Manager\r\n//\r\n// Handles $room proxy, $rooms, room event pub/sub, join/leave lifecycle.\r\n// Extracted from LiveComponent for single-responsibility.\r\n//\r\n// The context getter is lazy — getLiveComponentContext() is only called when\r\n// room features are actually used, not at construction time. This preserves\r\n// backward compatibility with tests that construct LiveComponent without a\r\n// running LiveServer.\r\n\r\nimport type { GenericWebSocket } from '../../transport/types'\r\nimport type { LiveComponentContext } from '../context'\r\nimport type { ServerRoomHandle, ServerRoomProxy } from '../../protocol/messages'\r\nimport type { LiveRoom, LiveRoomClass } from '../../rooms/LiveRoom'\r\nimport { liveLog, liveWarn } from '../../debug/LiveLogger'\r\nimport { sendImmediate } from '../../transport/WsSendBatcher'\r\n\r\nexport interface RoomProxyContext {\r\n componentId: string\r\n ws: GenericWebSocket\r\n defaultRoom?: string\r\n /** Lazy getter — only called when room features are used */\r\n getCtx: () => LiveComponentContext\r\n setStateFn: (updates: any) => void\r\n /** Deep diff setting for rooms (from component $options). Default: true */\r\n deepDiff?: boolean\r\n /** Max recursion depth for deep diff. Default: 3 */\r\n deepDiffDepth?: number\r\n /** When true, only server-side code can set room state. Default: false */\r\n serverOnlyState?: boolean\r\n}\r\n\r\n/** Keys that belong to the handle/proxy itself — never fall through to state */\r\nconst RESERVED_KEYS = new Set<string | symbol>([\r\n 'id', 'state', 'join', 'leave', 'emit', 'on', 'setState',\r\n // Function internals (proxy wraps a function)\r\n 'call', 'apply', 'bind', 'prototype', 'length', 'name', 'arguments', 'caller',\r\n // Symbol keys\r\n Symbol.toPrimitive, Symbol.toStringTag, Symbol.hasInstance,\r\n])\r\n\r\n/** Keys reserved on the typed LiveRoom handle — framework API keys */\r\nconst TYPED_RESERVED_KEYS = new Set<string | symbol>([\r\n 'id', 'state', 'meta', 'join', 'leave', 'emit', 'on', 'setState', 'memberCount',\r\n // Proxy internals\r\n 'then', 'toJSON', 'valueOf', 'toString',\r\n Symbol.toPrimitive, Symbol.toStringTag, Symbol.hasInstance,\r\n])\r\n\r\n/** Wrap a handle/proxy so unknown property access falls through to state */\r\nfunction wrapWithStateProxy<T extends object>(\r\n target: T,\r\n getState: () => any,\r\n setState: (updates: any) => void,\r\n): T {\r\n return new Proxy(target, {\r\n get(obj, prop, receiver) {\r\n // Reserved keys → delegate to the original object\r\n if (RESERVED_KEYS.has(prop) || typeof prop === 'symbol') {\r\n return Reflect.get(obj, prop, receiver)\r\n }\r\n // Check if prop exists on the target itself first (defined properties)\r\n const desc = Object.getOwnPropertyDescriptor(obj, prop)\r\n if (desc) return Reflect.get(obj, prop, receiver)\r\n // Prototype methods (e.g. toString)\r\n if (prop in obj) return Reflect.get(obj, prop, receiver)\r\n // Fall through → read from room state\r\n const st = getState()\r\n return st?.[prop]\r\n },\r\n set(_obj, prop, value) {\r\n if (typeof prop === 'symbol') return false\r\n // Write to room state via setState\r\n setState({ [prop]: value })\r\n return true\r\n },\r\n })\r\n}\r\n\r\nexport class ComponentRoomProxy {\r\n private roomEventUnsubscribers: (() => void)[] = []\r\n private joinedRooms: Set<string> = new Set()\r\n private roomHandles: Map<string, ServerRoomHandle> = new Map()\r\n private _roomProxy: ServerRoomProxy | null = null\r\n private _roomsCache: string[] | null = null\r\n private _cachedCtx: LiveComponentContext | null = null\r\n\r\n public roomType: string = 'default'\r\n public room?: string\r\n\r\n private componentId: string\r\n private ws: GenericWebSocket\r\n private getCtx: () => LiveComponentContext\r\n private setStateFn: (updates: any) => void\r\n private _deepDiff: boolean\r\n private _deepDiffDepth: number | undefined\r\n private _serverOnlyState: boolean\r\n\r\n constructor(rctx: RoomProxyContext) {\r\n this.componentId = rctx.componentId\r\n this.ws = rctx.ws\r\n this.room = rctx.defaultRoom\r\n this.getCtx = rctx.getCtx\r\n this.setStateFn = rctx.setStateFn\r\n this._deepDiff = rctx.deepDiff ?? true\r\n this._deepDiffDepth = rctx.deepDiffDepth\r\n this._serverOnlyState = rctx.serverOnlyState ?? false\r\n\r\n // Auto-join default room if specified\r\n if (this.room) {\r\n this.joinedRooms.add(this.room)\r\n this.ctx.roomManager.joinRoom(this.componentId, this.room, this.ws, undefined, { deepDiff: this._deepDiff, deepDiffDepth: this._deepDiffDepth, serverOnlyState: this._serverOnlyState })\r\n }\r\n }\r\n\r\n /** Lazy context resolution — cached after first access */\r\n private get ctx(): LiveComponentContext {\r\n if (!this._cachedCtx) {\r\n this._cachedCtx = this.getCtx()\r\n }\r\n return this._cachedCtx\r\n }\r\n\r\n get $room(): ServerRoomProxy {\r\n if (this._roomProxy) return this._roomProxy\r\n\r\n const self = this\r\n\r\n const createHandle = (roomId: string): ServerRoomHandle => {\r\n if (this.roomHandles.has(roomId)) {\r\n return this.roomHandles.get(roomId)!\r\n }\r\n\r\n const handle: ServerRoomHandle = {\r\n get id() { return roomId },\r\n get state() { return self.ctx.roomManager.getRoomState(roomId) },\r\n\r\n join: (initialState?: any) => {\r\n if (self.joinedRooms.has(roomId)) return\r\n self.joinedRooms.add(roomId)\r\n self._roomsCache = null\r\n self.ctx.roomManager.joinRoom(self.componentId, roomId, self.ws, initialState, { deepDiff: self._deepDiff, deepDiffDepth: self._deepDiffDepth, serverOnlyState: self._serverOnlyState })\r\n // onRoomJoin hook is called from LiveComponent\r\n },\r\n\r\n leave: () => {\r\n if (!self.joinedRooms.has(roomId)) return\r\n self.joinedRooms.delete(roomId)\r\n self._roomsCache = null\r\n self.ctx.roomManager.leaveRoom(self.componentId, roomId)\r\n // onRoomLeave hook is called from LiveComponent\r\n },\r\n\r\n emit: (event: string, data: any): number => {\r\n return self.ctx.roomManager.emitToRoom(roomId, event, data, self.componentId)\r\n },\r\n\r\n on: (event: string, handler: (data: any) => void): (() => void) => {\r\n const unsubscribe = self.ctx.roomEvents.on(\r\n 'room',\r\n roomId,\r\n event,\r\n self.componentId,\r\n handler\r\n )\r\n self.roomEventUnsubscribers.push(unsubscribe)\r\n return unsubscribe\r\n },\r\n\r\n setState: (updates: any) => {\r\n self.ctx.roomManager.setRoomState(roomId, updates, self.componentId)\r\n }\r\n }\r\n\r\n const proxied = wrapWithStateProxy(\r\n handle,\r\n () => self.ctx.roomManager.getRoomState(roomId),\r\n (updates: any) => self.ctx.roomManager.setRoomState(roomId, updates, self.componentId),\r\n )\r\n this.roomHandles.set(roomId, proxied)\r\n return proxied\r\n }\r\n\r\n // Overloaded: $room('roomId') → untyped handle, $room(ChatRoom, 'lobby') → typed handle\r\n const proxyFn = ((roomIdOrClass: string | LiveRoomClass, instanceId?: string) => {\r\n if (typeof roomIdOrClass === 'function' && instanceId !== undefined) {\r\n return self.$typedRoom(roomIdOrClass as LiveRoomClass<any>, instanceId)\r\n }\r\n return createHandle(roomIdOrClass as string)\r\n }) as ServerRoomProxy\r\n\r\n const defaultHandle = this.room ? createHandle(this.room) : null\r\n\r\n Object.defineProperties(proxyFn, {\r\n id: { get: () => self.room },\r\n state: { get: () => defaultHandle?.state ?? {} },\r\n join: {\r\n value: (initialState?: any) => {\r\n if (!defaultHandle) throw new Error('No default room set')\r\n defaultHandle.join(initialState)\r\n }\r\n },\r\n leave: {\r\n value: () => {\r\n if (!defaultHandle) throw new Error('No default room set')\r\n defaultHandle.leave()\r\n }\r\n },\r\n emit: {\r\n value: (event: string, data: any) => {\r\n if (!defaultHandle) throw new Error('No default room set')\r\n return defaultHandle.emit(event, data)\r\n }\r\n },\r\n on: {\r\n value: (event: string, handler: (data: any) => void) => {\r\n if (!defaultHandle) throw new Error('No default room set')\r\n return defaultHandle.on(event, handler)\r\n }\r\n },\r\n setState: {\r\n value: (updates: any) => {\r\n if (!defaultHandle) throw new Error('No default room set')\r\n defaultHandle.setState(updates)\r\n }\r\n }\r\n })\r\n\r\n // Wrap the top-level proxy so $room.players reads from default room state\r\n const defaultRoom = this.room\r\n const wrapped = defaultRoom\r\n ? wrapWithStateProxy(\r\n proxyFn,\r\n () => self.ctx.roomManager.getRoomState(defaultRoom),\r\n (updates: any) => self.ctx.roomManager.setRoomState(defaultRoom, updates, self.componentId),\r\n )\r\n : proxyFn\r\n\r\n this._roomProxy = wrapped as ServerRoomProxy\r\n return wrapped as ServerRoomProxy\r\n }\r\n\r\n /**\r\n * Get a typed room handle backed by a LiveRoom class.\r\n *\r\n * Usage: `this.$room(ChatRoom, 'lobby')` → typed handle with custom methods\r\n *\r\n * The returned handle exposes:\r\n * - `.id`, `.state`, `.meta`, `.memberCount` — framework properties\r\n * - `.join(payload?)`, `.leave()`, `.emit()`, `.on()`, `.setState()` — framework API\r\n * - Any custom method defined on the LiveRoom subclass (e.g. `.addMessage()`, `.ban()`)\r\n *\r\n * The compound room ID is `${roomClass.roomName}:${instanceId}`.\r\n */\r\n $typedRoom<R extends LiveRoom<any, any, any>>(\r\n roomClass: LiveRoomClass<R>,\r\n instanceId: string,\r\n ): R & {\r\n readonly id: string\r\n join: (payload?: any) => { rejected?: false } | { rejected: true; reason: string }\r\n leave: () => void\r\n emit: R['emit']\r\n on: <K extends string>(event: K, handler: (data: any) => void) => () => void\r\n setState: (updates: Partial<R['state']>) => void\r\n readonly memberCount: number\r\n } {\r\n const roomId = `${roomClass.roomName}:${instanceId}`\r\n const self = this\r\n\r\n // Return cached handle if it exists\r\n const cached = this.roomHandles.get(roomId)\r\n if (cached) return cached as any\r\n\r\n const handle = {\r\n get id() { return roomId },\r\n\r\n get state(): R['state'] {\r\n const instance = self.ctx.roomManager.getRoomInstance?.(roomId)\r\n return instance ? instance.state : self.ctx.roomManager.getRoomState(roomId)\r\n },\r\n\r\n get meta(): R['meta'] {\r\n const instance = self.ctx.roomManager.getRoomInstance?.(roomId)\r\n if (!instance) throw new Error(`Room '${roomId}' not found or not backed by a LiveRoom class`)\r\n return instance.meta\r\n },\r\n\r\n get memberCount(): number {\r\n return self.ctx.roomManager.getMemberCount?.(roomId) ?? 0\r\n },\r\n\r\n join: (payload?: any): { rejected?: false } | { rejected: true; reason: string } => {\r\n if (self.joinedRooms.has(roomId)) return {}\r\n const result = self.ctx.roomManager.joinRoom(\r\n self.componentId, roomId, self.ws, undefined, undefined,\r\n { userId: undefined, payload },\r\n )\r\n if ('rejected' in result && result.rejected) {\r\n return result\r\n }\r\n self.joinedRooms.add(roomId)\r\n self._roomsCache = null\r\n // Notify client about server-initiated join with initial state\r\n sendImmediate(self.ws, JSON.stringify({\r\n type: 'ROOM_JOINED',\r\n componentId: self.componentId,\r\n roomId: roomId,\r\n event: '$room:joined',\r\n data: { state: result.state },\r\n timestamp: Date.now(),\r\n }))\r\n return {}\r\n },\r\n\r\n leave: () => {\r\n if (!self.joinedRooms.has(roomId)) return\r\n self.joinedRooms.delete(roomId)\r\n self._roomsCache = null\r\n self.ctx.roomManager.leaveRoom(self.componentId, roomId, 'leave')\r\n },\r\n\r\n emit: ((event: string, data: any): number => {\r\n return self.ctx.roomManager.emitToRoom(roomId, event, data, self.componentId)\r\n }) as R['emit'],\r\n\r\n on: (event: string, handler: (data: any) => void): (() => void) => {\r\n const unsubscribe = self.ctx.roomEvents.on(\r\n 'room', roomId, event, self.componentId, handler,\r\n )\r\n self.roomEventUnsubscribers.push(unsubscribe)\r\n return unsubscribe\r\n },\r\n\r\n setState: (updates: any) => {\r\n self.ctx.roomManager.setRoomState(roomId, updates, self.componentId)\r\n },\r\n }\r\n\r\n // Create a Proxy that falls through to the LiveRoom instance for custom methods\r\n const proxied = new Proxy(handle, {\r\n get(obj, prop, receiver) {\r\n // Reserved framework keys → handle\r\n if (TYPED_RESERVED_KEYS.has(prop) || typeof prop === 'symbol') {\r\n return Reflect.get(obj, prop, receiver)\r\n }\r\n // Check handle own properties first\r\n if (prop in obj) return Reflect.get(obj, prop, receiver)\r\n // Fall through to LiveRoom instance (custom methods like addMessage, ban, etc.)\r\n const instance = self.ctx.roomManager.getRoomInstance?.(roomId)\r\n if (instance && prop in instance) {\r\n const val = (instance as any)[prop]\r\n // Bind methods to the instance\r\n return typeof val === 'function' ? val.bind(instance) : val\r\n }\r\n return undefined\r\n },\r\n })\r\n\r\n this.roomHandles.set(roomId, proxied as any)\r\n return proxied as any\r\n }\r\n\r\n get $rooms(): string[] {\r\n if (this._roomsCache) return this._roomsCache\r\n this._roomsCache = Array.from(this.joinedRooms)\r\n return this._roomsCache\r\n }\r\n\r\n getJoinedRooms(): Set<string> {\r\n return this.joinedRooms\r\n }\r\n\r\n emitRoomEvent(event: string, data: any, notifySelf = false): number {\r\n if (!this.room) {\r\n liveWarn('rooms', this.componentId, `[${this.componentId}] Cannot emit room event '${event}' - no room set`)\r\n return 0\r\n }\r\n\r\n const excludeId = notifySelf ? undefined : this.componentId\r\n const notified = this.ctx.roomEvents.emit(this.roomType, this.room, event, data, excludeId)\r\n\r\n liveLog('rooms', this.componentId, `[${this.componentId}] Room event '${event}' -> ${notified} components`)\r\n\r\n return notified\r\n }\r\n\r\n onRoomEvent<T = any>(event: string, handler: (data: T) => void): void {\r\n if (!this.room) {\r\n liveWarn('rooms', this.componentId, `[${this.componentId}] Cannot subscribe to room event '${event}' - no room set`)\r\n return\r\n }\r\n\r\n const unsubscribe = this.ctx.roomEvents.on(\r\n this.roomType,\r\n this.room,\r\n event,\r\n this.componentId,\r\n handler\r\n )\r\n\r\n this.roomEventUnsubscribers.push(unsubscribe)\r\n\r\n liveLog('rooms', this.componentId, `[${this.componentId}] Subscribed to room event '${event}'`)\r\n }\r\n\r\n emitRoomEventWithState(event: string, data: any, stateUpdates: any): number {\r\n this.setStateFn(stateUpdates)\r\n return this.emitRoomEvent(event, data, false)\r\n }\r\n\r\n subscribeToRoom(roomId: string): void {\r\n this.room = roomId\r\n }\r\n\r\n unsubscribeFromRoom(): void {\r\n this.room = undefined\r\n }\r\n\r\n destroy(): void {\r\n for (const unsubscribe of this.roomEventUnsubscribers) {\r\n unsubscribe()\r\n }\r\n this.roomEventUnsubscribers = []\r\n\r\n // Only access ctx if we have joined rooms (avoids throwing when no context exists)\r\n if (this.joinedRooms.size > 0 && this._cachedCtx) {\r\n for (const roomId of this.joinedRooms) {\r\n this._cachedCtx.roomManager.leaveRoom(this.componentId, roomId)\r\n }\r\n }\r\n this.joinedRooms.clear()\r\n this.roomHandles.clear()\r\n this._roomProxy = null\r\n this._roomsCache = null\r\n }\r\n}\r\n","// @fluxstack/live - LiveComponent Base Class\r\n//\r\n// Framework-agnostic base class for server-side Live Components.\r\n// Uses getLiveComponentContext() for dependency injection instead of global singletons.\r\n//\r\n// Internally delegates to focused managers (composition pattern):\r\n// - ComponentStateManager: reactive state, proxy, binary delta\r\n// - ComponentMessaging: emit(), broadcast()\r\n// - ActionSecurityManager: action validation, rate limiting, Zod\r\n// - ComponentRoomProxy: $room, $rooms, room events\r\n\r\nimport { getLiveComponentContext } from './context'\r\nimport type { GenericWebSocket } from '../transport/types'\r\nimport type { LiveAuthContext, LiveComponentAuth, LiveActionAuthMap } from '../auth/types'\r\nimport { ANONYMOUS_CONTEXT } from '../auth/LiveAuthContext'\r\nimport type { BroadcastMessage, ComponentState, ServerRoomProxy } from '../protocol/messages'\r\nimport type { LiveRoom, LiveRoomClass } from '../rooms/LiveRoom'\r\n\r\n// Managers\r\nimport { ComponentStateManager } from './managers/ComponentStateManager'\r\nimport { ComponentMessaging, EMIT_OVERRIDE_KEY } from './managers/ComponentMessaging'\r\nimport { ActionSecurityManager } from './managers/ActionSecurityManager'\r\nimport { ComponentRoomProxy } from './managers/ComponentRoomProxy'\r\n\r\n// Re-export EMIT_OVERRIDE_KEY for external consumers\r\nexport { EMIT_OVERRIDE_KEY }\r\n\r\nexport interface ComponentOptions {\r\n /** Enable deep diff for plain objects in setState(). Default: false */\r\n deepDiff?: boolean\r\n /** Enable deep diff for room state updates. Default: true */\r\n roomDeepDiff?: boolean\r\n /** Max recursion depth for deep diff (component + room). Default: 3 */\r\n deepDiffDepth?: number\r\n /** When true, room state can only be set from server-side code. Client ROOM_STATE_SET is rejected. Default: false */\r\n serverOnlyRoomState?: boolean\r\n}\r\n\r\nexport abstract class LiveComponent<\r\n TState = ComponentState,\r\n TPrivate extends Record<string, any> = Record<string, any>\r\n> {\r\n /** Component name for registry lookup - must be defined in subclasses */\r\n static componentName: string\r\n /** Default state - must be defined in subclasses */\r\n static defaultState: any\r\n\r\n /**\r\n * Per-component logging control. Silent by default.\r\n *\r\n * @example\r\n * static logging = true // all categories\r\n * static logging = ['lifecycle', 'messages'] // specific categories\r\n */\r\n static logging?: boolean | readonly ('lifecycle' | 'messages' | 'state' | 'performance' | 'rooms' | 'websocket')[]\r\n\r\n /**\r\n * Component-level auth configuration.\r\n */\r\n static auth?: LiveComponentAuth\r\n\r\n /**\r\n * Per-action auth configuration.\r\n */\r\n static actionAuth?: LiveActionAuthMap\r\n\r\n /**\r\n * Zod schemas for action payload validation.\r\n * When defined, payloads are validated before the action method is called.\r\n *\r\n * @example\r\n * static actionSchemas = {\r\n * sendMessage: z.object({ text: z.string().max(500) }),\r\n * updatePosition: z.object({ x: z.number(), y: z.number() }),\r\n * }\r\n */\r\n static actionSchemas?: Record<string, { safeParse: (data: unknown) => { success: boolean; error?: any; data?: any } }>\r\n\r\n /**\r\n * Rate limit for action execution.\r\n * Prevents clients from spamming expensive operations.\r\n *\r\n * @example\r\n * static actionRateLimit = { maxCalls: 10, windowMs: 1000, perAction: true }\r\n */\r\n static actionRateLimit?: {\r\n maxCalls: number\r\n windowMs: number\r\n perAction?: boolean\r\n }\r\n\r\n /**\r\n * Data that survives HMR reloads.\r\n */\r\n static persistent?: Record<string, any>\r\n\r\n /**\r\n * When true, only ONE server-side instance exists for this component.\r\n * All clients share the same state.\r\n */\r\n static singleton?: boolean\r\n\r\n /**\r\n * Component behavior options.\r\n *\r\n * @example\r\n * static $options = { deepDiff: true }\r\n */\r\n static $options?: ComponentOptions\r\n\r\n public readonly id: string\r\n public state: TState // Proxy wrapper (getter delegates to _stateManager)\r\n protected ws: GenericWebSocket\r\n public room?: string\r\n public userId?: string\r\n public broadcastToRoom: (message: BroadcastMessage) => void = () => {}\r\n\r\n // Server-only private state (NEVER sent to client)\r\n private _privateState: TPrivate = {} as TPrivate\r\n\r\n // Auth context (injected by registry during mount, immutable after first set)\r\n private _authContext: LiveAuthContext = ANONYMOUS_CONTEXT\r\n private _authContextSet = false\r\n\r\n // Room type for typed events (override in subclass)\r\n protected roomType: string = 'default'\r\n\r\n // Singleton emit override\r\n public [EMIT_OVERRIDE_KEY]: ((type: string, payload: any) => void) | null = null\r\n\r\n // ===== Internal Managers (composition) =====\r\n private _stateManager: ComponentStateManager<TState>\r\n private _messaging: ComponentMessaging\r\n private _actionSecurity: ActionSecurityManager\r\n private _roomProxyManager: ComponentRoomProxy\r\n\r\n static publicActions?: readonly string[]\r\n\r\n constructor(initialState: Partial<TState>, ws: GenericWebSocket, options?: { room?: string; userId?: string }) {\r\n this.id = this.generateId()\r\n const ctor = this.constructor as typeof LiveComponent\r\n this.ws = ws\r\n this.room = options?.room\r\n this.userId = options?.userId\r\n\r\n // 1. Messaging (needed by state manager for emit)\r\n this._messaging = new ComponentMessaging({\r\n componentId: this.id,\r\n ws: this.ws,\r\n getUserId: () => this.userId,\r\n getRoom: () => this.room,\r\n getBroadcastToRoom: () => this.broadcastToRoom,\r\n getEmitOverride: () => this[EMIT_OVERRIDE_KEY],\r\n })\r\n\r\n // 2. State manager\r\n this._stateManager = new ComponentStateManager<TState>({\r\n componentId: this.id,\r\n initialState: { ...ctor.defaultState, ...initialState } as TState,\r\n ws: this.ws,\r\n emitFn: (type, payload) => this._messaging.emit(type, payload),\r\n onStateChangeFn: (changes) => this.onStateChange(changes),\r\n deepDiff: (ctor as any).$options?.deepDiff ?? false,\r\n deepDiffDepth: (ctor as any).$options?.deepDiffDepth,\r\n })\r\n\r\n // Expose proxy state as `this.state`\r\n this.state = this._stateManager.proxyState\r\n\r\n // 3. Action security\r\n this._actionSecurity = new ActionSecurityManager()\r\n\r\n // 4. Room proxy (context resolved lazily — only when room features are used)\r\n this._roomProxyManager = new ComponentRoomProxy({\r\n componentId: this.id,\r\n ws: this.ws,\r\n defaultRoom: this.room,\r\n getCtx: () => getLiveComponentContext(),\r\n setStateFn: (updates: any) => this.setState(updates),\r\n deepDiff: (ctor as any).$options?.roomDeepDiff,\r\n deepDiffDepth: (ctor as any).$options?.deepDiffDepth,\r\n serverOnlyState: (ctor as any).$options?.serverOnlyRoomState,\r\n })\r\n\r\n // Create direct property accessors (this.count instead of this.state.count)\r\n this._stateManager.applyDirectAccessors(this, this.constructor as Function)\r\n }\r\n\r\n // ========================================\r\n // $private - Server-Only State\r\n // ========================================\r\n\r\n public get $private(): TPrivate {\r\n return this._privateState\r\n }\r\n\r\n // ========================================\r\n // $room - Unified Room System\r\n // ========================================\r\n\r\n /**\r\n * Unified room accessor.\r\n *\r\n * Usage:\r\n * - `this.$room` — default room handle (legacy)\r\n * - `this.$room('roomId')` — untyped room handle (legacy)\r\n * - `this.$room(ChatRoom, 'lobby')` — typed handle with custom methods\r\n */\r\n public get $room(): ServerRoomProxy & {\r\n <R extends LiveRoom<any, any, any>>(roomClass: LiveRoomClass<R>, instanceId: string): R & {\r\n readonly id: string\r\n join: (payload?: any) => { rejected?: false } | { rejected: true; reason: string }\r\n leave: () => void\r\n emit: R['emit']\r\n on: <K extends string>(event: K, handler: (data: any) => void) => () => void\r\n setState: (updates: Partial<R['state']>) => void\r\n readonly memberCount: number\r\n }\r\n } {\r\n return this._roomProxyManager.$room as any\r\n }\r\n\r\n /**\r\n * List of room IDs this component is participating in.\r\n * Cached — invalidated on join/leave.\r\n */\r\n public get $rooms(): string[] {\r\n return this._roomProxyManager.$rooms\r\n }\r\n\r\n // ========================================\r\n // $auth - Authentication Context\r\n // ========================================\r\n\r\n public get $auth(): LiveAuthContext {\r\n return this._authContext\r\n }\r\n\r\n /** @internal - Immutable after first set to prevent privilege escalation */\r\n public setAuthContext(context: LiveAuthContext): void {\r\n if (this._authContextSet) {\r\n throw new Error('Auth context is immutable after initial set')\r\n }\r\n this._authContext = context\r\n this._authContextSet = true\r\n if (context.authenticated && context.user?.id && !this.userId) {\r\n this.userId = context.user.id\r\n }\r\n }\r\n\r\n /** @internal - Reset auth context (for registry use in reconnection) */\r\n public _resetAuthContext(): void {\r\n this._authContextSet = false\r\n this._authContext = ANONYMOUS_CONTEXT\r\n }\r\n\r\n // ========================================\r\n // $persistent - HMR-Safe State\r\n // ========================================\r\n\r\n public get $persistent(): Record<string, any> {\r\n const ctor = this.constructor as typeof LiveComponent\r\n const name = ctor.componentName || ctor.name\r\n const key = `__fluxstack_persistent_${name}`\r\n\r\n if (!(globalThis as any)[key]) {\r\n (globalThis as any)[key] = { ...(ctor as any).persistent || {} }\r\n }\r\n\r\n return (globalThis as any)[key]\r\n }\r\n\r\n // ========================================\r\n // Lifecycle Hooks\r\n // ========================================\r\n\r\n protected onConnect(): void {}\r\n protected onMount(): void | Promise<void> {}\r\n protected onDisconnect(): void {}\r\n protected onDestroy(): void {}\r\n protected onStateChange(changes: Partial<TState>): void {}\r\n protected onRoomJoin(roomId: string): void {}\r\n protected onRoomLeave(roomId: string): void {}\r\n protected onRehydrate(previousState: TState): void {}\r\n protected onAction(action: string, payload: any): void | false | Promise<void | false> {}\r\n protected onClientJoin(connectionId: string, connectionCount: number): void {}\r\n protected onClientLeave(connectionId: string, connectionCount: number): void {}\r\n\r\n // ========================================\r\n // State Management (delegates to _stateManager)\r\n // ========================================\r\n\r\n public setState(updates: Partial<TState> | ((prev: TState) => Partial<TState>)) {\r\n this._stateManager.setState(updates)\r\n }\r\n\r\n /**\r\n * Send a binary-encoded state delta directly over WebSocket.\r\n * Updates internal state (same as setState) then sends the encoder's output\r\n * as a binary frame: [0x01][idLen:u8][id_bytes:utf8][payload_bytes].\r\n * Bypasses the JSON batcher — ideal for high-frequency updates.\r\n */\r\n public sendBinaryDelta(\r\n delta: Partial<TState>,\r\n encoder: (delta: Partial<TState>) => Uint8Array\r\n ): void {\r\n this._stateManager.sendBinaryDelta(delta, encoder)\r\n }\r\n\r\n public setValue<K extends keyof TState>(payload: { key: K; value: TState[K] }): { success: true; key: K; value: TState[K] } {\r\n return this._stateManager.setValue(payload)\r\n }\r\n\r\n // ========================================\r\n // Action Execution (delegates to _actionSecurity)\r\n // ========================================\r\n\r\n public async executeAction(action: string, payload: any): Promise<any> {\r\n return this._actionSecurity.validateAndExecute(action, payload, {\r\n component: this,\r\n componentClass: this.constructor as any,\r\n componentId: this.id,\r\n emitFn: (type, p) => this.emit(type, p),\r\n })\r\n }\r\n\r\n // ========================================\r\n // Messaging (delegates to _messaging)\r\n // ========================================\r\n\r\n protected emit(type: string, payload: any) {\r\n this._messaging.emit(type, payload)\r\n }\r\n\r\n protected broadcast(type: string, payload: any, excludeCurrentUser = false) {\r\n this._messaging.broadcast(type, payload, excludeCurrentUser)\r\n }\r\n\r\n // ========================================\r\n // Room Events (delegates to _roomProxyManager)\r\n // ========================================\r\n\r\n protected emitRoomEvent(event: string, data: any, notifySelf = false): number {\r\n return this._roomProxyManager.emitRoomEvent(event, data, notifySelf)\r\n }\r\n\r\n protected onRoomEvent<T = any>(event: string, handler: (data: T) => void): void {\r\n this._roomProxyManager.onRoomEvent(event, handler)\r\n }\r\n\r\n protected emitRoomEventWithState(event: string, data: any, stateUpdates: Partial<TState>): number {\r\n return this._roomProxyManager.emitRoomEventWithState(event, data, stateUpdates)\r\n }\r\n\r\n protected subscribeToRoom(roomId: string) {\r\n this._roomProxyManager.subscribeToRoom(roomId)\r\n this.room = roomId\r\n }\r\n\r\n protected unsubscribeFromRoom() {\r\n this._roomProxyManager.unsubscribeFromRoom()\r\n this.room = undefined\r\n }\r\n\r\n // ========================================\r\n // Internal\r\n // ========================================\r\n\r\n private generateId(): string {\r\n return `live-${crypto.randomUUID()}`\r\n }\r\n\r\n public destroy() {\r\n try {\r\n this.onDestroy()\r\n } catch (err: any) {\r\n console.error(`[${this.id}] onDestroy error:`, err?.message || err)\r\n }\r\n\r\n // Cleanup room proxy (unsubscribers, leave rooms, clear handles)\r\n this._roomProxyManager.destroy()\r\n\r\n // Cleanup state manager (cached bytes)\r\n this._stateManager.cleanup()\r\n\r\n // Clear private state\r\n this._privateState = {} as TPrivate\r\n\r\n // Clear room on this instance\r\n this.room = undefined\r\n }\r\n\r\n public getSerializableState(): TState {\r\n return this._stateManager.getSerializableState()\r\n }\r\n}\r\n","// @fluxstack/live - Component Registry\r\n//\r\n// Enhanced component registry with lifecycle management, health monitoring,\r\n// state signing, singleton support, and auto-discovery.\r\n\r\nimport type { LiveComponent } from './LiveComponent'\r\nimport { EMIT_OVERRIDE_KEY } from './LiveComponent'\r\nimport type { GenericWebSocket, LiveWSData } from '../transport/types'\r\nimport { queueWsMessage, sendImmediate } from '../transport/WsSendBatcher'\r\nimport type { LiveMessage, BroadcastMessage, ComponentDefinition } from '../protocol/messages'\r\nimport type { LiveComponentAuth, LiveActionAuthMap } from '../auth/types'\r\nimport { ANONYMOUS_CONTEXT } from '../auth/LiveAuthContext'\r\nimport type { LiveAuthManager } from '../auth/LiveAuthManager'\r\nimport type { StateSignatureManager, SignedState } from '../security/StateSignature'\r\nimport type { PerformanceMonitor } from '../monitoring/PerformanceMonitor'\r\nimport { liveLog, registerComponentLogging, unregisterComponentLogging } from '../debug/LiveLogger'\r\nimport type { IClusterAdapter, ClusterActionRequest, ClusterActionResponse } from '../cluster/types'\r\n\r\nexport interface ComponentMetadata {\r\n id: string\r\n name: string\r\n version: string\r\n mountedAt: Date\r\n lastActivity: Date\r\n state: 'mounting' | 'active' | 'inactive' | 'error' | 'destroying'\r\n healthStatus: 'healthy' | 'degraded' | 'unhealthy'\r\n dependencies: string[]\r\n services: Map<string, any>\r\n metrics: ComponentMetrics\r\n migrationHistory: StateMigration[]\r\n}\r\n\r\nexport interface ComponentMetrics {\r\n renderCount: number\r\n actionCount: number\r\n errorCount: number\r\n averageRenderTime: number\r\n memoryUsage: number\r\n lastRenderTime?: number\r\n}\r\n\r\nexport interface StateMigration {\r\n fromVersion: string\r\n toVersion: string\r\n migratedAt: Date\r\n success: boolean\r\n error?: string\r\n}\r\n\r\nexport interface ComponentRegistryDeps {\r\n authManager: LiveAuthManager\r\n stateSignature: StateSignatureManager\r\n performanceMonitor: PerformanceMonitor\r\n cluster?: IClusterAdapter\r\n}\r\n\r\n/** Remote singleton proxy — represents a singleton owned by another server instance. */\r\ninterface RemoteSingletonEntry {\r\n componentName: string\r\n componentId: string\r\n ownerInstanceId: string\r\n lastState: any\r\n connections: Map<string, GenericWebSocket>\r\n}\r\n\r\nexport class ComponentRegistry {\r\n private components = new Map<string, LiveComponent>()\r\n private definitions = new Map<string, ComponentDefinition<any>>()\r\n private metadata = new Map<string, ComponentMetadata>()\r\n private rooms = new Map<string, Set<string>>()\r\n private wsConnections = new Map<string, GenericWebSocket>()\r\n private autoDiscoveredComponents = new Map<string, new (initialState: any, ws: GenericWebSocket, options?: { room?: string; userId?: string }) => LiveComponent<any>>()\r\n private healthCheckInterval?: ReturnType<typeof setInterval>\r\n private singletons = new Map<string, { instance: LiveComponent; connections: Map<string, GenericWebSocket> }>()\r\n private remoteSingletons = new Map<string, RemoteSingletonEntry>()\r\n private cluster?: IClusterAdapter\r\n\r\n private authManager: LiveAuthManager\r\n private stateSignature: StateSignatureManager\r\n private performanceMonitor: PerformanceMonitor\r\n\r\n constructor(deps: ComponentRegistryDeps) {\r\n this.authManager = deps.authManager\r\n this.stateSignature = deps.stateSignature\r\n this.performanceMonitor = deps.performanceMonitor\r\n this.cluster = deps.cluster\r\n\r\n this.setupHealthMonitoring()\r\n this.setupClusterHandlers()\r\n }\r\n\r\n /** Set up handlers for incoming cluster messages (deltas, forwarded actions). */\r\n private setupClusterHandlers(): void {\r\n if (!this.cluster) return\r\n\r\n // Handle incoming state deltas from other instances (for remote singletons)\r\n this.cluster.onDelta((componentId, componentName, delta, sourceInstanceId) => {\r\n const remote = this.remoteSingletons.get(componentName)\r\n if (!remote || remote.componentId !== componentId) return\r\n\r\n // Apply delta to local cache\r\n if (delta && remote.lastState) {\r\n Object.assign(remote.lastState, delta)\r\n }\r\n\r\n // Forward STATE_DELTA to all local WebSocket connections interested in this singleton\r\n const message = JSON.stringify({\r\n type: 'STATE_DELTA',\r\n componentId,\r\n payload: { delta },\r\n timestamp: Date.now()\r\n })\r\n const dead: string[] = []\r\n for (const [connId, ws] of remote.connections) {\r\n if (ws.readyState === 1) {\r\n try { ws.send(message) } catch { dead.push(connId) }\r\n } else {\r\n dead.push(connId)\r\n }\r\n }\r\n for (const connId of dead) remote.connections.delete(connId)\r\n })\r\n\r\n // Handle ownership loss (split-brain detection during heartbeat)\r\n this.cluster.onOwnershipLost((componentName: string) => {\r\n const singleton = this.singletons.get(componentName)\r\n if (!singleton) return\r\n\r\n // Save final state before losing ownership\r\n this.cluster!.saveSingletonState(componentName, singleton.instance.getSerializableState()).catch(() => {})\r\n\r\n // Notify all local clients that this singleton is being destroyed\r\n const errorMsg = JSON.stringify({\r\n type: 'ERROR',\r\n componentId: singleton.instance.id,\r\n payload: { error: 'OWNERSHIP_LOST: singleton moved to another server' },\r\n timestamp: Date.now()\r\n })\r\n for (const [, ws] of singleton.connections) {\r\n try { ws.send(errorMsg) } catch { /* ignore */ }\r\n }\r\n\r\n // Clean up local singleton\r\n this.cleanupComponent(singleton.instance.id)\r\n this.singletons.delete(componentName)\r\n })\r\n\r\n // Handle forwarded actions from other instances (we are the singleton owner)\r\n this.cluster.onActionForward(async (request: ClusterActionRequest): Promise<ClusterActionResponse> => {\r\n try {\r\n // Split-brain protection: verify we still own this singleton before executing\r\n const stillOwner = await this.cluster!.verifySingletonOwnership(request.componentName)\r\n if (!stillOwner) {\r\n return { success: false, error: 'OWNERSHIP_LOST: this instance no longer owns the singleton', requestId: request.requestId }\r\n }\r\n\r\n const result = await this.executeAction(request.componentId, request.action, request.payload)\r\n return { success: true, result, requestId: request.requestId }\r\n } catch (error: any) {\r\n return { success: false, error: error.message, requestId: request.requestId }\r\n }\r\n })\r\n }\r\n\r\n private setupHealthMonitoring(): void {\r\n this.healthCheckInterval = setInterval(() => this.performHealthChecks(), 30000)\r\n }\r\n\r\n registerComponent<TState>(definition: ComponentDefinition<TState>) {\r\n this.definitions.set(definition.name, definition)\r\n liveLog('lifecycle', null, `Registered component: ${definition.name}`)\r\n }\r\n\r\n registerComponentClass(name: string, componentClass: new (initialState: any, ws: GenericWebSocket, options?: { room?: string; userId?: string }) => LiveComponent<any>) {\r\n this.autoDiscoveredComponents.set(name, componentClass)\r\n }\r\n\r\n async autoDiscoverComponents(componentsPath: string) {\r\n try {\r\n const fs = await import('fs')\r\n const path = await import('path')\r\n\r\n if (!fs.existsSync(componentsPath)) return\r\n\r\n const files = fs.readdirSync(componentsPath)\r\n\r\n for (const file of files) {\r\n if (file.endsWith('.ts') || file.endsWith('.js')) {\r\n try {\r\n const fullPath = path.join(componentsPath, file)\r\n const module = await import(fullPath)\r\n\r\n Object.keys(module).forEach(exportName => {\r\n const exportedItem = module[exportName]\r\n if (typeof exportedItem === 'function' &&\r\n exportedItem.prototype &&\r\n this.isLiveComponentClass(exportedItem)) {\r\n // Prefer static componentName over export name\r\n const componentName = exportedItem.componentName || exportName.replace(/Component$/, '')\r\n this.registerComponentClass(componentName, exportedItem)\r\n liveLog('lifecycle', null, `Auto-discovered component: ${componentName} (from ${file})`)\r\n }\r\n })\r\n } catch {\r\n // Silent\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n console.error('Auto-discovery failed:', error)\r\n }\r\n }\r\n\r\n private isLiveComponentClass(cls: any): boolean {\r\n try {\r\n // Most reliable: check for static componentName (all LiveComponent subclasses define it)\r\n if (typeof cls.componentName === 'string') return true\r\n\r\n // Check prototype chain for LiveComponent methods (bundler-safe)\r\n if (cls.prototype && typeof cls.prototype.executeAction === 'function' &&\r\n typeof cls.prototype.setState === 'function' &&\r\n typeof cls.prototype.getSerializableState === 'function') return true\r\n\r\n // Fallback: walk prototype chain checking class name\r\n // tsup/esbuild may rename LiveComponent to _LiveComponent in bundles\r\n let prototype = cls.prototype\r\n while (prototype) {\r\n const name = prototype.constructor.name\r\n if (name === 'LiveComponent' || name === '_LiveComponent') return true\r\n prototype = Object.getPrototypeOf(prototype)\r\n }\r\n return false\r\n } catch { return false }\r\n }\r\n\r\n async mountComponent(\r\n ws: GenericWebSocket,\r\n componentName: string,\r\n props: Record<string, unknown> = {},\r\n options?: { room?: string; userId?: string; version?: string; debugLabel?: string }\r\n ): Promise<{ componentId: string; initialState: unknown; signedState: unknown }> {\r\n const startTime = Date.now()\r\n\r\n try {\r\n const definition = this.definitions.get(componentName)\r\n let ComponentClass: (new (initialState: any, ws: GenericWebSocket, options?: { room?: string; userId?: string }) => LiveComponent<any>) | null = null\r\n let initialState: Record<string, unknown> = {}\r\n\r\n if (definition) {\r\n ComponentClass = definition.component\r\n initialState = definition.initialState as Record<string, unknown>\r\n } else {\r\n ComponentClass = this.autoDiscoveredComponents.get(componentName) ?? null\r\n if (!ComponentClass) {\r\n const variations = [\r\n componentName + 'Component',\r\n componentName.charAt(0).toUpperCase() + componentName.slice(1) + 'Component',\r\n componentName.charAt(0).toUpperCase() + componentName.slice(1)\r\n ]\r\n for (const variation of variations) {\r\n ComponentClass = this.autoDiscoveredComponents.get(variation) ?? null\r\n if (ComponentClass) break\r\n }\r\n }\r\n if (!ComponentClass) throw new Error(`Component '${componentName}' not found`)\r\n initialState = {}\r\n }\r\n\r\n // Auth check\r\n const authContext = ws.data?.authContext || ANONYMOUS_CONTEXT\r\n const componentAuth = (ComponentClass as any).auth as LiveComponentAuth | undefined\r\n const authResult = this.authManager.authorizeComponent(authContext, componentAuth)\r\n if (!authResult.allowed) throw new Error(`AUTH_DENIED: ${authResult.reason}`)\r\n\r\n // Singleton check\r\n const isSingleton = (ComponentClass as any).singleton === true\r\n let clusterSingletonId: string | null = null\r\n if (isSingleton) {\r\n // Check local singleton first\r\n const existing = this.singletons.get(componentName)\r\n if (existing) {\r\n const connId = ws.data?.connectionId || `ws-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`\r\n existing.connections.set(connId, ws)\r\n this.ensureWsData(ws, options?.userId)\r\n ws.data.components.set(existing.instance.id, existing.instance)\r\n\r\n const signedState = this.stateSignature.signState(existing.instance.id, {\r\n ...existing.instance.getSerializableState(),\r\n __componentName: componentName\r\n }, 1, { compress: true, backup: true })\r\n\r\n sendImmediate(ws, JSON.stringify({\r\n type: 'STATE_UPDATE',\r\n componentId: existing.instance.id,\r\n payload: { state: existing.instance.getSerializableState(), signedState },\r\n timestamp: Date.now()\r\n }))\r\n\r\n try { (existing.instance as any).onClientJoin(connId, existing.connections.size) } catch { /* ignore */ }\r\n\r\n return { componentId: existing.instance.id, initialState: existing.instance.getSerializableState(), signedState }\r\n }\r\n\r\n // Check remote singleton (already proxied from another instance)\r\n const existingRemote = this.remoteSingletons.get(componentName)\r\n if (existingRemote) {\r\n const connId = ws.data?.connectionId || `ws-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`\r\n this.ensureWsData(ws, options?.userId)\r\n existingRemote.connections.set(connId, ws)\r\n\r\n sendImmediate(ws, JSON.stringify({\r\n type: 'STATE_UPDATE',\r\n componentId: existingRemote.componentId,\r\n payload: { state: existingRemote.lastState },\r\n timestamp: Date.now()\r\n }))\r\n\r\n return { componentId: existingRemote.componentId, initialState: existingRemote.lastState, signedState: null }\r\n }\r\n\r\n // Cluster: try to claim singleton ownership with pre-generated ID (no race window)\r\n if (this.cluster) {\r\n clusterSingletonId = `live-${crypto.randomUUID()}`\r\n const claim = await this.cluster.claimSingleton(componentName, clusterSingletonId)\r\n if (!claim.claimed) {\r\n clusterSingletonId = null\r\n // Another server owns this singleton — create remote proxy\r\n const owner = await this.cluster.getSingletonOwner(componentName)\r\n if (owner) {\r\n const stored = await this.cluster.loadState(owner.componentId)\r\n const connId = ws.data?.connectionId || `ws-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`\r\n this.ensureWsData(ws, options?.userId)\r\n\r\n const remote: RemoteSingletonEntry = {\r\n componentName,\r\n componentId: owner.componentId,\r\n ownerInstanceId: owner.instanceId,\r\n lastState: stored?.state || {},\r\n connections: new Map([[connId, ws]])\r\n }\r\n this.remoteSingletons.set(componentName, remote)\r\n\r\n sendImmediate(ws, JSON.stringify({\r\n type: 'STATE_UPDATE',\r\n componentId: owner.componentId,\r\n payload: { state: remote.lastState },\r\n timestamp: Date.now()\r\n }))\r\n\r\n return { componentId: owner.componentId, initialState: remote.lastState, signedState: null }\r\n }\r\n }\r\n\r\n // Failover recovery: recovered state from adapter takes priority over client props\r\n if (claim.recoveredState) {\r\n props = { ...props, ...claim.recoveredState }\r\n }\r\n }\r\n }\r\n\r\n // Create component with merged state (props may include recovered cluster state)\r\n const component = new ComponentClass({ ...initialState, ...props }, ws, options)\r\n component.setAuthContext(authContext)\r\n\r\n // Cluster singleton: replace auto-generated ID with the one used for the atomic claim\r\n if (clusterSingletonId) {\r\n ;(component as any).id = clusterSingletonId\r\n }\r\n\r\n component.broadcastToRoom = (message: BroadcastMessage) => {\r\n this.broadcastToRoom(message, component.id)\r\n }\r\n\r\n // Metadata\r\n const metadata = this.createComponentMetadata(component.id, componentName, options?.version)\r\n this.metadata.set(component.id, metadata)\r\n\r\n this.components.set(component.id, component)\r\n this.wsConnections.set(component.id, ws)\r\n\r\n if (options?.room) this.subscribeToRoom(component.id, options.room)\r\n\r\n this.ensureWsData(ws, options?.userId)\r\n ws.data.components.set(component.id, component)\r\n\r\n // Singleton broadcast setup\r\n if (isSingleton) {\r\n const connId = ws.data.connectionId || `ws-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`\r\n const connections = new Map<string, GenericWebSocket>()\r\n connections.set(connId, ws)\r\n this.singletons.set(componentName, { instance: component, connections })\r\n\r\n // Cluster: save initial state (claim already established with correct ID)\r\n if (this.cluster) {\r\n this.cluster.saveState(component.id, componentName, component.getSerializableState()).catch(() => {})\r\n this.cluster.saveSingletonState(componentName, component.getSerializableState()).catch(() => {})\r\n }\r\n\r\n ;(component as any)[EMIT_OVERRIDE_KEY] = (type: string, payload: any) => {\r\n const message: LiveMessage = {\r\n type: type as any,\r\n componentId: component.id,\r\n payload,\r\n timestamp: Date.now(),\r\n userId: component.userId,\r\n room: component.room\r\n }\r\n const serialized = JSON.stringify(message)\r\n const singleton = this.singletons.get(componentName)\r\n if (singleton) {\r\n const dead: string[] = []\r\n for (const [cId, cWs] of singleton.connections) {\r\n try { cWs.send(serialized) } catch { dead.push(cId) }\r\n }\r\n for (const cId of dead) singleton.connections.delete(cId)\r\n }\r\n\r\n // Cluster: publish delta and save state for remote instances\r\n if (this.cluster && type === 'STATE_DELTA' && payload?.delta) {\r\n this.cluster.publishDelta(component.id, componentName, payload.delta).catch(() => {})\r\n this.cluster.saveState(component.id, componentName, component.getSerializableState()).catch(() => {})\r\n this.cluster.saveSingletonState(componentName, component.getSerializableState()).catch(() => {})\r\n }\r\n }\r\n\r\n try { (component as any).onClientJoin(connId, 1) } catch { /* ignore */ }\r\n }\r\n\r\n // Metrics & logging\r\n metadata.state = 'active'\r\n const renderTime = Date.now() - startTime\r\n this.recordComponentMetrics(component.id, renderTime)\r\n registerComponentLogging(component.id, (ComponentClass as any).logging)\r\n this.performanceMonitor.initializeComponent(component.id, componentName)\r\n this.performanceMonitor.recordRenderTime(component.id, renderTime)\r\n\r\n // Sign initial state\r\n const signedState = this.stateSignature.signState(component.id, {\r\n ...component.getSerializableState(),\r\n __componentName: componentName\r\n }, 1, { compress: true, backup: true })\r\n\r\n ;(component as any).emit('STATE_UPDATE', {\r\n state: component.getSerializableState(),\r\n signedState\r\n })\r\n\r\n // Lifecycle hooks\r\n try { (component as any).onConnect() } catch { /* ignore */ }\r\n try { await (component as any).onMount() } catch (err: any) {\r\n ;(component as any).emit('ERROR', { action: 'onMount', error: `Mount initialization failed: ${err?.message || err}` })\r\n }\r\n\r\n return { componentId: component.id, initialState: component.getSerializableState(), signedState }\r\n } catch (error: any) {\r\n console.error(`Failed to mount component ${componentName}:`, error)\r\n throw error\r\n }\r\n }\r\n\r\n async rehydrateComponent(\r\n componentId: string,\r\n componentName: string,\r\n signedState: SignedState,\r\n ws: GenericWebSocket,\r\n options?: { room?: string; userId?: string }\r\n ): Promise<{ success: boolean; newComponentId?: string; error?: string }> {\r\n try {\r\n const validation = this.stateSignature.validateState(signedState, { skipNonce: true })\r\n if (!validation.valid) return { success: false, error: validation.error || 'Invalid state signature' }\r\n\r\n const definition = this.definitions.get(componentName)\r\n let ComponentClass: (new (initialState: any, ws: GenericWebSocket, options?: { room?: string; userId?: string }) => LiveComponent<any>) | null = null\r\n let initialState: Record<string, unknown> = {}\r\n\r\n if (definition) {\r\n ComponentClass = definition.component\r\n initialState = definition.initialState as Record<string, unknown>\r\n } else {\r\n ComponentClass = this.autoDiscoveredComponents.get(componentName) ?? null\r\n if (!ComponentClass) {\r\n const variations = [componentName + 'Component', componentName.charAt(0).toUpperCase() + componentName.slice(1) + 'Component', componentName.charAt(0).toUpperCase() + componentName.slice(1)]\r\n for (const variation of variations) {\r\n ComponentClass = this.autoDiscoveredComponents.get(variation) ?? null\r\n if (ComponentClass) break\r\n }\r\n }\r\n if (!ComponentClass) return { success: false, error: `Component '${componentName}' not found` }\r\n }\r\n\r\n // Auth check\r\n const authContext = ws.data?.authContext || ANONYMOUS_CONTEXT\r\n const componentAuth = (ComponentClass as any).auth as LiveComponentAuth | undefined\r\n const authResult = this.authManager.authorizeComponent(authContext, componentAuth)\r\n if (!authResult.allowed) return { success: false, error: `AUTH_DENIED: ${authResult.reason}` }\r\n\r\n const clientState = this.stateSignature.extractData(signedState) as Record<string, any>\r\n\r\n if (!clientState.__componentName || clientState.__componentName !== componentName) {\r\n return { success: false, error: 'Component class mismatch - state tampering detected' }\r\n }\r\n\r\n const { __componentName, ...cleanState } = clientState\r\n const finalState = definition ? { ...initialState, ...cleanState } : cleanState\r\n const component = new ComponentClass(finalState, ws, options)\r\n component.setAuthContext(authContext)\r\n\r\n this.components.set(component.id, component)\r\n this.wsConnections.set(component.id, ws)\r\n if (options?.room) this.subscribeToRoom(component.id, options.room)\r\n this.ensureWsData(ws, options?.userId)\r\n ws.data.components.set(component.id, component)\r\n registerComponentLogging(component.id, (ComponentClass as any).logging)\r\n\r\n const newSignedState = this.stateSignature.signState(\r\n component.id,\r\n { ...component.getSerializableState(), __componentName: componentName },\r\n signedState.version + 1\r\n )\r\n\r\n ;(component as any).emit('STATE_REHYDRATED', {\r\n state: component.getSerializableState(),\r\n signedState: newSignedState,\r\n oldComponentId: componentId,\r\n newComponentId: component.id\r\n })\r\n\r\n try { (component as any).onConnect() } catch { /* ignore */ }\r\n try { (component as any).onRehydrate(clientState) } catch { /* ignore */ }\r\n try { await (component as any).onMount() } catch { /* ignore */ }\r\n\r\n return { success: true, newComponentId: component.id }\r\n } catch (error: any) {\r\n return { success: false, error: error.message }\r\n }\r\n }\r\n\r\n private ensureWsData(ws: GenericWebSocket, userId?: string): void {\r\n if (!ws.data) {\r\n (ws as { data: LiveWSData }).data = {\r\n connectionId: `ws-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\r\n components: new Map(),\r\n subscriptions: new Set(),\r\n connectedAt: new Date(),\r\n userId\r\n }\r\n }\r\n if (!ws.data.components) ws.data.components = new Map()\r\n }\r\n\r\n private isSingletonComponent(componentId: string): boolean {\r\n for (const [, s] of this.singletons) if (s.instance.id === componentId) return true\r\n return false\r\n }\r\n\r\n private removeSingletonConnection(componentId: string, connId?: string, context = 'unmount'): boolean {\r\n // Check local singletons\r\n for (const [name, singleton] of this.singletons) {\r\n if (singleton.instance.id !== componentId) continue\r\n if (connId) singleton.connections.delete(connId)\r\n if (singleton.connections.size === 0) {\r\n // Capture final state synchronously BEFORE cleanup destroys the instance\r\n const finalState = singleton.instance.getSerializableState()\r\n try { (singleton.instance as any).onDisconnect() } catch { /* ignore */ }\r\n this.cleanupComponent(componentId)\r\n this.singletons.delete(name)\r\n // Save state to Redis, THEN release claim (must be sequential to avoid race)\r\n if (this.cluster) {\r\n this.cluster.saveSingletonState(name, finalState)\r\n .then(() => this.cluster!.releaseSingleton(name))\r\n .then(() => this.cluster!.deleteState(componentId))\r\n .catch(() => {})\r\n }\r\n }\r\n return true\r\n }\r\n\r\n // Check remote singletons\r\n for (const [name, remote] of this.remoteSingletons) {\r\n if (remote.componentId !== componentId) continue\r\n if (connId) remote.connections.delete(connId)\r\n if (remote.connections.size === 0) {\r\n this.remoteSingletons.delete(name)\r\n }\r\n return true\r\n }\r\n\r\n return false\r\n }\r\n\r\n unmountComponent(componentId: string, ws?: GenericWebSocket) {\r\n const component = this.components.get(componentId)\r\n if (!component) {\r\n // May be a remote singleton — try to remove the connection\r\n if (ws) {\r\n const connId = ws.data?.connectionId\r\n this.removeSingletonConnection(componentId, connId, 'unmount')\r\n }\r\n return\r\n }\r\n\r\n if (ws) {\r\n const connId = ws.data?.connectionId\r\n ws.data?.components?.delete(componentId)\r\n\r\n if (this.isSingletonComponent(componentId)) {\r\n const singleton = this.singletons.get(this.getSingletonName(componentId) || '')\r\n const remaining = singleton ? singleton.connections.size - 1 : 0\r\n try { (component as any).onClientLeave(connId || 'unknown', Math.max(0, remaining)) } catch { /* ignore */ }\r\n }\r\n\r\n if (this.removeSingletonConnection(componentId, connId, 'unmount')) return\r\n } else {\r\n if (this.removeSingletonConnection(componentId, undefined, 'unmount')) return\r\n }\r\n\r\n component.destroy?.()\r\n this.unsubscribeFromAllRooms(componentId)\r\n this.components.delete(componentId)\r\n this.wsConnections.delete(componentId)\r\n unregisterComponentLogging(componentId)\r\n }\r\n\r\n private getSingletonName(componentId: string): string | null {\r\n for (const [name, s] of this.singletons) {\r\n if (s.instance.id === componentId) return name\r\n }\r\n return null\r\n }\r\n\r\n /** Find a remote singleton entry by componentId. */\r\n private findRemoteSingleton(componentId: string): RemoteSingletonEntry | null {\r\n for (const [, entry] of this.remoteSingletons) {\r\n if (entry.componentId === componentId) return entry\r\n }\r\n return null\r\n }\r\n\r\n async executeAction(componentId: string, action: string, payload: any): Promise<any> {\r\n const component = this.components.get(componentId)\r\n if (!component) throw new Error(`COMPONENT_REHYDRATION_REQUIRED:${componentId}`)\r\n\r\n const componentClass = component.constructor as any\r\n const actionAuthMap = componentClass.actionAuth as LiveActionAuthMap | undefined\r\n const actionAuth = actionAuthMap?.[action]\r\n\r\n if (actionAuth) {\r\n const authContext = (component as any).$auth || ANONYMOUS_CONTEXT\r\n const componentName = componentClass.componentName || componentClass.name\r\n const authResult = await this.authManager.authorizeAction(authContext, componentName, action, actionAuth)\r\n if (!authResult.allowed) throw new Error(`AUTH_DENIED: ${authResult.reason}`)\r\n }\r\n\r\n return await component.executeAction?.(action, payload)\r\n }\r\n\r\n updateProperty(componentId: string, property: string, value: any) {\r\n const component = this.components.get(componentId)\r\n if (!component) throw new Error(`Component '${componentId}' not found`)\r\n component.setState?.({ [property]: value })\r\n }\r\n\r\n subscribeToRoom(componentId: string, roomId: string) {\r\n if (!this.rooms.has(roomId)) this.rooms.set(roomId, new Set())\r\n this.rooms.get(roomId)!.add(componentId)\r\n }\r\n\r\n unsubscribeFromRoom(componentId: string, roomId: string) {\r\n const room = this.rooms.get(roomId)\r\n if (room) {\r\n room.delete(componentId)\r\n if (room.size === 0) this.rooms.delete(roomId)\r\n }\r\n }\r\n\r\n private unsubscribeFromAllRooms(componentId: string) {\r\n for (const [roomId, components] of Array.from(this.rooms.entries())) {\r\n if (components.has(componentId)) this.unsubscribeFromRoom(componentId, roomId)\r\n }\r\n }\r\n\r\n broadcastToRoom(message: BroadcastMessage, senderComponentId?: string) {\r\n if (!message.room) return\r\n const roomComponents = this.rooms.get(message.room)\r\n if (!roomComponents) return\r\n\r\n const broadcastMessage: LiveMessage = {\r\n type: 'BROADCAST',\r\n componentId: senderComponentId || 'system',\r\n payload: { type: message.type, data: message.payload },\r\n timestamp: Date.now(),\r\n room: message.room\r\n }\r\n\r\n for (const componentId of Array.from(roomComponents)) {\r\n const component = this.components.get(componentId)\r\n if (message.excludeUser && component?.userId === message.excludeUser) continue\r\n const ws = this.wsConnections.get(componentId)\r\n if (ws) queueWsMessage(ws, broadcastMessage as any)\r\n }\r\n }\r\n\r\n async handleMessage(ws: GenericWebSocket, message: LiveMessage): Promise<{ success: boolean; result?: unknown; error?: string } | null> {\r\n try {\r\n if (message.componentId) this.updateComponentActivity(message.componentId)\r\n\r\n switch (message.type) {\r\n case 'COMPONENT_MOUNT':\r\n const mountResult = await this.mountComponent(ws, message.payload.component, message.payload.props, {\r\n room: message.payload.room,\r\n userId: message.userId,\r\n debugLabel: message.payload.debugLabel\r\n })\r\n return { success: true, result: mountResult }\r\n\r\n case 'COMPONENT_UNMOUNT':\r\n this.unmountComponent(message.componentId, ws)\r\n return { success: true }\r\n\r\n case 'CALL_ACTION': {\r\n // Check if this action targets a remote singleton (owned by another server)\r\n const remoteSingleton = this.findRemoteSingleton(message.componentId)\r\n if (remoteSingleton && this.cluster) {\r\n const requestId = `req-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`\r\n const request: ClusterActionRequest = {\r\n sourceInstanceId: this.cluster.instanceId,\r\n targetInstanceId: remoteSingleton.ownerInstanceId,\r\n componentId: remoteSingleton.componentId,\r\n componentName: remoteSingleton.componentName,\r\n action: message.action!,\r\n payload: message.payload,\r\n requestId\r\n }\r\n const response = await this.cluster.forwardAction(request)\r\n if (!response.success) throw new Error(response.error || 'Remote action failed')\r\n if (message.expectResponse) return { success: true, result: response.result }\r\n return null\r\n }\r\n\r\n this.recordComponentMetrics(message.componentId, undefined, message.action)\r\n const actionStart = Date.now()\r\n try {\r\n const actionResult = await this.executeAction(message.componentId, message.action!, message.payload)\r\n this.performanceMonitor.recordActionTime(message.componentId, message.action!, Date.now() - actionStart)\r\n if (message.expectResponse) return { success: true, result: actionResult }\r\n return null\r\n } catch (error: any) {\r\n this.performanceMonitor.recordActionTime(message.componentId, message.action!, Date.now() - actionStart, error)\r\n throw error\r\n }\r\n }\r\n\r\n case 'PROPERTY_UPDATE':\r\n this.updateProperty(message.componentId, message.property!, message.payload.value)\r\n return { success: true }\r\n\r\n default:\r\n return { success: false, error: 'Unknown message type' }\r\n }\r\n } catch (error: any) {\r\n if (message.componentId) this.recordComponentError(message.componentId, error)\r\n return { success: false, error: error.message }\r\n }\r\n }\r\n\r\n cleanupConnection(ws: GenericWebSocket) {\r\n if (!ws.data?.components) return\r\n\r\n const componentsToCleanup = Array.from(ws.data.components.keys()) as string[]\r\n const connId = ws.data.connectionId\r\n\r\n for (const componentId of componentsToCleanup) {\r\n const component = this.components.get(componentId)\r\n if (component && !this.isSingletonComponent(componentId)) {\r\n try { (component as any).onDisconnect() } catch { /* ignore */ }\r\n }\r\n if (!this.removeSingletonConnection(componentId, connId || undefined, 'disconnect')) {\r\n this.cleanupComponent(componentId)\r\n }\r\n }\r\n\r\n // Also clean up any remote singleton connections for this ws\r\n if (connId) {\r\n for (const [name, remote] of this.remoteSingletons) {\r\n remote.connections.delete(connId)\r\n if (remote.connections.size === 0) {\r\n this.remoteSingletons.delete(name)\r\n }\r\n }\r\n }\r\n\r\n ws.data.components.clear()\r\n }\r\n\r\n getStats() {\r\n return {\r\n components: this.components.size,\r\n definitions: this.definitions.size,\r\n rooms: this.rooms.size,\r\n connections: this.wsConnections.size,\r\n singletons: Object.fromEntries(\r\n Array.from(this.singletons.entries()).map(([name, s]) => [name, { componentId: s.instance.id, connections: s.connections.size }])\r\n ),\r\n remoteSingletons: Object.fromEntries(\r\n Array.from(this.remoteSingletons.entries()).map(([name, r]) => [name, { componentId: r.componentId, ownerInstanceId: r.ownerInstanceId, connections: r.connections.size }])\r\n ),\r\n roomDetails: Object.fromEntries(\r\n Array.from(this.rooms.entries()).map(([roomId, components]) => [roomId, components.size])\r\n )\r\n }\r\n }\r\n\r\n getRegisteredComponentNames(): string[] {\r\n return [...new Set([...this.definitions.keys(), ...this.autoDiscoveredComponents.keys()])]\r\n }\r\n\r\n getComponent(componentId: string): LiveComponent | undefined {\r\n return this.components.get(componentId)\r\n }\r\n\r\n getRoomComponents(roomId: string): LiveComponent[] {\r\n const componentIds = this.rooms.get(roomId) || new Set()\r\n return Array.from(componentIds).map(id => this.components.get(id)).filter(Boolean) as LiveComponent[]\r\n }\r\n\r\n private createComponentMetadata(componentId: string, componentName: string, version = '1.0.0'): ComponentMetadata {\r\n return {\r\n id: componentId,\r\n name: componentName,\r\n version,\r\n mountedAt: new Date(),\r\n lastActivity: new Date(),\r\n state: 'mounting',\r\n healthStatus: 'healthy',\r\n dependencies: [],\r\n services: new Map(),\r\n metrics: { renderCount: 0, actionCount: 0, errorCount: 0, averageRenderTime: 0, memoryUsage: 0 },\r\n migrationHistory: []\r\n }\r\n }\r\n\r\n updateComponentActivity(componentId: string): boolean {\r\n const metadata = this.metadata.get(componentId)\r\n if (metadata) { metadata.lastActivity = new Date(); metadata.state = 'active'; return true }\r\n return false\r\n }\r\n\r\n recordComponentMetrics(componentId: string, renderTime?: number, action?: string): void {\r\n const metadata = this.metadata.get(componentId)\r\n if (!metadata) return\r\n if (renderTime) {\r\n metadata.metrics.renderCount++\r\n metadata.metrics.averageRenderTime = (metadata.metrics.averageRenderTime * (metadata.metrics.renderCount - 1) + renderTime) / metadata.metrics.renderCount\r\n metadata.metrics.lastRenderTime = renderTime\r\n }\r\n if (action) metadata.metrics.actionCount++\r\n this.updateComponentActivity(componentId)\r\n }\r\n\r\n recordComponentError(componentId: string, error: Error): void {\r\n const metadata = this.metadata.get(componentId)\r\n if (metadata) {\r\n metadata.metrics.errorCount++\r\n metadata.healthStatus = metadata.metrics.errorCount > 5 ? 'unhealthy' : 'degraded'\r\n }\r\n }\r\n\r\n private performHealthChecks(): void {\r\n for (const [componentId, metadata] of this.metadata) {\r\n if (!this.components.get(componentId)) continue\r\n if (metadata.metrics.errorCount > 10) metadata.healthStatus = 'unhealthy'\r\n else if (Date.now() - metadata.lastActivity.getTime() > 300000) metadata.healthStatus = 'degraded'\r\n }\r\n }\r\n\r\n private cleanupComponent(componentId: string): void {\r\n const component = this.components.get(componentId)\r\n if (component) try { component.destroy?.() } catch { /* ignore */ }\r\n this.performanceMonitor.removeComponent(componentId)\r\n unregisterComponentLogging(componentId)\r\n this.components.delete(componentId)\r\n this.metadata.delete(componentId)\r\n this.wsConnections.delete(componentId)\r\n for (const [roomId, componentIds] of this.rooms) {\r\n componentIds.delete(componentId)\r\n if (componentIds.size === 0) this.rooms.delete(roomId)\r\n }\r\n }\r\n\r\n cleanup(): void {\r\n if (this.healthCheckInterval) clearInterval(this.healthCheckInterval)\r\n this.singletons.clear()\r\n this.remoteSingletons.clear()\r\n for (const [componentId] of this.components) this.cleanupComponent(componentId)\r\n }\r\n}\r\n","// @fluxstack/live - Per-connection rate limiter\r\n//\r\n// Token bucket algorithm to prevent WebSocket message flooding.\r\n\r\nimport { DEFAULT_RATE_LIMIT_MAX_TOKENS, DEFAULT_RATE_LIMIT_REFILL_RATE } from '../protocol/constants'\r\n\r\nexport class ConnectionRateLimiter {\r\n private tokens: number\r\n private lastRefill: number\r\n private readonly maxTokens: number\r\n private readonly refillRate: number // tokens per second\r\n\r\n constructor(maxTokens = DEFAULT_RATE_LIMIT_MAX_TOKENS, refillRate = DEFAULT_RATE_LIMIT_REFILL_RATE) {\r\n this.maxTokens = maxTokens\r\n this.tokens = maxTokens\r\n this.refillRate = refillRate\r\n this.lastRefill = Date.now()\r\n }\r\n\r\n tryConsume(count = 1): boolean {\r\n this.refill()\r\n if (this.tokens >= count) {\r\n this.tokens -= count\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n private refill(): void {\r\n const now = Date.now()\r\n const elapsed = (now - this.lastRefill) / 1000\r\n this.tokens = Math.min(this.maxTokens, this.tokens + elapsed * this.refillRate)\r\n this.lastRefill = now\r\n }\r\n}\r\n\r\n/**\r\n * Manages rate limiters for all connections.\r\n */\r\nexport class RateLimiterRegistry {\r\n private limiters = new Map<string, ConnectionRateLimiter>()\r\n private maxTokens: number\r\n private refillRate: number\r\n\r\n constructor(maxTokens = DEFAULT_RATE_LIMIT_MAX_TOKENS, refillRate = DEFAULT_RATE_LIMIT_REFILL_RATE) {\r\n this.maxTokens = maxTokens\r\n this.refillRate = refillRate\r\n }\r\n\r\n /**\r\n * Get or create a rate limiter for a connection.\r\n */\r\n get(connectionId: string): ConnectionRateLimiter {\r\n let limiter = this.limiters.get(connectionId)\r\n if (!limiter) {\r\n limiter = new ConnectionRateLimiter(this.maxTokens, this.refillRate)\r\n this.limiters.set(connectionId, limiter)\r\n }\r\n return limiter\r\n }\r\n\r\n /**\r\n * Remove a rate limiter for a disconnected connection.\r\n */\r\n remove(connectionId: string): void {\r\n this.limiters.delete(connectionId)\r\n }\r\n}\r\n","// @fluxstack/live - Binary Protocol for File Uploads\r\n//\r\n// Wire format: [4 bytes headerLength (LE)][JSON header][binary data]\r\n\r\nimport type { BinaryChunkHeader } from './messages'\r\n\r\n/**\r\n * Encode a binary chunk message for transmission.\r\n * @param header - JSON metadata about the chunk\r\n * @param data - Raw binary data\r\n * @returns Combined buffer ready to send over WebSocket\r\n */\r\nexport function encodeBinaryChunk(header: BinaryChunkHeader, data: Buffer | Uint8Array): Buffer {\r\n const headerJson = JSON.stringify(header)\r\n const headerBuffer = Buffer.from(headerJson, 'utf-8')\r\n\r\n // Total: 4 bytes (header length) + header + data\r\n const result = Buffer.alloc(4 + headerBuffer.length + data.length)\r\n result.writeUInt32LE(headerBuffer.length, 0)\r\n headerBuffer.copy(result, 4)\r\n Buffer.from(data).copy(result, 4 + headerBuffer.length)\r\n\r\n return result\r\n}\r\n\r\n/**\r\n * Decode a binary chunk message received over WebSocket.\r\n * @param raw - Raw ArrayBuffer or Uint8Array from WebSocket\r\n * @returns Parsed header and binary chunk data\r\n */\r\nexport function decodeBinaryChunk(raw: ArrayBuffer | Uint8Array): { header: BinaryChunkHeader; data: Buffer } {\r\n const buffer = raw instanceof ArrayBuffer\r\n ? Buffer.from(raw)\r\n : Buffer.from(raw.buffer, raw.byteOffset, raw.byteLength)\r\n\r\n const headerLength = buffer.readUInt32LE(0)\r\n const headerJson = buffer.slice(4, 4 + headerLength).toString('utf-8')\r\n const header = JSON.parse(headerJson) as BinaryChunkHeader\r\n const data = buffer.slice(4 + headerLength)\r\n\r\n return { header, data }\r\n}\r\n","// @fluxstack/live - Payload Sanitization\r\n//\r\n// Strips prototype pollution keys (__proto__, constructor, prototype)\r\n// from incoming client payloads recursively.\r\n\r\nconst DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype'])\r\nconst MAX_DEPTH = 10\r\n\r\n/**\r\n * Recursively strip dangerous keys from an object.\r\n * Returns a clean copy (does not mutate the original).\r\n */\r\nexport function sanitizePayload<T>(value: T, depth = 0): T {\r\n if (depth > MAX_DEPTH) return value\r\n\r\n if (Array.isArray(value)) {\r\n return value.map(item => sanitizePayload(item, depth + 1)) as T\r\n }\r\n\r\n if (value !== null && typeof value === 'object') {\r\n const clean: Record<string, unknown> = {}\r\n for (const key of Object.keys(value as object)) {\r\n if (DANGEROUS_KEYS.has(key)) continue\r\n clean[key] = sanitizePayload((value as Record<string, unknown>)[key], depth + 1)\r\n }\r\n return clean as T\r\n }\r\n\r\n return value\r\n}\r\n","// @fluxstack/live - LiveRoom Base Class\r\n//\r\n// Typed room classes with lifecycle hooks, public/private state split,\r\n// and server-only join enforcement.\r\n//\r\n// Usage:\r\n// class ChatRoom extends LiveRoom<ChatState, ChatMeta, ChatEvents> {\r\n// static roomName = 'chat'\r\n// static defaultState = { messages: [] }\r\n// static defaultMeta = { password: null }\r\n// onJoin(ctx) { ... }\r\n// }\r\n\r\nimport type { LiveRoomManagerInterface } from '../component/context'\r\nimport type { RoomCodecOption } from './RoomCodec'\r\n\r\n// ===== Lifecycle Context Types =====\r\n\r\nexport interface RoomJoinContext {\r\n componentId: string\r\n userId?: string\r\n payload?: any\r\n}\r\n\r\nexport interface RoomLeaveContext {\r\n componentId: string\r\n userId?: string\r\n reason: 'leave' | 'disconnect' | 'cleanup'\r\n}\r\n\r\nexport interface RoomEventContext {\r\n componentId: string\r\n userId?: string\r\n}\r\n\r\n// ===== Room Options =====\r\n\r\nexport interface LiveRoomOptions {\r\n /** Enable deep diff for room state. Default: true */\r\n deepDiff?: boolean\r\n /** Max recursion depth for deep diff. Default: 3 */\r\n deepDiffDepth?: number\r\n /** Max number of members allowed. Undefined = unlimited */\r\n maxMembers?: number\r\n /**\r\n * Wire codec for room messages. Default: 'msgpack' (binary).\r\n * - 'msgpack' — Built-in MessagePack encoder (zero deps, ~30% smaller, ~2-3x faster)\r\n * - 'json' — Standard JSON (text-based, larger but human-readable)\r\n * - Custom RoomCodec object with encode/decode methods\r\n */\r\n codec?: RoomCodecOption\r\n}\r\n\r\n// ===== LiveRoom Base Class =====\r\n\r\n/**\r\n * Base class for typed rooms with lifecycle hooks and public/private state.\r\n *\r\n * @typeParam TState - Public state synced to all connected clients\r\n * @typeParam TMeta - Private server-only metadata (never broadcasted)\r\n * @typeParam TEvents - Event map for typed emit/on\r\n */\r\nexport abstract class LiveRoom<\r\n TState extends Record<string, any> = Record<string, any>,\r\n TMeta extends Record<string, any> = Record<string, any>,\r\n TEvents extends Record<string, any> = Record<string, any>,\r\n> {\r\n /** Unique room type name. Used as prefix in compound room IDs (e.g. \"chat:lobby\"). */\r\n static roomName: string\r\n\r\n /** Initial public state template. Cloned per room instance. */\r\n static defaultState: Record<string, any> = {}\r\n\r\n /** Initial private metadata template. Cloned per room instance. */\r\n static defaultMeta: Record<string, any> = {}\r\n\r\n /** Room-level options */\r\n static $options?: LiveRoomOptions\r\n\r\n /** The unique room instance identifier (e.g. \"chat:lobby\") */\r\n readonly id: string\r\n\r\n /** Public state — synced to all connected clients via setState(). */\r\n state: TState\r\n\r\n /** Private metadata — NEVER leaves the server. Mutate directly. */\r\n meta: TMeta\r\n\r\n /** @internal Type brand for client-side event inference.\r\n * No runtime value. Usage: `$room<CounterRoom>('id').on(...)` */\r\n declare readonly $events: TEvents\r\n\r\n /** @internal Reference to the room manager for broadcasting */\r\n protected readonly _manager: LiveRoomManagerInterface\r\n\r\n constructor(id: string, manager: LiveRoomManagerInterface) {\r\n const ctor = this.constructor as typeof LiveRoom\r\n this.id = id\r\n this._manager = manager\r\n this.state = structuredClone(ctor.defaultState ?? {}) as TState\r\n this.meta = structuredClone(ctor.defaultMeta ?? {}) as TMeta\r\n }\r\n\r\n // ===== Framework Methods =====\r\n\r\n /**\r\n * Update public state and broadcast changes to all room members.\r\n * Uses deep diff by default — only changed fields are sent over the wire.\r\n */\r\n setState(updates: Partial<TState>): void {\r\n this._manager.setRoomState(this.id, updates)\r\n }\r\n\r\n /**\r\n * Emit a typed event to all members in this room.\r\n * @returns Number of members notified\r\n */\r\n emit<K extends keyof TEvents & string>(event: K, data: TEvents[K]): number {\r\n return this._manager.emitToRoom(this.id, event, data)\r\n }\r\n\r\n /** Get current member count */\r\n get memberCount(): number {\r\n return this._manager.getMemberCount?.(this.id) ?? 0\r\n }\r\n\r\n // ===== Lifecycle Hooks (override in subclass) =====\r\n\r\n /**\r\n * Called when a component attempts to join this room.\r\n * Return false to reject the join.\r\n */\r\n onJoin(_ctx: RoomJoinContext): void | false | Promise<void | false> {}\r\n\r\n /**\r\n * Called after a component leaves this room.\r\n */\r\n onLeave(_ctx: RoomLeaveContext): void | Promise<void> {}\r\n\r\n /**\r\n * Called when an event is emitted to this room.\r\n * Can intercept/validate events before broadcasting.\r\n */\r\n onEvent(_event: string, _data: any, _ctx: RoomEventContext): void | Promise<void> {}\r\n\r\n /**\r\n * Called once when the room is first created (first member joins).\r\n */\r\n onCreate(): void | Promise<void> {}\r\n\r\n /**\r\n * Called when the last member leaves and the room is about to be destroyed.\r\n * Return false to keep the room alive (e.g., persist state).\r\n */\r\n onDestroy(): void | false | Promise<void | false> {}\r\n}\r\n\r\n// ===== Type Utilities =====\r\n\r\n/** Extract the public state type from a LiveRoom subclass */\r\nexport type InferRoomState<R> =\r\n R extends LiveRoom<infer S, any, any> ? S : Record<string, any>\r\n\r\n/** Extract the private meta type from a LiveRoom subclass */\r\nexport type InferRoomMeta<R> =\r\n R extends LiveRoom<any, infer M, any> ? M : Record<string, any>\r\n\r\n/** Extract the events type from a LiveRoom subclass */\r\nexport type InferRoomEvents<R> =\r\n R extends LiveRoom<any, any, infer E> ? E : Record<string, any>\r\n\r\n/** LiveRoom class constructor type */\r\nexport type LiveRoomClass<R extends LiveRoom = LiveRoom> = {\r\n new (id: string, manager: LiveRoomManagerInterface): R\r\n roomName: string\r\n defaultState: Record<string, any>\r\n defaultMeta: Record<string, any>\r\n $options?: LiveRoomOptions\r\n}\r\n","// @fluxstack/live - Room Registry\r\n//\r\n// Maps room type names to LiveRoom classes.\r\n// Used by LiveRoomManager to instantiate room instances with lifecycle hooks.\r\n\r\nimport { LiveRoom, type LiveRoomClass } from './LiveRoom'\r\n\r\nexport class RoomRegistry {\r\n private rooms = new Map<string, LiveRoomClass>()\r\n\r\n /**\r\n * Register a LiveRoom subclass.\r\n * @throws If the class doesn't define a static roomName\r\n */\r\n register(roomClass: LiveRoomClass): void {\r\n const name = roomClass.roomName\r\n if (!name) {\r\n throw new Error('LiveRoom subclass must define static roomName')\r\n }\r\n if (this.rooms.has(name)) {\r\n throw new Error(`LiveRoom '${name}' is already registered`)\r\n }\r\n this.rooms.set(name, roomClass)\r\n }\r\n\r\n /**\r\n * Get a registered room class by name.\r\n */\r\n get(name: string): LiveRoomClass | undefined {\r\n return this.rooms.get(name)\r\n }\r\n\r\n /**\r\n * Check if a room class is registered.\r\n */\r\n has(name: string): boolean {\r\n return this.rooms.has(name)\r\n }\r\n\r\n /**\r\n * Resolve a compound room ID (e.g. \"chat:lobby\") to its registered class.\r\n * Returns undefined if the prefix doesn't match any registered room.\r\n */\r\n resolveFromId(roomId: string): LiveRoomClass | undefined {\r\n const colonIdx = roomId.indexOf(':')\r\n if (colonIdx === -1) return undefined\r\n const prefix = roomId.substring(0, colonIdx)\r\n return this.rooms.get(prefix)\r\n }\r\n\r\n /**\r\n * Get all registered room names.\r\n */\r\n getRegisteredNames(): string[] {\r\n return Array.from(this.rooms.keys())\r\n }\r\n\r\n /**\r\n * Check if a value is a LiveRoom subclass.\r\n */\r\n static isLiveRoomClass(cls: unknown): cls is LiveRoomClass {\r\n if (typeof cls !== 'function' || !cls.prototype) return false\r\n if (typeof (cls as any).roomName !== 'string') return false\r\n let proto = Object.getPrototypeOf(cls.prototype)\r\n while (proto) {\r\n if (proto.constructor === LiveRoom) return true\r\n proto = Object.getPrototypeOf(proto)\r\n }\r\n return false\r\n }\r\n}\r\n","// @fluxstack/live - LiveServer Orchestrator\r\n//\r\n// Main entry point: wire up transport, create singletons, expose public API.\r\n// Usage:\r\n// const server = new LiveServer({ transport: new ElysiaTransport(app) })\r\n// await server.start()\r\n\r\nimport type { LiveTransport, GenericWebSocket, WebSocketConfig, HttpRouteDefinition } from '../transport/types'\r\nimport type { LiveMessage, WebSocketResponse } from '../protocol/messages'\r\nimport { RoomEventBus } from '../rooms/RoomEventBus'\r\nimport { LiveRoomManager } from '../rooms/LiveRoomManager'\r\nimport { LiveAuthManager } from '../auth/LiveAuthManager'\r\nimport { StateSignatureManager, type StateSignatureConfig } from '../security/StateSignature'\r\nimport { PerformanceMonitor, type PerformanceConfig } from '../monitoring/PerformanceMonitor'\r\nimport { FileUploadManager, type FileUploadConfig } from '../upload/FileUploadManager'\r\nimport { WebSocketConnectionManager, type ConnectionConfig } from '../connection/WebSocketConnectionManager'\r\nimport { ComponentRegistry } from '../component/ComponentRegistry'\r\nimport { setLiveComponentContext } from '../component/context'\r\nimport { RateLimiterRegistry } from '../connection/RateLimiter'\r\nimport { liveLog } from '../debug/LiveLogger'\r\nimport { decodeBinaryChunk } from '../protocol/binary'\r\nimport { DEFAULT_WS_PATH, MAX_MESSAGE_SIZE, MAX_ROOMS_PER_CONNECTION } from '../protocol/constants'\r\nimport { sendImmediate } from '../transport/WsSendBatcher'\r\nimport { sanitizePayload } from '../security/sanitize'\r\nimport type { LiveAuthProvider } from '../auth/types'\r\nimport type { IRoomPubSubAdapter } from '../rooms/adapters'\r\nimport type { IClusterAdapter } from '../cluster/types'\r\nimport { ANONYMOUS_CONTEXT } from '../auth/LiveAuthContext'\r\nimport { RoomRegistry } from '../rooms/RoomRegistry'\r\nimport type { LiveRoomClass } from '../rooms/LiveRoom'\r\n\r\nexport interface LiveServerOptions {\r\n /** Transport adapter (Elysia, Express, etc.) */\r\n transport: LiveTransport\r\n /** WebSocket endpoint path. Defaults to '/api/live/ws' */\r\n wsPath?: string\r\n /** Enable debug mode. Defaults to false. */\r\n debug?: boolean\r\n /** State signature configuration */\r\n stateSignature?: StateSignatureConfig\r\n /** Performance monitor configuration */\r\n performance?: PerformanceConfig\r\n /** File upload configuration */\r\n fileUpload?: FileUploadConfig\r\n /** Connection manager configuration */\r\n connection?: Partial<ConnectionConfig>\r\n /** Rate limiter: max tokens per connection */\r\n rateLimitMaxTokens?: number\r\n /** Rate limiter: tokens refilled per second */\r\n rateLimitRefillRate?: number\r\n /** Components path for auto-discovery */\r\n componentsPath?: string\r\n /** HTTP monitoring routes prefix. Set to false to disable. Defaults to '/api/live' */\r\n httpPrefix?: string | false\r\n /** Allowed origins for WebSocket connections (CSRF protection).\r\n * When set, connections from unlisted origins are rejected.\r\n * Example: ['https://myapp.com', 'http://localhost:3000'] */\r\n allowedOrigins?: string[]\r\n /** Optional cross-instance pub/sub adapter for horizontal scaling (e.g. Redis).\r\n * When provided, room events, state changes, and membership are propagated\r\n * across server instances. Without this, rooms are local to the current instance. */\r\n roomPubSub?: IRoomPubSubAdapter\r\n /** Optional cluster adapter for cross-instance component synchronization.\r\n * When provided, singleton components are coordinated across instances,\r\n * component state is mirrored to a shared store (Redis), and actions on\r\n * remote singletons are forwarded to the owner instance. */\r\n cluster?: IClusterAdapter\r\n /** LiveRoom classes to register. These define typed rooms with lifecycle hooks. */\r\n rooms?: LiveRoomClass[]\r\n}\r\n\r\nexport class LiveServer {\r\n // Public singletons (accessible for transport adapters & advanced usage)\r\n public readonly roomEvents: RoomEventBus\r\n public readonly roomManager: LiveRoomManager\r\n public readonly authManager: LiveAuthManager\r\n public readonly stateSignature: StateSignatureManager\r\n public readonly performanceMonitor: PerformanceMonitor\r\n public readonly fileUploadManager: FileUploadManager\r\n public readonly connectionManager: WebSocketConnectionManager\r\n public readonly registry: ComponentRegistry\r\n public readonly rateLimiter: RateLimiterRegistry\r\n public readonly roomRegistry: RoomRegistry\r\n\r\n private transport: LiveTransport\r\n private options: LiveServerOptions\r\n\r\n constructor(options: LiveServerOptions) {\r\n this.options = options\r\n this.transport = options.transport\r\n\r\n // Create all singletons\r\n this.roomEvents = new RoomEventBus()\r\n this.roomManager = new LiveRoomManager(this.roomEvents, options.roomPubSub)\r\n this.authManager = new LiveAuthManager()\r\n this.stateSignature = new StateSignatureManager(options.stateSignature)\r\n this.performanceMonitor = new PerformanceMonitor(options.performance)\r\n this.fileUploadManager = new FileUploadManager(options.fileUpload)\r\n this.connectionManager = new WebSocketConnectionManager(options.connection)\r\n this.rateLimiter = new RateLimiterRegistry(options.rateLimitMaxTokens, options.rateLimitRefillRate)\r\n\r\n // Room registry + wire to room manager\r\n this.roomRegistry = new RoomRegistry()\r\n this.roomManager.roomRegistry = this.roomRegistry\r\n if (options.rooms) {\r\n for (const roomClass of options.rooms) {\r\n this.roomRegistry.register(roomClass)\r\n }\r\n }\r\n\r\n this.registry = new ComponentRegistry({\r\n authManager: this.authManager,\r\n stateSignature: this.stateSignature,\r\n performanceMonitor: this.performanceMonitor,\r\n cluster: options.cluster,\r\n })\r\n\r\n // Set global context for LiveComponent base class\r\n setLiveComponentContext({\r\n roomEvents: this.roomEvents,\r\n roomManager: this.roomManager,\r\n })\r\n }\r\n\r\n /**\r\n * Register an auth provider.\r\n */\r\n useAuth(provider: LiveAuthProvider): this {\r\n this.authManager.register(provider)\r\n return this\r\n }\r\n\r\n /**\r\n * Register a LiveRoom class.\r\n * Can be called before start() to register room types dynamically.\r\n */\r\n useRoom(roomClass: LiveRoomClass): this {\r\n this.roomRegistry.register(roomClass)\r\n return this\r\n }\r\n\r\n /**\r\n * Start the LiveServer: register WS + HTTP handlers on the transport.\r\n */\r\n async start(): Promise<void> {\r\n // Auto-discover components if path provided\r\n if (this.options.componentsPath) {\r\n await this.registry.autoDiscoverComponents(this.options.componentsPath)\r\n }\r\n\r\n // Register WebSocket handler\r\n const wsConfig: WebSocketConfig = {\r\n path: this.options.wsPath ?? DEFAULT_WS_PATH,\r\n onOpen: (ws) => this.handleOpen(ws),\r\n onMessage: (ws, message, isBinary) => this.handleMessage(ws, message, isBinary),\r\n onClose: (ws, code, reason) => this.handleClose(ws, code, reason),\r\n onError: (ws, error) => this.handleError(ws, error),\r\n }\r\n await this.transport.registerWebSocket(wsConfig)\r\n\r\n // Register HTTP routes\r\n if (this.options.httpPrefix !== false) {\r\n const prefix = this.options.httpPrefix ?? '/api/live'\r\n await this.transport.registerHttpRoutes(this.buildHttpRoutes(prefix))\r\n }\r\n\r\n // Cluster adapter startup\r\n if (this.options.cluster) {\r\n await this.options.cluster.start()\r\n }\r\n\r\n // Transport startup hook\r\n if (this.transport.start) {\r\n await this.transport.start()\r\n }\r\n\r\n liveLog('lifecycle', null, `LiveServer started (ws: ${wsConfig.path}${this.options.cluster ? ', cluster: enabled' : ''})`)\r\n }\r\n\r\n /**\r\n * Graceful shutdown.\r\n */\r\n async shutdown(): Promise<void> {\r\n this.registry.cleanup()\r\n this.connectionManager.shutdown()\r\n this.fileUploadManager.shutdown()\r\n this.stateSignature.shutdown()\r\n if (this.options.cluster) await this.options.cluster.shutdown()\r\n if (this.transport.shutdown) await this.transport.shutdown()\r\n liveLog('lifecycle', null, 'LiveServer shut down')\r\n }\r\n\r\n // ===== WebSocket Handlers =====\r\n\r\n private handleOpen(ws: GenericWebSocket): void {\r\n // Read origin before overwriting ws.data (adapter may have pre-set it)\r\n const origin = ws.data?.origin\r\n\r\n // Origin validation (CSRF protection)\r\n const allowedOrigins = this.options.allowedOrigins\r\n if (allowedOrigins && allowedOrigins.length > 0) {\r\n if (!origin || !allowedOrigins.includes(origin)) {\r\n liveLog('websocket', null, `Connection rejected: origin '${origin || 'none'}' not in allowedOrigins`)\r\n ws.close(4003, 'Origin not allowed')\r\n return\r\n }\r\n }\r\n\r\n const connectionId = `ws-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`\r\n\r\n ws.data = {\r\n connectionId,\r\n components: new Map(),\r\n subscriptions: new Set(),\r\n connectedAt: new Date(),\r\n origin,\r\n }\r\n\r\n this.connectionManager.registerConnection(ws, connectionId)\r\n\r\n sendImmediate(ws, JSON.stringify({\r\n type: 'CONNECTION_ESTABLISHED',\r\n connectionId,\r\n timestamp: Date.now()\r\n }))\r\n\r\n liveLog('websocket', null, `Connection opened: ${connectionId}`)\r\n }\r\n\r\n private async handleMessage(ws: GenericWebSocket, rawMessage: unknown, isBinary: boolean): Promise<void> {\r\n // Rate limit\r\n const connectionId = ws.data?.connectionId\r\n if (connectionId) {\r\n const limiter = this.rateLimiter.get(connectionId)\r\n if (!limiter.tryConsume()) {\r\n sendImmediate(ws, JSON.stringify({ type: 'ERROR', error: 'Rate limit exceeded', timestamp: Date.now() }))\r\n return\r\n }\r\n }\r\n\r\n // Binary protocol (file upload chunks)\r\n if (isBinary && rawMessage instanceof ArrayBuffer) {\r\n try {\r\n const { header, data } = decodeBinaryChunk(rawMessage)\r\n if (header.type === 'FILE_UPLOAD_CHUNK') {\r\n const chunkMessage = { ...header, data: '' } as any\r\n const progress = await this.fileUploadManager.receiveChunk(chunkMessage, data)\r\n if (progress) sendImmediate(ws, JSON.stringify(progress))\r\n }\r\n } catch (error: any) {\r\n sendImmediate(ws, JSON.stringify({ type: 'ERROR', error: error.message, timestamp: Date.now() }))\r\n }\r\n return\r\n }\r\n\r\n // JSON protocol — check size before parsing\r\n const str = typeof rawMessage === 'string' ? rawMessage : new TextDecoder().decode(rawMessage as ArrayBuffer)\r\n if (str.length > MAX_MESSAGE_SIZE) {\r\n sendImmediate(ws, JSON.stringify({ type: 'ERROR', error: 'Message too large', timestamp: Date.now() }))\r\n return\r\n }\r\n\r\n let message: LiveMessage\r\n try {\r\n message = JSON.parse(str)\r\n } catch {\r\n sendImmediate(ws, JSON.stringify({ type: 'ERROR', error: 'Invalid JSON', timestamp: Date.now() }))\r\n return\r\n }\r\n\r\n // Strip prototype pollution keys from payload\r\n if (message.payload) {\r\n message.payload = sanitizePayload(message.payload)\r\n }\r\n\r\n try {\r\n // Auth message\r\n if (message.type === 'AUTH') {\r\n const authContext = await this.authManager.authenticate(message.payload || {})\r\n if (ws.data) ws.data.authContext = authContext\r\n sendImmediate(ws, JSON.stringify({\r\n type: 'AUTH_RESPONSE',\r\n success: authContext.authenticated,\r\n payload: authContext.authenticated ? { userId: authContext.user?.id } : { error: 'Authentication failed' },\r\n timestamp: Date.now()\r\n }))\r\n return\r\n }\r\n\r\n // Room messages\r\n if (message.type === 'ROOM_JOIN' || message.type === 'ROOM_LEAVE' || message.type === 'ROOM_EMIT' || message.type === 'ROOM_STATE_SET' || message.type === 'ROOM_STATE_GET') {\r\n await this.handleRoomMessage(ws, message)\r\n return\r\n }\r\n\r\n // File upload messages\r\n if (message.type === 'FILE_UPLOAD_START') {\r\n const result = await this.fileUploadManager.startUpload(message as any, ws.data?.userId)\r\n sendImmediate(ws, JSON.stringify({\r\n type: 'FILE_UPLOAD_START_RESPONSE',\r\n componentId: message.componentId,\r\n uploadId: message.payload?.uploadId,\r\n success: result.success,\r\n error: result.error,\r\n requestId: message.requestId,\r\n timestamp: Date.now()\r\n }))\r\n return\r\n }\r\n\r\n if (message.type === 'FILE_UPLOAD_CHUNK') {\r\n const progress = await this.fileUploadManager.receiveChunk(message as any)\r\n if (progress) sendImmediate(ws, JSON.stringify(progress))\r\n return\r\n }\r\n\r\n if (message.type === 'FILE_UPLOAD_COMPLETE') {\r\n const result = await this.fileUploadManager.completeUpload(message as any)\r\n sendImmediate(ws, JSON.stringify(result))\r\n return\r\n }\r\n\r\n // Component rehydration\r\n if (message.type === 'COMPONENT_REHYDRATE') {\r\n const result = await this.registry.rehydrateComponent(\r\n message.componentId,\r\n message.payload.component,\r\n message.payload.signedState,\r\n ws,\r\n { room: message.payload.room, userId: message.userId }\r\n )\r\n sendImmediate(ws, JSON.stringify({\r\n type: 'COMPONENT_REHYDRATED',\r\n componentId: message.componentId,\r\n success: result.success,\r\n result: result.success ? { newComponentId: result.newComponentId } : undefined,\r\n error: result.error,\r\n requestId: message.requestId,\r\n timestamp: Date.now()\r\n }))\r\n return\r\n }\r\n\r\n // Delegate to registry\r\n const result = await this.registry.handleMessage(ws, message)\r\n\r\n if (result !== null) {\r\n const response: WebSocketResponse = {\r\n type: message.type === 'CALL_ACTION' ? 'ACTION_RESPONSE' : 'MESSAGE_RESPONSE',\r\n originalType: message.type,\r\n componentId: message.componentId,\r\n success: result.success,\r\n result: result.result,\r\n error: result.error,\r\n requestId: message.requestId,\r\n responseId: message.responseId,\r\n timestamp: Date.now()\r\n }\r\n sendImmediate(ws, JSON.stringify(response))\r\n }\r\n } catch (error: any) {\r\n sendImmediate(ws, JSON.stringify({\r\n type: 'ERROR',\r\n componentId: message.componentId,\r\n error: error.message,\r\n requestId: message.requestId,\r\n timestamp: Date.now()\r\n }))\r\n }\r\n }\r\n\r\n private handleClose(ws: GenericWebSocket, code: number, reason: string): void {\r\n const connectionId = ws.data?.connectionId\r\n const componentCount = ws.data?.components?.size || 0\r\n\r\n this.registry.cleanupConnection(ws)\r\n this.roomManager.cleanupComponent(connectionId || '')\r\n if (connectionId) {\r\n this.connectionManager.cleanupConnection(connectionId)\r\n this.rateLimiter.remove(connectionId)\r\n }\r\n\r\n liveLog('websocket', null, `Connection closed: ${connectionId} (${componentCount} components)`)\r\n }\r\n\r\n private handleError(ws: GenericWebSocket, error: Error): void {\r\n console.error(`[LiveServer] WebSocket error:`, error.message)\r\n }\r\n\r\n // ===== Room Message Router =====\r\n\r\n private async handleRoomMessage(ws: GenericWebSocket, message: LiveMessage): Promise<void> {\r\n const { componentId } = message\r\n const roomId = (message as any).roomId || message.payload?.roomId\r\n\r\n switch (message.type) {\r\n case 'ROOM_JOIN': {\r\n // Block client join for LiveRoom-backed rooms (must use server-side $room().join())\r\n if (this.roomRegistry.resolveFromId(roomId)) {\r\n sendImmediate(ws, JSON.stringify({\r\n type: 'ERROR',\r\n componentId,\r\n error: 'Room requires server-side join via component action',\r\n requestId: message.requestId,\r\n timestamp: Date.now()\r\n }))\r\n break\r\n }\r\n\r\n // Per-connection room limit\r\n const connRooms = ws.data?.rooms as Set<string> | undefined\r\n if (connRooms && connRooms.size >= MAX_ROOMS_PER_CONNECTION) {\r\n sendImmediate(ws, JSON.stringify({\r\n type: 'ERROR',\r\n componentId,\r\n error: 'Room limit exceeded',\r\n requestId: message.requestId,\r\n timestamp: Date.now()\r\n }))\r\n break\r\n }\r\n\r\n // Auth: check if auth provider allows joining this room\r\n if (this.authManager.hasProviders()) {\r\n const authContext = ws.data?.authContext\r\n const authResult = await this.authManager.authorizeRoom(\r\n authContext || ANONYMOUS_CONTEXT,\r\n roomId,\r\n )\r\n if (!authResult.allowed) {\r\n sendImmediate(ws, JSON.stringify({\r\n type: 'ERROR',\r\n componentId,\r\n error: authResult.reason || 'Room access denied',\r\n requestId: message.requestId,\r\n timestamp: Date.now()\r\n }))\r\n break\r\n }\r\n }\r\n\r\n const result = this.roomManager.joinRoom(componentId, roomId, ws, message.payload?.initialState)\r\n\r\n if ('rejected' in result && result.rejected) {\r\n sendImmediate(ws, JSON.stringify({\r\n type: 'ERROR',\r\n componentId,\r\n error: result.reason,\r\n requestId: message.requestId,\r\n timestamp: Date.now()\r\n }))\r\n break\r\n }\r\n\r\n // Track rooms per connection\r\n if (!ws.data!.rooms) ws.data!.rooms = new Set<string>()\r\n ;(ws.data!.rooms as Set<string>).add(roomId)\r\n\r\n sendImmediate(ws, JSON.stringify({\r\n type: 'ROOM_JOINED',\r\n componentId,\r\n payload: { roomId, state: result.state },\r\n requestId: message.requestId,\r\n timestamp: Date.now()\r\n }))\r\n break\r\n }\r\n case 'ROOM_LEAVE':\r\n this.roomManager.leaveRoom(componentId, roomId)\r\n ;(ws.data?.rooms as Set<string> | undefined)?.delete(roomId)\r\n sendImmediate(ws, JSON.stringify({\r\n type: 'ROOM_LEFT',\r\n componentId,\r\n payload: { roomId },\r\n requestId: message.requestId,\r\n timestamp: Date.now()\r\n }))\r\n break\r\n case 'ROOM_EMIT': {\r\n // Security: must be a member of the room to emit\r\n if (!this.roomManager.isInRoom(componentId, roomId)) {\r\n sendImmediate(ws, JSON.stringify({\r\n type: 'ERROR',\r\n componentId,\r\n error: 'Not a member of this room',\r\n requestId: message.requestId,\r\n timestamp: Date.now()\r\n }))\r\n break\r\n }\r\n this.roomManager.emitToRoom(roomId, message.payload?.event, message.payload?.data, componentId)\r\n break\r\n }\r\n case 'ROOM_STATE_SET': {\r\n // Security: must be a member of the room\r\n if (!this.roomManager.isInRoom(componentId, roomId)) {\r\n sendImmediate(ws, JSON.stringify({\r\n type: 'ERROR',\r\n componentId,\r\n error: 'Not a member of this room',\r\n requestId: message.requestId,\r\n timestamp: Date.now()\r\n }))\r\n break\r\n }\r\n // Security: block client writes when serverOnlyState is enabled\r\n if (this.roomManager.isServerOnlyState(roomId)) {\r\n sendImmediate(ws, JSON.stringify({\r\n type: 'ERROR',\r\n componentId,\r\n error: 'Room state is server-only',\r\n requestId: message.requestId,\r\n timestamp: Date.now()\r\n }))\r\n break\r\n }\r\n this.roomManager.setRoomState(roomId, message.payload?.state, componentId)\r\n break\r\n }\r\n case 'ROOM_STATE_GET': {\r\n // Security: must be a member of the room to read state\r\n if (!this.roomManager.isInRoom(componentId, roomId)) {\r\n sendImmediate(ws, JSON.stringify({\r\n type: 'ERROR',\r\n componentId,\r\n error: 'Not a member of this room',\r\n requestId: message.requestId,\r\n timestamp: Date.now()\r\n }))\r\n break\r\n }\r\n const state = this.roomManager.getRoomState(roomId)\r\n sendImmediate(ws, JSON.stringify({\r\n type: 'ROOM_STATE',\r\n componentId,\r\n payload: { roomId, state },\r\n requestId: message.requestId,\r\n timestamp: Date.now()\r\n }))\r\n break\r\n }\r\n }\r\n }\r\n\r\n // ===== HTTP Monitoring Routes =====\r\n\r\n private buildHttpRoutes(prefix: string): HttpRouteDefinition[] {\r\n return [\r\n {\r\n method: 'GET',\r\n path: `${prefix}/stats`,\r\n handler: () => ({\r\n body: {\r\n components: this.registry.getStats(),\r\n rooms: this.roomManager.getStats(),\r\n connections: this.connectionManager.getSystemStats(),\r\n uploads: this.fileUploadManager.getStats(),\r\n performance: this.performanceMonitor.getStats(),\r\n }\r\n }),\r\n metadata: { summary: 'Live Components system statistics', tags: ['live'] }\r\n },\r\n {\r\n method: 'GET',\r\n path: `${prefix}/components`,\r\n handler: () => ({\r\n body: { names: this.registry.getRegisteredComponentNames() }\r\n }),\r\n metadata: { summary: 'List registered component names', tags: ['live'] }\r\n },\r\n {\r\n method: 'POST',\r\n path: `${prefix}/rooms/:roomId/messages`,\r\n handler: (req) => {\r\n const roomId = req.params.roomId!\r\n this.roomManager.emitToRoom(roomId, 'message:new', req.body)\r\n return { body: { success: true, roomId } }\r\n },\r\n metadata: { summary: 'Send message to room via HTTP', tags: ['live', 'rooms'] }\r\n },\r\n {\r\n method: 'POST',\r\n path: `${prefix}/rooms/:roomId/emit`,\r\n handler: (req) => {\r\n const roomId = req.params.roomId!\r\n const { event, data } = req.body as any\r\n this.roomManager.emitToRoom(roomId, event, data)\r\n return { body: { success: true, roomId, event } }\r\n },\r\n metadata: { summary: 'Emit custom event to room via HTTP', tags: ['live', 'rooms'] }\r\n },\r\n ]\r\n }\r\n}\r\n","// @fluxstack/live - Room State Manager (In-memory storage per room)\r\n\r\ntype RoomStateData = Record<string, any>\r\n\r\ninterface RoomInfo {\r\n state: RoomStateData\r\n componentCount: number\r\n createdAt: number\r\n lastUpdate: number\r\n}\r\n\r\nexport function createTypedRoomState<TRoomTypes extends Record<string, RoomStateData>>() {\r\n const rooms = new Map<string, RoomInfo>()\r\n const getKey = (type: string, roomId: string) => `${type}:${roomId}`\r\n\r\n return {\r\n get<K extends keyof TRoomTypes>(type: K, roomId: string, defaultState: TRoomTypes[K]): TRoomTypes[K] {\r\n const key = getKey(type as string, roomId)\r\n const room = rooms.get(key)\r\n\r\n if (room) return room.state as TRoomTypes[K]\r\n\r\n rooms.set(key, { state: defaultState, componentCount: 0, createdAt: Date.now(), lastUpdate: Date.now() })\r\n return defaultState\r\n },\r\n\r\n update<K extends keyof TRoomTypes>(type: K, roomId: string, updates: Partial<TRoomTypes[K]>): TRoomTypes[K] {\r\n const key = getKey(type as string, roomId)\r\n const room = rooms.get(key)\r\n\r\n if (room) {\r\n room.state = { ...room.state, ...updates }\r\n room.lastUpdate = Date.now()\r\n return room.state as TRoomTypes[K]\r\n }\r\n\r\n const newState = updates as TRoomTypes[K]\r\n rooms.set(key, { state: newState, componentCount: 0, createdAt: Date.now(), lastUpdate: Date.now() })\r\n return newState\r\n },\r\n\r\n set<K extends keyof TRoomTypes>(type: K, roomId: string, state: TRoomTypes[K]): void {\r\n const key = getKey(type as string, roomId)\r\n const room = rooms.get(key)\r\n\r\n if (room) {\r\n room.state = state\r\n room.lastUpdate = Date.now()\r\n } else {\r\n rooms.set(key, { state, componentCount: 0, createdAt: Date.now(), lastUpdate: Date.now() })\r\n }\r\n },\r\n\r\n join<K extends keyof TRoomTypes>(type: K, roomId: string): void {\r\n const room = rooms.get(getKey(type as string, roomId))\r\n if (room) room.componentCount++\r\n },\r\n\r\n leave<K extends keyof TRoomTypes>(type: K, roomId: string): void {\r\n const key = getKey(type as string, roomId)\r\n const room = rooms.get(key)\r\n if (room) {\r\n room.componentCount--\r\n if (room.componentCount <= 0) {\r\n setTimeout(() => {\r\n const current = rooms.get(key)\r\n if (current && current.componentCount <= 0) {\r\n rooms.delete(key)\r\n }\r\n }, 5 * 60 * 1000)\r\n }\r\n }\r\n },\r\n\r\n has<K extends keyof TRoomTypes>(type: K, roomId: string): boolean {\r\n return rooms.has(getKey(type as string, roomId))\r\n },\r\n\r\n delete<K extends keyof TRoomTypes>(type: K, roomId: string): boolean {\r\n return rooms.delete(getKey(type as string, roomId))\r\n },\r\n\r\n getStats(): { totalRooms: number; rooms: Record<string, { componentCount: number; stateKeys: string[] }> } {\r\n const roomStats: Record<string, { componentCount: number; stateKeys: string[] }> = {}\r\n for (const [key, info] of rooms) {\r\n roomStats[key] = { componentCount: info.componentCount, stateKeys: Object.keys(info.state) }\r\n }\r\n return { totalRooms: rooms.size, rooms: roomStats }\r\n }\r\n }\r\n}\r\n\r\nexport class RoomStateManager {\r\n private rooms = new Map<string, RoomInfo>()\r\n\r\n get<T extends RoomStateData>(roomId: string, defaultState?: T): T {\r\n const room = this.rooms.get(roomId)\r\n if (room) return room.state as T\r\n\r\n if (defaultState) {\r\n this.rooms.set(roomId, { state: defaultState, componentCount: 0, createdAt: Date.now(), lastUpdate: Date.now() })\r\n return defaultState\r\n }\r\n\r\n return {} as T\r\n }\r\n\r\n update<T extends RoomStateData>(roomId: string, updates: Partial<T>): T {\r\n const room = this.rooms.get(roomId)\r\n\r\n if (room) {\r\n room.state = { ...room.state, ...updates }\r\n room.lastUpdate = Date.now()\r\n return room.state as T\r\n }\r\n\r\n const newState = updates as T\r\n this.rooms.set(roomId, { state: newState, componentCount: 0, createdAt: Date.now(), lastUpdate: Date.now() })\r\n return newState\r\n }\r\n\r\n set<T extends RoomStateData>(roomId: string, state: T): void {\r\n const room = this.rooms.get(roomId)\r\n\r\n if (room) {\r\n room.state = state\r\n room.lastUpdate = Date.now()\r\n } else {\r\n this.rooms.set(roomId, { state, componentCount: 0, createdAt: Date.now(), lastUpdate: Date.now() })\r\n }\r\n }\r\n\r\n join(roomId: string): void {\r\n const room = this.rooms.get(roomId)\r\n if (room) room.componentCount++\r\n }\r\n\r\n leave(roomId: string): void {\r\n const room = this.rooms.get(roomId)\r\n if (room) {\r\n room.componentCount--\r\n if (room.componentCount <= 0) {\r\n setTimeout(() => {\r\n const current = this.rooms.get(roomId)\r\n if (current && current.componentCount <= 0) {\r\n this.rooms.delete(roomId)\r\n }\r\n }, 5 * 60 * 1000)\r\n }\r\n }\r\n }\r\n\r\n has(roomId: string): boolean {\r\n return this.rooms.has(roomId)\r\n }\r\n\r\n delete(roomId: string): boolean {\r\n return this.rooms.delete(roomId)\r\n }\r\n\r\n getStats(): { totalRooms: number; rooms: Record<string, { componentCount: number; stateKeys: string[] }> } {\r\n const rooms: Record<string, { componentCount: number; stateKeys: string[] }> = {}\r\n for (const [roomId, info] of this.rooms) {\r\n rooms[roomId] = { componentCount: info.componentCount, stateKeys: Object.keys(info.state) }\r\n }\r\n return { totalRooms: this.rooms.size, rooms }\r\n }\r\n}\r\n\r\nexport type { RoomStateData, RoomInfo }\r\n","// @fluxstack/live - In-Memory Room Adapter (Default)\r\n//\r\n// Single-instance, zero-dependency adapter for room storage and pub/sub.\r\n// All operations resolve synchronously via Promise.resolve().\r\n// Pub/sub methods are no-ops since all events are already local.\r\n\r\nimport type { IRoomStorageAdapter, IRoomPubSubAdapter } from './adapters'\r\n\r\ninterface RoomData {\r\n state: any\r\n createdAt: number\r\n lastUpdate: number\r\n}\r\n\r\nexport class InMemoryRoomAdapter implements IRoomStorageAdapter, IRoomPubSubAdapter {\r\n private rooms = new Map<string, RoomData>()\r\n\r\n // ===== IRoomStorageAdapter =====\r\n\r\n async getOrCreateRoom(roomId: string, initialState?: any): Promise<{ state: any; created: boolean }> {\r\n const existing = this.rooms.get(roomId)\r\n if (existing) {\r\n return { state: existing.state, created: false }\r\n }\r\n\r\n const now = Date.now()\r\n const data: RoomData = {\r\n state: initialState ?? {},\r\n createdAt: now,\r\n lastUpdate: now,\r\n }\r\n this.rooms.set(roomId, data)\r\n return { state: data.state, created: true }\r\n }\r\n\r\n async getState(roomId: string): Promise<any> {\r\n return this.rooms.get(roomId)?.state ?? {}\r\n }\r\n\r\n async updateState(roomId: string, updates: any): Promise<void> {\r\n const room = this.rooms.get(roomId)\r\n if (room) {\r\n Object.assign(room.state, updates)\r\n room.lastUpdate = Date.now()\r\n }\r\n }\r\n\r\n async hasRoom(roomId: string): Promise<boolean> {\r\n return this.rooms.has(roomId)\r\n }\r\n\r\n async deleteRoom(roomId: string): Promise<boolean> {\r\n return this.rooms.delete(roomId)\r\n }\r\n\r\n async getStats(): Promise<{ totalRooms: number; rooms: Record<string, any> }> {\r\n const rooms: Record<string, any> = {}\r\n for (const [id, data] of this.rooms) {\r\n rooms[id] = {\r\n createdAt: data.createdAt,\r\n lastUpdate: data.lastUpdate,\r\n stateKeys: Object.keys(data.state),\r\n }\r\n }\r\n return { totalRooms: this.rooms.size, rooms }\r\n }\r\n\r\n // ===== IRoomPubSubAdapter =====\r\n // No-ops for single-instance: all events are already propagated locally\r\n // by RoomEventBus and LiveRoomManager's broadcastToRoom().\r\n\r\n async publish(_roomId: string, _event: string, _data: any): Promise<void> {\r\n // No-op: events are already local\r\n }\r\n\r\n async subscribe(_roomId: string, _handler: (event: string, data: any) => void): Promise<() => void> {\r\n // No-op: return empty unsubscribe\r\n return () => {}\r\n }\r\n\r\n async publishMembership(_roomId: string, _action: 'join' | 'leave', _componentId: string): Promise<void> {\r\n // No-op: membership is already tracked locally\r\n }\r\n\r\n async publishStateChange(_roomId: string, _updates: any): Promise<void> {\r\n // No-op: state changes are already propagated locally\r\n }\r\n}\r\n"]}