vg-x07df 1.9.5 → 1.10.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/channel/index.cjs.map +1 -1
- package/dist/channel/index.d.cts +1 -1
- package/dist/channel/index.d.ts +1 -1
- package/dist/channel/index.mjs.map +1 -1
- package/dist/index.cjs +121 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +39 -5
- package/dist/index.d.ts +39 -5
- package/dist/index.mjs +121 -10
- package/dist/index.mjs.map +1 -1
- package/dist/{types-CCWG5LpL.d.cts → types-BbdWZE4Y.d.cts} +1 -1
- package/dist/{types-CCWG5LpL.d.ts → types-BbdWZE4Y.d.ts} +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/logger.ts","../../src/channel/DataChannelContext.ts","../../src/state/types.ts","../../src/state/store.ts","../../src/channel/chat/store.ts","../../src/channel/chat/utils.ts","../../src/channel/chat/service.ts","../../src/channel/chat/useChat.ts","../../src/channel/raiseHand/store.ts","../../src/channel/raiseHand/service.ts","../../src/channel/raiseHand/useRaiseHand.ts","../../src/channel/reactions/store.ts","../../src/channel/reactions/utils.ts","../../src/channel/reactions/service.ts","../../src/channel/reactions/useReactions.ts","../../src/channel/spotlight/store.ts","../../src/channel/spotlight/service.ts","../../src/channel/spotlight/useSpotlight.ts","../../src/channel/registry.ts","../../src/channel/DataChannelProvider.tsx"],"names":["createContext","useContext","create","immer","entry","nanoid","ConnectionState","useMemo","useCallback","react","defaultState","logger","useRef","useState","useEffect"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Comprehensive logging system for the Callpad Web SDK\n *\n * Features:\n * - Log level filtering (debug, info, warn, error)\n * - Environment variable configuration (DEBUG, CALLPAD_LOG_LEVEL)\n * - Hierarchical namespacing (callpad:socket:connection)\n * - Custom logger integration\n * - Zero-cost when disabled\n */\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface LoggerOptions {\n level?: LogLevel;\n enableDebug?: boolean;\n customLogger?: (level: LogLevel, message: string, meta?: any) => void;\n}\n\nexport interface CallpadLogger {\n debug(message: string, meta?: any): void;\n info(message: string, meta?: any): void;\n warn(message: string, meta?: any): void;\n error(message: string, meta?: any): void;\n child(namespace: string): CallpadLogger;\n setLevel(level: LogLevel): void;\n isLevelEnabled(level: LogLevel): boolean;\n}\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\nclass CallpadLoggerImpl implements CallpadLogger {\n private namespace: string;\n private level: LogLevel;\n private enableDebug: boolean;\n private customLogger?: (level: LogLevel, message: string, meta?: any) => void;\n\n constructor(namespace = \"callpad\", options: LoggerOptions = {}) {\n this.namespace = namespace;\n this.level = options.level ?? this.getDefaultLevel();\n this.enableDebug = options.enableDebug ?? this.shouldEnableDebug();\n if (options.customLogger) {\n this.customLogger = options.customLogger;\n }\n }\n\n private getDefaultLevel(): LogLevel {\n const envLevel =\n typeof window !== \"undefined\"\n ? (window as any).__CALLPAD_LOG_LEVEL__\n : typeof globalThis !== \"undefined\" &&\n (globalThis as any).process?.env?.CALLPAD_LOG_LEVEL;\n\n if (envLevel && this.isValidLogLevel(envLevel)) {\n return envLevel as LogLevel;\n }\n\n const isProduction =\n typeof globalThis !== \"undefined\" &&\n (globalThis as any).process?.env?.NODE_ENV === \"production\";\n\n return isProduction ? \"warn\" : \"info\";\n }\n\n private shouldEnableDebug(): boolean {\n const debugEnv =\n typeof window !== \"undefined\"\n ? (window as any).__DEBUG__\n : typeof globalThis !== \"undefined\" &&\n (globalThis as any).process?.env?.DEBUG;\n\n if (!debugEnv) return false;\n\n const debugPatterns = debugEnv.split(/[\\s,]+/);\n return debugPatterns.some((pattern: string) => {\n if (pattern === \"*\") return true;\n if (pattern.endsWith(\"*\")) {\n const prefix = pattern.slice(0, -1);\n return this.namespace.startsWith(prefix);\n }\n return this.namespace === pattern;\n });\n }\n\n private isValidLogLevel(level: string): boolean {\n return Object.keys(LOG_LEVELS).includes(level);\n }\n\n private shouldLog(level: LogLevel): boolean {\n if (level === \"debug\" && !this.enableDebug) {\n return false;\n }\n return LOG_LEVELS[level] >= LOG_LEVELS[this.level];\n }\n\n private formatMessage(level: LogLevel, message: string, meta?: any): void {\n if (!this.shouldLog(level)) return;\n\n const timestamp = new Date().toISOString();\n const prefix = `[${timestamp}] [${this.namespace}] [${level.toUpperCase()}]`;\n\n if (this.customLogger) {\n this.customLogger(level, message, meta);\n return;\n }\n\n const logMethod =\n level === \"error\"\n ? console.error\n : level === \"warn\"\n ? console.warn\n : level === \"info\"\n ? console.info\n : console.log;\n\n if (meta !== undefined) {\n logMethod(`${prefix} ${message}`, meta);\n } else {\n logMethod(`${prefix} ${message}`);\n }\n }\n\n debug(message: string, meta?: any): void {\n this.formatMessage(\"debug\", message, meta);\n }\n\n info(message: string, meta?: any): void {\n this.formatMessage(\"info\", message, meta);\n }\n\n warn(message: string, meta?: any): void {\n this.formatMessage(\"warn\", message, meta);\n }\n\n error(message: string, meta?: any): void {\n this.formatMessage(\"error\", message, meta);\n }\n\n child(namespace: string): CallpadLogger {\n const childNamespace = `${this.namespace}:${namespace}`;\n const childOptions: LoggerOptions = {\n level: this.level,\n enableDebug: this.enableDebug,\n };\n if (this.customLogger) {\n childOptions.customLogger = this.customLogger;\n }\n return new CallpadLoggerImpl(childNamespace, childOptions);\n }\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n isLevelEnabled(level: LogLevel): boolean {\n return this.shouldLog(level);\n }\n}\n\nlet rootLogger: CallpadLogger | null = null;\n\nexport function createLogger(\n namespace?: string,\n options?: LoggerOptions\n): CallpadLogger {\n if (!namespace) {\n if (!rootLogger) {\n rootLogger = new CallpadLoggerImpl(\"callpad\", options);\n }\n return rootLogger;\n }\n\n return new CallpadLoggerImpl(`callpad:${namespace}`, options);\n}\n\nexport function setGlobalLoggerOptions(options: LoggerOptions): void {\n rootLogger = new CallpadLoggerImpl(\"callpad\", options);\n}\n","import { createContext, useContext } from \"react\";\n\nexport interface DataChannelContextValue {\n services: Map<string, any>;\n isReady: boolean;\n}\n\nexport const DataChannelContext = createContext<DataChannelContextValue | null>(\n null\n);\n\nexport function useDataChannelContext(): DataChannelContextValue {\n const context = useContext(DataChannelContext);\n if (!context) {\n throw new Error(\n \"useDataChannelContext must be used within DataChannelProvider\"\n );\n }\n return context;\n}\n\nexport function useFeatureService<T = any>(featureName: string): T {\n const { services } = useDataChannelContext();\n const service = services.get(featureName) as T;\n if (!service) {\n throw new Error(\n `Feature service \"${featureName}\" not found. Make sure it's enabled in DataChannelProvider.`\n );\n }\n\n return service;\n}\n","type Nullable<T> = T | null;\n\nexport type CallParticipantRole = \"HOST\" | \"PARTICIPANT\" | \"GUEST\";\n\nexport interface Profile {\n userId: string;\n username: string | null;\n firstName: string | null;\n lastName: string | null;\n profilePhoto: string | null;\n}\n\nexport interface ParticipantPermissions {\n canMute: boolean;\n canKick: boolean;\n canTransfer: boolean;\n canEnd: boolean;\n canRecord: boolean;\n canShareScreen: boolean;\n}\n\nexport interface ParticipantMetadata {\n userId: string | number;\n firstName: Nullable<string>;\n lastName: Nullable<string>;\n username: Nullable<string>;\n email: Nullable<string>;\n profilePhoto: Nullable<string>;\n role: CallParticipantRole;\n permissions: ParticipantPermissions;\n}\n\nexport interface LiveKitJoinInfo {\n token: string;\n roomName: string;\n url: string;\n}\n\nexport interface RecordingInfo {\n recordingId: string;\n egressId: string;\n startedAt: string;\n initiatedBy?: string;\n}\n\nexport type SessionType = \"CALL\" | \"MEETING\";\n\nexport interface MeetingInfo {\n meetingId: string;\n meetingCode: string;\n}\n\nexport interface Session {\n id: string;\n status: \"initializing\" | \"pending\" | \"ready\" | \"active\" | \"ended\";\n mode: \"AUDIO\" | \"VIDEO\";\n role: \"HOST\" | \"PARTICIPANT\" | \"GUEST\";\n livekitInfo?: LiveKitJoinInfo;\n startedAt?: string;\n ringTimeoutMs?: number;\n recording?: RecordingInfo | null;\n sessionType?: SessionType;\n meetingInfo?: MeetingInfo;\n}\n\nexport interface IncomingInvite {\n callId: string;\n inviteId: string;\n caller: ParticipantMetadata;\n mode: \"AUDIO\" | \"VIDEO\";\n expiresAt: string;\n expiresInMs: number;\n ringTimeoutMs: number;\n}\n\nexport interface OutgoingInvite {\n userId: string;\n status: \"sent\" | \"accepted\" | \"declined\" | \"missed\";\n participant?: Omit<ParticipantMetadata, \"permissions\"> | undefined;\n}\n\nexport interface RtcError {\n code: string;\n message: string;\n timestamp: number;\n context?: any;\n}\n\nexport interface GuestIdentity {\n guestId: string;\n displayName: string;\n}\n\nexport interface RtcState {\n // Did we initiate the current call?\n initiated: boolean;\n\n // Active session (null when no active call)\n session: Session | null;\n\n // Incoming invitation (null when no pending invite)\n incomingInvite: IncomingInvite | null;\n\n outgoingInvites: Record<string, OutgoingInvite>;\n\n // Error tracking\n errors: RtcError[];\n\n // Guest mode state\n guestIdentity: GuestIdentity | null;\n isGuestMode: boolean;\n}\n\nexport const defaultState: RtcState = {\n initiated: false,\n session: null,\n incomingInvite: null,\n outgoingInvites: {},\n errors: [],\n guestIdentity: null,\n isGuestMode: false,\n};\n\nimport type { Participant } from \"livekit-client\";\n\nexport interface ParticipantListOptions {\n pageSize?: number;\n includeLocalParticipant?: boolean;\n sortBy?: \"speaking\" | \"name\" | \"raised-hand\";\n}\n\nexport interface ParticipantListReturn {\n participants: Participant[];\n pinnedParticipants: Participant[];\n currentPage: number;\n totalPages: number;\n pageSize: number;\n totalParticipants: number;\n hasNextPage: boolean;\n hasPrevPage: boolean;\n nextPage: () => void;\n prevPage: () => void;\n setPageSize: (size: number) => void;\n togglePin: (participantId: string) => void;\n clearPinned: () => void;\n isPinned: (participantId: string) => boolean;\n}\n","import { create } from \"zustand\";\nimport { immer } from \"zustand/middleware/immer\";\nimport type { RtcError, RtcState } from \"./types\";\nimport { defaultState } from \"./types\";\n\ntype Actions = {\n patch: (fn: (draft: RtcState) => void) => void;\n reset: () => void;\n addError: (error: RtcError) => void;\n clearErrors: () => void;\n};\n\nexport const useRtcStore = create<RtcState & Actions>()(\n immer((set) => ({\n ...defaultState,\n\n patch: (fn) =>\n set((state) => {\n fn(state);\n }),\n\n reset: () => set(() => defaultState),\n\n addError: (error) =>\n set((state) => {\n state.errors.push(error);\n }),\n\n clearErrors: () =>\n set((state) => {\n state.errors = [];\n }),\n }))\n);\n\nexport const rtcStore = useRtcStore;\n","import { create } from \"zustand\";\nimport { immer } from \"zustand/middleware/immer\";\nimport type { ChatEntry, ChatState, Envelope } from \"./types\";\n\ninterface ChatActions {\n patch: (fn: (draft: ChatState) => void) => void;\n applyIncoming: (envelope: Envelope) => void;\n addFile: (file: File, filename: string) => void;\n addEntryOptimistic: (entry: ChatEntry) => void;\n markEntrySent: (entryId: string) => void;\n markEntryFailed: (entryId: string) => void;\n applyEdit: (entryId: string, newContent: string, version: number) => void;\n applyRemove: (entryId: string) => void;\n applyReaction: (\n entryId: string,\n emoji: string,\n participantId: string,\n op: \"add\" | \"remove\"\n ) => void;\n queuePendingOp: (entryId: string, envelope: Envelope) => void;\n processPendingOps: (entryId: string) => void;\n trimOldEntries: () => void;\n clearChat: () => void;\n}\n\nconst defaultChatState: ChatState = {\n byId: {},\n order: [],\n pendingOps: {},\n participantCache: {},\n maxEntries: 1000,\n};\n\nfunction applyReactionToEntry(\n entry: ChatEntry,\n emoji: string,\n participantId: string,\n op: \"add\" | \"remove\"\n) {\n const emojiSet = entry.reactions[emoji];\n if (!emojiSet) {\n entry.reactions[emoji] = new Set();\n }\n if (op === \"add\") {\n entry.reactions[emoji]?.add(participantId);\n } else {\n entry.reactions[emoji]?.delete(participantId);\n if (entry.reactions[emoji]?.size === 0) {\n delete entry.reactions[emoji];\n }\n }\n}\n\nfunction trimEntriesIfNeeded(state: ChatState) {\n if (Object.keys(state.byId).length > state.maxEntries) {\n const entriesToRemove = Object.keys(state.byId).length - state.maxEntries;\n for (let i = 0; i < entriesToRemove; i++) {\n const oldestId = state.order[i];\n if (oldestId) {\n delete state.byId[oldestId];\n }\n }\n state.order = state.order.slice(entriesToRemove);\n }\n}\n\nexport const useChatStore = create<ChatState & ChatActions>()(\n immer((set) => ({\n ...defaultChatState,\n\n patch: (fn) =>\n set((state) => {\n fn(state);\n }),\n\n applyIncoming: (envelope) =>\n set((state) => {\n if (envelope.kind === \"entry\") {\n if (state.byId[envelope.entryId]) {\n return;\n }\n\n if (envelope.sender.info) {\n state.participantCache[envelope.sender.id] = envelope.sender.info;\n }\n\n const entry: ChatEntry = {\n id: envelope.entryId,\n content: envelope.payload.content,\n sender: {\n id: envelope.sender.id,\n },\n createdAt: envelope.ts,\n version: 1,\n reactions: {},\n status: \"sent\",\n filename: envelope.payload?.meta?.filename,\n };\n\n state.byId[envelope.entryId] = entry;\n state.order.push(envelope.entryId);\n\n trimEntriesIfNeeded(state);\n\n const pendingOps = state.pendingOps[envelope.entryId];\n if (pendingOps) {\n delete state.pendingOps[envelope.entryId];\n\n for (const op of pendingOps) {\n if (op.kind === \"edit\") {\n const entry = state.byId[op.entryId];\n if (entry && op.payload.version > entry.version) {\n entry.content = op.payload.newContent;\n entry.version = op.payload.version;\n entry.editedAt = op.ts;\n }\n } else if (op.kind === \"remove\") {\n const entry = state.byId[op.entryId];\n if (entry && !entry.removedAt) {\n entry.removedAt = op.ts;\n }\n } else if (op.kind === \"reaction\") {\n if (op.sender.info) {\n state.participantCache[op.sender.id] = op.sender.info;\n }\n\n const entry = state.byId[op.entryId];\n if (entry) {\n applyReactionToEntry(\n entry,\n op.payload.emoji,\n op.sender.id,\n op.payload.op\n );\n }\n }\n }\n }\n } else if (envelope.kind === \"edit\") {\n const entry = state.byId[envelope.entryId];\n if (entry) {\n if (envelope.payload.version > entry.version) {\n entry.content = envelope.payload.newContent;\n entry.version = envelope.payload.version;\n entry.editedAt = envelope.ts;\n }\n } else {\n if (!state.pendingOps[envelope.entryId]) {\n state.pendingOps[envelope.entryId] = [];\n }\n state.pendingOps[envelope.entryId]?.push(envelope);\n }\n } else if (envelope.kind === \"remove\") {\n const entry = state.byId[envelope.entryId];\n if (entry) {\n if (!entry.removedAt) {\n entry.removedAt = envelope.ts;\n }\n } else {\n if (!state.pendingOps[envelope.entryId]) {\n state.pendingOps[envelope.entryId] = [];\n }\n state.pendingOps[envelope.entryId]?.push(envelope);\n }\n } else if (envelope.kind === \"reaction\") {\n if (envelope.sender.info) {\n state.participantCache[envelope.sender.id] = envelope.sender.info;\n }\n\n const entry = state.byId[envelope.entryId];\n if (entry) {\n applyReactionToEntry(\n entry,\n envelope.payload.emoji,\n envelope.sender.id,\n envelope.payload.op\n );\n } else {\n if (!state.pendingOps[envelope.entryId]) {\n state.pendingOps[envelope.entryId] = [];\n }\n state.pendingOps[envelope.entryId]?.push(envelope);\n }\n }\n }),\n\n addFile: (file, filename) =>\n set((state) => {\n const values = Object.values(state.byId);\n const entryArr = values.filter((val) => val.filename === filename);\n const entry = entryArr[0];\n entry!.file = file;\n state.byId[entry!.id] = entry!;\n }),\n\n addEntryOptimistic: (entry) =>\n set((state) => {\n state.byId[entry.id] = entry;\n state.order.push(entry.id);\n\n trimEntriesIfNeeded(state);\n }),\n\n markEntrySent: (entryId) =>\n set((state) => {\n const entry = state.byId[entryId];\n if (entry) {\n entry.status = \"sent\";\n }\n }),\n\n markEntryFailed: (entryId) =>\n set((state) => {\n const entry = state.byId[entryId];\n if (entry) {\n entry.status = \"failed\";\n }\n }),\n\n applyEdit: (entryId, newContent, version) =>\n set((state) => {\n const entry = state.byId[entryId];\n if (entry && version > entry.version) {\n entry.content = newContent;\n entry.version = version;\n entry.editedAt = Date.now();\n }\n }),\n\n applyRemove: (entryId) =>\n set((state) => {\n const entry = state.byId[entryId];\n if (entry && !entry.removedAt) {\n entry.removedAt = Date.now();\n }\n }),\n\n applyReaction: (entryId, emoji, participantId, op) =>\n set((state) => {\n const entry = state.byId[entryId];\n if (entry) {\n applyReactionToEntry(entry, emoji, participantId, op);\n }\n }),\n\n queuePendingOp: (entryId, envelope) =>\n set((state) => {\n if (!state.pendingOps[entryId]) {\n state.pendingOps[entryId] = [];\n }\n state.pendingOps[entryId].push(envelope);\n }),\n\n processPendingOps: (entryId) =>\n set((state) => {\n const pendingOps = state.pendingOps[entryId];\n if (!pendingOps) {\n return;\n }\n\n delete state.pendingOps[entryId];\n\n for (const envelope of pendingOps) {\n if (envelope.kind === \"edit\") {\n const entry = state.byId[envelope.entryId];\n if (entry && envelope.payload.version > entry.version) {\n entry.content = envelope.payload.newContent;\n entry.version = envelope.payload.version;\n entry.editedAt = envelope.ts;\n }\n } else if (envelope.kind === \"remove\") {\n const entry = state.byId[envelope.entryId];\n if (entry && !entry.removedAt) {\n entry.removedAt = envelope.ts;\n }\n } else if (envelope.kind === \"reaction\") {\n if (envelope.sender.info) {\n state.participantCache[envelope.sender.id] = envelope.sender.info;\n }\n\n const entry = state.byId[envelope.entryId];\n if (entry) {\n applyReactionToEntry(\n entry,\n envelope.payload.emoji,\n envelope.sender.id,\n envelope.payload.op\n );\n }\n }\n }\n }),\n\n trimOldEntries: () =>\n set((state) => {\n trimEntriesIfNeeded(state);\n }),\n\n clearChat: () => set(() => defaultChatState),\n }))\n);\n\nexport const chatStore = useChatStore;\n","import { nanoid } from \"nanoid\";\nimport type { ChatEntry, Envelope } from \"./types\";\n\nexport function compareEntries(a: ChatEntry, b: ChatEntry): number {\n if (a.createdAt !== b.createdAt) {\n return a.createdAt - b.createdAt;\n }\n\n if (a.sender.id !== b.sender.id) {\n return a.sender.id.localeCompare(b.sender.id);\n }\n\n return a.id.localeCompare(b.id);\n}\n\nexport function validateContent(content: string): {\n valid: boolean;\n error?: string;\n} {\n const trimmed = content.trim();\n\n if (trimmed.length === 0) {\n return { valid: false, error: \"Content cannot be empty\" };\n }\n\n const sizeInBytes = new TextEncoder().encode(content).length;\n if (sizeInBytes > 16384) {\n return { valid: false, error: \"Content exceeds 16KB limit\" };\n }\n\n return { valid: true };\n}\n\nexport function isValidEnvelope(data: any): data is Envelope {\n if (!data || typeof data !== \"object\") {\n return false;\n }\n\n if (data.v !== 1) {\n return false;\n }\n\n if (![\"entry\", \"edit\", \"remove\", \"reaction\"].includes(data.kind)) {\n return false;\n }\n\n if (\n typeof data.roomId !== \"string\" ||\n typeof data.entryId !== \"string\" ||\n typeof data.ts !== \"number\"\n ) {\n return false;\n }\n\n if (!data.sender || typeof data.sender.id !== \"string\") {\n return false;\n }\n\n if (\n data.kind === \"entry\" ||\n data.kind === \"edit\" ||\n data.kind === \"reaction\"\n ) {\n if (!data.payload || typeof data.payload !== \"object\") {\n return false;\n }\n }\n\n return true;\n}\n\nexport function generateEntryId(): string {\n return nanoid();\n}\n\nexport function getCurrentTimestamp(): number {\n return Date.now();\n}\n","import { ConnectionState, type Room } from \"livekit-client\";\nimport { useRtcStore } from \"../../state/store\";\nimport type { ParticipantMetadata } from \"../../state/types\";\nimport { createLogger } from \"../../utils\";\nimport { useChatStore } from \"./store\";\nimport type { ChatEntry, Envelope } from \"./types\";\nimport {\n generateEntryId,\n getCurrentTimestamp,\n isValidEnvelope,\n validateContent,\n} from \"./utils\";\n\nconst logger = createLogger(\"chat\");\n\nexport class ChatService {\n private readonly room: Room;\n private isSubscribed = false;\n\n constructor(room: Room) {\n this.room = room;\n }\n\n private isRoomReady(): boolean {\n if (!this.room) {\n logger.warn(\"Room not initialized\");\n return false;\n }\n\n if (this.room.state !== ConnectionState.Connected) {\n logger.warn(\"Room not connected\", { state: this.room.state });\n return false;\n }\n\n if (!this.room.localParticipant) {\n logger.warn(\"Local participant not available\");\n return false;\n }\n\n return true;\n }\n\n subscribe(): void {\n if (this.isSubscribed) {\n return;\n }\n // Handles incoming text streams\n this.room.registerTextStreamHandler(\n \"chat:v1\",\n async (reader, participantInfo) => {\n try {\n const text = await reader.readAll();\n console.log(\"Got here: chat:v1\", text, participantInfo.identity);\n this.handleIncomingMessage(text);\n } catch (error) {\n logger.error(\"Error reading text stream\", error);\n }\n }\n );\n\n // Handles incoming file streams\n this.room.registerByteStreamHandler(\n \"chat:v1\",\n async (reader, participantInfo) => {\n try {\n const info = reader.info;\n const filename = info.name;\n\n // Ensure BlobParts are backed by ArrayBuffer (not SharedArrayBuffer) by copying with slice().\n const parts = (await reader.readAll()).map((chunk) => chunk.slice());\n const fileBlob = new Blob(parts, { type: info.mimeType });\n\n this.handleIncomingFile(fileBlob, filename, info.mimeType);\n } catch (error) {\n logger.error(\"Error reading file stream\", error);\n }\n }\n );\n this.isSubscribed = true;\n }\n\n unsubscribe(): void {\n this.isSubscribed = false;\n }\n\n getLocalParticipantId(): string {\n return this.room.localParticipant.identity;\n }\n\n async send(content: string, file?: File): Promise<void> {\n if (!this.isRoomReady()) {\n useRtcStore.getState().addError({\n code: \"CHAT_ROOM_NOT_READY\",\n message: \"Cannot send message: room not connected\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const messageContent =\n content.length === 0 && typeof file !== \"undefined\" ? file.name : content;\n\n const validation = validateContent(messageContent);\n if (!validation.valid) {\n useRtcStore.getState().addError({\n code: \"CHAT_INVALID_CONTENT\",\n message: validation.error || \"Invalid content\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const entryId = generateEntryId();\n const chatStore = useChatStore.getState();\n const senderInfo = this.getSenderInfo();\n if (senderInfo.info) {\n chatStore.patch((state) => {\n state.participantCache[senderInfo.id] = senderInfo.info!;\n });\n }\n\n const entry: ChatEntry = {\n id: entryId,\n content: messageContent,\n sender: {\n id: senderInfo.id,\n },\n createdAt: getCurrentTimestamp(),\n version: 1,\n reactions: {},\n status: \"sending\",\n file: file!,\n };\n\n chatStore.addEntryOptimistic(entry);\n try {\n const envelope: Envelope = {\n v: 1,\n kind: \"entry\",\n roomId: this.room.name,\n entryId,\n ts: entry.createdAt,\n sender: senderInfo,\n payload: {\n content,\n meta: { filename: file?.name },\n },\n };\n\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\n topic: \"chat:v1\",\n });\n if (file) {\n await this.room.localParticipant.sendFile(file, {\n mimeType: file.type,\n topic: \"chat:v1\",\n });\n }\n chatStore.markEntrySent(entryId);\n } catch (error) {\n chatStore.markEntryFailed(entryId);\n useRtcStore.getState().addError({\n code: \"CHAT_SEND_FAILED\",\n message:\n error instanceof Error ? error.message : \"Failed to send message\",\n timestamp: Date.now(),\n context: { entryId },\n });\n }\n }\n\n async edit(entryId: string, newContent: string): Promise<void> {\n if (!this.isRoomReady()) {\n useRtcStore.getState().addError({\n code: \"CHAT_ROOM_NOT_READY\",\n message: \"Cannot edit message: room not connected\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const validation = validateContent(newContent);\n if (!validation.valid) {\n useRtcStore.getState().addError({\n code: \"CHAT_INVALID_CONTENT\",\n message: validation.error || \"Invalid content\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const chatStore = useChatStore.getState();\n const entry = chatStore.byId[entryId];\n if (!entry) {\n useRtcStore.getState().addError({\n code: \"CHAT_ENTRY_NOT_FOUND\",\n message: \"Entry not found\",\n timestamp: Date.now(),\n context: { entryId },\n });\n return;\n }\n\n const senderInfo = this.getSenderInfo();\n if (entry.sender.id !== senderInfo.id) {\n useRtcStore.getState().addError({\n code: \"CHAT_UNAUTHORIZED\",\n message: \"You can only edit your own messages\",\n timestamp: Date.now(),\n context: { entryId },\n });\n return;\n }\n\n const newVersion = entry.version + 1;\n chatStore.applyEdit(entryId, newContent, newVersion);\n try {\n const envelope: Envelope = {\n v: 1,\n kind: \"edit\",\n roomId: this.room.name,\n entryId,\n ts: getCurrentTimestamp(),\n sender: senderInfo,\n payload: {\n newContent,\n version: newVersion,\n },\n };\n\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\n topic: \"chat:v1\",\n });\n } catch (error) {\n useRtcStore.getState().addError({\n code: \"CHAT_EDIT_FAILED\",\n message:\n error instanceof Error ? error.message : \"Failed to edit message\",\n timestamp: Date.now(),\n context: { entryId },\n });\n }\n }\n\n async remove(entryId: string): Promise<void> {\n if (!this.isRoomReady()) {\n useRtcStore.getState().addError({\n code: \"CHAT_ROOM_NOT_READY\",\n message: \"Cannot remove message: room not connected\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const chatStore = useChatStore.getState();\n const entry = chatStore.byId[entryId];\n if (!entry) {\n useRtcStore.getState().addError({\n code: \"CHAT_ENTRY_NOT_FOUND\",\n message: \"Entry not found\",\n timestamp: Date.now(),\n context: { entryId },\n });\n return;\n }\n\n const senderInfo = this.getSenderInfo();\n if (entry.sender.id !== senderInfo.id) {\n useRtcStore.getState().addError({\n code: \"CHAT_UNAUTHORIZED\",\n message: \"You can only remove your own messages\",\n timestamp: Date.now(),\n context: { entryId },\n });\n return;\n }\n\n chatStore.applyRemove(entryId);\n try {\n const envelope: Envelope = {\n v: 1,\n kind: \"remove\",\n roomId: this.room.name,\n entryId,\n ts: getCurrentTimestamp(),\n sender: senderInfo,\n };\n\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\n topic: \"chat:v1\",\n });\n } catch (error) {\n useRtcStore.getState().addError({\n code: \"CHAT_REMOVE_FAILED\",\n message:\n error instanceof Error ? error.message : \"Failed to remove message\",\n timestamp: Date.now(),\n context: { entryId },\n });\n }\n }\n\n async react(entryId: string, emoji: string): Promise<void> {\n if (!this.isRoomReady()) {\n useRtcStore.getState().addError({\n code: \"CHAT_ROOM_NOT_READY\",\n message: \"Cannot add reaction: room not connected\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const chatStore = useChatStore.getState();\n const entry = chatStore.byId[entryId];\n if (!entry) {\n return;\n }\n\n const senderInfo = this.getSenderInfo();\n if (senderInfo.info) {\n chatStore.patch((state) => {\n state.participantCache[senderInfo.id] = senderInfo.info!;\n });\n }\n\n chatStore.applyReaction(entryId, emoji, senderInfo.id, \"add\");\n try {\n const envelope: Envelope = {\n v: 1,\n kind: \"reaction\",\n roomId: this.room.name,\n entryId,\n ts: getCurrentTimestamp(),\n sender: senderInfo,\n payload: {\n emoji,\n op: \"add\",\n },\n };\n\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\n topic: \"chat:v1\",\n });\n } catch (error) {\n useRtcStore.getState().addError({\n code: \"CHAT_REACTION_FAILED\",\n message:\n error instanceof Error ? error.message : \"Failed to add reaction\",\n timestamp: Date.now(),\n context: { entryId, emoji },\n });\n }\n }\n\n async unreact(entryId: string, emoji: string): Promise<void> {\n if (!this.isRoomReady()) {\n useRtcStore.getState().addError({\n code: \"CHAT_ROOM_NOT_READY\",\n message: \"Cannot remove reaction: room not connected\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const chatStore = useChatStore.getState();\n const entry = chatStore.byId[entryId];\n if (!entry) {\n return;\n }\n\n const senderInfo = this.getSenderInfo();\n if (senderInfo.info) {\n chatStore.patch((state) => {\n state.participantCache[senderInfo.id] = senderInfo.info!;\n });\n }\n\n chatStore.applyReaction(entryId, emoji, senderInfo.id, \"remove\");\n try {\n const envelope: Envelope = {\n v: 1,\n kind: \"reaction\",\n roomId: this.room.name,\n entryId,\n ts: getCurrentTimestamp(),\n sender: senderInfo,\n payload: {\n emoji,\n op: \"remove\",\n },\n };\n\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\n topic: \"chat:v1\",\n });\n } catch (error) {\n useRtcStore.getState().addError({\n code: \"CHAT_REACTION_FAILED\",\n message:\n error instanceof Error ? error.message : \"Failed to remove reaction\",\n timestamp: Date.now(),\n context: { entryId, emoji },\n });\n }\n }\n\n private handleIncomingMessage(text: string): void {\n try {\n const parsed = JSON.parse(text);\n if (!isValidEnvelope(parsed)) {\n logger.warn(\"Invalid envelope received\", parsed);\n return;\n }\n\n useChatStore.getState().applyIncoming(parsed);\n } catch (error) {\n logger.error(\"Error parsing incoming message\", error);\n }\n }\n\n private handleIncomingFile(\n blob: Blob,\n filename: string,\n mimeType: string\n ): void {\n try {\n const file = new File([blob], filename, { type: mimeType || blob.type });\n\n useChatStore.getState().addFile(file, filename);\n } catch (error) {\n logger.error(\"Error parsing incoming file\", error);\n }\n }\n\n private getSenderInfo(): { id: string; info?: ParticipantMetadata } {\n const localParticipant = this.room.localParticipant;\n const sender: { id: string; info?: ParticipantMetadata } = {\n id: localParticipant.identity,\n };\n\n if (localParticipant.metadata) {\n try {\n sender.info = JSON.parse(\n localParticipant.metadata\n ) as ParticipantMetadata;\n } catch {\n // Ignore metadata parsing errors\n }\n }\n\n return sender;\n }\n}\n","import { useCallback, useMemo } from \"react\";\nimport type { ParticipantMetadata } from \"../../state/types\";\nimport { useFeatureService } from \"../DataChannelContext\";\nimport type { ChatService } from \"./service\";\nimport { useChatStore } from \"./store\";\nimport type { ChatEntry } from \"./types\";\nimport { compareEntries } from \"./utils\";\n\ntype Nullable<T> = T | null;\n\nexport interface UseChatReturn {\n entries: ChatEntry[];\n isReady: boolean;\n getParticipantInfo: (id: string) => Nullable<ParticipantMetadata>;\n isOwnEntry: (entry: ChatEntry) => boolean;\n send: (content: string, file?: File) => Promise<void>;\n edit: (id: string, content: string) => Promise<void>;\n remove: (id: string) => Promise<void>;\n react: (id: string, emoji: string) => Promise<void>;\n unreact: (id: string, emoji: string) => Promise<void>;\n}\n\nexport function useChat(): UseChatReturn {\n const service = useFeatureService<ChatService>(\"chat\");\n\n const byId = useChatStore((state) => state.byId);\n const order = useChatStore((state) => state.order);\n const participantCache = useChatStore((state) => state.participantCache);\n\n const entries = useMemo(() => {\n return order\n .map((id) => byId[id])\n .filter((entry): entry is ChatEntry => entry !== undefined)\n .sort(compareEntries);\n }, [byId, order]);\n\n const getParticipantInfo = useCallback(\n (id: string): Nullable<ParticipantMetadata> => {\n return participantCache[id] || null;\n },\n [participantCache]\n );\n\n const send = useCallback(\n async (content: string, file?: File) => service.send(content, file),\n [service]\n );\n\n const edit = useCallback(\n async (id: string, content: string) => service.edit(id, content),\n [service]\n );\n\n const remove = useCallback(\n async (id: string) => service.remove(id),\n [service]\n );\n\n const react = useCallback(\n async (id: string, emoji: string) => service.react(id, emoji),\n [service]\n );\n\n const unreact = useCallback(\n async (id: string, emoji: string) => service.unreact(id, emoji),\n [service]\n );\n\n const isOwnEntry = useCallback(\n (entry: ChatEntry) => entry.sender.id === service.getLocalParticipantId(),\n [service]\n );\n\n return {\n entries,\n isReady: true,\n getParticipantInfo,\n isOwnEntry,\n send,\n edit,\n remove,\n react,\n unreact,\n };\n}\n","import { create } from \"zustand\";\nimport { immer } from \"zustand/middleware/immer\";\nimport type { ParticipantMetadata } from \"../../state/types\";\nimport type { RaiseHandEnvelope, RaiseHandState, RaisedHand } from \"./types\";\n\ninterface RaiseHandActions {\n raiseHand: (participantId: string) => void;\n lowerHand: (participantId: string) => void;\n lowerAllHands: () => void;\n isHandRaised: (participantId: string) => boolean;\n getRaisedHandOrder: (participantId: string) => number | null;\n upsertParticipantInfo: (id: string, info: ParticipantMetadata) => void;\n clear: () => void;\n}\n\nconst defaultState: RaiseHandState = {\n raisedHands: new Map(),\n nextOrder: 1,\n};\n\nexport const useRaiseHandStore = create<RaiseHandState & RaiseHandActions>()(\n immer((set, get) => ({\n ...defaultState,\n\n raiseHand: (participantId) =>\n set((state) => {\n if (!state.raisedHands.has(participantId)) {\n state.raisedHands.set(participantId, {\n ts: Date.now(),\n order: state.nextOrder++,\n });\n }\n }),\n\n lowerHand: (participantId) =>\n set((state) => {\n state.raisedHands.delete(participantId);\n // Reset order counter when all hands are lowered\n if (state.raisedHands.size === 0) {\n state.nextOrder = 1;\n }\n }),\n\n lowerAllHands: () =>\n set((state) => {\n state.raisedHands.clear();\n state.nextOrder = 1;\n }),\n\n isHandRaised: (participantId) => get().raisedHands.has(participantId),\n\n getRaisedHandOrder: (participantId) => {\n const hand = get().raisedHands.get(participantId);\n return hand?.order ?? null;\n },\n\n upsertParticipantInfo: (id, info) => {\n // No-op for now, can be extended if needed\n },\n\n clear: () =>\n set(() => ({\n raisedHands: new Map(),\n nextOrder: 1,\n })),\n }))\n);\n\nexport function applyIncomingRaiseHand(envelope: RaiseHandEnvelope): void {\n const { raiseHand, lowerHand, lowerAllHands, upsertParticipantInfo } =\n useRaiseHandStore.getState();\n\n if (envelope.sender.info) {\n upsertParticipantInfo(envelope.sender.id, envelope.sender.info);\n }\n\n switch (envelope.payload.action) {\n case \"raise\": {\n raiseHand(envelope.sender.id);\n break;\n }\n case \"lower\": {\n const targetId = envelope.payload.targetId || envelope.sender.id;\n lowerHand(targetId);\n break;\n }\n case \"lower-all\": {\n lowerAllHands();\n break;\n }\n }\n}\n","import { ConnectionState, type Room } from \"livekit-client\";\nimport { useRtcStore } from \"../../state/store\";\nimport type { ParticipantMetadata } from \"../../state/types\";\nimport { createLogger } from \"../../utils\";\nimport { applyIncomingRaiseHand, useRaiseHandStore } from \"./store\";\nimport type { RaiseHandEnvelope } from \"./types\";\n\nconst logger = createLogger(\"raise-hand\");\n\nexport class RaiseHandService {\n private readonly room: Room;\n private isSubscribed = false;\n\n constructor(room: Room) {\n this.room = room;\n }\n\n private isRoomReady(): boolean {\n if (!this.room) {\n logger.warn(\"Room not initialized\");\n return false;\n }\n\n if (this.room.state !== ConnectionState.Connected) {\n logger.warn(\"Room not connected\", { state: this.room.state });\n return false;\n }\n\n if (!this.room.localParticipant) {\n logger.warn(\"Local participant not available\");\n return false;\n }\n\n return true;\n }\n\n subscribe(): void {\n if (this.isSubscribed) return;\n\n this.room.registerTextStreamHandler(\"raise-hand:v1\", async (reader) => {\n try {\n const text = await reader.readAll();\n this.handleIncoming(text);\n } catch (err) {\n logger.error(\"Error reading raise-hand stream\", err);\n }\n });\n\n this.isSubscribed = true;\n logger.info(\"RaiseHandService subscribed\");\n }\n\n unsubscribe(): void {\n this.isSubscribed = false;\n logger.info(\"RaiseHandService unsubscribed\");\n }\n\n getLocalParticipantId(): string {\n return this.room.localParticipant.identity;\n }\n\n async raiseHand(): Promise<void> {\n if (!this.isRoomReady()) {\n useRtcStore.getState().addError({\n code: \"RAISE_HAND_ROOM_NOT_READY\",\n message: \"Cannot raise hand: room not connected\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const senderInfo = this.getSenderInfo();\n useRaiseHandStore.getState().raiseHand(senderInfo.id);\n\n try {\n const envelope: RaiseHandEnvelope = {\n v: 1,\n kind: \"raise-hand\",\n roomId: this.room.name,\n ts: Date.now(),\n sender: senderInfo,\n payload: {\n action: \"raise\",\n },\n };\n\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\n topic: \"raise-hand:v1\",\n });\n\n logger.debug(\"Hand raised\");\n } catch (error) {\n logger.error(\"Failed to raise hand\", error);\n useRtcStore.getState().addError({\n code: \"RAISE_HAND_SEND_FAILED\",\n message:\n error instanceof Error ? error.message : \"Failed to raise hand\",\n timestamp: Date.now(),\n });\n }\n }\n\n async lowerHand(targetId?: string): Promise<void> {\n if (!this.isRoomReady()) {\n useRtcStore.getState().addError({\n code: \"LOWER_HAND_ROOM_NOT_READY\",\n message: \"Cannot lower hand: room not connected\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const senderInfo = this.getSenderInfo();\n const participantId = targetId || senderInfo.id;\n useRaiseHandStore.getState().lowerHand(participantId);\n\n try {\n const envelope: RaiseHandEnvelope = {\n v: 1,\n kind: \"raise-hand\",\n roomId: this.room.name,\n ts: Date.now(),\n sender: senderInfo,\n payload: {\n action: \"lower\",\n targetId: participantId,\n },\n };\n\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\n topic: \"raise-hand:v1\",\n });\n\n logger.debug(\"Hand lowered\", { targetId: participantId });\n } catch (error) {\n logger.error(\"Failed to lower hand\", error);\n useRtcStore.getState().addError({\n code: \"LOWER_HAND_SEND_FAILED\",\n message:\n error instanceof Error ? error.message : \"Failed to lower hand\",\n timestamp: Date.now(),\n });\n }\n }\n\n async lowerAllHands(): Promise<void> {\n if (!this.isRoomReady()) {\n useRtcStore.getState().addError({\n code: \"LOWER_ALL_HANDS_ROOM_NOT_READY\",\n message: \"Cannot lower all hands: room not connected\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const senderInfo = this.getSenderInfo();\n useRaiseHandStore.getState().lowerAllHands();\n\n try {\n const envelope: RaiseHandEnvelope = {\n v: 1,\n kind: \"raise-hand\",\n roomId: this.room.name,\n ts: Date.now(),\n sender: senderInfo,\n payload: {\n action: \"lower-all\",\n },\n };\n\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\n topic: \"raise-hand:v1\",\n });\n\n logger.debug(\"All hands lowered\");\n } catch (error) {\n logger.error(\"Failed to lower all hands\", error);\n useRtcStore.getState().addError({\n code: \"LOWER_ALL_HANDS_SEND_FAILED\",\n message:\n error instanceof Error ? error.message : \"Failed to lower all hands\",\n timestamp: Date.now(),\n });\n }\n }\n\n private handleIncoming(text: string): void {\n try {\n const parsed = JSON.parse(text) as RaiseHandEnvelope;\n if (!this.isValidEnvelope(parsed)) {\n logger.warn(\"Invalid raise-hand envelope received\", parsed);\n return;\n }\n\n if (parsed.sender.id === this.getLocalParticipantId()) {\n logger.debug(\"Ignoring self-echo raise-hand message\");\n return;\n }\n\n applyIncomingRaiseHand(parsed);\n logger.debug(\"Raise-hand message received\", {\n action: parsed.payload.action,\n });\n } catch (error) {\n logger.error(\"Error parsing incoming raise-hand message\", error);\n }\n }\n\n private isValidEnvelope(e: any): e is RaiseHandEnvelope {\n return (\n e &&\n e.v === 1 &&\n e.kind === \"raise-hand\" &&\n typeof e.roomId === \"string\" &&\n e.roomId === this.room.name &&\n typeof e.ts === \"number\" &&\n e.ts > 0 &&\n typeof e.sender?.id === \"string\" &&\n typeof e.payload?.action === \"string\" &&\n [\"raise\", \"lower\", \"lower-all\"].includes(e.payload.action)\n );\n }\n\n private getSenderInfo(): { id: string; info?: ParticipantMetadata } {\n const localParticipant = this.room.localParticipant;\n const sender: { id: string; info?: ParticipantMetadata } = {\n id: localParticipant.identity,\n };\n\n if (localParticipant.metadata) {\n try {\n sender.info = JSON.parse(\n localParticipant.metadata\n ) as ParticipantMetadata;\n } catch {\n // Ignore metadata parse errors\n }\n }\n\n return sender;\n }\n}\n","import { useCallback, useMemo } from \"react\";\nimport { createLogger } from \"../../utils\";\nimport { useFeatureService } from \"../DataChannelContext\";\nimport type { RaiseHandService } from \"./service\";\nimport { useRaiseHandStore } from \"./store\";\n\nconst logger = createLogger(\"raise-hand:hook\");\n\ntype Nullable<T> = T | null;\n\nexport interface RaisedHandInfo {\n participantId: string;\n order: number;\n ts: number;\n}\n\nexport interface UseRaiseHandReturn {\n raiseHand: () => Promise<void>;\n lowerHand: (participantId?: string) => Promise<void>;\n lowerAllHands: () => Promise<void>;\n isHandRaised: (participantId: string) => boolean;\n getRaisedHandOrder: (participantId: string) => Nullable<number>;\n getRaisedHands: () => RaisedHandInfo[];\n isReady: boolean;\n}\n\nexport function useRaiseHand(): UseRaiseHandReturn {\n const service = useFeatureService<RaiseHandService>(\"raise-hand\");\n\n const raisedHands = useRaiseHandStore((state) => state.raisedHands);\n const isHandRaised = useRaiseHandStore((state) => state.isHandRaised);\n const getRaisedHandOrder = useRaiseHandStore(\n (state) => state.getRaisedHandOrder\n );\n\n const raiseHand = useCallback(async () => {\n if (!service) {\n logger.error(\"Cannot raise hand: service not ready\");\n return;\n }\n return service.raiseHand();\n }, [service]);\n\n const lowerHand = useCallback(\n async (participantId?: string) => {\n if (!service) {\n logger.error(\"Cannot lower hand: service not ready\");\n return;\n }\n return service.lowerHand(participantId);\n },\n [service]\n );\n\n const lowerAllHands = useCallback(async () => {\n if (!service) {\n logger.error(\"Cannot lower all hands: service not ready\");\n return;\n }\n return service.lowerAllHands();\n }, [service]);\n\n const getRaisedHands = useCallback((): RaisedHandInfo[] => {\n const hands: RaisedHandInfo[] = [];\n for (const [participantId, hand] of raisedHands.entries()) {\n hands.push({\n participantId,\n order: hand.order,\n ts: hand.ts,\n });\n }\n return hands.sort((a, b) => a.order - b.order);\n }, [raisedHands]);\n\n return {\n raiseHand,\n lowerHand,\n lowerAllHands,\n isHandRaised,\n getRaisedHandOrder,\n getRaisedHands,\n isReady: !!service,\n };\n}\n","import { create } from \"zustand\";\nimport { immer } from \"zustand/middleware/immer\";\nimport type { ParticipantMetadata } from \"../../state/types\";\nimport type {\n ParticipantReaction,\n ReactionEnvelope,\n ReactionsState,\n} from \"./types\";\n\ninterface ReactionsActions {\n setReaction: (participantId: string, reaction: ParticipantReaction) => void;\n clearReaction: (participantId: string) => void;\n upsertParticipantInfo: (id: string, info: ParticipantMetadata) => void;\n pruneExpired: (now?: number) => void;\n clear: () => void;\n}\n\nconst defaultState: ReactionsState = {\n reactions: new Map(),\n participantCache: {},\n ttlMs: 4000,\n};\n\nexport const useReactionsStore = create<ReactionsState & ReactionsActions>()(\n immer((set) => ({\n ...defaultState,\n\n setReaction: (participantId, reaction) =>\n set((state) => {\n state.reactions.set(participantId, reaction);\n }),\n\n clearReaction: (participantId) =>\n set((state) => {\n state.reactions.delete(participantId);\n }),\n\n upsertParticipantInfo: (id, info) =>\n set((state) => {\n state.participantCache[id] = info;\n }),\n\n pruneExpired: (now = Date.now()) =>\n set((state) => {\n const entries = Array.from(state.reactions.entries());\n for (const [participantId, reaction] of entries) {\n if (reaction.ts + state.ttlMs < now) {\n state.reactions.delete(participantId);\n }\n }\n }),\n\n clear: () =>\n set(() => ({\n reactions: new Map(),\n participantCache: {},\n ttlMs: defaultState.ttlMs,\n })),\n }))\n);\n\nexport function applyIncomingReaction(envelope: ReactionEnvelope): void {\n const { upsertParticipantInfo, setReaction } = useReactionsStore.getState();\n\n if (envelope.sender.info) {\n upsertParticipantInfo(envelope.sender.id, envelope.sender.info);\n }\n\n setReaction(envelope.sender.id, {\n emoji: envelope.payload.emoji,\n ts: Date.now(),\n nonce: envelope.payload.nonce,\n });\n}\n","import { createLogger } from \"../../utils\";\n\nexport const logger = createLogger(\"reactions\");\n\nexport function validateEmoji(emoji: string): {\n valid: boolean;\n error?: string;\n} {\n if (!emoji || typeof emoji !== \"string\") {\n return { valid: false, error: \"empty\" };\n }\n if (emoji.length > 10) {\n return { valid: false, error: \"too long\" };\n }\n return { valid: true };\n}\n\nexport function generateNonce(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n","import { ConnectionState, type Room } from \"livekit-client\";\nimport { useRtcStore } from \"../../state/store\";\nimport type { ParticipantMetadata } from \"../../state/types\";\nimport { createLogger } from \"../../utils\";\nimport { applyIncomingReaction, useReactionsStore } from \"./store\";\nimport type { ReactionEnvelope } from \"./types\";\nimport { generateNonce, validateEmoji } from \"./utils\";\n\nconst logger = createLogger(\"reactions\");\n\nexport class ReactionsService {\n private readonly room: Room;\n private isSubscribed = false;\n private pruneInterval: ReturnType<typeof setInterval> | undefined;\n private lastSendAt = 0;\n private minIntervalMs = 200;\n private lastRemoteTs = new Map<string, number>();\n\n constructor(room: Room) {\n this.room = room;\n }\n\n private isRoomReady(): boolean {\n if (!this.room) {\n logger.warn(\"Room not initialized\");\n return false;\n }\n\n if (this.room.state !== ConnectionState.Connected) {\n logger.warn(\"Room not connected\", { state: this.room.state });\n return false;\n }\n\n if (!this.room.localParticipant) {\n logger.warn(\"Local participant not available\");\n return false;\n }\n\n return true;\n }\n\n private canSendNow(): boolean {\n const now = Date.now();\n if (now - this.lastSendAt < this.minIntervalMs) return false;\n this.lastSendAt = now;\n return true;\n }\n\n subscribe(): void {\n if (this.isSubscribed) return;\n\n this.room.registerTextStreamHandler(\"reactions:v1\", async (reader) => {\n try {\n const text = await reader.readAll();\n this.handleIncoming(text);\n } catch (err) {\n logger.error(\"Error reading reactions stream\", err);\n }\n });\n\n this.pruneInterval = setInterval(() => {\n useReactionsStore.getState().pruneExpired();\n }, 1000);\n\n this.isSubscribed = true;\n logger.info(\"ReactionsService subscribed\");\n }\n\n unsubscribe(): void {\n this.isSubscribed = false;\n if (this.pruneInterval) {\n clearInterval(this.pruneInterval);\n this.pruneInterval = undefined;\n }\n logger.info(\"ReactionsService unsubscribed\");\n }\n\n getLocalParticipantId(): string {\n return this.room.localParticipant.identity;\n }\n\n async sendReaction(emoji: string): Promise<void> {\n if (!this.isRoomReady()) {\n useRtcStore.getState().addError({\n code: \"REACTIONS_ROOM_NOT_READY\",\n message: \"Cannot send reaction: room not connected\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const validation = validateEmoji(emoji);\n if (!validation.valid) {\n useRtcStore.getState().addError({\n code: \"REACTIONS_INVALID_EMOJI\",\n message: validation.error || \"Invalid emoji\",\n timestamp: Date.now(),\n });\n return;\n }\n\n if (!this.canSendNow()) {\n logger.debug(\"Rate limited, skipping send\");\n return;\n }\n\n const senderInfo = this.getSenderInfo();\n const ts = Date.now();\n const nonce = generateNonce();\n\n useReactionsStore.getState().setReaction(senderInfo.id, {\n emoji,\n ts,\n nonce,\n });\n\n try {\n const envelope: ReactionEnvelope = {\n v: 1,\n kind: \"reaction\",\n roomId: this.room.name,\n ts,\n sender: senderInfo,\n payload: {\n emoji,\n nonce,\n },\n };\n\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\n topic: \"reactions:v1\",\n });\n\n logger.debug(\"Reaction sent\", { emoji });\n } catch (error) {\n logger.error(\"Failed to send reaction\", error);\n useRtcStore.getState().addError({\n code: \"REACTIONS_SEND_FAILED\",\n message:\n error instanceof Error ? error.message : \"Failed to send reaction\",\n timestamp: Date.now(),\n context: { emoji },\n });\n }\n }\n\n private handleIncoming(text: string): void {\n try {\n const parsed = JSON.parse(text) as ReactionEnvelope;\n if (!this.isValidEnvelope(parsed)) {\n logger.warn(\"Invalid reaction envelope received\", parsed);\n return;\n }\n\n if (parsed.sender.id === this.getLocalParticipantId()) {\n logger.debug(\"Ignoring self-echo reaction\");\n return;\n }\n\n const lastTs =\n this.lastRemoteTs.get(parsed.sender.id) ?? Number.NEGATIVE_INFINITY;\n if (parsed.ts < lastTs) {\n logger.debug(\"Ignoring out-of-order reaction\", {\n sender: parsed.sender.id,\n ts: parsed.ts,\n lastTs,\n });\n return;\n }\n this.lastRemoteTs.set(parsed.sender.id, parsed.ts);\n applyIncomingReaction(parsed);\n logger.debug(\"Reaction received\", { emoji: parsed.payload.emoji });\n } catch (error) {\n logger.error(\"Error parsing incoming reaction\", error);\n }\n }\n\n private isValidEnvelope(e: any): e is ReactionEnvelope {\n return (\n e &&\n e.v === 1 &&\n e.kind === \"reaction\" &&\n typeof e.roomId === \"string\" &&\n e.roomId === this.room.name &&\n typeof e.ts === \"number\" &&\n e.ts > 0 &&\n typeof e.sender?.id === \"string\" &&\n typeof e.payload?.emoji === \"string\" &&\n typeof e.payload?.nonce === \"string\"\n );\n }\n\n private getSenderInfo(): { id: string; info?: ParticipantMetadata } {\n const localParticipant = this.room.localParticipant;\n const sender: { id: string; info?: ParticipantMetadata } = {\n id: localParticipant.identity,\n };\n\n if (localParticipant.metadata) {\n try {\n sender.info = JSON.parse(\n localParticipant.metadata\n ) as ParticipantMetadata;\n } catch {\n // Ignore metadata parse errors\n }\n }\n\n return sender;\n }\n}\n","import { useCallback } from \"react\";\nimport type { ParticipantMetadata } from \"../../state/types\";\nimport { createLogger } from \"../../utils\";\nimport { useFeatureService } from \"../DataChannelContext\";\nimport type { ReactionsService } from \"./service\";\nimport { useReactionsStore } from \"./store\";\n\nconst logger = createLogger(\"reactions:hook\");\n\ntype Nullable<T> = T | null;\n\nexport interface UseReactionsReturn {\n sendReaction: (emoji: string) => Promise<void>;\n getReactionFor: (participantId: string) => Nullable<string>;\n clearReaction: (participantId: string) => void;\n getParticipantInfo: (id: string) => Nullable<ParticipantMetadata>;\n isReady: boolean;\n}\n\nexport function useReactions(): UseReactionsReturn {\n const service = useFeatureService<ReactionsService>(\"reactions\");\n\n const reactions = useReactionsStore((state) => state.reactions);\n const participantCache = useReactionsStore((state) => state.participantCache);\n\n const getReactionFor = useCallback(\n (participantId: string): Nullable<string> => {\n const reaction = reactions.get(participantId);\n return reaction?.emoji ?? null;\n },\n [reactions]\n );\n\n const getParticipantInfo = useCallback(\n (id: string): Nullable<ParticipantMetadata> => participantCache[id] || null,\n [participantCache]\n );\n\n const sendReaction = useCallback(\n async (emoji: string) => {\n if (!service) {\n logger.error(\"Cannot send reaction: service not ready\");\n return;\n }\n return service.sendReaction(emoji);\n },\n [service]\n );\n\n const clearReaction = useCallback((participantId: string) => {\n useReactionsStore.getState().clearReaction(participantId);\n }, []);\n\n return {\n sendReaction,\n getReactionFor,\n clearReaction,\n getParticipantInfo,\n isReady: !!service,\n };\n}\n","import { create } from \"zustand\";\nimport { immer } from \"zustand/middleware/immer\";\nimport type { ParticipantMetadata } from \"../../state/types\";\nimport type {\n SpotlightEnvelope,\n SpotlightState,\n SpotlightedUser,\n} from \"./types\";\n\ninterface SpotlightActions {\n spotlight: (participantId: string, info?: ParticipantMetadata) => void;\n unspotlight: () => void;\n getSpotlightedUser: () => SpotlightedUser | null;\n clear: () => void;\n}\n\nconst defaultState: SpotlightState = {\n spotlightedUser: null,\n isSpotlighted: false,\n};\n\nexport const useSpotlightStore = create<SpotlightState & SpotlightActions>()(\n immer((set, get) => ({\n ...defaultState,\n\n spotlight: (participantId, info) =>\n set((state) => {\n state.spotlightedUser = {\n participantId,\n ts: Date.now(),\n ...(info && { info }),\n };\n state.isSpotlighted = true;\n }),\n\n unspotlight: () =>\n set((state) => {\n state.spotlightedUser = null;\n state.isSpotlighted = false;\n }),\n\n getSpotlightedUser: () => get().spotlightedUser,\n\n clear: () =>\n set(() => ({\n spotlightedUser: null,\n isSpotlighted: false,\n })),\n }))\n);\n\nexport function applyIncomingSpotlight(envelope: SpotlightEnvelope): void {\n const { spotlight, unspotlight } = useSpotlightStore.getState();\n\n switch (envelope.payload.action) {\n case \"spotlight\": {\n // Note: We don't have the target's info in the envelope, only the sender's\n // The info can be populated later if needed from the room's participant list\n spotlight(envelope.payload.targetId, envelope.payload.info);\n break;\n }\n case \"unspotlight\": {\n unspotlight();\n break;\n }\n }\n}\n","import { ConnectionState, type Room } from \"livekit-client\";\nimport { useRtcStore } from \"../../state/store\";\nimport type { ParticipantMetadata } from \"../../state/types\";\nimport { createLogger } from \"../../utils\";\nimport { applyIncomingSpotlight, useSpotlightStore } from \"./store\";\nimport type { SpotlightEnvelope } from \"./types\";\n\nconst logger = createLogger(\"spotlight\");\n\nexport class SpotlightService {\n private readonly room: Room;\n private isSubscribed = false;\n\n constructor(room: Room) {\n this.room = room;\n }\n\n private isRoomReady(): boolean {\n if (!this.room) {\n logger.warn(\"Room not initialized\");\n return false;\n }\n\n if (this.room.state !== ConnectionState.Connected) {\n logger.warn(\"Room not connected\", { state: this.room.state });\n return false;\n }\n\n if (!this.room.localParticipant) {\n logger.warn(\"Local participant not available\");\n return false;\n }\n\n return true;\n }\n\n subscribe(): void {\n if (this.isSubscribed) return;\n\n this.room.registerTextStreamHandler(\"spotlight:v1\", async (reader) => {\n try {\n const text = await reader.readAll();\n this.handleIncoming(text);\n } catch (err) {\n logger.error(\"Error reading spotlight stream\", err);\n }\n });\n\n this.isSubscribed = true;\n logger.info(\"SpotlightService subscribed\");\n }\n\n unsubscribe(): void {\n this.isSubscribed = false;\n logger.info(\"SpotlightService unsubscribed\");\n }\n\n getLocalParticipantId(): string {\n return this.room.localParticipant.identity;\n }\n\n async spotlight(targetId: string, info?: ParticipantMetadata): Promise<void> {\n if (!this.isRoomReady()) {\n useRtcStore.getState().addError({\n code: \"SPOTLIGHT_ROOM_NOT_READY\",\n message: \"Cannot spotlight: room not connected\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const senderInfo = this.getSenderInfo();\n // Store previous state for rollback\n const previousSpotlighted = useSpotlightStore\n .getState()\n .getSpotlightedUser();\n\n // Optimistically update store\n useSpotlightStore.getState().spotlight(targetId, info);\n\n try {\n const envelope: SpotlightEnvelope = {\n v: 1,\n kind: \"spotlight\",\n roomId: this.room.name,\n ts: Date.now(),\n sender: senderInfo,\n payload: {\n action: \"spotlight\",\n targetId,\n info: info!,\n },\n };\n\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\n topic: \"spotlight:v1\",\n });\n\n logger.info(\"User spotlighted\", { targetId });\n } catch (error) {\n logger.error(\"Failed to spotlight user\", error);\n\n // Rollback to previous state on failure\n if (previousSpotlighted) {\n useSpotlightStore\n .getState()\n .spotlight(\n previousSpotlighted.participantId,\n previousSpotlighted.info\n );\n } else {\n useSpotlightStore.getState().unspotlight();\n }\n\n useRtcStore.getState().addError({\n code: \"SPOTLIGHT_SEND_FAILED\",\n message:\n error instanceof Error ? error.message : \"Failed to spotlight user\",\n timestamp: Date.now(),\n });\n }\n }\n\n async unspotlight(): Promise<void> {\n if (!this.isRoomReady()) {\n useRtcStore.getState().addError({\n code: \"UNSPOTLIGHT_ROOM_NOT_READY\",\n message: \"Cannot unspotlight: room not connected\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const senderInfo = this.getSenderInfo();\n const currentSpotlighted = useSpotlightStore\n .getState()\n .getSpotlightedUser();\n\n if (!currentSpotlighted) {\n logger.debug(\"No user is currently spotlighted\");\n return;\n }\n\n // Store previous state for rollback\n const previousSpotlighted = { ...currentSpotlighted };\n\n // Optimistically update store\n useSpotlightStore.getState().unspotlight();\n\n try {\n const envelope: SpotlightEnvelope = {\n v: 1,\n kind: \"spotlight\",\n roomId: this.room.name,\n ts: Date.now(),\n sender: senderInfo,\n payload: {\n action: \"unspotlight\",\n targetId: previousSpotlighted.participantId,\n },\n };\n\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\n topic: \"spotlight:v1\",\n });\n\n logger.info(\"User unspotlighted\");\n } catch (error) {\n logger.error(\"Failed to unspotlight user\", error);\n\n // Rollback to previous state on failure\n useSpotlightStore\n .getState()\n .spotlight(previousSpotlighted.participantId, previousSpotlighted.info);\n\n useRtcStore.getState().addError({\n code: \"UNSPOTLIGHT_SEND_FAILED\",\n message:\n error instanceof Error ? error.message : \"Failed to unspotlight user\",\n timestamp: Date.now(),\n });\n }\n }\n\n private handleIncoming(text: string): void {\n try {\n const parsed = JSON.parse(text) as SpotlightEnvelope;\n if (!this.isValidEnvelope(parsed)) {\n logger.warn(\"Invalid spotlight envelope received\", parsed);\n return;\n }\n\n if (parsed.sender.id === this.getLocalParticipantId()) {\n logger.debug(\"Ignoring self-echo spotlight message\");\n return;\n }\n\n applyIncomingSpotlight(parsed);\n logger.debug(\"Spotlight message received\", {\n action: parsed.payload.action,\n targetId: parsed.payload.targetId,\n });\n } catch (error) {\n logger.error(\"Error parsing incoming spotlight message\", error);\n }\n }\n\n private isValidEnvelope(e: any): e is SpotlightEnvelope {\n return (\n e &&\n e.v === 1 &&\n e.kind === \"spotlight\" &&\n typeof e.roomId === \"string\" &&\n e.roomId === this.room.name &&\n typeof e.ts === \"number\" &&\n e.ts > 0 &&\n typeof e.sender?.id === \"string\" &&\n typeof e.payload?.action === \"string\" &&\n [\"spotlight\", \"unspotlight\"].includes(e.payload.action) &&\n typeof e.payload?.targetId === \"string\"\n );\n }\n\n private getSenderInfo(): { id: string; info?: ParticipantMetadata } {\n const localParticipant = this.room.localParticipant;\n const sender: { id: string; info?: ParticipantMetadata } = {\n id: localParticipant.identity,\n };\n\n if (localParticipant.metadata) {\n try {\n sender.info = JSON.parse(\n localParticipant.metadata\n ) as ParticipantMetadata;\n } catch {\n // Ignore metadata parse errors\n }\n }\n\n return sender;\n }\n}\n","import { useCallback } from \"react\";\nimport type { ParticipantMetadata } from \"../../state/types\";\nimport { createLogger } from \"../../utils\";\nimport { useFeatureService } from \"../DataChannelContext\";\nimport type { SpotlightService } from \"./service\";\nimport { useSpotlightStore } from \"./store\";\nimport type { SpotlightedUser } from \"./types\";\n\nconst logger = createLogger(\"spotlight:hook\");\n\ntype Nullable<T> = T | null;\n\nexport interface IUseSpotlight {\n spotlight: (targetId: string, info?: ParticipantMetadata) => Promise<void>;\n unspotlight: () => Promise<void>;\n getSpotlightedUser: () => Nullable<SpotlightedUser>;\n isSpotlighted: boolean;\n isReady: boolean;\n}\n\nexport function useSpotlight(): IUseSpotlight {\n const service = useFeatureService<SpotlightService>(\"spotlight\");\n\n const getSpotlightedUser = useSpotlightStore(\n (state) => state.getSpotlightedUser\n );\n const isSpotlighted = useSpotlightStore((state) => state.isSpotlighted);\n\n const spotlight = useCallback(\n async (targetId: string, info?: ParticipantMetadata) => {\n if (!service) {\n logger.error(\"Cannot spotlight: service not ready\");\n return;\n }\n return service.spotlight(targetId, info!);\n },\n [service]\n );\n\n const unspotlight = useCallback(async () => {\n if (!service) {\n logger.error(\"Cannot unspotlight: service not ready\");\n return;\n }\n return service.unspotlight();\n }, [service]);\n\n return {\n spotlight,\n unspotlight,\n getSpotlightedUser,\n isSpotlighted,\n isReady: !!service,\n };\n}\n","import type { Room } from \"livekit-client\";\nimport { ChatService, useChatStore } from \"./chat\";\nimport { RaiseHandService, useRaiseHandStore } from \"./raiseHand\";\nimport { ReactionsService, useReactionsStore } from \"./reactions\";\nimport { SpotlightService, useSpotlightStore } from \"./spotlight\";\nimport type { RealtimeFeature } from \"./types\";\n\nexport const FEATURES: Record<string, RealtimeFeature> = {\n chat: {\n name: \"chat\",\n createService: (room: Room) => new ChatService(room),\n cleanupStore: () => useChatStore.getState().clearChat(),\n },\n reactions: {\n name: \"reactions\",\n createService: (room: Room) => new ReactionsService(room),\n cleanupStore: () => useReactionsStore.getState().clear(),\n },\n \"raise-hand\": {\n name: \"raise-hand\",\n createService: (room: Room) => new RaiseHandService(room),\n cleanupStore: () => useRaiseHandStore.getState().clear(),\n },\n spotlight: {\n name: \"spotlight\",\n createService: (room: Room) => new SpotlightService(room),\n cleanupStore: () => useSpotlightStore.getState().clear(),\n },\n};\n\nexport const DEFAULT_FEATURES = [\n \"chat\",\n \"reactions\",\n \"raise-hand\",\n \"spotlight\",\n];\n","import type { Room } from \"livekit-client\";\nimport { type ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\nimport { createLogger } from \"../utils\";\nimport {\n DataChannelContext,\n type DataChannelContextValue,\n} from \"./DataChannelContext\";\nimport { DEFAULT_FEATURES, FEATURES } from \"./registry\";\n\nconst logger = createLogger(\"channels:provider\");\n\nexport interface DataChannelProviderProps {\n room: Room;\n features?: string[];\n children: ReactNode;\n}\n\nexport function DataChannelProvider({\n room,\n features = DEFAULT_FEATURES,\n children,\n}: DataChannelProviderProps) {\n const services = useRef<Map<string, any>>(new Map());\n const [isReady, setIsReady] = useState(false);\n\n useEffect(() => {\n if (!room) {\n logger.warn(\"DataChannelProvider mounted without room\");\n return;\n }\n\n logger.debug(\"Initializing features\", { features });\n for (const featureName of features) {\n const feature = FEATURES[featureName];\n\n if (!feature) {\n logger.warn(`Feature \"${featureName}\" not found in registry`);\n continue;\n }\n\n try {\n logger.debug(`Initializing feature: ${featureName}`);\n const service = feature.createService(room);\n\n service.subscribe();\n services.current.set(featureName, service);\n\n logger.info(`Feature \"${featureName}\" initialized`);\n } catch (error) {\n logger.error(`Failed to initialize feature \"${featureName}\"`, error);\n }\n }\n\n setIsReady(true);\n logger.info(\"All features initialized\");\n return () => {\n logger.debug(\"Cleaning up features\");\n\n // Unsubscribe all services\n services.current.forEach((service, name) => {\n try {\n logger.debug(`Unsubscribing feature: ${name}`);\n service.unsubscribe();\n } catch (error) {\n logger.error(`Failed to unsubscribe feature \"${name}\"`, error);\n }\n });\n\n // Clean up stores\n for (const featureName of features) {\n const feature = FEATURES[featureName];\n if (feature?.cleanupStore) {\n try {\n logger.debug(`Cleaning store for feature: ${featureName}`);\n feature.cleanupStore();\n } catch (error) {\n logger.error(`Failed to cleanup store for \"${featureName}\"`, error);\n }\n }\n }\n\n services.current.clear();\n setIsReady(false);\n logger.info(\"Features cleanup complete\");\n };\n }, [room, features]);\n\n const contextValue = useMemo<DataChannelContextValue>(\n () => ({\n services: services.current,\n isReady,\n }),\n [isReady]\n );\n\n return (\n <DataChannelContext.Provider value={contextValue}>\n {children}\n </DataChannelContext.Provider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/logger.ts","../../src/channel/DataChannelContext.ts","../../src/state/types.ts","../../src/state/store.ts","../../src/channel/chat/store.ts","../../src/channel/chat/utils.ts","../../src/channel/chat/service.ts","../../src/channel/chat/useChat.ts","../../src/channel/raiseHand/store.ts","../../src/channel/raiseHand/service.ts","../../src/channel/raiseHand/useRaiseHand.ts","../../src/channel/reactions/store.ts","../../src/channel/reactions/utils.ts","../../src/channel/reactions/service.ts","../../src/channel/reactions/useReactions.ts","../../src/channel/spotlight/store.ts","../../src/channel/spotlight/service.ts","../../src/channel/spotlight/useSpotlight.ts","../../src/channel/registry.ts","../../src/channel/DataChannelProvider.tsx"],"names":["createContext","useContext","create","immer","entry","nanoid","ConnectionState","useMemo","useCallback","react","defaultState","logger","useRef","useState","useEffect"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Comprehensive logging system for the Callpad Web SDK\n *\n * Features:\n * - Log level filtering (debug, info, warn, error)\n * - Environment variable configuration (DEBUG, CALLPAD_LOG_LEVEL)\n * - Hierarchical namespacing (callpad:socket:connection)\n * - Custom logger integration\n * - Zero-cost when disabled\n */\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface LoggerOptions {\n level?: LogLevel;\n enableDebug?: boolean;\n customLogger?: (level: LogLevel, message: string, meta?: any) => void;\n}\n\nexport interface CallpadLogger {\n debug(message: string, meta?: any): void;\n info(message: string, meta?: any): void;\n warn(message: string, meta?: any): void;\n error(message: string, meta?: any): void;\n child(namespace: string): CallpadLogger;\n setLevel(level: LogLevel): void;\n isLevelEnabled(level: LogLevel): boolean;\n}\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\nclass CallpadLoggerImpl implements CallpadLogger {\n private namespace: string;\n private level: LogLevel;\n private enableDebug: boolean;\n private customLogger?: (level: LogLevel, message: string, meta?: any) => void;\n\n constructor(namespace = \"callpad\", options: LoggerOptions = {}) {\n this.namespace = namespace;\n this.level = options.level ?? this.getDefaultLevel();\n this.enableDebug = options.enableDebug ?? this.shouldEnableDebug();\n if (options.customLogger) {\n this.customLogger = options.customLogger;\n }\n }\n\n private getDefaultLevel(): LogLevel {\n const envLevel =\n typeof window !== \"undefined\"\n ? (window as any).__CALLPAD_LOG_LEVEL__\n : typeof globalThis !== \"undefined\" &&\n (globalThis as any).process?.env?.CALLPAD_LOG_LEVEL;\n\n if (envLevel && this.isValidLogLevel(envLevel)) {\n return envLevel as LogLevel;\n }\n\n const isProduction =\n typeof globalThis !== \"undefined\" &&\n (globalThis as any).process?.env?.NODE_ENV === \"production\";\n\n return isProduction ? \"warn\" : \"info\";\n }\n\n private shouldEnableDebug(): boolean {\n const debugEnv =\n typeof window !== \"undefined\"\n ? (window as any).__DEBUG__\n : typeof globalThis !== \"undefined\" &&\n (globalThis as any).process?.env?.DEBUG;\n\n if (!debugEnv) return false;\n\n const debugPatterns = debugEnv.split(/[\\s,]+/);\n return debugPatterns.some((pattern: string) => {\n if (pattern === \"*\") return true;\n if (pattern.endsWith(\"*\")) {\n const prefix = pattern.slice(0, -1);\n return this.namespace.startsWith(prefix);\n }\n return this.namespace === pattern;\n });\n }\n\n private isValidLogLevel(level: string): boolean {\n return Object.keys(LOG_LEVELS).includes(level);\n }\n\n private shouldLog(level: LogLevel): boolean {\n if (level === \"debug\" && !this.enableDebug) {\n return false;\n }\n return LOG_LEVELS[level] >= LOG_LEVELS[this.level];\n }\n\n private formatMessage(level: LogLevel, message: string, meta?: any): void {\n if (!this.shouldLog(level)) return;\n\n const timestamp = new Date().toISOString();\n const prefix = `[${timestamp}] [${this.namespace}] [${level.toUpperCase()}]`;\n\n if (this.customLogger) {\n this.customLogger(level, message, meta);\n return;\n }\n\n const logMethod =\n level === \"error\"\n ? console.error\n : level === \"warn\"\n ? console.warn\n : level === \"info\"\n ? console.info\n : console.log;\n\n if (meta !== undefined) {\n logMethod(`${prefix} ${message}`, meta);\n } else {\n logMethod(`${prefix} ${message}`);\n }\n }\n\n debug(message: string, meta?: any): void {\n this.formatMessage(\"debug\", message, meta);\n }\n\n info(message: string, meta?: any): void {\n this.formatMessage(\"info\", message, meta);\n }\n\n warn(message: string, meta?: any): void {\n this.formatMessage(\"warn\", message, meta);\n }\n\n error(message: string, meta?: any): void {\n this.formatMessage(\"error\", message, meta);\n }\n\n child(namespace: string): CallpadLogger {\n const childNamespace = `${this.namespace}:${namespace}`;\n const childOptions: LoggerOptions = {\n level: this.level,\n enableDebug: this.enableDebug,\n };\n if (this.customLogger) {\n childOptions.customLogger = this.customLogger;\n }\n return new CallpadLoggerImpl(childNamespace, childOptions);\n }\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n isLevelEnabled(level: LogLevel): boolean {\n return this.shouldLog(level);\n }\n}\n\nlet rootLogger: CallpadLogger | null = null;\n\nexport function createLogger(\n namespace?: string,\n options?: LoggerOptions\n): CallpadLogger {\n if (!namespace) {\n if (!rootLogger) {\n rootLogger = new CallpadLoggerImpl(\"callpad\", options);\n }\n return rootLogger;\n }\n\n return new CallpadLoggerImpl(`callpad:${namespace}`, options);\n}\n\nexport function setGlobalLoggerOptions(options: LoggerOptions): void {\n rootLogger = new CallpadLoggerImpl(\"callpad\", options);\n}\n","import { createContext, useContext } from \"react\";\n\nexport interface DataChannelContextValue {\n services: Map<string, any>;\n isReady: boolean;\n}\n\nexport const DataChannelContext = createContext<DataChannelContextValue | null>(\n null\n);\n\nexport function useDataChannelContext(): DataChannelContextValue {\n const context = useContext(DataChannelContext);\n if (!context) {\n throw new Error(\n \"useDataChannelContext must be used within DataChannelProvider\"\n );\n }\n return context;\n}\n\nexport function useFeatureService<T = any>(featureName: string): T {\n const { services } = useDataChannelContext();\n const service = services.get(featureName) as T;\n if (!service) {\n throw new Error(\n `Feature service \"${featureName}\" not found. Make sure it's enabled in DataChannelProvider.`\n );\n }\n\n return service;\n}\n","type Nullable<T> = T | null;\n\nexport type CallParticipantRole = \"HOST\" | \"PARTICIPANT\" | \"GUEST\";\n\nexport interface Profile {\n userId: string;\n username: string | null;\n firstName: string | null;\n lastName: string | null;\n profilePhoto: string | null;\n}\n\nexport interface ParticipantPermissions {\n canMute: boolean;\n canKick: boolean;\n canTransfer: boolean;\n canEnd: boolean;\n canRecord: boolean;\n canShareScreen: boolean;\n}\n\nexport interface ParticipantMetadata {\n userId: string | number;\n firstName: Nullable<string>;\n lastName: Nullable<string>;\n username: Nullable<string>;\n email: Nullable<string>;\n profilePhoto: Nullable<string>;\n role: CallParticipantRole;\n permissions: ParticipantPermissions;\n}\n\nexport interface LiveKitJoinInfo {\n token: string;\n roomName: string;\n url: string;\n}\n\nexport interface RecordingInfo {\n recordingId: string;\n egressId: string;\n startedAt: string;\n initiatedBy?: string;\n}\n\nexport type SessionType = \"CALL\" | \"MEETING\";\n\nexport interface MeetingInfo {\n meetingId: string;\n meetingCode: string;\n}\n\nexport interface Session {\n id: string;\n status: \"initializing\" | \"pending\" | \"ready\" | \"active\" | \"ended\";\n mode: \"AUDIO\" | \"VIDEO\";\n role: \"HOST\" | \"PARTICIPANT\" | \"GUEST\";\n livekitInfo?: LiveKitJoinInfo;\n startedAt?: string;\n ringTimeoutMs?: number;\n recording?: RecordingInfo | null;\n sessionType?: SessionType;\n meetingInfo?: MeetingInfo;\n}\n\nexport interface IncomingInvite {\n callId: string;\n inviteId: string;\n caller: ParticipantMetadata;\n mode: \"AUDIO\" | \"VIDEO\";\n expiresAt: string;\n expiresInMs: number;\n ringTimeoutMs: number;\n}\n\nexport interface OutgoingInvite {\n userId: string;\n status: \"sent\" | \"accepted\" | \"declined\" | \"missed\" | \"left\";\n participant?: Omit<ParticipantMetadata, \"permissions\"> | undefined;\n}\n\nexport interface RtcError {\n code: string;\n message: string;\n timestamp: number;\n context?: any;\n}\n\nexport interface GuestIdentity {\n guestId: string;\n displayName: string;\n}\n\nexport interface RtcState {\n // Did we initiate the current call?\n initiated: boolean;\n\n // Active session (null when no active call)\n session: Session | null;\n\n // Incoming invitation (null when no pending invite)\n incomingInvite: IncomingInvite | null;\n\n outgoingInvites: Record<string, OutgoingInvite>;\n\n // Error tracking\n errors: RtcError[];\n\n // Guest mode state\n guestIdentity: GuestIdentity | null;\n isGuestMode: boolean;\n}\n\nexport const defaultState: RtcState = {\n initiated: false,\n session: null,\n incomingInvite: null,\n outgoingInvites: {},\n errors: [],\n guestIdentity: null,\n isGuestMode: false,\n};\n\nimport type { Participant } from \"livekit-client\";\n\nexport interface ParticipantListOptions {\n pageSize?: number;\n includeLocalParticipant?: boolean;\n sortBy?: \"speaking\" | \"name\" | \"raised-hand\";\n}\n\nexport interface ParticipantListReturn {\n participants: Participant[];\n pinnedParticipants: Participant[];\n currentPage: number;\n totalPages: number;\n pageSize: number;\n totalParticipants: number;\n hasNextPage: boolean;\n hasPrevPage: boolean;\n nextPage: () => void;\n prevPage: () => void;\n setPageSize: (size: number) => void;\n togglePin: (participantId: string) => void;\n clearPinned: () => void;\n isPinned: (participantId: string) => boolean;\n}\n","import { create } from \"zustand\";\nimport { immer } from \"zustand/middleware/immer\";\nimport type { RtcError, RtcState } from \"./types\";\nimport { defaultState } from \"./types\";\n\ntype Actions = {\n patch: (fn: (draft: RtcState) => void) => void;\n reset: () => void;\n addError: (error: RtcError) => void;\n clearErrors: () => void;\n};\n\nexport const useRtcStore = create<RtcState & Actions>()(\n immer((set) => ({\n ...defaultState,\n\n patch: (fn) =>\n set((state) => {\n fn(state);\n }),\n\n reset: () => set(() => defaultState),\n\n addError: (error) =>\n set((state) => {\n state.errors.push(error);\n }),\n\n clearErrors: () =>\n set((state) => {\n state.errors = [];\n }),\n }))\n);\n\nexport const rtcStore = useRtcStore;\n","import { create } from \"zustand\";\nimport { immer } from \"zustand/middleware/immer\";\nimport type { ChatEntry, ChatState, Envelope } from \"./types\";\n\ninterface ChatActions {\n patch: (fn: (draft: ChatState) => void) => void;\n applyIncoming: (envelope: Envelope) => void;\n addFile: (file: File, filename: string) => void;\n addEntryOptimistic: (entry: ChatEntry) => void;\n markEntrySent: (entryId: string) => void;\n markEntryFailed: (entryId: string) => void;\n applyEdit: (entryId: string, newContent: string, version: number) => void;\n applyRemove: (entryId: string) => void;\n applyReaction: (\n entryId: string,\n emoji: string,\n participantId: string,\n op: \"add\" | \"remove\"\n ) => void;\n queuePendingOp: (entryId: string, envelope: Envelope) => void;\n processPendingOps: (entryId: string) => void;\n trimOldEntries: () => void;\n clearChat: () => void;\n}\n\nconst defaultChatState: ChatState = {\n byId: {},\n order: [],\n pendingOps: {},\n participantCache: {},\n maxEntries: 1000,\n};\n\nfunction applyReactionToEntry(\n entry: ChatEntry,\n emoji: string,\n participantId: string,\n op: \"add\" | \"remove\"\n) {\n const emojiSet = entry.reactions[emoji];\n if (!emojiSet) {\n entry.reactions[emoji] = new Set();\n }\n if (op === \"add\") {\n entry.reactions[emoji]?.add(participantId);\n } else {\n entry.reactions[emoji]?.delete(participantId);\n if (entry.reactions[emoji]?.size === 0) {\n delete entry.reactions[emoji];\n }\n }\n}\n\nfunction trimEntriesIfNeeded(state: ChatState) {\n if (Object.keys(state.byId).length > state.maxEntries) {\n const entriesToRemove = Object.keys(state.byId).length - state.maxEntries;\n for (let i = 0; i < entriesToRemove; i++) {\n const oldestId = state.order[i];\n if (oldestId) {\n delete state.byId[oldestId];\n }\n }\n state.order = state.order.slice(entriesToRemove);\n }\n}\n\nexport const useChatStore = create<ChatState & ChatActions>()(\n immer((set) => ({\n ...defaultChatState,\n\n patch: (fn) =>\n set((state) => {\n fn(state);\n }),\n\n applyIncoming: (envelope) =>\n set((state) => {\n if (envelope.kind === \"entry\") {\n if (state.byId[envelope.entryId]) {\n return;\n }\n\n if (envelope.sender.info) {\n state.participantCache[envelope.sender.id] = envelope.sender.info;\n }\n\n const entry: ChatEntry = {\n id: envelope.entryId,\n content: envelope.payload.content,\n sender: {\n id: envelope.sender.id,\n },\n createdAt: envelope.ts,\n version: 1,\n reactions: {},\n status: \"sent\",\n filename: envelope.payload?.meta?.filename,\n };\n\n state.byId[envelope.entryId] = entry;\n state.order.push(envelope.entryId);\n\n trimEntriesIfNeeded(state);\n\n const pendingOps = state.pendingOps[envelope.entryId];\n if (pendingOps) {\n delete state.pendingOps[envelope.entryId];\n\n for (const op of pendingOps) {\n if (op.kind === \"edit\") {\n const entry = state.byId[op.entryId];\n if (entry && op.payload.version > entry.version) {\n entry.content = op.payload.newContent;\n entry.version = op.payload.version;\n entry.editedAt = op.ts;\n }\n } else if (op.kind === \"remove\") {\n const entry = state.byId[op.entryId];\n if (entry && !entry.removedAt) {\n entry.removedAt = op.ts;\n }\n } else if (op.kind === \"reaction\") {\n if (op.sender.info) {\n state.participantCache[op.sender.id] = op.sender.info;\n }\n\n const entry = state.byId[op.entryId];\n if (entry) {\n applyReactionToEntry(\n entry,\n op.payload.emoji,\n op.sender.id,\n op.payload.op\n );\n }\n }\n }\n }\n } else if (envelope.kind === \"edit\") {\n const entry = state.byId[envelope.entryId];\n if (entry) {\n if (envelope.payload.version > entry.version) {\n entry.content = envelope.payload.newContent;\n entry.version = envelope.payload.version;\n entry.editedAt = envelope.ts;\n }\n } else {\n if (!state.pendingOps[envelope.entryId]) {\n state.pendingOps[envelope.entryId] = [];\n }\n state.pendingOps[envelope.entryId]?.push(envelope);\n }\n } else if (envelope.kind === \"remove\") {\n const entry = state.byId[envelope.entryId];\n if (entry) {\n if (!entry.removedAt) {\n entry.removedAt = envelope.ts;\n }\n } else {\n if (!state.pendingOps[envelope.entryId]) {\n state.pendingOps[envelope.entryId] = [];\n }\n state.pendingOps[envelope.entryId]?.push(envelope);\n }\n } else if (envelope.kind === \"reaction\") {\n if (envelope.sender.info) {\n state.participantCache[envelope.sender.id] = envelope.sender.info;\n }\n\n const entry = state.byId[envelope.entryId];\n if (entry) {\n applyReactionToEntry(\n entry,\n envelope.payload.emoji,\n envelope.sender.id,\n envelope.payload.op\n );\n } else {\n if (!state.pendingOps[envelope.entryId]) {\n state.pendingOps[envelope.entryId] = [];\n }\n state.pendingOps[envelope.entryId]?.push(envelope);\n }\n }\n }),\n\n addFile: (file, filename) =>\n set((state) => {\n const values = Object.values(state.byId);\n const entryArr = values.filter((val) => val.filename === filename);\n const entry = entryArr[0];\n entry!.file = file;\n state.byId[entry!.id] = entry!;\n }),\n\n addEntryOptimistic: (entry) =>\n set((state) => {\n state.byId[entry.id] = entry;\n state.order.push(entry.id);\n\n trimEntriesIfNeeded(state);\n }),\n\n markEntrySent: (entryId) =>\n set((state) => {\n const entry = state.byId[entryId];\n if (entry) {\n entry.status = \"sent\";\n }\n }),\n\n markEntryFailed: (entryId) =>\n set((state) => {\n const entry = state.byId[entryId];\n if (entry) {\n entry.status = \"failed\";\n }\n }),\n\n applyEdit: (entryId, newContent, version) =>\n set((state) => {\n const entry = state.byId[entryId];\n if (entry && version > entry.version) {\n entry.content = newContent;\n entry.version = version;\n entry.editedAt = Date.now();\n }\n }),\n\n applyRemove: (entryId) =>\n set((state) => {\n const entry = state.byId[entryId];\n if (entry && !entry.removedAt) {\n entry.removedAt = Date.now();\n }\n }),\n\n applyReaction: (entryId, emoji, participantId, op) =>\n set((state) => {\n const entry = state.byId[entryId];\n if (entry) {\n applyReactionToEntry(entry, emoji, participantId, op);\n }\n }),\n\n queuePendingOp: (entryId, envelope) =>\n set((state) => {\n if (!state.pendingOps[entryId]) {\n state.pendingOps[entryId] = [];\n }\n state.pendingOps[entryId].push(envelope);\n }),\n\n processPendingOps: (entryId) =>\n set((state) => {\n const pendingOps = state.pendingOps[entryId];\n if (!pendingOps) {\n return;\n }\n\n delete state.pendingOps[entryId];\n\n for (const envelope of pendingOps) {\n if (envelope.kind === \"edit\") {\n const entry = state.byId[envelope.entryId];\n if (entry && envelope.payload.version > entry.version) {\n entry.content = envelope.payload.newContent;\n entry.version = envelope.payload.version;\n entry.editedAt = envelope.ts;\n }\n } else if (envelope.kind === \"remove\") {\n const entry = state.byId[envelope.entryId];\n if (entry && !entry.removedAt) {\n entry.removedAt = envelope.ts;\n }\n } else if (envelope.kind === \"reaction\") {\n if (envelope.sender.info) {\n state.participantCache[envelope.sender.id] = envelope.sender.info;\n }\n\n const entry = state.byId[envelope.entryId];\n if (entry) {\n applyReactionToEntry(\n entry,\n envelope.payload.emoji,\n envelope.sender.id,\n envelope.payload.op\n );\n }\n }\n }\n }),\n\n trimOldEntries: () =>\n set((state) => {\n trimEntriesIfNeeded(state);\n }),\n\n clearChat: () => set(() => defaultChatState),\n }))\n);\n\nexport const chatStore = useChatStore;\n","import { nanoid } from \"nanoid\";\nimport type { ChatEntry, Envelope } from \"./types\";\n\nexport function compareEntries(a: ChatEntry, b: ChatEntry): number {\n if (a.createdAt !== b.createdAt) {\n return a.createdAt - b.createdAt;\n }\n\n if (a.sender.id !== b.sender.id) {\n return a.sender.id.localeCompare(b.sender.id);\n }\n\n return a.id.localeCompare(b.id);\n}\n\nexport function validateContent(content: string): {\n valid: boolean;\n error?: string;\n} {\n const trimmed = content.trim();\n\n if (trimmed.length === 0) {\n return { valid: false, error: \"Content cannot be empty\" };\n }\n\n const sizeInBytes = new TextEncoder().encode(content).length;\n if (sizeInBytes > 16384) {\n return { valid: false, error: \"Content exceeds 16KB limit\" };\n }\n\n return { valid: true };\n}\n\nexport function isValidEnvelope(data: any): data is Envelope {\n if (!data || typeof data !== \"object\") {\n return false;\n }\n\n if (data.v !== 1) {\n return false;\n }\n\n if (![\"entry\", \"edit\", \"remove\", \"reaction\"].includes(data.kind)) {\n return false;\n }\n\n if (\n typeof data.roomId !== \"string\" ||\n typeof data.entryId !== \"string\" ||\n typeof data.ts !== \"number\"\n ) {\n return false;\n }\n\n if (!data.sender || typeof data.sender.id !== \"string\") {\n return false;\n }\n\n if (\n data.kind === \"entry\" ||\n data.kind === \"edit\" ||\n data.kind === \"reaction\"\n ) {\n if (!data.payload || typeof data.payload !== \"object\") {\n return false;\n }\n }\n\n return true;\n}\n\nexport function generateEntryId(): string {\n return nanoid();\n}\n\nexport function getCurrentTimestamp(): number {\n return Date.now();\n}\n","import { ConnectionState, type Room } from \"livekit-client\";\nimport { useRtcStore } from \"../../state/store\";\nimport type { ParticipantMetadata } from \"../../state/types\";\nimport { createLogger } from \"../../utils\";\nimport { useChatStore } from \"./store\";\nimport type { ChatEntry, Envelope } from \"./types\";\nimport {\n generateEntryId,\n getCurrentTimestamp,\n isValidEnvelope,\n validateContent,\n} from \"./utils\";\n\nconst logger = createLogger(\"chat\");\n\nexport class ChatService {\n private readonly room: Room;\n private isSubscribed = false;\n\n constructor(room: Room) {\n this.room = room;\n }\n\n private isRoomReady(): boolean {\n if (!this.room) {\n logger.warn(\"Room not initialized\");\n return false;\n }\n\n if (this.room.state !== ConnectionState.Connected) {\n logger.warn(\"Room not connected\", { state: this.room.state });\n return false;\n }\n\n if (!this.room.localParticipant) {\n logger.warn(\"Local participant not available\");\n return false;\n }\n\n return true;\n }\n\n subscribe(): void {\n if (this.isSubscribed) {\n return;\n }\n // Handles incoming text streams\n this.room.registerTextStreamHandler(\n \"chat:v1\",\n async (reader, participantInfo) => {\n try {\n const text = await reader.readAll();\n console.log(\"Got here: chat:v1\", text, participantInfo.identity);\n this.handleIncomingMessage(text);\n } catch (error) {\n logger.error(\"Error reading text stream\", error);\n }\n }\n );\n\n // Handles incoming file streams\n this.room.registerByteStreamHandler(\n \"chat:v1\",\n async (reader, participantInfo) => {\n try {\n const info = reader.info;\n const filename = info.name;\n\n // Ensure BlobParts are backed by ArrayBuffer (not SharedArrayBuffer) by copying with slice().\n const parts = (await reader.readAll()).map((chunk) => chunk.slice());\n const fileBlob = new Blob(parts, { type: info.mimeType });\n\n this.handleIncomingFile(fileBlob, filename, info.mimeType);\n } catch (error) {\n logger.error(\"Error reading file stream\", error);\n }\n }\n );\n this.isSubscribed = true;\n }\n\n unsubscribe(): void {\n this.isSubscribed = false;\n }\n\n getLocalParticipantId(): string {\n return this.room.localParticipant.identity;\n }\n\n async send(content: string, file?: File): Promise<void> {\n if (!this.isRoomReady()) {\n useRtcStore.getState().addError({\n code: \"CHAT_ROOM_NOT_READY\",\n message: \"Cannot send message: room not connected\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const messageContent =\n content.length === 0 && typeof file !== \"undefined\" ? file.name : content;\n\n const validation = validateContent(messageContent);\n if (!validation.valid) {\n useRtcStore.getState().addError({\n code: \"CHAT_INVALID_CONTENT\",\n message: validation.error || \"Invalid content\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const entryId = generateEntryId();\n const chatStore = useChatStore.getState();\n const senderInfo = this.getSenderInfo();\n if (senderInfo.info) {\n chatStore.patch((state) => {\n state.participantCache[senderInfo.id] = senderInfo.info!;\n });\n }\n\n const entry: ChatEntry = {\n id: entryId,\n content: messageContent,\n sender: {\n id: senderInfo.id,\n },\n createdAt: getCurrentTimestamp(),\n version: 1,\n reactions: {},\n status: \"sending\",\n file: file!,\n };\n\n chatStore.addEntryOptimistic(entry);\n try {\n const envelope: Envelope = {\n v: 1,\n kind: \"entry\",\n roomId: this.room.name,\n entryId,\n ts: entry.createdAt,\n sender: senderInfo,\n payload: {\n content,\n meta: { filename: file?.name },\n },\n };\n\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\n topic: \"chat:v1\",\n });\n if (file) {\n await this.room.localParticipant.sendFile(file, {\n mimeType: file.type,\n topic: \"chat:v1\",\n });\n }\n chatStore.markEntrySent(entryId);\n } catch (error) {\n chatStore.markEntryFailed(entryId);\n useRtcStore.getState().addError({\n code: \"CHAT_SEND_FAILED\",\n message:\n error instanceof Error ? error.message : \"Failed to send message\",\n timestamp: Date.now(),\n context: { entryId },\n });\n }\n }\n\n async edit(entryId: string, newContent: string): Promise<void> {\n if (!this.isRoomReady()) {\n useRtcStore.getState().addError({\n code: \"CHAT_ROOM_NOT_READY\",\n message: \"Cannot edit message: room not connected\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const validation = validateContent(newContent);\n if (!validation.valid) {\n useRtcStore.getState().addError({\n code: \"CHAT_INVALID_CONTENT\",\n message: validation.error || \"Invalid content\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const chatStore = useChatStore.getState();\n const entry = chatStore.byId[entryId];\n if (!entry) {\n useRtcStore.getState().addError({\n code: \"CHAT_ENTRY_NOT_FOUND\",\n message: \"Entry not found\",\n timestamp: Date.now(),\n context: { entryId },\n });\n return;\n }\n\n const senderInfo = this.getSenderInfo();\n if (entry.sender.id !== senderInfo.id) {\n useRtcStore.getState().addError({\n code: \"CHAT_UNAUTHORIZED\",\n message: \"You can only edit your own messages\",\n timestamp: Date.now(),\n context: { entryId },\n });\n return;\n }\n\n const newVersion = entry.version + 1;\n chatStore.applyEdit(entryId, newContent, newVersion);\n try {\n const envelope: Envelope = {\n v: 1,\n kind: \"edit\",\n roomId: this.room.name,\n entryId,\n ts: getCurrentTimestamp(),\n sender: senderInfo,\n payload: {\n newContent,\n version: newVersion,\n },\n };\n\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\n topic: \"chat:v1\",\n });\n } catch (error) {\n useRtcStore.getState().addError({\n code: \"CHAT_EDIT_FAILED\",\n message:\n error instanceof Error ? error.message : \"Failed to edit message\",\n timestamp: Date.now(),\n context: { entryId },\n });\n }\n }\n\n async remove(entryId: string): Promise<void> {\n if (!this.isRoomReady()) {\n useRtcStore.getState().addError({\n code: \"CHAT_ROOM_NOT_READY\",\n message: \"Cannot remove message: room not connected\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const chatStore = useChatStore.getState();\n const entry = chatStore.byId[entryId];\n if (!entry) {\n useRtcStore.getState().addError({\n code: \"CHAT_ENTRY_NOT_FOUND\",\n message: \"Entry not found\",\n timestamp: Date.now(),\n context: { entryId },\n });\n return;\n }\n\n const senderInfo = this.getSenderInfo();\n if (entry.sender.id !== senderInfo.id) {\n useRtcStore.getState().addError({\n code: \"CHAT_UNAUTHORIZED\",\n message: \"You can only remove your own messages\",\n timestamp: Date.now(),\n context: { entryId },\n });\n return;\n }\n\n chatStore.applyRemove(entryId);\n try {\n const envelope: Envelope = {\n v: 1,\n kind: \"remove\",\n roomId: this.room.name,\n entryId,\n ts: getCurrentTimestamp(),\n sender: senderInfo,\n };\n\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\n topic: \"chat:v1\",\n });\n } catch (error) {\n useRtcStore.getState().addError({\n code: \"CHAT_REMOVE_FAILED\",\n message:\n error instanceof Error ? error.message : \"Failed to remove message\",\n timestamp: Date.now(),\n context: { entryId },\n });\n }\n }\n\n async react(entryId: string, emoji: string): Promise<void> {\n if (!this.isRoomReady()) {\n useRtcStore.getState().addError({\n code: \"CHAT_ROOM_NOT_READY\",\n message: \"Cannot add reaction: room not connected\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const chatStore = useChatStore.getState();\n const entry = chatStore.byId[entryId];\n if (!entry) {\n return;\n }\n\n const senderInfo = this.getSenderInfo();\n if (senderInfo.info) {\n chatStore.patch((state) => {\n state.participantCache[senderInfo.id] = senderInfo.info!;\n });\n }\n\n chatStore.applyReaction(entryId, emoji, senderInfo.id, \"add\");\n try {\n const envelope: Envelope = {\n v: 1,\n kind: \"reaction\",\n roomId: this.room.name,\n entryId,\n ts: getCurrentTimestamp(),\n sender: senderInfo,\n payload: {\n emoji,\n op: \"add\",\n },\n };\n\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\n topic: \"chat:v1\",\n });\n } catch (error) {\n useRtcStore.getState().addError({\n code: \"CHAT_REACTION_FAILED\",\n message:\n error instanceof Error ? error.message : \"Failed to add reaction\",\n timestamp: Date.now(),\n context: { entryId, emoji },\n });\n }\n }\n\n async unreact(entryId: string, emoji: string): Promise<void> {\n if (!this.isRoomReady()) {\n useRtcStore.getState().addError({\n code: \"CHAT_ROOM_NOT_READY\",\n message: \"Cannot remove reaction: room not connected\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const chatStore = useChatStore.getState();\n const entry = chatStore.byId[entryId];\n if (!entry) {\n return;\n }\n\n const senderInfo = this.getSenderInfo();\n if (senderInfo.info) {\n chatStore.patch((state) => {\n state.participantCache[senderInfo.id] = senderInfo.info!;\n });\n }\n\n chatStore.applyReaction(entryId, emoji, senderInfo.id, \"remove\");\n try {\n const envelope: Envelope = {\n v: 1,\n kind: \"reaction\",\n roomId: this.room.name,\n entryId,\n ts: getCurrentTimestamp(),\n sender: senderInfo,\n payload: {\n emoji,\n op: \"remove\",\n },\n };\n\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\n topic: \"chat:v1\",\n });\n } catch (error) {\n useRtcStore.getState().addError({\n code: \"CHAT_REACTION_FAILED\",\n message:\n error instanceof Error ? error.message : \"Failed to remove reaction\",\n timestamp: Date.now(),\n context: { entryId, emoji },\n });\n }\n }\n\n private handleIncomingMessage(text: string): void {\n try {\n const parsed = JSON.parse(text);\n if (!isValidEnvelope(parsed)) {\n logger.warn(\"Invalid envelope received\", parsed);\n return;\n }\n\n useChatStore.getState().applyIncoming(parsed);\n } catch (error) {\n logger.error(\"Error parsing incoming message\", error);\n }\n }\n\n private handleIncomingFile(\n blob: Blob,\n filename: string,\n mimeType: string\n ): void {\n try {\n const file = new File([blob], filename, { type: mimeType || blob.type });\n\n useChatStore.getState().addFile(file, filename);\n } catch (error) {\n logger.error(\"Error parsing incoming file\", error);\n }\n }\n\n private getSenderInfo(): { id: string; info?: ParticipantMetadata } {\n const localParticipant = this.room.localParticipant;\n const sender: { id: string; info?: ParticipantMetadata } = {\n id: localParticipant.identity,\n };\n\n if (localParticipant.metadata) {\n try {\n sender.info = JSON.parse(\n localParticipant.metadata\n ) as ParticipantMetadata;\n } catch {\n // Ignore metadata parsing errors\n }\n }\n\n return sender;\n }\n}\n","import { useCallback, useMemo } from \"react\";\nimport type { ParticipantMetadata } from \"../../state/types\";\nimport { useFeatureService } from \"../DataChannelContext\";\nimport type { ChatService } from \"./service\";\nimport { useChatStore } from \"./store\";\nimport type { ChatEntry } from \"./types\";\nimport { compareEntries } from \"./utils\";\n\ntype Nullable<T> = T | null;\n\nexport interface UseChatReturn {\n entries: ChatEntry[];\n isReady: boolean;\n getParticipantInfo: (id: string) => Nullable<ParticipantMetadata>;\n isOwnEntry: (entry: ChatEntry) => boolean;\n send: (content: string, file?: File) => Promise<void>;\n edit: (id: string, content: string) => Promise<void>;\n remove: (id: string) => Promise<void>;\n react: (id: string, emoji: string) => Promise<void>;\n unreact: (id: string, emoji: string) => Promise<void>;\n}\n\nexport function useChat(): UseChatReturn {\n const service = useFeatureService<ChatService>(\"chat\");\n\n const byId = useChatStore((state) => state.byId);\n const order = useChatStore((state) => state.order);\n const participantCache = useChatStore((state) => state.participantCache);\n\n const entries = useMemo(() => {\n return order\n .map((id) => byId[id])\n .filter((entry): entry is ChatEntry => entry !== undefined)\n .sort(compareEntries);\n }, [byId, order]);\n\n const getParticipantInfo = useCallback(\n (id: string): Nullable<ParticipantMetadata> => {\n return participantCache[id] || null;\n },\n [participantCache]\n );\n\n const send = useCallback(\n async (content: string, file?: File) => service.send(content, file),\n [service]\n );\n\n const edit = useCallback(\n async (id: string, content: string) => service.edit(id, content),\n [service]\n );\n\n const remove = useCallback(\n async (id: string) => service.remove(id),\n [service]\n );\n\n const react = useCallback(\n async (id: string, emoji: string) => service.react(id, emoji),\n [service]\n );\n\n const unreact = useCallback(\n async (id: string, emoji: string) => service.unreact(id, emoji),\n [service]\n );\n\n const isOwnEntry = useCallback(\n (entry: ChatEntry) => entry.sender.id === service.getLocalParticipantId(),\n [service]\n );\n\n return {\n entries,\n isReady: true,\n getParticipantInfo,\n isOwnEntry,\n send,\n edit,\n remove,\n react,\n unreact,\n };\n}\n","import { create } from \"zustand\";\nimport { immer } from \"zustand/middleware/immer\";\nimport type { ParticipantMetadata } from \"../../state/types\";\nimport type { RaiseHandEnvelope, RaiseHandState, RaisedHand } from \"./types\";\n\ninterface RaiseHandActions {\n raiseHand: (participantId: string) => void;\n lowerHand: (participantId: string) => void;\n lowerAllHands: () => void;\n isHandRaised: (participantId: string) => boolean;\n getRaisedHandOrder: (participantId: string) => number | null;\n upsertParticipantInfo: (id: string, info: ParticipantMetadata) => void;\n clear: () => void;\n}\n\nconst defaultState: RaiseHandState = {\n raisedHands: new Map(),\n nextOrder: 1,\n};\n\nexport const useRaiseHandStore = create<RaiseHandState & RaiseHandActions>()(\n immer((set, get) => ({\n ...defaultState,\n\n raiseHand: (participantId) =>\n set((state) => {\n if (!state.raisedHands.has(participantId)) {\n state.raisedHands.set(participantId, {\n ts: Date.now(),\n order: state.nextOrder++,\n });\n }\n }),\n\n lowerHand: (participantId) =>\n set((state) => {\n state.raisedHands.delete(participantId);\n // Reset order counter when all hands are lowered\n if (state.raisedHands.size === 0) {\n state.nextOrder = 1;\n }\n }),\n\n lowerAllHands: () =>\n set((state) => {\n state.raisedHands.clear();\n state.nextOrder = 1;\n }),\n\n isHandRaised: (participantId) => get().raisedHands.has(participantId),\n\n getRaisedHandOrder: (participantId) => {\n const hand = get().raisedHands.get(participantId);\n return hand?.order ?? null;\n },\n\n upsertParticipantInfo: (id, info) => {\n // No-op for now, can be extended if needed\n },\n\n clear: () =>\n set(() => ({\n raisedHands: new Map(),\n nextOrder: 1,\n })),\n }))\n);\n\nexport function applyIncomingRaiseHand(envelope: RaiseHandEnvelope): void {\n const { raiseHand, lowerHand, lowerAllHands, upsertParticipantInfo } =\n useRaiseHandStore.getState();\n\n if (envelope.sender.info) {\n upsertParticipantInfo(envelope.sender.id, envelope.sender.info);\n }\n\n switch (envelope.payload.action) {\n case \"raise\": {\n raiseHand(envelope.sender.id);\n break;\n }\n case \"lower\": {\n const targetId = envelope.payload.targetId || envelope.sender.id;\n lowerHand(targetId);\n break;\n }\n case \"lower-all\": {\n lowerAllHands();\n break;\n }\n }\n}\n","import { ConnectionState, type Room } from \"livekit-client\";\nimport { useRtcStore } from \"../../state/store\";\nimport type { ParticipantMetadata } from \"../../state/types\";\nimport { createLogger } from \"../../utils\";\nimport { applyIncomingRaiseHand, useRaiseHandStore } from \"./store\";\nimport type { RaiseHandEnvelope } from \"./types\";\n\nconst logger = createLogger(\"raise-hand\");\n\nexport class RaiseHandService {\n private readonly room: Room;\n private isSubscribed = false;\n\n constructor(room: Room) {\n this.room = room;\n }\n\n private isRoomReady(): boolean {\n if (!this.room) {\n logger.warn(\"Room not initialized\");\n return false;\n }\n\n if (this.room.state !== ConnectionState.Connected) {\n logger.warn(\"Room not connected\", { state: this.room.state });\n return false;\n }\n\n if (!this.room.localParticipant) {\n logger.warn(\"Local participant not available\");\n return false;\n }\n\n return true;\n }\n\n subscribe(): void {\n if (this.isSubscribed) return;\n\n this.room.registerTextStreamHandler(\"raise-hand:v1\", async (reader) => {\n try {\n const text = await reader.readAll();\n this.handleIncoming(text);\n } catch (err) {\n logger.error(\"Error reading raise-hand stream\", err);\n }\n });\n\n this.isSubscribed = true;\n logger.info(\"RaiseHandService subscribed\");\n }\n\n unsubscribe(): void {\n this.isSubscribed = false;\n logger.info(\"RaiseHandService unsubscribed\");\n }\n\n getLocalParticipantId(): string {\n return this.room.localParticipant.identity;\n }\n\n async raiseHand(): Promise<void> {\n if (!this.isRoomReady()) {\n useRtcStore.getState().addError({\n code: \"RAISE_HAND_ROOM_NOT_READY\",\n message: \"Cannot raise hand: room not connected\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const senderInfo = this.getSenderInfo();\n useRaiseHandStore.getState().raiseHand(senderInfo.id);\n\n try {\n const envelope: RaiseHandEnvelope = {\n v: 1,\n kind: \"raise-hand\",\n roomId: this.room.name,\n ts: Date.now(),\n sender: senderInfo,\n payload: {\n action: \"raise\",\n },\n };\n\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\n topic: \"raise-hand:v1\",\n });\n\n logger.debug(\"Hand raised\");\n } catch (error) {\n logger.error(\"Failed to raise hand\", error);\n useRtcStore.getState().addError({\n code: \"RAISE_HAND_SEND_FAILED\",\n message:\n error instanceof Error ? error.message : \"Failed to raise hand\",\n timestamp: Date.now(),\n });\n }\n }\n\n async lowerHand(targetId?: string): Promise<void> {\n if (!this.isRoomReady()) {\n useRtcStore.getState().addError({\n code: \"LOWER_HAND_ROOM_NOT_READY\",\n message: \"Cannot lower hand: room not connected\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const senderInfo = this.getSenderInfo();\n const participantId = targetId || senderInfo.id;\n useRaiseHandStore.getState().lowerHand(participantId);\n\n try {\n const envelope: RaiseHandEnvelope = {\n v: 1,\n kind: \"raise-hand\",\n roomId: this.room.name,\n ts: Date.now(),\n sender: senderInfo,\n payload: {\n action: \"lower\",\n targetId: participantId,\n },\n };\n\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\n topic: \"raise-hand:v1\",\n });\n\n logger.debug(\"Hand lowered\", { targetId: participantId });\n } catch (error) {\n logger.error(\"Failed to lower hand\", error);\n useRtcStore.getState().addError({\n code: \"LOWER_HAND_SEND_FAILED\",\n message:\n error instanceof Error ? error.message : \"Failed to lower hand\",\n timestamp: Date.now(),\n });\n }\n }\n\n async lowerAllHands(): Promise<void> {\n if (!this.isRoomReady()) {\n useRtcStore.getState().addError({\n code: \"LOWER_ALL_HANDS_ROOM_NOT_READY\",\n message: \"Cannot lower all hands: room not connected\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const senderInfo = this.getSenderInfo();\n useRaiseHandStore.getState().lowerAllHands();\n\n try {\n const envelope: RaiseHandEnvelope = {\n v: 1,\n kind: \"raise-hand\",\n roomId: this.room.name,\n ts: Date.now(),\n sender: senderInfo,\n payload: {\n action: \"lower-all\",\n },\n };\n\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\n topic: \"raise-hand:v1\",\n });\n\n logger.debug(\"All hands lowered\");\n } catch (error) {\n logger.error(\"Failed to lower all hands\", error);\n useRtcStore.getState().addError({\n code: \"LOWER_ALL_HANDS_SEND_FAILED\",\n message:\n error instanceof Error ? error.message : \"Failed to lower all hands\",\n timestamp: Date.now(),\n });\n }\n }\n\n private handleIncoming(text: string): void {\n try {\n const parsed = JSON.parse(text) as RaiseHandEnvelope;\n if (!this.isValidEnvelope(parsed)) {\n logger.warn(\"Invalid raise-hand envelope received\", parsed);\n return;\n }\n\n if (parsed.sender.id === this.getLocalParticipantId()) {\n logger.debug(\"Ignoring self-echo raise-hand message\");\n return;\n }\n\n applyIncomingRaiseHand(parsed);\n logger.debug(\"Raise-hand message received\", {\n action: parsed.payload.action,\n });\n } catch (error) {\n logger.error(\"Error parsing incoming raise-hand message\", error);\n }\n }\n\n private isValidEnvelope(e: any): e is RaiseHandEnvelope {\n return (\n e &&\n e.v === 1 &&\n e.kind === \"raise-hand\" &&\n typeof e.roomId === \"string\" &&\n e.roomId === this.room.name &&\n typeof e.ts === \"number\" &&\n e.ts > 0 &&\n typeof e.sender?.id === \"string\" &&\n typeof e.payload?.action === \"string\" &&\n [\"raise\", \"lower\", \"lower-all\"].includes(e.payload.action)\n );\n }\n\n private getSenderInfo(): { id: string; info?: ParticipantMetadata } {\n const localParticipant = this.room.localParticipant;\n const sender: { id: string; info?: ParticipantMetadata } = {\n id: localParticipant.identity,\n };\n\n if (localParticipant.metadata) {\n try {\n sender.info = JSON.parse(\n localParticipant.metadata\n ) as ParticipantMetadata;\n } catch {\n // Ignore metadata parse errors\n }\n }\n\n return sender;\n }\n}\n","import { useCallback, useMemo } from \"react\";\nimport { createLogger } from \"../../utils\";\nimport { useFeatureService } from \"../DataChannelContext\";\nimport type { RaiseHandService } from \"./service\";\nimport { useRaiseHandStore } from \"./store\";\n\nconst logger = createLogger(\"raise-hand:hook\");\n\ntype Nullable<T> = T | null;\n\nexport interface RaisedHandInfo {\n participantId: string;\n order: number;\n ts: number;\n}\n\nexport interface UseRaiseHandReturn {\n raiseHand: () => Promise<void>;\n lowerHand: (participantId?: string) => Promise<void>;\n lowerAllHands: () => Promise<void>;\n isHandRaised: (participantId: string) => boolean;\n getRaisedHandOrder: (participantId: string) => Nullable<number>;\n getRaisedHands: () => RaisedHandInfo[];\n isReady: boolean;\n}\n\nexport function useRaiseHand(): UseRaiseHandReturn {\n const service = useFeatureService<RaiseHandService>(\"raise-hand\");\n\n const raisedHands = useRaiseHandStore((state) => state.raisedHands);\n const isHandRaised = useRaiseHandStore((state) => state.isHandRaised);\n const getRaisedHandOrder = useRaiseHandStore(\n (state) => state.getRaisedHandOrder\n );\n\n const raiseHand = useCallback(async () => {\n if (!service) {\n logger.error(\"Cannot raise hand: service not ready\");\n return;\n }\n return service.raiseHand();\n }, [service]);\n\n const lowerHand = useCallback(\n async (participantId?: string) => {\n if (!service) {\n logger.error(\"Cannot lower hand: service not ready\");\n return;\n }\n return service.lowerHand(participantId);\n },\n [service]\n );\n\n const lowerAllHands = useCallback(async () => {\n if (!service) {\n logger.error(\"Cannot lower all hands: service not ready\");\n return;\n }\n return service.lowerAllHands();\n }, [service]);\n\n const getRaisedHands = useCallback((): RaisedHandInfo[] => {\n const hands: RaisedHandInfo[] = [];\n for (const [participantId, hand] of raisedHands.entries()) {\n hands.push({\n participantId,\n order: hand.order,\n ts: hand.ts,\n });\n }\n return hands.sort((a, b) => a.order - b.order);\n }, [raisedHands]);\n\n return {\n raiseHand,\n lowerHand,\n lowerAllHands,\n isHandRaised,\n getRaisedHandOrder,\n getRaisedHands,\n isReady: !!service,\n };\n}\n","import { create } from \"zustand\";\nimport { immer } from \"zustand/middleware/immer\";\nimport type { ParticipantMetadata } from \"../../state/types\";\nimport type {\n ParticipantReaction,\n ReactionEnvelope,\n ReactionsState,\n} from \"./types\";\n\ninterface ReactionsActions {\n setReaction: (participantId: string, reaction: ParticipantReaction) => void;\n clearReaction: (participantId: string) => void;\n upsertParticipantInfo: (id: string, info: ParticipantMetadata) => void;\n pruneExpired: (now?: number) => void;\n clear: () => void;\n}\n\nconst defaultState: ReactionsState = {\n reactions: new Map(),\n participantCache: {},\n ttlMs: 4000,\n};\n\nexport const useReactionsStore = create<ReactionsState & ReactionsActions>()(\n immer((set) => ({\n ...defaultState,\n\n setReaction: (participantId, reaction) =>\n set((state) => {\n state.reactions.set(participantId, reaction);\n }),\n\n clearReaction: (participantId) =>\n set((state) => {\n state.reactions.delete(participantId);\n }),\n\n upsertParticipantInfo: (id, info) =>\n set((state) => {\n state.participantCache[id] = info;\n }),\n\n pruneExpired: (now = Date.now()) =>\n set((state) => {\n const entries = Array.from(state.reactions.entries());\n for (const [participantId, reaction] of entries) {\n if (reaction.ts + state.ttlMs < now) {\n state.reactions.delete(participantId);\n }\n }\n }),\n\n clear: () =>\n set(() => ({\n reactions: new Map(),\n participantCache: {},\n ttlMs: defaultState.ttlMs,\n })),\n }))\n);\n\nexport function applyIncomingReaction(envelope: ReactionEnvelope): void {\n const { upsertParticipantInfo, setReaction } = useReactionsStore.getState();\n\n if (envelope.sender.info) {\n upsertParticipantInfo(envelope.sender.id, envelope.sender.info);\n }\n\n setReaction(envelope.sender.id, {\n emoji: envelope.payload.emoji,\n ts: Date.now(),\n nonce: envelope.payload.nonce,\n });\n}\n","import { createLogger } from \"../../utils\";\n\nexport const logger = createLogger(\"reactions\");\n\nexport function validateEmoji(emoji: string): {\n valid: boolean;\n error?: string;\n} {\n if (!emoji || typeof emoji !== \"string\") {\n return { valid: false, error: \"empty\" };\n }\n if (emoji.length > 10) {\n return { valid: false, error: \"too long\" };\n }\n return { valid: true };\n}\n\nexport function generateNonce(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n","import { ConnectionState, type Room } from \"livekit-client\";\nimport { useRtcStore } from \"../../state/store\";\nimport type { ParticipantMetadata } from \"../../state/types\";\nimport { createLogger } from \"../../utils\";\nimport { applyIncomingReaction, useReactionsStore } from \"./store\";\nimport type { ReactionEnvelope } from \"./types\";\nimport { generateNonce, validateEmoji } from \"./utils\";\n\nconst logger = createLogger(\"reactions\");\n\nexport class ReactionsService {\n private readonly room: Room;\n private isSubscribed = false;\n private pruneInterval: ReturnType<typeof setInterval> | undefined;\n private lastSendAt = 0;\n private minIntervalMs = 200;\n private lastRemoteTs = new Map<string, number>();\n\n constructor(room: Room) {\n this.room = room;\n }\n\n private isRoomReady(): boolean {\n if (!this.room) {\n logger.warn(\"Room not initialized\");\n return false;\n }\n\n if (this.room.state !== ConnectionState.Connected) {\n logger.warn(\"Room not connected\", { state: this.room.state });\n return false;\n }\n\n if (!this.room.localParticipant) {\n logger.warn(\"Local participant not available\");\n return false;\n }\n\n return true;\n }\n\n private canSendNow(): boolean {\n const now = Date.now();\n if (now - this.lastSendAt < this.minIntervalMs) return false;\n this.lastSendAt = now;\n return true;\n }\n\n subscribe(): void {\n if (this.isSubscribed) return;\n\n this.room.registerTextStreamHandler(\"reactions:v1\", async (reader) => {\n try {\n const text = await reader.readAll();\n this.handleIncoming(text);\n } catch (err) {\n logger.error(\"Error reading reactions stream\", err);\n }\n });\n\n this.pruneInterval = setInterval(() => {\n useReactionsStore.getState().pruneExpired();\n }, 1000);\n\n this.isSubscribed = true;\n logger.info(\"ReactionsService subscribed\");\n }\n\n unsubscribe(): void {\n this.isSubscribed = false;\n if (this.pruneInterval) {\n clearInterval(this.pruneInterval);\n this.pruneInterval = undefined;\n }\n logger.info(\"ReactionsService unsubscribed\");\n }\n\n getLocalParticipantId(): string {\n return this.room.localParticipant.identity;\n }\n\n async sendReaction(emoji: string): Promise<void> {\n if (!this.isRoomReady()) {\n useRtcStore.getState().addError({\n code: \"REACTIONS_ROOM_NOT_READY\",\n message: \"Cannot send reaction: room not connected\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const validation = validateEmoji(emoji);\n if (!validation.valid) {\n useRtcStore.getState().addError({\n code: \"REACTIONS_INVALID_EMOJI\",\n message: validation.error || \"Invalid emoji\",\n timestamp: Date.now(),\n });\n return;\n }\n\n if (!this.canSendNow()) {\n logger.debug(\"Rate limited, skipping send\");\n return;\n }\n\n const senderInfo = this.getSenderInfo();\n const ts = Date.now();\n const nonce = generateNonce();\n\n useReactionsStore.getState().setReaction(senderInfo.id, {\n emoji,\n ts,\n nonce,\n });\n\n try {\n const envelope: ReactionEnvelope = {\n v: 1,\n kind: \"reaction\",\n roomId: this.room.name,\n ts,\n sender: senderInfo,\n payload: {\n emoji,\n nonce,\n },\n };\n\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\n topic: \"reactions:v1\",\n });\n\n logger.debug(\"Reaction sent\", { emoji });\n } catch (error) {\n logger.error(\"Failed to send reaction\", error);\n useRtcStore.getState().addError({\n code: \"REACTIONS_SEND_FAILED\",\n message:\n error instanceof Error ? error.message : \"Failed to send reaction\",\n timestamp: Date.now(),\n context: { emoji },\n });\n }\n }\n\n private handleIncoming(text: string): void {\n try {\n const parsed = JSON.parse(text) as ReactionEnvelope;\n if (!this.isValidEnvelope(parsed)) {\n logger.warn(\"Invalid reaction envelope received\", parsed);\n return;\n }\n\n if (parsed.sender.id === this.getLocalParticipantId()) {\n logger.debug(\"Ignoring self-echo reaction\");\n return;\n }\n\n const lastTs =\n this.lastRemoteTs.get(parsed.sender.id) ?? Number.NEGATIVE_INFINITY;\n if (parsed.ts < lastTs) {\n logger.debug(\"Ignoring out-of-order reaction\", {\n sender: parsed.sender.id,\n ts: parsed.ts,\n lastTs,\n });\n return;\n }\n this.lastRemoteTs.set(parsed.sender.id, parsed.ts);\n applyIncomingReaction(parsed);\n logger.debug(\"Reaction received\", { emoji: parsed.payload.emoji });\n } catch (error) {\n logger.error(\"Error parsing incoming reaction\", error);\n }\n }\n\n private isValidEnvelope(e: any): e is ReactionEnvelope {\n return (\n e &&\n e.v === 1 &&\n e.kind === \"reaction\" &&\n typeof e.roomId === \"string\" &&\n e.roomId === this.room.name &&\n typeof e.ts === \"number\" &&\n e.ts > 0 &&\n typeof e.sender?.id === \"string\" &&\n typeof e.payload?.emoji === \"string\" &&\n typeof e.payload?.nonce === \"string\"\n );\n }\n\n private getSenderInfo(): { id: string; info?: ParticipantMetadata } {\n const localParticipant = this.room.localParticipant;\n const sender: { id: string; info?: ParticipantMetadata } = {\n id: localParticipant.identity,\n };\n\n if (localParticipant.metadata) {\n try {\n sender.info = JSON.parse(\n localParticipant.metadata\n ) as ParticipantMetadata;\n } catch {\n // Ignore metadata parse errors\n }\n }\n\n return sender;\n }\n}\n","import { useCallback } from \"react\";\nimport type { ParticipantMetadata } from \"../../state/types\";\nimport { createLogger } from \"../../utils\";\nimport { useFeatureService } from \"../DataChannelContext\";\nimport type { ReactionsService } from \"./service\";\nimport { useReactionsStore } from \"./store\";\n\nconst logger = createLogger(\"reactions:hook\");\n\ntype Nullable<T> = T | null;\n\nexport interface UseReactionsReturn {\n sendReaction: (emoji: string) => Promise<void>;\n getReactionFor: (participantId: string) => Nullable<string>;\n clearReaction: (participantId: string) => void;\n getParticipantInfo: (id: string) => Nullable<ParticipantMetadata>;\n isReady: boolean;\n}\n\nexport function useReactions(): UseReactionsReturn {\n const service = useFeatureService<ReactionsService>(\"reactions\");\n\n const reactions = useReactionsStore((state) => state.reactions);\n const participantCache = useReactionsStore((state) => state.participantCache);\n\n const getReactionFor = useCallback(\n (participantId: string): Nullable<string> => {\n const reaction = reactions.get(participantId);\n return reaction?.emoji ?? null;\n },\n [reactions]\n );\n\n const getParticipantInfo = useCallback(\n (id: string): Nullable<ParticipantMetadata> => participantCache[id] || null,\n [participantCache]\n );\n\n const sendReaction = useCallback(\n async (emoji: string) => {\n if (!service) {\n logger.error(\"Cannot send reaction: service not ready\");\n return;\n }\n return service.sendReaction(emoji);\n },\n [service]\n );\n\n const clearReaction = useCallback((participantId: string) => {\n useReactionsStore.getState().clearReaction(participantId);\n }, []);\n\n return {\n sendReaction,\n getReactionFor,\n clearReaction,\n getParticipantInfo,\n isReady: !!service,\n };\n}\n","import { create } from \"zustand\";\nimport { immer } from \"zustand/middleware/immer\";\nimport type { ParticipantMetadata } from \"../../state/types\";\nimport type {\n SpotlightEnvelope,\n SpotlightState,\n SpotlightedUser,\n} from \"./types\";\n\ninterface SpotlightActions {\n spotlight: (participantId: string, info?: ParticipantMetadata) => void;\n unspotlight: () => void;\n getSpotlightedUser: () => SpotlightedUser | null;\n clear: () => void;\n}\n\nconst defaultState: SpotlightState = {\n spotlightedUser: null,\n isSpotlighted: false,\n};\n\nexport const useSpotlightStore = create<SpotlightState & SpotlightActions>()(\n immer((set, get) => ({\n ...defaultState,\n\n spotlight: (participantId, info) =>\n set((state) => {\n state.spotlightedUser = {\n participantId,\n ts: Date.now(),\n ...(info && { info }),\n };\n state.isSpotlighted = true;\n }),\n\n unspotlight: () =>\n set((state) => {\n state.spotlightedUser = null;\n state.isSpotlighted = false;\n }),\n\n getSpotlightedUser: () => get().spotlightedUser,\n\n clear: () =>\n set(() => ({\n spotlightedUser: null,\n isSpotlighted: false,\n })),\n }))\n);\n\nexport function applyIncomingSpotlight(envelope: SpotlightEnvelope): void {\n const { spotlight, unspotlight } = useSpotlightStore.getState();\n\n switch (envelope.payload.action) {\n case \"spotlight\": {\n // Note: We don't have the target's info in the envelope, only the sender's\n // The info can be populated later if needed from the room's participant list\n spotlight(envelope.payload.targetId, envelope.payload.info);\n break;\n }\n case \"unspotlight\": {\n unspotlight();\n break;\n }\n }\n}\n","import { ConnectionState, type Room } from \"livekit-client\";\nimport { useRtcStore } from \"../../state/store\";\nimport type { ParticipantMetadata } from \"../../state/types\";\nimport { createLogger } from \"../../utils\";\nimport { applyIncomingSpotlight, useSpotlightStore } from \"./store\";\nimport type { SpotlightEnvelope } from \"./types\";\n\nconst logger = createLogger(\"spotlight\");\n\nexport class SpotlightService {\n private readonly room: Room;\n private isSubscribed = false;\n\n constructor(room: Room) {\n this.room = room;\n }\n\n private isRoomReady(): boolean {\n if (!this.room) {\n logger.warn(\"Room not initialized\");\n return false;\n }\n\n if (this.room.state !== ConnectionState.Connected) {\n logger.warn(\"Room not connected\", { state: this.room.state });\n return false;\n }\n\n if (!this.room.localParticipant) {\n logger.warn(\"Local participant not available\");\n return false;\n }\n\n return true;\n }\n\n subscribe(): void {\n if (this.isSubscribed) return;\n\n this.room.registerTextStreamHandler(\"spotlight:v1\", async (reader) => {\n try {\n const text = await reader.readAll();\n this.handleIncoming(text);\n } catch (err) {\n logger.error(\"Error reading spotlight stream\", err);\n }\n });\n\n this.isSubscribed = true;\n logger.info(\"SpotlightService subscribed\");\n }\n\n unsubscribe(): void {\n this.isSubscribed = false;\n logger.info(\"SpotlightService unsubscribed\");\n }\n\n getLocalParticipantId(): string {\n return this.room.localParticipant.identity;\n }\n\n async spotlight(targetId: string, info?: ParticipantMetadata): Promise<void> {\n if (!this.isRoomReady()) {\n useRtcStore.getState().addError({\n code: \"SPOTLIGHT_ROOM_NOT_READY\",\n message: \"Cannot spotlight: room not connected\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const senderInfo = this.getSenderInfo();\n // Store previous state for rollback\n const previousSpotlighted = useSpotlightStore\n .getState()\n .getSpotlightedUser();\n\n // Optimistically update store\n useSpotlightStore.getState().spotlight(targetId, info);\n\n try {\n const envelope: SpotlightEnvelope = {\n v: 1,\n kind: \"spotlight\",\n roomId: this.room.name,\n ts: Date.now(),\n sender: senderInfo,\n payload: {\n action: \"spotlight\",\n targetId,\n info: info!,\n },\n };\n\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\n topic: \"spotlight:v1\",\n });\n\n logger.info(\"User spotlighted\", { targetId });\n } catch (error) {\n logger.error(\"Failed to spotlight user\", error);\n\n // Rollback to previous state on failure\n if (previousSpotlighted) {\n useSpotlightStore\n .getState()\n .spotlight(\n previousSpotlighted.participantId,\n previousSpotlighted.info\n );\n } else {\n useSpotlightStore.getState().unspotlight();\n }\n\n useRtcStore.getState().addError({\n code: \"SPOTLIGHT_SEND_FAILED\",\n message:\n error instanceof Error ? error.message : \"Failed to spotlight user\",\n timestamp: Date.now(),\n });\n }\n }\n\n async unspotlight(): Promise<void> {\n if (!this.isRoomReady()) {\n useRtcStore.getState().addError({\n code: \"UNSPOTLIGHT_ROOM_NOT_READY\",\n message: \"Cannot unspotlight: room not connected\",\n timestamp: Date.now(),\n });\n return;\n }\n\n const senderInfo = this.getSenderInfo();\n const currentSpotlighted = useSpotlightStore\n .getState()\n .getSpotlightedUser();\n\n if (!currentSpotlighted) {\n logger.debug(\"No user is currently spotlighted\");\n return;\n }\n\n // Store previous state for rollback\n const previousSpotlighted = { ...currentSpotlighted };\n\n // Optimistically update store\n useSpotlightStore.getState().unspotlight();\n\n try {\n const envelope: SpotlightEnvelope = {\n v: 1,\n kind: \"spotlight\",\n roomId: this.room.name,\n ts: Date.now(),\n sender: senderInfo,\n payload: {\n action: \"unspotlight\",\n targetId: previousSpotlighted.participantId,\n },\n };\n\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\n topic: \"spotlight:v1\",\n });\n\n logger.info(\"User unspotlighted\");\n } catch (error) {\n logger.error(\"Failed to unspotlight user\", error);\n\n // Rollback to previous state on failure\n useSpotlightStore\n .getState()\n .spotlight(previousSpotlighted.participantId, previousSpotlighted.info);\n\n useRtcStore.getState().addError({\n code: \"UNSPOTLIGHT_SEND_FAILED\",\n message:\n error instanceof Error ? error.message : \"Failed to unspotlight user\",\n timestamp: Date.now(),\n });\n }\n }\n\n private handleIncoming(text: string): void {\n try {\n const parsed = JSON.parse(text) as SpotlightEnvelope;\n if (!this.isValidEnvelope(parsed)) {\n logger.warn(\"Invalid spotlight envelope received\", parsed);\n return;\n }\n\n if (parsed.sender.id === this.getLocalParticipantId()) {\n logger.debug(\"Ignoring self-echo spotlight message\");\n return;\n }\n\n applyIncomingSpotlight(parsed);\n logger.debug(\"Spotlight message received\", {\n action: parsed.payload.action,\n targetId: parsed.payload.targetId,\n });\n } catch (error) {\n logger.error(\"Error parsing incoming spotlight message\", error);\n }\n }\n\n private isValidEnvelope(e: any): e is SpotlightEnvelope {\n return (\n e &&\n e.v === 1 &&\n e.kind === \"spotlight\" &&\n typeof e.roomId === \"string\" &&\n e.roomId === this.room.name &&\n typeof e.ts === \"number\" &&\n e.ts > 0 &&\n typeof e.sender?.id === \"string\" &&\n typeof e.payload?.action === \"string\" &&\n [\"spotlight\", \"unspotlight\"].includes(e.payload.action) &&\n typeof e.payload?.targetId === \"string\"\n );\n }\n\n private getSenderInfo(): { id: string; info?: ParticipantMetadata } {\n const localParticipant = this.room.localParticipant;\n const sender: { id: string; info?: ParticipantMetadata } = {\n id: localParticipant.identity,\n };\n\n if (localParticipant.metadata) {\n try {\n sender.info = JSON.parse(\n localParticipant.metadata\n ) as ParticipantMetadata;\n } catch {\n // Ignore metadata parse errors\n }\n }\n\n return sender;\n }\n}\n","import { useCallback } from \"react\";\nimport type { ParticipantMetadata } from \"../../state/types\";\nimport { createLogger } from \"../../utils\";\nimport { useFeatureService } from \"../DataChannelContext\";\nimport type { SpotlightService } from \"./service\";\nimport { useSpotlightStore } from \"./store\";\nimport type { SpotlightedUser } from \"./types\";\n\nconst logger = createLogger(\"spotlight:hook\");\n\ntype Nullable<T> = T | null;\n\nexport interface IUseSpotlight {\n spotlight: (targetId: string, info?: ParticipantMetadata) => Promise<void>;\n unspotlight: () => Promise<void>;\n getSpotlightedUser: () => Nullable<SpotlightedUser>;\n isSpotlighted: boolean;\n isReady: boolean;\n}\n\nexport function useSpotlight(): IUseSpotlight {\n const service = useFeatureService<SpotlightService>(\"spotlight\");\n\n const getSpotlightedUser = useSpotlightStore(\n (state) => state.getSpotlightedUser\n );\n const isSpotlighted = useSpotlightStore((state) => state.isSpotlighted);\n\n const spotlight = useCallback(\n async (targetId: string, info?: ParticipantMetadata) => {\n if (!service) {\n logger.error(\"Cannot spotlight: service not ready\");\n return;\n }\n return service.spotlight(targetId, info!);\n },\n [service]\n );\n\n const unspotlight = useCallback(async () => {\n if (!service) {\n logger.error(\"Cannot unspotlight: service not ready\");\n return;\n }\n return service.unspotlight();\n }, [service]);\n\n return {\n spotlight,\n unspotlight,\n getSpotlightedUser,\n isSpotlighted,\n isReady: !!service,\n };\n}\n","import type { Room } from \"livekit-client\";\nimport { ChatService, useChatStore } from \"./chat\";\nimport { RaiseHandService, useRaiseHandStore } from \"./raiseHand\";\nimport { ReactionsService, useReactionsStore } from \"./reactions\";\nimport { SpotlightService, useSpotlightStore } from \"./spotlight\";\nimport type { RealtimeFeature } from \"./types\";\n\nexport const FEATURES: Record<string, RealtimeFeature> = {\n chat: {\n name: \"chat\",\n createService: (room: Room) => new ChatService(room),\n cleanupStore: () => useChatStore.getState().clearChat(),\n },\n reactions: {\n name: \"reactions\",\n createService: (room: Room) => new ReactionsService(room),\n cleanupStore: () => useReactionsStore.getState().clear(),\n },\n \"raise-hand\": {\n name: \"raise-hand\",\n createService: (room: Room) => new RaiseHandService(room),\n cleanupStore: () => useRaiseHandStore.getState().clear(),\n },\n spotlight: {\n name: \"spotlight\",\n createService: (room: Room) => new SpotlightService(room),\n cleanupStore: () => useSpotlightStore.getState().clear(),\n },\n};\n\nexport const DEFAULT_FEATURES = [\n \"chat\",\n \"reactions\",\n \"raise-hand\",\n \"spotlight\",\n];\n","import type { Room } from \"livekit-client\";\nimport { type ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\nimport { createLogger } from \"../utils\";\nimport {\n DataChannelContext,\n type DataChannelContextValue,\n} from \"./DataChannelContext\";\nimport { DEFAULT_FEATURES, FEATURES } from \"./registry\";\n\nconst logger = createLogger(\"channels:provider\");\n\nexport interface DataChannelProviderProps {\n room: Room;\n features?: string[];\n children: ReactNode;\n}\n\nexport function DataChannelProvider({\n room,\n features = DEFAULT_FEATURES,\n children,\n}: DataChannelProviderProps) {\n const services = useRef<Map<string, any>>(new Map());\n const [isReady, setIsReady] = useState(false);\n\n useEffect(() => {\n if (!room) {\n logger.warn(\"DataChannelProvider mounted without room\");\n return;\n }\n\n logger.debug(\"Initializing features\", { features });\n for (const featureName of features) {\n const feature = FEATURES[featureName];\n\n if (!feature) {\n logger.warn(`Feature \"${featureName}\" not found in registry`);\n continue;\n }\n\n try {\n logger.debug(`Initializing feature: ${featureName}`);\n const service = feature.createService(room);\n\n service.subscribe();\n services.current.set(featureName, service);\n\n logger.info(`Feature \"${featureName}\" initialized`);\n } catch (error) {\n logger.error(`Failed to initialize feature \"${featureName}\"`, error);\n }\n }\n\n setIsReady(true);\n logger.info(\"All features initialized\");\n return () => {\n logger.debug(\"Cleaning up features\");\n\n // Unsubscribe all services\n services.current.forEach((service, name) => {\n try {\n logger.debug(`Unsubscribing feature: ${name}`);\n service.unsubscribe();\n } catch (error) {\n logger.error(`Failed to unsubscribe feature \"${name}\"`, error);\n }\n });\n\n // Clean up stores\n for (const featureName of features) {\n const feature = FEATURES[featureName];\n if (feature?.cleanupStore) {\n try {\n logger.debug(`Cleaning store for feature: ${featureName}`);\n feature.cleanupStore();\n } catch (error) {\n logger.error(`Failed to cleanup store for \"${featureName}\"`, error);\n }\n }\n }\n\n services.current.clear();\n setIsReady(false);\n logger.info(\"Features cleanup complete\");\n };\n }, [room, features]);\n\n const contextValue = useMemo<DataChannelContextValue>(\n () => ({\n services: services.current,\n isReady,\n }),\n [isReady]\n );\n\n return (\n <DataChannelContext.Provider value={contextValue}>\n {children}\n </DataChannelContext.Provider>\n );\n}\n"]}
|