@fluxstack/live 0.1.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.
@@ -0,0 +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"]}