vg-x07df 1.6.0 → 1.6.1
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 +5 -5
- 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 +5 -5
- package/dist/channel/index.mjs.map +1 -1
- package/dist/index.cjs +25 -26
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +25 -26
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/channel/index.cjs
CHANGED
|
@@ -33,15 +33,15 @@ var defaultChatState = {
|
|
|
33
33
|
participantCache: {},
|
|
34
34
|
maxEntries: 1e3
|
|
35
35
|
};
|
|
36
|
-
function applyReactionToEntry(entry, emoji,
|
|
36
|
+
function applyReactionToEntry(entry, emoji, participantId, op) {
|
|
37
37
|
const emojiSet = entry.reactions[emoji];
|
|
38
38
|
if (!emojiSet) {
|
|
39
39
|
entry.reactions[emoji] = /* @__PURE__ */ new Set();
|
|
40
40
|
}
|
|
41
41
|
if (op === "add") {
|
|
42
|
-
entry.reactions[emoji]?.add(
|
|
42
|
+
entry.reactions[emoji]?.add(participantId);
|
|
43
43
|
} else {
|
|
44
|
-
entry.reactions[emoji]?.delete(
|
|
44
|
+
entry.reactions[emoji]?.delete(participantId);
|
|
45
45
|
if (entry.reactions[emoji]?.size === 0) {
|
|
46
46
|
delete entry.reactions[emoji];
|
|
47
47
|
}
|
|
@@ -196,10 +196,10 @@ var useChatStore = zustand.create()(
|
|
|
196
196
|
entry.removedAt = Date.now();
|
|
197
197
|
}
|
|
198
198
|
}),
|
|
199
|
-
applyReaction: (entryId, emoji,
|
|
199
|
+
applyReaction: (entryId, emoji, participantId, op) => set((state) => {
|
|
200
200
|
const entry = state.byId[entryId];
|
|
201
201
|
if (entry) {
|
|
202
|
-
applyReactionToEntry(entry, emoji,
|
|
202
|
+
applyReactionToEntry(entry, emoji, participantId, op);
|
|
203
203
|
}
|
|
204
204
|
}),
|
|
205
205
|
queuePendingOp: (entryId, envelope) => set((state) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/channel/DataChannelContext.ts","../../src/channel/chat/store.ts","../../src/state/types.ts","../../src/state/store.ts","../../src/channel/chat/utils.ts","../../src/utils/logger.ts","../../src/channel/chat/service.ts","../../src/channel/chat/useChat.ts","../../src/channel/registry.ts","../../src/channel/DataChannelProvider.tsx"],"names":["createContext","useContext","create","immer","entry","nanoid","ConnectionState","useMemo","useCallback","react","logger","useRef","useState","useEffect"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\r\n\r\nexport interface DataChannelContextValue {\r\n services: Map<string, any>;\r\n isReady: boolean;\r\n}\r\n\r\nexport const DataChannelContext = createContext<DataChannelContextValue | null>(null);\r\n\r\nexport function useDataChannelContext(): DataChannelContextValue {\r\n const context = useContext(DataChannelContext);\r\n if (!context) {\r\n throw new Error(\"useDataChannelContext must be used within DataChannelProvider\");\r\n }\r\n return context;\r\n}\r\n\r\nexport function useFeatureService<T = any>(featureName: string): T {\r\n const { services } = useDataChannelContext();\r\n const service = services.get(featureName) as T;\r\n if (!service) {\r\n throw new Error(\r\n `Feature service \"${featureName}\" not found. Make sure it's enabled in DataChannelProvider.`\r\n );\r\n }\r\n \r\n return service;\r\n}\r\n","import { create } from \"zustand\";\r\nimport { immer } from \"zustand/middleware/immer\";\r\nimport type { ChatEntry, ChatState, Envelope } from \"./types\";\r\n\r\ninterface ChatActions {\r\n patch: (fn: (draft: ChatState) => void) => void;\r\n applyIncoming: (envelope: Envelope) => void;\r\n addEntryOptimistic: (entry: ChatEntry) => void;\r\n markEntrySent: (entryId: string) => void;\r\n markEntryFailed: (entryId: string) => void;\r\n applyEdit: (entryId: string, newContent: string, version: number) => void;\r\n applyRemove: (entryId: string) => void;\r\n applyReaction: (\r\n entryId: string,\r\n emoji: string,\r\n participantSid: string,\r\n op: \"add\" | \"remove\"\r\n ) => void;\r\n queuePendingOp: (entryId: string, envelope: Envelope) => void;\r\n processPendingOps: (entryId: string) => void;\r\n trimOldEntries: () => void;\r\n clearChat: () => void;\r\n}\r\n\r\nconst defaultChatState: ChatState = {\r\n byId: {},\r\n order: [],\r\n pendingOps: {},\r\n participantCache: {},\r\n maxEntries: 1000,\r\n};\r\n\r\nfunction applyReactionToEntry(\r\n entry: ChatEntry,\r\n emoji: string,\r\n participantSid: string,\r\n op: \"add\" | \"remove\"\r\n) {\r\n const emojiSet = entry.reactions[emoji];\r\n if (!emojiSet) {\r\n entry.reactions[emoji] = new Set();\r\n }\r\n if (op === \"add\") {\r\n entry.reactions[emoji]?.add(participantSid);\r\n } else {\r\n entry.reactions[emoji]?.delete(participantSid);\r\n if (entry.reactions[emoji]?.size === 0) {\r\n delete entry.reactions[emoji];\r\n }\r\n }\r\n}\r\n\r\nfunction trimEntriesIfNeeded(state: ChatState) {\r\n if (Object.keys(state.byId).length > state.maxEntries) {\r\n const entriesToRemove = Object.keys(state.byId).length - state.maxEntries;\r\n for (let i = 0; i < entriesToRemove; i++) {\r\n const oldestId = state.order[i];\r\n if (oldestId) {\r\n delete state.byId[oldestId];\r\n }\r\n }\r\n state.order = state.order.slice(entriesToRemove);\r\n }\r\n}\r\n\r\nexport const useChatStore = create<ChatState & ChatActions>()(\r\n immer((set) => ({\r\n ...defaultChatState,\r\n\r\n patch: (fn) =>\r\n set((state) => {\r\n fn(state);\r\n }),\r\n\r\n applyIncoming: (envelope) =>\r\n set((state) => {\r\n if (envelope.kind === \"entry\") {\r\n if (state.byId[envelope.entryId]) {\r\n return;\r\n }\r\n\r\n if (envelope.sender.info) {\r\n state.participantCache[envelope.sender.id] = envelope.sender.info;\r\n }\r\n\r\n const entry: ChatEntry = {\r\n id: envelope.entryId,\r\n content: envelope.payload.content,\r\n sender: {\r\n id: envelope.sender.id,\r\n },\r\n createdAt: envelope.ts,\r\n version: 1,\r\n reactions: {},\r\n status: \"sent\",\r\n };\r\n\r\n state.byId[envelope.entryId] = entry;\r\n state.order.push(envelope.entryId);\r\n\r\n trimEntriesIfNeeded(state);\r\n\r\n const pendingOps = state.pendingOps[envelope.entryId];\r\n if (pendingOps) {\r\n delete state.pendingOps[envelope.entryId];\r\n\r\n for (const op of pendingOps) {\r\n if (op.kind === \"edit\") {\r\n const entry = state.byId[op.entryId];\r\n if (entry && op.payload.version > entry.version) {\r\n entry.content = op.payload.newContent;\r\n entry.version = op.payload.version;\r\n entry.editedAt = op.ts;\r\n }\r\n } else if (op.kind === \"remove\") {\r\n const entry = state.byId[op.entryId];\r\n if (entry && !entry.removedAt) {\r\n entry.removedAt = op.ts;\r\n }\r\n } else if (op.kind === \"reaction\") {\r\n if (op.sender.info) {\r\n state.participantCache[op.sender.id] = op.sender.info;\r\n }\r\n\r\n const entry = state.byId[op.entryId];\r\n if (entry) {\r\n applyReactionToEntry(\r\n entry,\r\n op.payload.emoji,\r\n op.sender.id,\r\n op.payload.op\r\n );\r\n }\r\n }\r\n }\r\n }\r\n } else if (envelope.kind === \"edit\") {\r\n const entry = state.byId[envelope.entryId];\r\n if (entry) {\r\n if (envelope.payload.version > entry.version) {\r\n entry.content = envelope.payload.newContent;\r\n entry.version = envelope.payload.version;\r\n entry.editedAt = envelope.ts;\r\n }\r\n } else {\r\n if (!state.pendingOps[envelope.entryId]) {\r\n state.pendingOps[envelope.entryId] = [];\r\n }\r\n state.pendingOps[envelope.entryId]?.push(envelope);\r\n }\r\n } else if (envelope.kind === \"remove\") {\r\n const entry = state.byId[envelope.entryId];\r\n if (entry) {\r\n if (!entry.removedAt) {\r\n entry.removedAt = envelope.ts;\r\n }\r\n } else {\r\n if (!state.pendingOps[envelope.entryId]) {\r\n state.pendingOps[envelope.entryId] = [];\r\n }\r\n state.pendingOps[envelope.entryId]?.push(envelope);\r\n }\r\n } else if (envelope.kind === \"reaction\") {\r\n if (envelope.sender.info) {\r\n state.participantCache[envelope.sender.id] = envelope.sender.info;\r\n }\r\n\r\n const entry = state.byId[envelope.entryId];\r\n if (entry) {\r\n applyReactionToEntry(\r\n entry,\r\n envelope.payload.emoji,\r\n envelope.sender.id,\r\n envelope.payload.op\r\n );\r\n } else {\r\n if (!state.pendingOps[envelope.entryId]) {\r\n state.pendingOps[envelope.entryId] = [];\r\n }\r\n state.pendingOps[envelope.entryId]?.push(envelope);\r\n }\r\n }\r\n }),\r\n\r\n addEntryOptimistic: (entry) =>\r\n set((state) => {\r\n state.byId[entry.id] = entry;\r\n state.order.push(entry.id);\r\n\r\n trimEntriesIfNeeded(state);\r\n }),\r\n\r\n markEntrySent: (entryId) =>\r\n set((state) => {\r\n const entry = state.byId[entryId];\r\n if (entry) {\r\n entry.status = \"sent\";\r\n }\r\n }),\r\n\r\n markEntryFailed: (entryId) =>\r\n set((state) => {\r\n const entry = state.byId[entryId];\r\n if (entry) {\r\n entry.status = \"failed\";\r\n }\r\n }),\r\n\r\n applyEdit: (entryId, newContent, version) =>\r\n set((state) => {\r\n const entry = state.byId[entryId];\r\n if (entry && version > entry.version) {\r\n entry.content = newContent;\r\n entry.version = version;\r\n entry.editedAt = Date.now();\r\n }\r\n }),\r\n\r\n applyRemove: (entryId) =>\r\n set((state) => {\r\n const entry = state.byId[entryId];\r\n if (entry && !entry.removedAt) {\r\n entry.removedAt = Date.now();\r\n }\r\n }),\r\n\r\n applyReaction: (entryId, emoji, participantSid, op) =>\r\n set((state) => {\r\n const entry = state.byId[entryId];\r\n if (entry) {\r\n applyReactionToEntry(entry, emoji, participantSid, op);\r\n }\r\n }),\r\n\r\n queuePendingOp: (entryId, envelope) =>\r\n set((state) => {\r\n if (!state.pendingOps[entryId]) {\r\n state.pendingOps[entryId] = [];\r\n }\r\n state.pendingOps[entryId].push(envelope);\r\n }),\r\n\r\n processPendingOps: (entryId) =>\r\n set((state) => {\r\n const pendingOps = state.pendingOps[entryId];\r\n if (!pendingOps) {\r\n return;\r\n }\r\n\r\n delete state.pendingOps[entryId];\r\n\r\n for (const envelope of pendingOps) {\r\n if (envelope.kind === \"edit\") {\r\n const entry = state.byId[envelope.entryId];\r\n if (entry && envelope.payload.version > entry.version) {\r\n entry.content = envelope.payload.newContent;\r\n entry.version = envelope.payload.version;\r\n entry.editedAt = envelope.ts;\r\n }\r\n } else if (envelope.kind === \"remove\") {\r\n const entry = state.byId[envelope.entryId];\r\n if (entry && !entry.removedAt) {\r\n entry.removedAt = envelope.ts;\r\n }\r\n } else if (envelope.kind === \"reaction\") {\r\n if (envelope.sender.info) {\r\n state.participantCache[envelope.sender.id] = envelope.sender.info;\r\n }\r\n\r\n const entry = state.byId[envelope.entryId];\r\n if (entry) {\r\n applyReactionToEntry(\r\n entry,\r\n envelope.payload.emoji,\r\n envelope.sender.id,\r\n envelope.payload.op\r\n );\r\n }\r\n }\r\n }\r\n }),\r\n\r\n trimOldEntries: () =>\r\n set((state) => {\r\n trimEntriesIfNeeded(state);\r\n }),\r\n\r\n clearChat: () => set(() => defaultChatState),\r\n }))\r\n);\r\n\r\nexport const chatStore = useChatStore;\r\n","type Nullable<T> = T | null;\r\n\r\nexport type CallParticipantRole = \"HOST\" | \"PARTICIPANT\" | \"GUEST\";\r\n\r\nexport interface ParticipantPermissions {\r\n canMute: boolean;\r\n canKick: boolean;\r\n canTransfer: boolean;\r\n canEnd: boolean;\r\n canRecord: boolean;\r\n canShareScreen: boolean;\r\n}\r\n\r\nexport interface ParticipantMetadata {\r\n userId: string | number;\r\n firstName: Nullable<string>;\r\n lastName: Nullable<string>;\r\n username: Nullable<string>;\r\n email: Nullable<string>;\r\n profilePhoto: Nullable<string>;\r\n role: CallParticipantRole;\r\n permissions: ParticipantPermissions;\r\n}\r\n\r\nexport interface LiveKitJoinInfo {\r\n token: string;\r\n roomName: string;\r\n url: string;\r\n}\r\n\r\nexport interface Session {\r\n id: string;\r\n status: \"pending\" | \"ready\" | \"active\" | \"ended\";\r\n mode: \"AUDIO\" | \"VIDEO\";\r\n role: \"HOST\" | \"PARTICIPANT\" | \"GUEST\";\r\n livekitInfo?: LiveKitJoinInfo;\r\n startedAt?: string;\r\n ringTimeoutMs?: number;\r\n}\r\n\r\nexport interface IncomingInvite {\r\n callId: string;\r\n inviteId: string;\r\n caller: ParticipantMetadata;\r\n mode: \"AUDIO\" | \"VIDEO\";\r\n expiresAt: string;\r\n expiresInMs: number;\r\n ringTimeoutMs: number;\r\n}\r\n\r\nexport interface OutgoingInvite {\r\n userId: string;\r\n status: \"sent\" | \"accepted\" | \"declined\" | \"missed\";\r\n participant: Omit<ParticipantMetadata, \"permissions\">;\r\n}\r\n\r\nexport interface RtcError {\r\n code: string;\r\n message: string;\r\n timestamp: number;\r\n context?: any;\r\n}\r\n\r\nexport interface RtcState {\r\n // Did we initiate the current call?\r\n initiated: boolean;\r\n\r\n // Active session (null when no active call)\r\n session: Session | null;\r\n\r\n // Incoming invitation (null when no pending invite)\r\n incomingInvite: IncomingInvite | null;\r\n\r\n outgoingInvites: Record<string, OutgoingInvite>;\r\n\r\n // Error tracking\r\n errors: RtcError[];\r\n}\r\n\r\nexport const defaultState: RtcState = {\r\n initiated: false,\r\n session: null,\r\n incomingInvite: null,\r\n outgoingInvites: {},\r\n errors: [],\r\n};\r\n","import { create } from \"zustand\";\r\nimport { immer } from \"zustand/middleware/immer\";\r\nimport type { RtcError, RtcState } from \"./types\";\r\nimport { defaultState } from \"./types\";\r\n\r\ntype Actions = {\r\n patch: (fn: (draft: RtcState) => void) => void;\r\n reset: () => void;\r\n addError: (error: RtcError) => void;\r\n clearErrors: () => void;\r\n};\r\n\r\nexport const useRtcStore = create<RtcState & Actions>()(\r\n immer((set) => ({\r\n ...defaultState,\r\n\r\n patch: (fn) =>\r\n set((state) => {\r\n fn(state);\r\n }),\r\n\r\n reset: () => set(() => defaultState),\r\n\r\n addError: (error) =>\r\n set((state) => {\r\n state.errors.push(error);\r\n }),\r\n\r\n clearErrors: () =>\r\n set((state) => {\r\n state.errors = [];\r\n }),\r\n }))\r\n);\r\n\r\nexport const rtcStore = useRtcStore;\r\n","import { nanoid } from \"nanoid\";\r\nimport type { ChatEntry, Envelope } from \"./types\";\r\n\r\nexport function compareEntries(a: ChatEntry, b: ChatEntry): number {\r\n if (a.createdAt !== b.createdAt) {\r\n return a.createdAt - b.createdAt;\r\n }\r\n \r\n if (a.sender.id !== b.sender.id) {\r\n return a.sender.id.localeCompare(b.sender.id);\r\n }\r\n \r\n return a.id.localeCompare(b.id);\r\n}\r\n\r\nexport function validateContent(content: string): { valid: boolean; error?: string } {\r\n const trimmed = content.trim();\r\n \r\n if (trimmed.length === 0) {\r\n return { valid: false, error: \"Content cannot be empty\" };\r\n }\r\n \r\n const sizeInBytes = new TextEncoder().encode(content).length;\r\n if (sizeInBytes > 16384) {\r\n return { valid: false, error: \"Content exceeds 16KB limit\" };\r\n }\r\n \r\n return { valid: true };\r\n}\r\n\r\nexport function isValidEnvelope(data: any): data is Envelope {\r\n if (!data || typeof data !== \"object\") {\r\n return false;\r\n }\r\n \r\n if (data.v !== 1) {\r\n return false;\r\n }\r\n \r\n if (![\"entry\", \"edit\", \"remove\", \"reaction\"].includes(data.kind)) {\r\n return false;\r\n }\r\n \r\n if (\r\n typeof data.roomId !== \"string\" ||\r\n typeof data.entryId !== \"string\" ||\r\n typeof data.ts !== \"number\"\r\n ) {\r\n return false;\r\n }\r\n \r\n if (!data.sender || typeof data.sender.id !== \"string\") {\r\n return false;\r\n }\r\n \r\n if (data.kind === \"entry\" || data.kind === \"edit\" || data.kind === \"reaction\") {\r\n if (!data.payload || typeof data.payload !== \"object\") {\r\n return false;\r\n }\r\n }\r\n \r\n return true;\r\n}\r\n\r\nexport function generateEntryId(): string {\r\n return nanoid();\r\n}\r\n\r\nexport function getCurrentTimestamp(): number {\r\n return Date.now();\r\n}\r\n","/**\r\n * Comprehensive logging system for the Callpad Web SDK\r\n *\r\n * Features:\r\n * - Log level filtering (debug, info, warn, error)\r\n * - Environment variable configuration (DEBUG, CALLPAD_LOG_LEVEL)\r\n * - Hierarchical namespacing (callpad:socket:connection)\r\n * - Custom logger integration\r\n * - Zero-cost when disabled\r\n */\r\n\r\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\r\n\r\nexport interface LoggerOptions {\r\n level?: LogLevel;\r\n enableDebug?: boolean;\r\n customLogger?: (level: LogLevel, message: string, meta?: any) => void;\r\n}\r\n\r\nexport interface CallpadLogger {\r\n debug(message: string, meta?: any): void;\r\n info(message: string, meta?: any): void;\r\n warn(message: string, meta?: any): void;\r\n error(message: string, meta?: any): void;\r\n child(namespace: string): CallpadLogger;\r\n setLevel(level: LogLevel): void;\r\n isLevelEnabled(level: LogLevel): boolean;\r\n}\r\n\r\nconst LOG_LEVELS: Record<LogLevel, number> = {\r\n debug: 0,\r\n info: 1,\r\n warn: 2,\r\n error: 3,\r\n};\r\n\r\nclass CallpadLoggerImpl implements CallpadLogger {\r\n private namespace: string;\r\n private level: LogLevel;\r\n private enableDebug: boolean;\r\n private customLogger?: (level: LogLevel, message: string, meta?: any) => void;\r\n\r\n constructor(namespace = \"callpad\", options: LoggerOptions = {}) {\r\n this.namespace = namespace;\r\n this.level = options.level ?? this.getDefaultLevel();\r\n this.enableDebug = options.enableDebug ?? this.shouldEnableDebug();\r\n if (options.customLogger) {\r\n this.customLogger = options.customLogger;\r\n }\r\n }\r\n\r\n private getDefaultLevel(): LogLevel {\r\n const envLevel =\r\n typeof window !== \"undefined\"\r\n ? (window as any).__CALLPAD_LOG_LEVEL__\r\n : typeof globalThis !== \"undefined\" &&\r\n (globalThis as any).process?.env?.CALLPAD_LOG_LEVEL;\r\n\r\n if (envLevel && this.isValidLogLevel(envLevel)) {\r\n return envLevel as LogLevel;\r\n }\r\n\r\n const isProduction =\r\n typeof globalThis !== \"undefined\" &&\r\n (globalThis as any).process?.env?.NODE_ENV === \"production\";\r\n\r\n return isProduction ? \"warn\" : \"info\";\r\n }\r\n\r\n private shouldEnableDebug(): boolean {\r\n const debugEnv =\r\n typeof window !== \"undefined\"\r\n ? (window as any).__DEBUG__\r\n : typeof globalThis !== \"undefined\" &&\r\n (globalThis as any).process?.env?.DEBUG;\r\n\r\n if (!debugEnv) return false;\r\n\r\n const debugPatterns = debugEnv.split(/[\\s,]+/);\r\n return debugPatterns.some((pattern: string) => {\r\n if (pattern === \"*\") return true;\r\n if (pattern.endsWith(\"*\")) {\r\n const prefix = pattern.slice(0, -1);\r\n return this.namespace.startsWith(prefix);\r\n }\r\n return this.namespace === pattern;\r\n });\r\n }\r\n\r\n private isValidLogLevel(level: string): boolean {\r\n return Object.keys(LOG_LEVELS).includes(level);\r\n }\r\n\r\n private shouldLog(level: LogLevel): boolean {\r\n if (level === \"debug\" && !this.enableDebug) {\r\n return false;\r\n }\r\n return LOG_LEVELS[level] >= LOG_LEVELS[this.level];\r\n }\r\n\r\n private formatMessage(level: LogLevel, message: string, meta?: any): void {\r\n if (!this.shouldLog(level)) return;\r\n\r\n const timestamp = new Date().toISOString();\r\n const prefix = `[${timestamp}] [${this.namespace}] [${level.toUpperCase()}]`;\r\n\r\n if (this.customLogger) {\r\n this.customLogger(level, message, meta);\r\n return;\r\n }\r\n\r\n const logMethod =\r\n level === \"error\"\r\n ? console.error\r\n : level === \"warn\"\r\n ? console.warn\r\n : level === \"info\"\r\n ? console.info\r\n : console.log;\r\n\r\n if (meta !== undefined) {\r\n logMethod(`${prefix} ${message}`, meta);\r\n } else {\r\n logMethod(`${prefix} ${message}`);\r\n }\r\n }\r\n\r\n debug(message: string, meta?: any): void {\r\n this.formatMessage(\"debug\", message, meta);\r\n }\r\n\r\n info(message: string, meta?: any): void {\r\n this.formatMessage(\"info\", message, meta);\r\n }\r\n\r\n warn(message: string, meta?: any): void {\r\n this.formatMessage(\"warn\", message, meta);\r\n }\r\n\r\n error(message: string, meta?: any): void {\r\n this.formatMessage(\"error\", message, meta);\r\n }\r\n\r\n child(namespace: string): CallpadLogger {\r\n const childNamespace = `${this.namespace}:${namespace}`;\r\n const childOptions: LoggerOptions = {\r\n level: this.level,\r\n enableDebug: this.enableDebug,\r\n };\r\n if (this.customLogger) {\r\n childOptions.customLogger = this.customLogger;\r\n }\r\n return new CallpadLoggerImpl(childNamespace, childOptions);\r\n }\r\n\r\n setLevel(level: LogLevel): void {\r\n this.level = level;\r\n }\r\n\r\n isLevelEnabled(level: LogLevel): boolean {\r\n return this.shouldLog(level);\r\n }\r\n}\r\n\r\nlet rootLogger: CallpadLogger | null = null;\r\n\r\nexport function createLogger(\r\n namespace?: string,\r\n options?: LoggerOptions\r\n): CallpadLogger {\r\n if (!namespace) {\r\n if (!rootLogger) {\r\n rootLogger = new CallpadLoggerImpl(\"callpad\", options);\r\n }\r\n return rootLogger;\r\n }\r\n\r\n return new CallpadLoggerImpl(`callpad:${namespace}`, options);\r\n}\r\n\r\nexport function setGlobalLoggerOptions(options: LoggerOptions): void {\r\n rootLogger = new CallpadLoggerImpl(\"callpad\", options);\r\n}\r\n","import {ConnectionState, type Room} from \"livekit-client\";\r\nimport type {ChatEntry, Envelope} from \"./types\";\r\nimport type {ParticipantMetadata} from \"../../state/types\";\r\nimport {useChatStore} from \"./store\";\r\nimport {useRtcStore} from \"../../state/store\";\r\nimport {generateEntryId, getCurrentTimestamp, isValidEnvelope, validateContent,} from \"./utils\";\r\nimport {createLogger} from \"../../utils\";\r\n\r\nconst logger = createLogger(\"chat\");\r\n\r\nexport class ChatService {\r\n private readonly room: Room;\r\n private isSubscribed = false;\r\n\r\n constructor(room: Room) {\r\n this.room = room;\r\n }\r\n\r\n private isRoomReady(): boolean {\r\n if (!this.room) {\r\n logger.warn(\"Room not initialized\");\r\n return false;\r\n }\r\n\r\n if (this.room.state !== ConnectionState.Connected) {\r\n logger.warn(\"Room not connected\", { state: this.room.state });\r\n return false;\r\n }\r\n\r\n if (!this.room.localParticipant) {\r\n logger.warn(\"Local participant not available\");\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n subscribe(): void {\r\n if (this.isSubscribed) {\r\n return;\r\n }\r\n\r\n this.room.registerTextStreamHandler(\r\n \"chat:v1\",\r\n async (reader, participantInfo) => {\r\n try {\r\n const text = await reader.readAll();\r\n this.handleIncomingMessage(text);\r\n } catch (error) {\r\n logger.error(\"Error reading text stream\", error);\r\n }\r\n }\r\n );\r\n\r\n this.isSubscribed = true;\r\n }\r\n\r\n unsubscribe(): void {\r\n this.isSubscribed = false;\r\n }\r\n\r\n getLocalParticipantId(): string {\r\n return this.room.localParticipant.identity;\r\n }\r\n\r\n async send(content: string): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ROOM_NOT_READY\",\r\n message: \"Cannot send message: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const validation = validateContent(content);\r\n if (!validation.valid) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_INVALID_CONTENT\",\r\n message: validation.error || \"Invalid content\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const entryId = generateEntryId();\r\n const chatStore = useChatStore.getState();\r\n const senderInfo = this.getSenderInfo();\r\n\r\n if (senderInfo.info) {\r\n chatStore.patch((state) => {\r\n state.participantCache[senderInfo.id] = senderInfo.info!;\r\n });\r\n }\r\n\r\n const entry: ChatEntry = {\r\n id: entryId,\r\n content,\r\n sender: {\r\n id: senderInfo.id,\r\n },\r\n createdAt: getCurrentTimestamp(),\r\n version: 1,\r\n reactions: {},\r\n status: \"sending\",\r\n };\r\n\r\n chatStore.addEntryOptimistic(entry);\r\n try {\r\n const envelope: Envelope = {\r\n v: 1,\r\n kind: \"entry\",\r\n roomId: this.room.name,\r\n entryId,\r\n ts: entry.createdAt,\r\n sender: senderInfo,\r\n payload: {\r\n content,\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"chat:v1\",\r\n });\r\n\r\n chatStore.markEntrySent(entryId);\r\n } catch (error) {\r\n chatStore.markEntryFailed(entryId);\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_SEND_FAILED\",\r\n message: error instanceof Error ? error.message : \"Failed to send message\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n }\r\n }\r\n\r\n async edit(entryId: string, newContent: string): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ROOM_NOT_READY\",\r\n message: \"Cannot edit message: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const validation = validateContent(newContent);\r\n if (!validation.valid) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_INVALID_CONTENT\",\r\n message: validation.error || \"Invalid content\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const chatStore = useChatStore.getState();\r\n const entry = chatStore.byId[entryId];\r\n if (!entry) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ENTRY_NOT_FOUND\",\r\n message: \"Entry not found\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n if (entry.sender.id !== senderInfo.id) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_UNAUTHORIZED\",\r\n message: \"You can only edit your own messages\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n return;\r\n }\r\n\r\n const newVersion = entry.version + 1;\r\n chatStore.applyEdit(entryId, newContent, newVersion);\r\n try {\r\n const envelope: Envelope = {\r\n v: 1,\r\n kind: \"edit\",\r\n roomId: this.room.name,\r\n entryId,\r\n ts: getCurrentTimestamp(),\r\n sender: senderInfo,\r\n payload: {\r\n newContent,\r\n version: newVersion,\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"chat:v1\",\r\n });\r\n } catch (error) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_EDIT_FAILED\",\r\n message: error instanceof Error ? error.message : \"Failed to edit message\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n }\r\n }\r\n\r\n async remove(entryId: string): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ROOM_NOT_READY\",\r\n message: \"Cannot remove message: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const chatStore = useChatStore.getState();\r\n const entry = chatStore.byId[entryId];\r\n if (!entry) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ENTRY_NOT_FOUND\",\r\n message: \"Entry not found\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n if (entry.sender.id !== senderInfo.id) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_UNAUTHORIZED\",\r\n message: \"You can only remove your own messages\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n return;\r\n }\r\n\r\n chatStore.applyRemove(entryId);\r\n try {\r\n const envelope: Envelope = {\r\n v: 1,\r\n kind: \"remove\",\r\n roomId: this.room.name,\r\n entryId,\r\n ts: getCurrentTimestamp(),\r\n sender: senderInfo,\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"chat:v1\",\r\n });\r\n } catch (error) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_REMOVE_FAILED\",\r\n message: error instanceof Error ? error.message : \"Failed to remove message\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n }\r\n }\r\n\r\n async react(entryId: string, emoji: string): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ROOM_NOT_READY\",\r\n message: \"Cannot add reaction: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const chatStore = useChatStore.getState();\r\n const entry = chatStore.byId[entryId];\r\n\r\n if (!entry) {\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n\r\n if (senderInfo.info) {\r\n chatStore.patch((state) => {\r\n state.participantCache[senderInfo.id] = senderInfo.info!;\r\n });\r\n }\r\n\r\n chatStore.applyReaction(entryId, emoji, senderInfo.id, \"add\");\r\n\r\n try {\r\n const envelope: Envelope = {\r\n v: 1,\r\n kind: \"reaction\",\r\n roomId: this.room.name,\r\n entryId,\r\n ts: getCurrentTimestamp(),\r\n sender: senderInfo,\r\n payload: {\r\n emoji,\r\n op: \"add\",\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"chat:v1\",\r\n });\r\n } catch (error) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_REACTION_FAILED\",\r\n message: error instanceof Error ? error.message : \"Failed to add reaction\",\r\n timestamp: Date.now(),\r\n context: { entryId, emoji },\r\n });\r\n }\r\n }\r\n\r\n async unreact(entryId: string, emoji: string): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ROOM_NOT_READY\",\r\n message: \"Cannot remove reaction: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const chatStore = useChatStore.getState();\r\n const entry = chatStore.byId[entryId];\r\n\r\n if (!entry) {\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n\r\n if (senderInfo.info) {\r\n chatStore.patch((state) => {\r\n state.participantCache[senderInfo.id] = senderInfo.info!;\r\n });\r\n }\r\n\r\n chatStore.applyReaction(entryId, emoji, senderInfo.id, \"remove\");\r\n\r\n try {\r\n const envelope: Envelope = {\r\n v: 1,\r\n kind: \"reaction\",\r\n roomId: this.room.name,\r\n entryId,\r\n ts: getCurrentTimestamp(),\r\n sender: senderInfo,\r\n payload: {\r\n emoji,\r\n op: \"remove\",\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"chat:v1\",\r\n });\r\n } catch (error) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_REACTION_FAILED\",\r\n message:\r\n error instanceof Error ? error.message : \"Failed to remove reaction\",\r\n timestamp: Date.now(),\r\n context: { entryId, emoji },\r\n });\r\n }\r\n }\r\n\r\n private handleIncomingMessage(text: string): void {\r\n try {\r\n const parsed = JSON.parse(text);\r\n\r\n if (!isValidEnvelope(parsed)) {\r\n logger.warn(\"Invalid envelope received\", parsed);\r\n return;\r\n }\r\n\r\n useChatStore.getState().applyIncoming(parsed);\r\n } catch (error) {\r\n logger.error(\"Error parsing incoming message\", error);\r\n }\r\n }\r\n\r\n private getSenderInfo(): { id: string; info?: ParticipantMetadata } {\r\n const localParticipant = this.room.localParticipant;\r\n const sender: { id: string; info?: ParticipantMetadata } = {\r\n id: localParticipant.identity,\r\n };\r\n\r\n if (localParticipant.metadata) {\r\n try {\r\n sender.info = JSON.parse(localParticipant.metadata) as ParticipantMetadata;\r\n } catch {\r\n // Ignore metadata parsing errors\r\n }\r\n }\r\n\r\n return sender;\r\n }\r\n}\r\n","import { useMemo, useCallback } from \"react\";\r\nimport { useChatStore } from \"./store\";\r\nimport { useFeatureService } from \"../DataChannelContext\";\r\nimport { compareEntries } from \"./utils\";\r\nimport type { ChatService } from \"./service\";\r\nimport type { ChatEntry } from \"./types\";\r\nimport type { ParticipantMetadata } from \"../../state/types\";\r\n\r\ntype Nullable<T> = T | null;\r\n\r\nexport interface UseChatReturn {\r\n entries: ChatEntry[];\r\n isReady: boolean;\r\n getParticipantInfo: (id: string) => Nullable<ParticipantMetadata>;\r\n isOwnEntry: (entry: ChatEntry) => boolean;\r\n send: (content: string) => Promise<void>;\r\n edit: (id: string, content: string) => Promise<void>;\r\n remove: (id: string) => Promise<void>;\r\n react: (id: string, emoji: string) => Promise<void>;\r\n unreact: (id: string, emoji: string) => Promise<void>;\r\n}\r\n\r\nexport function useChat(): UseChatReturn {\r\n const service = useFeatureService<ChatService>(\"chat\");\r\n \r\n const byId = useChatStore(state => state.byId);\r\n const order = useChatStore(state => state.order);\r\n const participantCache = useChatStore(state => state.participantCache);\r\n\r\n const entries = useMemo(() => {\r\n return order\r\n .map(id => byId[id])\r\n .filter((entry): entry is ChatEntry => entry !== undefined)\r\n .sort(compareEntries);\r\n }, [byId, order]);\r\n\r\n const getParticipantInfo = useCallback(\r\n (id: string): Nullable<ParticipantMetadata> => {\r\n return participantCache[id] || null;\r\n },\r\n [participantCache]\r\n );\r\n\r\n const send = useCallback(\r\n async (content: string) => service.send(content),\r\n [service]\r\n );\r\n\r\n const edit = useCallback(\r\n async (id: string, content: string) => service.edit(id, content),\r\n [service]\r\n );\r\n\r\n const remove = useCallback(\r\n async (id: string) => service.remove(id),\r\n [service]\r\n );\r\n\r\n const react = useCallback(\r\n async (id: string, emoji: string) => service.react(id, emoji),\r\n [service]\r\n );\r\n\r\n const unreact = useCallback(\r\n async (id: string, emoji: string) => service.unreact(id, emoji),\r\n [service]\r\n );\r\n\r\n const isOwnEntry = useCallback(\r\n (entry: ChatEntry) => entry.sender.id === service.getLocalParticipantId(),\r\n [service]\r\n );\r\n\r\n return {\r\n entries,\r\n isReady: true,\r\n getParticipantInfo,\r\n isOwnEntry,\r\n send,\r\n edit,\r\n remove,\r\n react,\r\n unreact,\r\n };\r\n}\r\n","import type { Room } from \"livekit-client\";\r\nimport { ChatService, useChatStore } from \"./chat\";\r\nimport type { RealtimeFeature } from \"./types\";\r\n\r\nexport const FEATURES: Record<string, RealtimeFeature> = {\r\n chat: {\r\n name: \"chat\",\r\n createService: (room: Room) => new ChatService(room),\r\n cleanupStore: () => useChatStore.getState().clearChat(),\r\n },\r\n};\r\n\r\nexport const DEFAULT_FEATURES = [\"chat\"];\r\n","import { useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\r\nimport type { Room } from \"livekit-client\";\r\nimport { DataChannelContext, type DataChannelContextValue } from \"./DataChannelContext\";\r\nimport { FEATURES, DEFAULT_FEATURES } from \"./registry\";\r\nimport { createLogger } from \"../utils\";\r\n\r\nconst logger = createLogger(\"channels:provider\");\r\n\r\nexport interface DataChannelProviderProps {\r\n room: Room;\r\n features?: string[];\r\n children: ReactNode;\r\n}\r\n\r\nexport function DataChannelProvider({\r\n room,\r\n features = DEFAULT_FEATURES,\r\n children,\r\n}: DataChannelProviderProps) {\r\n const services = useRef<Map<string, any>>(new Map());\r\n const [isReady, setIsReady] = useState(false);\r\n\r\n useEffect(() => {\r\n if (!room) {\r\n logger.warn(\"DataChannelProvider mounted without room\");\r\n return;\r\n }\r\n\r\n logger.debug(\"Initializing features\", { features });\r\n for (const featureName of features) {\r\n const feature = FEATURES[featureName];\r\n \r\n if (!feature) {\r\n logger.warn(`Feature \"${featureName}\" not found in registry`);\r\n continue;\r\n }\r\n\r\n try {\r\n logger.debug(`Initializing feature: ${featureName}`);\r\n const service = feature.createService(room);\r\n\r\n service.subscribe();\r\n services.current.set(featureName, service);\r\n \r\n logger.info(`Feature \"${featureName}\" initialized`);\r\n } catch (error) {\r\n logger.error(`Failed to initialize feature \"${featureName}\"`, error);\r\n }\r\n }\r\n\r\n setIsReady(true);\r\n logger.info(\"All features initialized\");\r\n return () => {\r\n logger.debug(\"Cleaning up features\");\r\n\r\n // Unsubscribe all services\r\n services.current.forEach((service, name) => {\r\n try {\r\n logger.debug(`Unsubscribing feature: ${name}`);\r\n service.unsubscribe();\r\n } catch (error) {\r\n logger.error(`Failed to unsubscribe feature \"${name}\"`, error);\r\n }\r\n });\r\n\r\n // Clean up stores\r\n for (const featureName of features) {\r\n const feature = FEATURES[featureName];\r\n if (feature?.cleanupStore) {\r\n try {\r\n logger.debug(`Cleaning store for feature: ${featureName}`);\r\n feature.cleanupStore();\r\n } catch (error) {\r\n logger.error(`Failed to cleanup store for \"${featureName}\"`, error);\r\n }\r\n }\r\n }\r\n\r\n services.current.clear();\r\n setIsReady(false);\r\n logger.info(\"Features cleanup complete\");\r\n };\r\n }, [room, features]);\r\n\r\n const contextValue = useMemo<DataChannelContextValue>(\r\n () => ({\r\n services: services.current,\r\n isReady,\r\n }),\r\n [isReady]\r\n );\r\n\r\n return (\r\n <DataChannelContext.Provider value={contextValue}>\r\n {children}\r\n </DataChannelContext.Provider>\r\n );\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/channel/DataChannelContext.ts","../../src/channel/chat/store.ts","../../src/state/types.ts","../../src/state/store.ts","../../src/channel/chat/utils.ts","../../src/utils/logger.ts","../../src/channel/chat/service.ts","../../src/channel/chat/useChat.ts","../../src/channel/registry.ts","../../src/channel/DataChannelProvider.tsx"],"names":["createContext","useContext","create","immer","entry","nanoid","ConnectionState","useMemo","useCallback","react","logger","useRef","useState","useEffect"],"mappings":";;;;;;;;;;AAOO,IAAM,kBAAA,GAAqBA,oBAA8C,IAAI,CAAA;AAE7E,SAAS,qBAAA,GAAiD;AAC/D,EAAA,MAAM,OAAA,GAAUC,iBAAW,kBAAkB,CAAA;AAC7C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,+DAA+D,CAAA;AAAA,EACjF;AACA,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,kBAA2B,WAAA,EAAwB;AACjE,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,qBAAA,EAAsB;AAC3C,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,WAAW,CAAA;AACxC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,oBAAoB,WAAW,CAAA,2DAAA;AAAA,KACjC;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;ACHA,IAAM,gBAAA,GAA8B;AAAA,EAClC,MAAM,EAAC;AAAA,EACP,OAAO,EAAC;AAAA,EACR,YAAY,EAAC;AAAA,EACb,kBAAkB,EAAC;AAAA,EACnB,UAAA,EAAY;AACd,CAAA;AAEA,SAAS,oBAAA,CACP,KAAA,EACA,KAAA,EACA,aAAA,EACA,EAAA,EACA;AACA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA;AACtC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA,mBAAI,IAAI,GAAA,EAAI;AAAA,EACnC;AACA,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA,EAAG,GAAA,CAAI,aAAa,CAAA;AAAA,EAC3C,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA,EAAG,MAAA,CAAO,aAAa,CAAA;AAC5C,IAAA,IAAI,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA,EAAG,SAAS,CAAA,EAAG;AACtC,MAAA,OAAO,KAAA,CAAM,UAAU,KAAK,CAAA;AAAA,IAC9B;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,KAAA,EAAkB;AAC7C,EAAA,IAAI,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,GAAS,MAAM,UAAA,EAAY;AACrD,IAAA,MAAM,kBAAkB,MAAA,CAAO,IAAA,CAAK,MAAM,IAAI,CAAA,CAAE,SAAS,KAAA,CAAM,UAAA;AAC/D,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,eAAA,EAAiB,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA;AAC9B,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,OAAO,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,MAC5B;AAAA,IACF;AACA,IAAA,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,eAAe,CAAA;AAAA,EACjD;AACF;AAEO,IAAM,eAAeC,cAAA,EAAgC;AAAA,EAC1DC,WAAA,CAAM,CAAC,GAAA,MAAS;AAAA,IACd,GAAG,gBAAA;AAAA,IAEH,KAAA,EAAO,CAAC,EAAA,KACN,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,EAAA,CAAG,KAAK,CAAA;AAAA,IACV,CAAC,CAAA;AAAA,IAEH,aAAA,EAAe,CAAC,QAAA,KACd,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,IAAI,QAAA,CAAS,SAAS,OAAA,EAAS;AAC7B,QAAA,IAAI,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AAChC,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,QAAA,CAAS,OAAO,IAAA,EAAM;AACxB,UAAA,KAAA,CAAM,iBAAiB,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA,GAAI,SAAS,MAAA,CAAO,IAAA;AAAA,QAC/D;AAEA,QAAA,MAAM,KAAA,GAAmB;AAAA,UACvB,IAAI,QAAA,CAAS,OAAA;AAAA,UACb,OAAA,EAAS,SAAS,OAAA,CAAQ,OAAA;AAAA,UAC1B,MAAA,EAAQ;AAAA,YACN,EAAA,EAAI,SAAS,MAAA,CAAO;AAAA,WACtB;AAAA,UACA,WAAW,QAAA,CAAS,EAAA;AAAA,UACpB,OAAA,EAAS,CAAA;AAAA,UACT,WAAW,EAAC;AAAA,UACZ,MAAA,EAAQ;AAAA,SACV;AAEA,QAAA,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,GAAI,KAAA;AAC/B,QAAA,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AAEjC,QAAA,mBAAA,CAAoB,KAAK,CAAA;AAEzB,QAAA,MAAM,UAAA,GAAa,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA;AACpD,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,OAAO,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA;AAExC,UAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,YAAA,IAAI,EAAA,CAAG,SAAS,MAAA,EAAQ;AACtB,cAAA,MAAMC,MAAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,EAAA,CAAG,OAAO,CAAA;AACnC,cAAA,IAAIA,MAAAA,IAAS,EAAA,CAAG,OAAA,CAAQ,OAAA,GAAUA,OAAM,OAAA,EAAS;AAC/C,gBAAAA,MAAAA,CAAM,OAAA,GAAU,EAAA,CAAG,OAAA,CAAQ,UAAA;AAC3B,gBAAAA,MAAAA,CAAM,OAAA,GAAU,EAAA,CAAG,OAAA,CAAQ,OAAA;AAC3B,gBAAAA,MAAAA,CAAM,WAAW,EAAA,CAAG,EAAA;AAAA,cACtB;AAAA,YACF,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,KAAS,QAAA,EAAU;AAC/B,cAAA,MAAMA,MAAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,EAAA,CAAG,OAAO,CAAA;AACnC,cAAA,IAAIA,MAAAA,IAAS,CAACA,MAAAA,CAAM,SAAA,EAAW;AAC7B,gBAAAA,MAAAA,CAAM,YAAY,EAAA,CAAG,EAAA;AAAA,cACvB;AAAA,YACF,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,KAAS,UAAA,EAAY;AACjC,cAAA,IAAI,EAAA,CAAG,OAAO,IAAA,EAAM;AAClB,gBAAA,KAAA,CAAM,iBAAiB,EAAA,CAAG,MAAA,CAAO,EAAE,CAAA,GAAI,GAAG,MAAA,CAAO,IAAA;AAAA,cACnD;AAEA,cAAA,MAAMA,MAAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,EAAA,CAAG,OAAO,CAAA;AACnC,cAAA,IAAIA,MAAAA,EAAO;AACT,gBAAA,oBAAA;AAAA,kBACEA,MAAAA;AAAA,kBACA,GAAG,OAAA,CAAQ,KAAA;AAAA,kBACX,GAAG,MAAA,CAAO,EAAA;AAAA,kBACV,GAAG,OAAA,CAAQ;AAAA,iBACb;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAA,MAAA,IAAW,QAAA,CAAS,IAAA,KAAS,MAAA,EAAQ;AACnC,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AACzC,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,IAAI,QAAA,CAAS,OAAA,CAAQ,OAAA,GAAU,KAAA,CAAM,OAAA,EAAS;AAC5C,YAAA,KAAA,CAAM,OAAA,GAAU,SAAS,OAAA,CAAQ,UAAA;AACjC,YAAA,KAAA,CAAM,OAAA,GAAU,SAAS,OAAA,CAAQ,OAAA;AACjC,YAAA,KAAA,CAAM,WAAW,QAAA,CAAS,EAAA;AAAA,UAC5B;AAAA,QACF,CAAA,MAAO;AACL,UAAA,IAAI,CAAC,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,EAAG;AACvC,YAAA,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,GAAI,EAAC;AAAA,UACxC;AACA,UAAA,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,EAAG,KAAK,QAAQ,CAAA;AAAA,QACnD;AAAA,MACF,CAAA,MAAA,IAAW,QAAA,CAAS,IAAA,KAAS,QAAA,EAAU;AACrC,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AACzC,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,IAAI,CAAC,MAAM,SAAA,EAAW;AACpB,YAAA,KAAA,CAAM,YAAY,QAAA,CAAS,EAAA;AAAA,UAC7B;AAAA,QACF,CAAA,MAAO;AACL,UAAA,IAAI,CAAC,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,EAAG;AACvC,YAAA,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,GAAI,EAAC;AAAA,UACxC;AACA,UAAA,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,EAAG,KAAK,QAAQ,CAAA;AAAA,QACnD;AAAA,MACF,CAAA,MAAA,IAAW,QAAA,CAAS,IAAA,KAAS,UAAA,EAAY;AACvC,QAAA,IAAI,QAAA,CAAS,OAAO,IAAA,EAAM;AACxB,UAAA,KAAA,CAAM,iBAAiB,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA,GAAI,SAAS,MAAA,CAAO,IAAA;AAAA,QAC/D;AAEA,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AACzC,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,oBAAA;AAAA,YACE,KAAA;AAAA,YACA,SAAS,OAAA,CAAQ,KAAA;AAAA,YACjB,SAAS,MAAA,CAAO,EAAA;AAAA,YAChB,SAAS,OAAA,CAAQ;AAAA,WACnB;AAAA,QACF,CAAA,MAAO;AACL,UAAA,IAAI,CAAC,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,EAAG;AACvC,YAAA,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,GAAI,EAAC;AAAA,UACxC;AACA,UAAA,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,EAAG,KAAK,QAAQ,CAAA;AAAA,QACnD;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,IAEH,kBAAA,EAAoB,CAAC,KAAA,KACnB,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,GAAI,KAAA;AACvB,MAAA,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA;AAEzB,MAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,IAC3B,CAAC,CAAA;AAAA,IAEH,aAAA,EAAe,CAAC,OAAA,KACd,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAChC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,KAAA,CAAM,MAAA,GAAS,MAAA;AAAA,MACjB;AAAA,IACF,CAAC,CAAA;AAAA,IAEH,eAAA,EAAiB,CAAC,OAAA,KAChB,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAChC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,KAAA,CAAM,MAAA,GAAS,QAAA;AAAA,MACjB;AAAA,IACF,CAAC,CAAA;AAAA,IAEH,WAAW,CAAC,OAAA,EAAS,YAAY,OAAA,KAC/B,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAChC,MAAA,IAAI,KAAA,IAAS,OAAA,GAAU,KAAA,CAAM,OAAA,EAAS;AACpC,QAAA,KAAA,CAAM,OAAA,GAAU,UAAA;AAChB,QAAA,KAAA,CAAM,OAAA,GAAU,OAAA;AAChB,QAAA,KAAA,CAAM,QAAA,GAAW,KAAK,GAAA,EAAI;AAAA,MAC5B;AAAA,IACF,CAAC,CAAA;AAAA,IAEH,WAAA,EAAa,CAAC,OAAA,KACZ,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAChC,MAAA,IAAI,KAAA,IAAS,CAAC,KAAA,CAAM,SAAA,EAAW;AAC7B,QAAA,KAAA,CAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAAA,MAC7B;AAAA,IACF,CAAC,CAAA;AAAA,IAEH,aAAA,EAAe,CAAC,OAAA,EAAS,KAAA,EAAO,eAAe,EAAA,KAC7C,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAChC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,oBAAA,CAAqB,KAAA,EAAO,KAAA,EAAO,aAAA,EAAe,EAAE,CAAA;AAAA,MACtD;AAAA,IACF,CAAC,CAAA;AAAA,IAEH,gBAAgB,CAAC,OAAA,EAAS,QAAA,KACxB,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,IAAI,CAAC,KAAA,CAAM,UAAA,CAAW,OAAO,CAAA,EAAG;AAC9B,QAAA,KAAA,CAAM,UAAA,CAAW,OAAO,CAAA,GAAI,EAAC;AAAA,MAC/B;AACA,MAAA,KAAA,CAAM,UAAA,CAAW,OAAO,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAA;AAAA,IACzC,CAAC,CAAA;AAAA,IAEH,iBAAA,EAAmB,CAAC,OAAA,KAClB,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,UAAA,CAAW,OAAO,CAAA;AAC3C,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA;AAAA,MACF;AAEA,MAAA,OAAO,KAAA,CAAM,WAAW,OAAO,CAAA;AAE/B,MAAA,KAAA,MAAW,YAAY,UAAA,EAAY;AACjC,QAAA,IAAI,QAAA,CAAS,SAAS,MAAA,EAAQ;AAC5B,UAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AACzC,UAAA,IAAI,KAAA,IAAS,QAAA,CAAS,OAAA,CAAQ,OAAA,GAAU,MAAM,OAAA,EAAS;AACrD,YAAA,KAAA,CAAM,OAAA,GAAU,SAAS,OAAA,CAAQ,UAAA;AACjC,YAAA,KAAA,CAAM,OAAA,GAAU,SAAS,OAAA,CAAQ,OAAA;AACjC,YAAA,KAAA,CAAM,WAAW,QAAA,CAAS,EAAA;AAAA,UAC5B;AAAA,QACF,CAAA,MAAA,IAAW,QAAA,CAAS,IAAA,KAAS,QAAA,EAAU;AACrC,UAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AACzC,UAAA,IAAI,KAAA,IAAS,CAAC,KAAA,CAAM,SAAA,EAAW;AAC7B,YAAA,KAAA,CAAM,YAAY,QAAA,CAAS,EAAA;AAAA,UAC7B;AAAA,QACF,CAAA,MAAA,IAAW,QAAA,CAAS,IAAA,KAAS,UAAA,EAAY;AACvC,UAAA,IAAI,QAAA,CAAS,OAAO,IAAA,EAAM;AACxB,YAAA,KAAA,CAAM,iBAAiB,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA,GAAI,SAAS,MAAA,CAAO,IAAA;AAAA,UAC/D;AAEA,UAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AACzC,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,oBAAA;AAAA,cACE,KAAA;AAAA,cACA,SAAS,OAAA,CAAQ,KAAA;AAAA,cACjB,SAAS,MAAA,CAAO,EAAA;AAAA,cAChB,SAAS,OAAA,CAAQ;AAAA,aACnB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,IAEH,cAAA,EAAgB,MACd,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,IAC3B,CAAC,CAAA;AAAA,IAEH,SAAA,EAAW,MAAM,GAAA,CAAI,MAAM,gBAAgB;AAAA,GAC7C,CAAE;AACJ;;;AClNO,IAAM,YAAA,GAAyB;AAAA,EACpC,SAAA,EAAW,KAAA;AAAA,EACX,OAAA,EAAS,IAAA;AAAA,EACT,cAAA,EAAgB,IAAA;AAAA,EAChB,iBAAiB,EAAC;AAAA,EAClB,QAAQ;AACV,CAAA;;;ACzEO,IAAM,cAAcF,cAAAA,EAA2B;AAAA,EACpDC,WAAAA,CAAM,CAAC,GAAA,MAAS;AAAA,IACd,GAAG,YAAA;AAAA,IAEH,KAAA,EAAO,CAAC,EAAA,KACN,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,EAAA,CAAG,KAAK,CAAA;AAAA,IACV,CAAC,CAAA;AAAA,IAEH,KAAA,EAAO,MAAM,GAAA,CAAI,MAAM,YAAY,CAAA;AAAA,IAEnC,QAAA,EAAU,CAAC,KAAA,KACT,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,KAAA,CAAM,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACzB,CAAC,CAAA;AAAA,IAEH,WAAA,EAAa,MACX,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,KAAA,CAAM,SAAS,EAAC;AAAA,IAClB,CAAC;AAAA,GACL,CAAE;AACJ,CAAA;AC9BO,SAAS,cAAA,CAAe,GAAc,CAAA,EAAsB;AACjE,EAAA,IAAI,CAAA,CAAE,SAAA,KAAc,CAAA,CAAE,SAAA,EAAW;AAC/B,IAAA,OAAO,CAAA,CAAE,YAAY,CAAA,CAAE,SAAA;AAAA,EACzB;AAEA,EAAA,IAAI,CAAA,CAAE,MAAA,CAAO,EAAA,KAAO,CAAA,CAAE,OAAO,EAAA,EAAI;AAC/B,IAAA,OAAO,EAAE,MAAA,CAAO,EAAA,CAAG,aAAA,CAAc,CAAA,CAAE,OAAO,EAAE,CAAA;AAAA,EAC9C;AAEA,EAAA,OAAO,CAAA,CAAE,EAAA,CAAG,aAAA,CAAc,CAAA,CAAE,EAAE,CAAA;AAChC;AAEO,SAAS,gBAAgB,OAAA,EAAqD;AACnF,EAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAE7B,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,EAC1D;AAEA,EAAA,MAAM,cAAc,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,MAAA;AACtD,EAAA,IAAI,cAAc,KAAA,EAAO;AACvB,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,4BAAA,EAA6B;AAAA,EAC7D;AAEA,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;AAEO,SAAS,gBAAgB,IAAA,EAA6B;AAC3D,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA,CAAK,MAAM,CAAA,EAAG;AAChB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,CAAC,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,UAAU,CAAA,CAAE,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EAAG;AAChE,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IACE,OAAO,IAAA,CAAK,MAAA,KAAW,QAAA,IACvB,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,IACxB,OAAO,IAAA,CAAK,EAAA,KAAO,QAAA,EACnB;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,OAAO,IAAA,CAAK,MAAA,CAAO,OAAO,QAAA,EAAU;AACtD,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA,CAAK,SAAS,OAAA,IAAW,IAAA,CAAK,SAAS,MAAA,IAAU,IAAA,CAAK,SAAS,UAAA,EAAY;AAC7E,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,OAAO,IAAA,CAAK,YAAY,QAAA,EAAU;AACrD,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,eAAA,GAA0B;AACxC,EAAA,OAAOE,aAAA,EAAO;AAChB;AAEO,SAAS,mBAAA,GAA8B;AAC5C,EAAA,OAAO,KAAK,GAAA,EAAI;AAClB;;;ACzCA,IAAM,UAAA,GAAuC;AAAA,EAC3C,KAAA,EAAO,CAAA;AAAA,EACP,IAAA,EAAM,CAAA;AAAA,EACN,IAAA,EAAM,CAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,iBAAA,GAAN,MAAM,kBAAA,CAA2C;AAAA,EAM/C,WAAA,CAAY,SAAA,GAAY,SAAA,EAAW,OAAA,GAAyB,EAAC,EAAG;AAC9D,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,eAAA,EAAgB;AACnD,IAAA,IAAA,CAAK,WAAA,GAAc,OAAA,CAAQ,WAAA,IAAe,IAAA,CAAK,iBAAA,EAAkB;AACjE,IAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,MAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,YAAA;AAAA,IAC9B;AAAA,EACF;AAAA,EAEQ,eAAA,GAA4B;AAClC,IAAA,MAAM,QAAA,GACJ,OAAO,MAAA,KAAW,WAAA,GACb,MAAA,CAAe,qBAAA,GAChB,OAAO,UAAA,KAAe,WAAA,IACrB,UAAA,CAAmB,OAAA,EAAS,GAAA,EAAK,iBAAA;AAExC,IAAA,IAAI,QAAA,IAAY,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA,EAAG;AAC9C,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,MAAM,eACJ,OAAO,UAAA,KAAe,eACrB,UAAA,CAAmB,OAAA,EAAS,KAAK,QAAA,KAAa,YAAA;AAEjD,IAAA,OAAO,eAAe,MAAA,GAAS,MAAA;AAAA,EACjC;AAAA,EAEQ,iBAAA,GAA6B;AACnC,IAAA,MAAM,QAAA,GACJ,OAAO,MAAA,KAAW,WAAA,GACb,MAAA,CAAe,SAAA,GAChB,OAAO,UAAA,KAAe,WAAA,IACrB,UAAA,CAAmB,OAAA,EAAS,GAAA,EAAK,KAAA;AAExC,IAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AAEtB,IAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AAC7C,IAAA,OAAO,aAAA,CAAc,IAAA,CAAK,CAAC,OAAA,KAAoB;AAC7C,MAAA,IAAI,OAAA,KAAY,KAAK,OAAO,IAAA;AAC5B,MAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AACzB,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAClC,QAAA,OAAO,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,MAAM,CAAA;AAAA,MACzC;AACA,MAAA,OAAO,KAAK,SAAA,KAAc,OAAA;AAAA,IAC5B,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,gBAAgB,KAAA,EAAwB;AAC9C,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,SAAS,KAAK,CAAA;AAAA,EAC/C;AAAA,EAEQ,UAAU,KAAA,EAA0B;AAC1C,IAAA,IAAI,KAAA,KAAU,OAAA,IAAW,CAAC,IAAA,CAAK,WAAA,EAAa;AAC1C,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,UAAA,CAAW,KAAK,CAAA,IAAK,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA,EACnD;AAAA,EAEQ,aAAA,CAAc,KAAA,EAAiB,OAAA,EAAiB,IAAA,EAAkB;AACxE,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,EAAG;AAE5B,IAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACzC,IAAA,MAAM,MAAA,GAAS,IAAI,SAAS,CAAA,GAAA,EAAM,KAAK,SAAS,CAAA,GAAA,EAAM,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA,CAAA;AAEzE,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,OAAA,EAAS,IAAI,CAAA;AACtC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GACJ,KAAA,KAAU,OAAA,GACN,OAAA,CAAQ,KAAA,GACR,KAAA,KAAU,MAAA,GACR,OAAA,CAAQ,IAAA,GACR,KAAA,KAAU,MAAA,GACR,OAAA,CAAQ,OACR,OAAA,CAAQ,GAAA;AAElB,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,SAAA,CAAU,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,OAAO,IAAI,IAAI,CAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,KAAA,CAAM,SAAiB,IAAA,EAAkB;AACvC,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAAA,EAC3C;AAAA,EAEA,IAAA,CAAK,SAAiB,IAAA,EAAkB;AACtC,IAAA,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,OAAA,EAAS,IAAI,CAAA;AAAA,EAC1C;AAAA,EAEA,IAAA,CAAK,SAAiB,IAAA,EAAkB;AACtC,IAAA,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,OAAA,EAAS,IAAI,CAAA;AAAA,EAC1C;AAAA,EAEA,KAAA,CAAM,SAAiB,IAAA,EAAkB;AACvC,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,SAAA,EAAkC;AACtC,IAAA,MAAM,cAAA,GAAiB,CAAA,EAAG,IAAA,CAAK,SAAS,IAAI,SAAS,CAAA,CAAA;AACrD,IAAA,MAAM,YAAA,GAA8B;AAAA,MAClC,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,aAAa,IAAA,CAAK;AAAA,KACpB;AACA,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,YAAA,CAAa,eAAe,IAAA,CAAK,YAAA;AAAA,IACnC;AACA,IAAA,OAAO,IAAI,kBAAA,CAAkB,cAAA,EAAgB,YAAY,CAAA;AAAA,EAC3D;AAAA,EAEA,SAAS,KAAA,EAAuB;AAC9B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,eAAe,KAAA,EAA0B;AACvC,IAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EAC7B;AACF,CAAA;AAEA,IAAI,UAAA,GAAmC,IAAA;AAEhC,SAAS,YAAA,CACd,WACA,OAAA,EACe;AACf,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,UAAA,GAAa,IAAI,iBAAA,CAAkB,SAAA,EAAW,OAAO,CAAA;AAAA,IACvD;AACA,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAI,iBAAA,CAAkB,CAAA,QAAA,EAAW,SAAS,IAAI,OAAO,CAAA;AAC9D;;;AC1KA,IAAM,MAAA,GAAS,aAAa,MAAM,CAAA;AAE3B,IAAM,cAAN,MAAkB;AAAA,EAIvB,YAAY,IAAA,EAAY;AAFxB,IAAA,IAAA,CAAQ,YAAA,GAAe,KAAA;AAGrB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA,EAEQ,WAAA,GAAuB;AAC7B,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,MAAA,MAAA,CAAO,KAAK,sBAAsB,CAAA;AAClC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,KAAA,KAAUC,6BAAA,CAAgB,SAAA,EAAW;AACjD,MAAA,MAAA,CAAO,KAAK,oBAAA,EAAsB,EAAE,OAAO,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAC5D,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,gBAAA,EAAkB;AAC/B,MAAA,MAAA,CAAO,KAAK,iCAAiC,CAAA;AAC7C,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAA,GAAkB;AAChB,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,yBAAA;AAAA,MACR,SAAA;AAAA,MACA,OAAO,QAAQ,eAAA,KAAoB;AACjC,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,OAAA,EAAQ;AAClC,UAAA,IAAA,CAAK,sBAAsB,IAAI,CAAA;AAAA,QACjC,SAAS,KAAA,EAAO;AACd,UAAA,MAAA,CAAO,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAAA,QACjD;AAAA,MACF;AAAA,KACF;AACA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,EACtB;AAAA,EAEA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,EACtB;AAAA,EAEA,qBAAA,GAAgC;AAC9B,IAAA,OAAO,IAAA,CAAK,KAAK,gBAAA,CAAiB,QAAA;AAAA,EACpC;AAAA,EAEA,MAAM,KAAK,OAAA,EAAgC;AACzC,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,qBAAA;AAAA,QACN,OAAA,EAAS,yCAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,gBAAgB,OAAO,CAAA;AAC1C,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,sBAAA;AAAA,QACN,OAAA,EAAS,WAAW,KAAA,IAAS,iBAAA;AAAA,QAC7B,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,IAAA,MAAM,SAAA,GAAY,aAAa,QAAA,EAAS;AACxC,IAAA,MAAM,UAAA,GAAa,KAAK,aAAA,EAAc;AACtC,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,SAAA,CAAU,KAAA,CAAM,CAAC,KAAA,KAAU;AACzB,QAAA,KAAA,CAAM,gBAAA,CAAiB,UAAA,CAAW,EAAE,CAAA,GAAI,UAAA,CAAW,IAAA;AAAA,MACrD,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,KAAA,GAAmB;AAAA,MACvB,EAAA,EAAI,OAAA;AAAA,MACJ,OAAA;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAI,UAAA,CAAW;AAAA,OACjB;AAAA,MACA,WAAW,mBAAA,EAAoB;AAAA,MAC/B,OAAA,EAAS,CAAA;AAAA,MACT,WAAW,EAAC;AAAA,MACZ,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,SAAA,CAAU,mBAAmB,KAAK,CAAA;AAClC,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAqB;AAAA,QACzB,CAAA,EAAG,CAAA;AAAA,QACH,IAAA,EAAM,OAAA;AAAA,QACN,MAAA,EAAQ,KAAK,IAAA,CAAK,IAAA;AAAA,QAClB,OAAA;AAAA,QACA,IAAI,KAAA,CAAM,SAAA;AAAA,QACV,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP;AAAA;AACF,OACF;AAEA,MAAA,MAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,SAAS,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG;AAAA,QAClE,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,SAAA,CAAU,cAAc,OAAO,CAAA;AAAA,IACjC,SAAS,KAAA,EAAO;AACd,MAAA,SAAA,CAAU,gBAAgB,OAAO,CAAA;AACjC,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,kBAAA;AAAA,QACN,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,wBAAA;AAAA,QAClD,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,OAAA,EAAS,EAAE,OAAA;AAAQ,OACpB,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,CAAK,OAAA,EAAiB,UAAA,EAAmC;AAC7D,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,qBAAA;AAAA,QACN,OAAA,EAAS,yCAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,gBAAgB,UAAU,CAAA;AAC7C,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,sBAAA;AAAA,QACN,OAAA,EAAS,WAAW,KAAA,IAAS,iBAAA;AAAA,QAC7B,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,aAAa,QAAA,EAAS;AACxC,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AACpC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,sBAAA;AAAA,QACN,OAAA,EAAS,iBAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,OAAA,EAAS,EAAE,OAAA;AAAQ,OACpB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,KAAK,aAAA,EAAc;AACtC,IAAA,IAAI,KAAA,CAAM,MAAA,CAAO,EAAA,KAAO,UAAA,CAAW,EAAA,EAAI;AACrC,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,mBAAA;AAAA,QACN,OAAA,EAAS,qCAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,OAAA,EAAS,EAAE,OAAA;AAAQ,OACpB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,MAAM,OAAA,GAAU,CAAA;AACnC,IAAA,SAAA,CAAU,SAAA,CAAU,OAAA,EAAS,UAAA,EAAY,UAAU,CAAA;AACnD,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAqB;AAAA,QACzB,CAAA,EAAG,CAAA;AAAA,QACH,IAAA,EAAM,MAAA;AAAA,QACN,MAAA,EAAQ,KAAK,IAAA,CAAK,IAAA;AAAA,QAClB,OAAA;AAAA,QACA,IAAI,mBAAA,EAAoB;AAAA,QACxB,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,UAAA;AAAA,UACA,OAAA,EAAS;AAAA;AACX,OACF;AAEA,MAAA,MAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,SAAS,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG;AAAA,QAClE,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,kBAAA;AAAA,QACN,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,wBAAA;AAAA,QAClD,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,OAAA,EAAS,EAAE,OAAA;AAAQ,OACpB,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,OAAA,EAAgC;AAC3C,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,qBAAA;AAAA,QACN,OAAA,EAAS,2CAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,aAAa,QAAA,EAAS;AACxC,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AACpC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,sBAAA;AAAA,QACN,OAAA,EAAS,iBAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,OAAA,EAAS,EAAE,OAAA;AAAQ,OACpB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,KAAK,aAAA,EAAc;AACtC,IAAA,IAAI,KAAA,CAAM,MAAA,CAAO,EAAA,KAAO,UAAA,CAAW,EAAA,EAAI;AACrC,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,mBAAA;AAAA,QACN,OAAA,EAAS,uCAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,OAAA,EAAS,EAAE,OAAA;AAAQ,OACpB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,SAAA,CAAU,YAAY,OAAO,CAAA;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAqB;AAAA,QACzB,CAAA,EAAG,CAAA;AAAA,QACH,IAAA,EAAM,QAAA;AAAA,QACN,MAAA,EAAQ,KAAK,IAAA,CAAK,IAAA;AAAA,QAClB,OAAA;AAAA,QACA,IAAI,mBAAA,EAAoB;AAAA,QACxB,MAAA,EAAQ;AAAA,OACV;AAEA,MAAA,MAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,SAAS,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG;AAAA,QAClE,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,oBAAA;AAAA,QACN,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,0BAAA;AAAA,QAClD,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,OAAA,EAAS,EAAE,OAAA;AAAQ,OACpB,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,CAAM,OAAA,EAAiB,KAAA,EAA8B;AACzD,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,qBAAA;AAAA,QACN,OAAA,EAAS,yCAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,aAAa,QAAA,EAAS;AACxC,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AACpC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,KAAK,aAAA,EAAc;AACtC,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,SAAA,CAAU,KAAA,CAAM,CAAC,KAAA,KAAU;AACzB,QAAA,KAAA,CAAM,gBAAA,CAAiB,UAAA,CAAW,EAAE,CAAA,GAAI,UAAA,CAAW,IAAA;AAAA,MACrD,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,SAAA,CAAU,aAAA,CAAc,OAAA,EAAS,KAAA,EAAO,UAAA,CAAW,IAAI,KAAK,CAAA;AAC5D,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAqB;AAAA,QACzB,CAAA,EAAG,CAAA;AAAA,QACH,IAAA,EAAM,UAAA;AAAA,QACN,MAAA,EAAQ,KAAK,IAAA,CAAK,IAAA;AAAA,QAClB,OAAA;AAAA,QACA,IAAI,mBAAA,EAAoB;AAAA,QACxB,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,KAAA;AAAA,UACA,EAAA,EAAI;AAAA;AACN,OACF;AAEA,MAAA,MAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,SAAS,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG;AAAA,QAClE,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,sBAAA;AAAA,QACN,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,wBAAA;AAAA,QAClD,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,OAAA,EAAS,EAAE,OAAA,EAAS,KAAA;AAAM,OAC3B,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,CAAQ,OAAA,EAAiB,KAAA,EAA8B;AAC3D,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,qBAAA;AAAA,QACN,OAAA,EAAS,4CAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,aAAa,QAAA,EAAS;AACxC,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AACpC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,KAAK,aAAA,EAAc;AACtC,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,SAAA,CAAU,KAAA,CAAM,CAAC,KAAA,KAAU;AACzB,QAAA,KAAA,CAAM,gBAAA,CAAiB,UAAA,CAAW,EAAE,CAAA,GAAI,UAAA,CAAW,IAAA;AAAA,MACrD,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,SAAA,CAAU,aAAA,CAAc,OAAA,EAAS,KAAA,EAAO,UAAA,CAAW,IAAI,QAAQ,CAAA;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAqB;AAAA,QACzB,CAAA,EAAG,CAAA;AAAA,QACH,IAAA,EAAM,UAAA;AAAA,QACN,MAAA,EAAQ,KAAK,IAAA,CAAK,IAAA;AAAA,QAClB,OAAA;AAAA,QACA,IAAI,mBAAA,EAAoB;AAAA,QACxB,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,KAAA;AAAA,UACA,EAAA,EAAI;AAAA;AACN,OACF;AAEA,MAAA,MAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,SAAS,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG;AAAA,QAClE,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,sBAAA;AAAA,QACN,OAAA,EACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,2BAAA;AAAA,QAC3C,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,OAAA,EAAS,EAAE,OAAA,EAAS,KAAA;AAAM,OAC3B,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,sBAAsB,IAAA,EAAoB;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,MAAA,IAAI,CAAC,eAAA,CAAgB,MAAM,CAAA,EAAG;AAC5B,QAAA,MAAA,CAAO,IAAA,CAAK,6BAA6B,MAAM,CAAA;AAC/C,QAAA;AAAA,MACF;AAEA,MAAA,YAAA,CAAa,QAAA,EAAS,CAAE,aAAA,CAAc,MAAM,CAAA;AAAA,IAC9C,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,KAAA,CAAM,kCAAkC,KAAK,CAAA;AAAA,IACtD;AAAA,EACF;AAAA,EAEQ,aAAA,GAA4D;AAClE,IAAA,MAAM,gBAAA,GAAmB,KAAK,IAAA,CAAK,gBAAA;AACnC,IAAA,MAAM,MAAA,GAAqD;AAAA,MACzD,IAAI,gBAAA,CAAiB;AAAA,KACvB;AAEA,IAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,MAAA,IAAI;AACA,QAAA,MAAA,CAAO,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,QAAQ,CAAA;AAAA,MACtD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;ACtXO,SAAS,OAAA,GAAyB;AACvC,EAAA,MAAM,OAAA,GAAU,kBAA+B,MAAM,CAAA;AAErD,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,CAAA,KAAA,KAAS,KAAA,CAAM,IAAI,CAAA;AAC7C,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,CAAA,KAAA,KAAS,KAAA,CAAM,KAAK,CAAA;AAC/C,EAAA,MAAM,gBAAA,GAAmB,YAAA,CAAa,CAAA,KAAA,KAAS,KAAA,CAAM,gBAAgB,CAAA;AAErE,EAAA,MAAM,OAAA,GAAUC,cAAQ,MAAM;AAC5B,IAAA,OAAO,KAAA,CACJ,GAAA,CAAI,CAAA,EAAA,KAAM,IAAA,CAAK,EAAE,CAAC,CAAA,CAClB,MAAA,CAAO,CAAC,KAAA,KAA8B,KAAA,KAAU,MAAS,CAAA,CACzD,KAAK,cAAc,CAAA;AAAA,EACxB,CAAA,EAAG,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AAEhB,EAAA,MAAM,kBAAA,GAAqBC,iBAAA;AAAA,IACzB,CAAC,EAAA,KAA8C;AAC7C,MAAA,OAAO,gBAAA,CAAiB,EAAE,CAAA,IAAK,IAAA;AAAA,IACjC,CAAA;AAAA,IACA,CAAC,gBAAgB;AAAA,GACnB;AAEA,EAAA,MAAM,IAAA,GAAOA,iBAAA;AAAA,IACX,OAAO,OAAA,KAAoB,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA;AAAA,IAC/C,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,IAAA,GAAOA,iBAAA;AAAA,IACX,OAAO,EAAA,EAAY,OAAA,KAAoB,OAAA,CAAQ,IAAA,CAAK,IAAI,OAAO,CAAA;AAAA,IAC/D,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,MAAA,GAASA,iBAAA;AAAA,IACb,OAAO,EAAA,KAAe,OAAA,CAAQ,MAAA,CAAO,EAAE,CAAA;AAAA,IACvC,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAMC,OAAA,GAAQD,iBAAA;AAAA,IACZ,OAAO,EAAA,EAAY,KAAA,KAAkB,OAAA,CAAQ,KAAA,CAAM,IAAI,KAAK,CAAA;AAAA,IAC5D,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,OAAA,GAAUA,iBAAA;AAAA,IACd,OAAO,EAAA,EAAY,KAAA,KAAkB,OAAA,CAAQ,OAAA,CAAQ,IAAI,KAAK,CAAA;AAAA,IAC9D,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,UAAA,GAAaA,iBAAA;AAAA,IACjB,CAAC,KAAA,KAAqB,KAAA,CAAM,MAAA,CAAO,EAAA,KAAO,QAAQ,qBAAA,EAAsB;AAAA,IACxE,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,OAAA,EAAS,IAAA;AAAA,IACT,kBAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA;AAAA,WACAC,OAAA;AAAA,IACA;AAAA,GACF;AACF;;;AChFO,IAAM,QAAA,GAA4C;AAAA,EACvD,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,aAAA,EAAe,CAAC,IAAA,KAAe,IAAI,YAAY,IAAI,CAAA;AAAA,IACnD,YAAA,EAAc,MAAM,YAAA,CAAa,QAAA,GAAW,SAAA;AAAU;AAE1D,CAAA;AAEO,IAAM,gBAAA,GAAmB,CAAC,MAAM,CAAA;ACNvC,IAAMC,OAAAA,GAAS,aAAa,mBAAmB,CAAA;AAQxC,SAAS,mBAAA,CAAoB;AAAA,EAClC,IAAA;AAAA,EACA,QAAA,GAAW,gBAAA;AAAA,EACX;AACF,CAAA,EAA6B;AAC3B,EAAA,MAAM,QAAA,GAAWC,YAAA,iBAAyB,IAAI,GAAA,EAAK,CAAA;AACnD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,eAAS,KAAK,CAAA;AAE5C,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAAH,OAAAA,CAAO,KAAK,0CAA0C,CAAA;AACtD,MAAA;AAAA,IACF;AAEA,IAAAA,OAAAA,CAAO,KAAA,CAAM,uBAAA,EAAyB,EAAE,UAAU,CAAA;AAClD,IAAA,KAAA,MAAW,eAAe,QAAA,EAAU;AAClC,MAAA,MAAM,OAAA,GAAU,SAAS,WAAW,CAAA;AAEpC,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAAA,OAAAA,CAAO,IAAA,CAAK,CAAA,SAAA,EAAY,WAAW,CAAA,uBAAA,CAAyB,CAAA;AAC5D,QAAA;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAAA,OAAAA,CAAO,KAAA,CAAM,CAAA,sBAAA,EAAyB,WAAW,CAAA,CAAE,CAAA;AACnD,QAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,aAAA,CAAc,IAAI,CAAA;AAE1C,QAAA,OAAA,CAAQ,SAAA,EAAU;AAClB,QAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,WAAA,EAAa,OAAO,CAAA;AAEzC,QAAAA,OAAAA,CAAO,IAAA,CAAK,CAAA,SAAA,EAAY,WAAW,CAAA,aAAA,CAAe,CAAA;AAAA,MACpD,SAAS,KAAA,EAAO;AACd,QAAAA,OAAAA,CAAO,KAAA,CAAM,CAAA,8BAAA,EAAiC,WAAW,KAAK,KAAK,CAAA;AAAA,MACrE;AAAA,IACF;AAEA,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAAA,OAAAA,CAAO,KAAK,0BAA0B,CAAA;AACtC,IAAA,OAAO,MAAM;AACX,MAAAA,OAAAA,CAAO,MAAM,sBAAsB,CAAA;AAGnC,MAAA,QAAA,CAAS,OAAA,CAAQ,OAAA,CAAQ,CAAC,OAAA,EAAS,IAAA,KAAS;AAC1C,QAAA,IAAI;AACF,UAAAA,OAAAA,CAAO,KAAA,CAAM,CAAA,uBAAA,EAA0B,IAAI,CAAA,CAAE,CAAA;AAC7C,UAAA,OAAA,CAAQ,WAAA,EAAY;AAAA,QACtB,SAAS,KAAA,EAAO;AACd,UAAAA,OAAAA,CAAO,KAAA,CAAM,CAAA,+BAAA,EAAkC,IAAI,KAAK,KAAK,CAAA;AAAA,QAC/D;AAAA,MACF,CAAC,CAAA;AAGD,MAAA,KAAA,MAAW,eAAe,QAAA,EAAU;AAClC,QAAA,MAAM,OAAA,GAAU,SAAS,WAAW,CAAA;AACpC,QAAA,IAAI,SAAS,YAAA,EAAc;AACzB,UAAA,IAAI;AACF,YAAAA,OAAAA,CAAO,KAAA,CAAM,CAAA,4BAAA,EAA+B,WAAW,CAAA,CAAE,CAAA;AACzD,YAAA,OAAA,CAAQ,YAAA,EAAa;AAAA,UACvB,SAAS,KAAA,EAAO;AACd,YAAAA,OAAAA,CAAO,KAAA,CAAM,CAAA,6BAAA,EAAgC,WAAW,KAAK,KAAK,CAAA;AAAA,UACpE;AAAA,QACF;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,QAAQ,KAAA,EAAM;AACvB,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAAA,OAAAA,CAAO,KAAK,2BAA2B,CAAA;AAAA,IACzC,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,QAAQ,CAAC,CAAA;AAEnB,EAAA,MAAM,YAAA,GAAeH,aAAAA;AAAA,IACnB,OAAO;AAAA,MACL,UAAU,QAAA,CAAS,OAAA;AAAA,MACnB;AAAA,KACF,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,sCACG,kBAAA,CAAmB,QAAA,EAAnB,EAA4B,KAAA,EAAO,cACjC,QAAA,EACH,CAAA;AAEJ","file":"index.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\r\n\r\nexport interface DataChannelContextValue {\r\n services: Map<string, any>;\r\n isReady: boolean;\r\n}\r\n\r\nexport const DataChannelContext = createContext<DataChannelContextValue | null>(null);\r\n\r\nexport function useDataChannelContext(): DataChannelContextValue {\r\n const context = useContext(DataChannelContext);\r\n if (!context) {\r\n throw new Error(\"useDataChannelContext must be used within DataChannelProvider\");\r\n }\r\n return context;\r\n}\r\n\r\nexport function useFeatureService<T = any>(featureName: string): T {\r\n const { services } = useDataChannelContext();\r\n const service = services.get(featureName) as T;\r\n if (!service) {\r\n throw new Error(\r\n `Feature service \"${featureName}\" not found. Make sure it's enabled in DataChannelProvider.`\r\n );\r\n }\r\n \r\n return service;\r\n}\r\n","import { create } from \"zustand\";\r\nimport { immer } from \"zustand/middleware/immer\";\r\nimport type { ChatEntry, ChatState, Envelope } from \"./types\";\r\n\r\ninterface ChatActions {\r\n patch: (fn: (draft: ChatState) => void) => void;\r\n applyIncoming: (envelope: Envelope) => void;\r\n addEntryOptimistic: (entry: ChatEntry) => void;\r\n markEntrySent: (entryId: string) => void;\r\n markEntryFailed: (entryId: string) => void;\r\n applyEdit: (entryId: string, newContent: string, version: number) => void;\r\n applyRemove: (entryId: string) => void;\r\n applyReaction: (\r\n entryId: string,\r\n emoji: string,\r\n participantId: string,\r\n op: \"add\" | \"remove\"\r\n ) => void;\r\n queuePendingOp: (entryId: string, envelope: Envelope) => void;\r\n processPendingOps: (entryId: string) => void;\r\n trimOldEntries: () => void;\r\n clearChat: () => void;\r\n}\r\n\r\nconst defaultChatState: ChatState = {\r\n byId: {},\r\n order: [],\r\n pendingOps: {},\r\n participantCache: {},\r\n maxEntries: 1000,\r\n};\r\n\r\nfunction applyReactionToEntry(\r\n entry: ChatEntry,\r\n emoji: string,\r\n participantId: string,\r\n op: \"add\" | \"remove\"\r\n) {\r\n const emojiSet = entry.reactions[emoji];\r\n if (!emojiSet) {\r\n entry.reactions[emoji] = new Set();\r\n }\r\n if (op === \"add\") {\r\n entry.reactions[emoji]?.add(participantId);\r\n } else {\r\n entry.reactions[emoji]?.delete(participantId);\r\n if (entry.reactions[emoji]?.size === 0) {\r\n delete entry.reactions[emoji];\r\n }\r\n }\r\n}\r\n\r\nfunction trimEntriesIfNeeded(state: ChatState) {\r\n if (Object.keys(state.byId).length > state.maxEntries) {\r\n const entriesToRemove = Object.keys(state.byId).length - state.maxEntries;\r\n for (let i = 0; i < entriesToRemove; i++) {\r\n const oldestId = state.order[i];\r\n if (oldestId) {\r\n delete state.byId[oldestId];\r\n }\r\n }\r\n state.order = state.order.slice(entriesToRemove);\r\n }\r\n}\r\n\r\nexport const useChatStore = create<ChatState & ChatActions>()(\r\n immer((set) => ({\r\n ...defaultChatState,\r\n\r\n patch: (fn) =>\r\n set((state) => {\r\n fn(state);\r\n }),\r\n\r\n applyIncoming: (envelope) =>\r\n set((state) => {\r\n if (envelope.kind === \"entry\") {\r\n if (state.byId[envelope.entryId]) {\r\n return;\r\n }\r\n\r\n if (envelope.sender.info) {\r\n state.participantCache[envelope.sender.id] = envelope.sender.info;\r\n }\r\n\r\n const entry: ChatEntry = {\r\n id: envelope.entryId,\r\n content: envelope.payload.content,\r\n sender: {\r\n id: envelope.sender.id,\r\n },\r\n createdAt: envelope.ts,\r\n version: 1,\r\n reactions: {},\r\n status: \"sent\",\r\n };\r\n\r\n state.byId[envelope.entryId] = entry;\r\n state.order.push(envelope.entryId);\r\n\r\n trimEntriesIfNeeded(state);\r\n\r\n const pendingOps = state.pendingOps[envelope.entryId];\r\n if (pendingOps) {\r\n delete state.pendingOps[envelope.entryId];\r\n\r\n for (const op of pendingOps) {\r\n if (op.kind === \"edit\") {\r\n const entry = state.byId[op.entryId];\r\n if (entry && op.payload.version > entry.version) {\r\n entry.content = op.payload.newContent;\r\n entry.version = op.payload.version;\r\n entry.editedAt = op.ts;\r\n }\r\n } else if (op.kind === \"remove\") {\r\n const entry = state.byId[op.entryId];\r\n if (entry && !entry.removedAt) {\r\n entry.removedAt = op.ts;\r\n }\r\n } else if (op.kind === \"reaction\") {\r\n if (op.sender.info) {\r\n state.participantCache[op.sender.id] = op.sender.info;\r\n }\r\n\r\n const entry = state.byId[op.entryId];\r\n if (entry) {\r\n applyReactionToEntry(\r\n entry,\r\n op.payload.emoji,\r\n op.sender.id,\r\n op.payload.op\r\n );\r\n }\r\n }\r\n }\r\n }\r\n } else if (envelope.kind === \"edit\") {\r\n const entry = state.byId[envelope.entryId];\r\n if (entry) {\r\n if (envelope.payload.version > entry.version) {\r\n entry.content = envelope.payload.newContent;\r\n entry.version = envelope.payload.version;\r\n entry.editedAt = envelope.ts;\r\n }\r\n } else {\r\n if (!state.pendingOps[envelope.entryId]) {\r\n state.pendingOps[envelope.entryId] = [];\r\n }\r\n state.pendingOps[envelope.entryId]?.push(envelope);\r\n }\r\n } else if (envelope.kind === \"remove\") {\r\n const entry = state.byId[envelope.entryId];\r\n if (entry) {\r\n if (!entry.removedAt) {\r\n entry.removedAt = envelope.ts;\r\n }\r\n } else {\r\n if (!state.pendingOps[envelope.entryId]) {\r\n state.pendingOps[envelope.entryId] = [];\r\n }\r\n state.pendingOps[envelope.entryId]?.push(envelope);\r\n }\r\n } else if (envelope.kind === \"reaction\") {\r\n if (envelope.sender.info) {\r\n state.participantCache[envelope.sender.id] = envelope.sender.info;\r\n }\r\n\r\n const entry = state.byId[envelope.entryId];\r\n if (entry) {\r\n applyReactionToEntry(\r\n entry,\r\n envelope.payload.emoji,\r\n envelope.sender.id,\r\n envelope.payload.op\r\n );\r\n } else {\r\n if (!state.pendingOps[envelope.entryId]) {\r\n state.pendingOps[envelope.entryId] = [];\r\n }\r\n state.pendingOps[envelope.entryId]?.push(envelope);\r\n }\r\n }\r\n }),\r\n\r\n addEntryOptimistic: (entry) =>\r\n set((state) => {\r\n state.byId[entry.id] = entry;\r\n state.order.push(entry.id);\r\n\r\n trimEntriesIfNeeded(state);\r\n }),\r\n\r\n markEntrySent: (entryId) =>\r\n set((state) => {\r\n const entry = state.byId[entryId];\r\n if (entry) {\r\n entry.status = \"sent\";\r\n }\r\n }),\r\n\r\n markEntryFailed: (entryId) =>\r\n set((state) => {\r\n const entry = state.byId[entryId];\r\n if (entry) {\r\n entry.status = \"failed\";\r\n }\r\n }),\r\n\r\n applyEdit: (entryId, newContent, version) =>\r\n set((state) => {\r\n const entry = state.byId[entryId];\r\n if (entry && version > entry.version) {\r\n entry.content = newContent;\r\n entry.version = version;\r\n entry.editedAt = Date.now();\r\n }\r\n }),\r\n\r\n applyRemove: (entryId) =>\r\n set((state) => {\r\n const entry = state.byId[entryId];\r\n if (entry && !entry.removedAt) {\r\n entry.removedAt = Date.now();\r\n }\r\n }),\r\n\r\n applyReaction: (entryId, emoji, participantId, op) =>\r\n set((state) => {\r\n const entry = state.byId[entryId];\r\n if (entry) {\r\n applyReactionToEntry(entry, emoji, participantId, op);\r\n }\r\n }),\r\n\r\n queuePendingOp: (entryId, envelope) =>\r\n set((state) => {\r\n if (!state.pendingOps[entryId]) {\r\n state.pendingOps[entryId] = [];\r\n }\r\n state.pendingOps[entryId].push(envelope);\r\n }),\r\n\r\n processPendingOps: (entryId) =>\r\n set((state) => {\r\n const pendingOps = state.pendingOps[entryId];\r\n if (!pendingOps) {\r\n return;\r\n }\r\n\r\n delete state.pendingOps[entryId];\r\n\r\n for (const envelope of pendingOps) {\r\n if (envelope.kind === \"edit\") {\r\n const entry = state.byId[envelope.entryId];\r\n if (entry && envelope.payload.version > entry.version) {\r\n entry.content = envelope.payload.newContent;\r\n entry.version = envelope.payload.version;\r\n entry.editedAt = envelope.ts;\r\n }\r\n } else if (envelope.kind === \"remove\") {\r\n const entry = state.byId[envelope.entryId];\r\n if (entry && !entry.removedAt) {\r\n entry.removedAt = envelope.ts;\r\n }\r\n } else if (envelope.kind === \"reaction\") {\r\n if (envelope.sender.info) {\r\n state.participantCache[envelope.sender.id] = envelope.sender.info;\r\n }\r\n\r\n const entry = state.byId[envelope.entryId];\r\n if (entry) {\r\n applyReactionToEntry(\r\n entry,\r\n envelope.payload.emoji,\r\n envelope.sender.id,\r\n envelope.payload.op\r\n );\r\n }\r\n }\r\n }\r\n }),\r\n\r\n trimOldEntries: () =>\r\n set((state) => {\r\n trimEntriesIfNeeded(state);\r\n }),\r\n\r\n clearChat: () => set(() => defaultChatState),\r\n }))\r\n);\r\n\r\nexport const chatStore = useChatStore;\r\n","type Nullable<T> = T | null;\r\n\r\nexport type CallParticipantRole = \"HOST\" | \"PARTICIPANT\" | \"GUEST\";\r\n\r\nexport interface ParticipantPermissions {\r\n canMute: boolean;\r\n canKick: boolean;\r\n canTransfer: boolean;\r\n canEnd: boolean;\r\n canRecord: boolean;\r\n canShareScreen: boolean;\r\n}\r\n\r\nexport interface ParticipantMetadata {\r\n userId: string | number;\r\n firstName: Nullable<string>;\r\n lastName: Nullable<string>;\r\n username: Nullable<string>;\r\n email: Nullable<string>;\r\n profilePhoto: Nullable<string>;\r\n role: CallParticipantRole;\r\n permissions: ParticipantPermissions;\r\n}\r\n\r\nexport interface LiveKitJoinInfo {\r\n token: string;\r\n roomName: string;\r\n url: string;\r\n}\r\n\r\nexport interface Session {\r\n id: string;\r\n status: \"pending\" | \"ready\" | \"active\" | \"ended\";\r\n mode: \"AUDIO\" | \"VIDEO\";\r\n role: \"HOST\" | \"PARTICIPANT\" | \"GUEST\";\r\n livekitInfo?: LiveKitJoinInfo;\r\n startedAt?: string;\r\n ringTimeoutMs?: number;\r\n}\r\n\r\nexport interface IncomingInvite {\r\n callId: string;\r\n inviteId: string;\r\n caller: ParticipantMetadata;\r\n mode: \"AUDIO\" | \"VIDEO\";\r\n expiresAt: string;\r\n expiresInMs: number;\r\n ringTimeoutMs: number;\r\n}\r\n\r\nexport interface OutgoingInvite {\r\n userId: string;\r\n status: \"sent\" | \"accepted\" | \"declined\" | \"missed\";\r\n participant: Omit<ParticipantMetadata, \"permissions\">;\r\n}\r\n\r\nexport interface RtcError {\r\n code: string;\r\n message: string;\r\n timestamp: number;\r\n context?: any;\r\n}\r\n\r\nexport interface RtcState {\r\n // Did we initiate the current call?\r\n initiated: boolean;\r\n\r\n // Active session (null when no active call)\r\n session: Session | null;\r\n\r\n // Incoming invitation (null when no pending invite)\r\n incomingInvite: IncomingInvite | null;\r\n\r\n outgoingInvites: Record<string, OutgoingInvite>;\r\n\r\n // Error tracking\r\n errors: RtcError[];\r\n}\r\n\r\nexport const defaultState: RtcState = {\r\n initiated: false,\r\n session: null,\r\n incomingInvite: null,\r\n outgoingInvites: {},\r\n errors: [],\r\n};\r\n","import { create } from \"zustand\";\r\nimport { immer } from \"zustand/middleware/immer\";\r\nimport type { RtcError, RtcState } from \"./types\";\r\nimport { defaultState } from \"./types\";\r\n\r\ntype Actions = {\r\n patch: (fn: (draft: RtcState) => void) => void;\r\n reset: () => void;\r\n addError: (error: RtcError) => void;\r\n clearErrors: () => void;\r\n};\r\n\r\nexport const useRtcStore = create<RtcState & Actions>()(\r\n immer((set) => ({\r\n ...defaultState,\r\n\r\n patch: (fn) =>\r\n set((state) => {\r\n fn(state);\r\n }),\r\n\r\n reset: () => set(() => defaultState),\r\n\r\n addError: (error) =>\r\n set((state) => {\r\n state.errors.push(error);\r\n }),\r\n\r\n clearErrors: () =>\r\n set((state) => {\r\n state.errors = [];\r\n }),\r\n }))\r\n);\r\n\r\nexport const rtcStore = useRtcStore;\r\n","import { nanoid } from \"nanoid\";\r\nimport type { ChatEntry, Envelope } from \"./types\";\r\n\r\nexport function compareEntries(a: ChatEntry, b: ChatEntry): number {\r\n if (a.createdAt !== b.createdAt) {\r\n return a.createdAt - b.createdAt;\r\n }\r\n \r\n if (a.sender.id !== b.sender.id) {\r\n return a.sender.id.localeCompare(b.sender.id);\r\n }\r\n \r\n return a.id.localeCompare(b.id);\r\n}\r\n\r\nexport function validateContent(content: string): { valid: boolean; error?: string } {\r\n const trimmed = content.trim();\r\n \r\n if (trimmed.length === 0) {\r\n return { valid: false, error: \"Content cannot be empty\" };\r\n }\r\n \r\n const sizeInBytes = new TextEncoder().encode(content).length;\r\n if (sizeInBytes > 16384) {\r\n return { valid: false, error: \"Content exceeds 16KB limit\" };\r\n }\r\n \r\n return { valid: true };\r\n}\r\n\r\nexport function isValidEnvelope(data: any): data is Envelope {\r\n if (!data || typeof data !== \"object\") {\r\n return false;\r\n }\r\n \r\n if (data.v !== 1) {\r\n return false;\r\n }\r\n \r\n if (![\"entry\", \"edit\", \"remove\", \"reaction\"].includes(data.kind)) {\r\n return false;\r\n }\r\n \r\n if (\r\n typeof data.roomId !== \"string\" ||\r\n typeof data.entryId !== \"string\" ||\r\n typeof data.ts !== \"number\"\r\n ) {\r\n return false;\r\n }\r\n \r\n if (!data.sender || typeof data.sender.id !== \"string\") {\r\n return false;\r\n }\r\n \r\n if (data.kind === \"entry\" || data.kind === \"edit\" || data.kind === \"reaction\") {\r\n if (!data.payload || typeof data.payload !== \"object\") {\r\n return false;\r\n }\r\n }\r\n \r\n return true;\r\n}\r\n\r\nexport function generateEntryId(): string {\r\n return nanoid();\r\n}\r\n\r\nexport function getCurrentTimestamp(): number {\r\n return Date.now();\r\n}\r\n","/**\r\n * Comprehensive logging system for the Callpad Web SDK\r\n *\r\n * Features:\r\n * - Log level filtering (debug, info, warn, error)\r\n * - Environment variable configuration (DEBUG, CALLPAD_LOG_LEVEL)\r\n * - Hierarchical namespacing (callpad:socket:connection)\r\n * - Custom logger integration\r\n * - Zero-cost when disabled\r\n */\r\n\r\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\r\n\r\nexport interface LoggerOptions {\r\n level?: LogLevel;\r\n enableDebug?: boolean;\r\n customLogger?: (level: LogLevel, message: string, meta?: any) => void;\r\n}\r\n\r\nexport interface CallpadLogger {\r\n debug(message: string, meta?: any): void;\r\n info(message: string, meta?: any): void;\r\n warn(message: string, meta?: any): void;\r\n error(message: string, meta?: any): void;\r\n child(namespace: string): CallpadLogger;\r\n setLevel(level: LogLevel): void;\r\n isLevelEnabled(level: LogLevel): boolean;\r\n}\r\n\r\nconst LOG_LEVELS: Record<LogLevel, number> = {\r\n debug: 0,\r\n info: 1,\r\n warn: 2,\r\n error: 3,\r\n};\r\n\r\nclass CallpadLoggerImpl implements CallpadLogger {\r\n private namespace: string;\r\n private level: LogLevel;\r\n private enableDebug: boolean;\r\n private customLogger?: (level: LogLevel, message: string, meta?: any) => void;\r\n\r\n constructor(namespace = \"callpad\", options: LoggerOptions = {}) {\r\n this.namespace = namespace;\r\n this.level = options.level ?? this.getDefaultLevel();\r\n this.enableDebug = options.enableDebug ?? this.shouldEnableDebug();\r\n if (options.customLogger) {\r\n this.customLogger = options.customLogger;\r\n }\r\n }\r\n\r\n private getDefaultLevel(): LogLevel {\r\n const envLevel =\r\n typeof window !== \"undefined\"\r\n ? (window as any).__CALLPAD_LOG_LEVEL__\r\n : typeof globalThis !== \"undefined\" &&\r\n (globalThis as any).process?.env?.CALLPAD_LOG_LEVEL;\r\n\r\n if (envLevel && this.isValidLogLevel(envLevel)) {\r\n return envLevel as LogLevel;\r\n }\r\n\r\n const isProduction =\r\n typeof globalThis !== \"undefined\" &&\r\n (globalThis as any).process?.env?.NODE_ENV === \"production\";\r\n\r\n return isProduction ? \"warn\" : \"info\";\r\n }\r\n\r\n private shouldEnableDebug(): boolean {\r\n const debugEnv =\r\n typeof window !== \"undefined\"\r\n ? (window as any).__DEBUG__\r\n : typeof globalThis !== \"undefined\" &&\r\n (globalThis as any).process?.env?.DEBUG;\r\n\r\n if (!debugEnv) return false;\r\n\r\n const debugPatterns = debugEnv.split(/[\\s,]+/);\r\n return debugPatterns.some((pattern: string) => {\r\n if (pattern === \"*\") return true;\r\n if (pattern.endsWith(\"*\")) {\r\n const prefix = pattern.slice(0, -1);\r\n return this.namespace.startsWith(prefix);\r\n }\r\n return this.namespace === pattern;\r\n });\r\n }\r\n\r\n private isValidLogLevel(level: string): boolean {\r\n return Object.keys(LOG_LEVELS).includes(level);\r\n }\r\n\r\n private shouldLog(level: LogLevel): boolean {\r\n if (level === \"debug\" && !this.enableDebug) {\r\n return false;\r\n }\r\n return LOG_LEVELS[level] >= LOG_LEVELS[this.level];\r\n }\r\n\r\n private formatMessage(level: LogLevel, message: string, meta?: any): void {\r\n if (!this.shouldLog(level)) return;\r\n\r\n const timestamp = new Date().toISOString();\r\n const prefix = `[${timestamp}] [${this.namespace}] [${level.toUpperCase()}]`;\r\n\r\n if (this.customLogger) {\r\n this.customLogger(level, message, meta);\r\n return;\r\n }\r\n\r\n const logMethod =\r\n level === \"error\"\r\n ? console.error\r\n : level === \"warn\"\r\n ? console.warn\r\n : level === \"info\"\r\n ? console.info\r\n : console.log;\r\n\r\n if (meta !== undefined) {\r\n logMethod(`${prefix} ${message}`, meta);\r\n } else {\r\n logMethod(`${prefix} ${message}`);\r\n }\r\n }\r\n\r\n debug(message: string, meta?: any): void {\r\n this.formatMessage(\"debug\", message, meta);\r\n }\r\n\r\n info(message: string, meta?: any): void {\r\n this.formatMessage(\"info\", message, meta);\r\n }\r\n\r\n warn(message: string, meta?: any): void {\r\n this.formatMessage(\"warn\", message, meta);\r\n }\r\n\r\n error(message: string, meta?: any): void {\r\n this.formatMessage(\"error\", message, meta);\r\n }\r\n\r\n child(namespace: string): CallpadLogger {\r\n const childNamespace = `${this.namespace}:${namespace}`;\r\n const childOptions: LoggerOptions = {\r\n level: this.level,\r\n enableDebug: this.enableDebug,\r\n };\r\n if (this.customLogger) {\r\n childOptions.customLogger = this.customLogger;\r\n }\r\n return new CallpadLoggerImpl(childNamespace, childOptions);\r\n }\r\n\r\n setLevel(level: LogLevel): void {\r\n this.level = level;\r\n }\r\n\r\n isLevelEnabled(level: LogLevel): boolean {\r\n return this.shouldLog(level);\r\n }\r\n}\r\n\r\nlet rootLogger: CallpadLogger | null = null;\r\n\r\nexport function createLogger(\r\n namespace?: string,\r\n options?: LoggerOptions\r\n): CallpadLogger {\r\n if (!namespace) {\r\n if (!rootLogger) {\r\n rootLogger = new CallpadLoggerImpl(\"callpad\", options);\r\n }\r\n return rootLogger;\r\n }\r\n\r\n return new CallpadLoggerImpl(`callpad:${namespace}`, options);\r\n}\r\n\r\nexport function setGlobalLoggerOptions(options: LoggerOptions): void {\r\n rootLogger = new CallpadLoggerImpl(\"callpad\", options);\r\n}\r\n","import {ConnectionState, type Room} from \"livekit-client\";\r\nimport type {ChatEntry, Envelope} from \"./types\";\r\nimport type {ParticipantMetadata} from \"../../state/types\";\r\nimport {useChatStore} from \"./store\";\r\nimport {useRtcStore} from \"../../state/store\";\r\nimport {generateEntryId, getCurrentTimestamp, isValidEnvelope, validateContent,} from \"./utils\";\r\nimport {createLogger} from \"../../utils\";\r\n\r\nconst logger = createLogger(\"chat\");\r\n\r\nexport class ChatService {\r\n private readonly room: Room;\r\n private isSubscribed = false;\r\n\r\n constructor(room: Room) {\r\n this.room = room;\r\n }\r\n\r\n private isRoomReady(): boolean {\r\n if (!this.room) {\r\n logger.warn(\"Room not initialized\");\r\n return false;\r\n }\r\n\r\n if (this.room.state !== ConnectionState.Connected) {\r\n logger.warn(\"Room not connected\", { state: this.room.state });\r\n return false;\r\n }\r\n\r\n if (!this.room.localParticipant) {\r\n logger.warn(\"Local participant not available\");\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n subscribe(): void {\r\n if (this.isSubscribed) {\r\n return;\r\n }\r\n\r\n this.room.registerTextStreamHandler(\r\n \"chat:v1\",\r\n async (reader, participantInfo) => {\r\n try {\r\n const text = await reader.readAll();\r\n this.handleIncomingMessage(text);\r\n } catch (error) {\r\n logger.error(\"Error reading text stream\", error);\r\n }\r\n }\r\n );\r\n this.isSubscribed = true;\r\n }\r\n\r\n unsubscribe(): void {\r\n this.isSubscribed = false;\r\n }\r\n\r\n getLocalParticipantId(): string {\r\n return this.room.localParticipant.identity;\r\n }\r\n\r\n async send(content: string): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ROOM_NOT_READY\",\r\n message: \"Cannot send message: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const validation = validateContent(content);\r\n if (!validation.valid) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_INVALID_CONTENT\",\r\n message: validation.error || \"Invalid content\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const entryId = generateEntryId();\r\n const chatStore = useChatStore.getState();\r\n const senderInfo = this.getSenderInfo();\r\n if (senderInfo.info) {\r\n chatStore.patch((state) => {\r\n state.participantCache[senderInfo.id] = senderInfo.info!;\r\n });\r\n }\r\n\r\n const entry: ChatEntry = {\r\n id: entryId,\r\n content,\r\n sender: {\r\n id: senderInfo.id,\r\n },\r\n createdAt: getCurrentTimestamp(),\r\n version: 1,\r\n reactions: {},\r\n status: \"sending\",\r\n };\r\n\r\n chatStore.addEntryOptimistic(entry);\r\n try {\r\n const envelope: Envelope = {\r\n v: 1,\r\n kind: \"entry\",\r\n roomId: this.room.name,\r\n entryId,\r\n ts: entry.createdAt,\r\n sender: senderInfo,\r\n payload: {\r\n content,\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"chat:v1\",\r\n });\r\n chatStore.markEntrySent(entryId);\r\n } catch (error) {\r\n chatStore.markEntryFailed(entryId);\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_SEND_FAILED\",\r\n message: error instanceof Error ? error.message : \"Failed to send message\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n }\r\n }\r\n\r\n async edit(entryId: string, newContent: string): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ROOM_NOT_READY\",\r\n message: \"Cannot edit message: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const validation = validateContent(newContent);\r\n if (!validation.valid) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_INVALID_CONTENT\",\r\n message: validation.error || \"Invalid content\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const chatStore = useChatStore.getState();\r\n const entry = chatStore.byId[entryId];\r\n if (!entry) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ENTRY_NOT_FOUND\",\r\n message: \"Entry not found\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n if (entry.sender.id !== senderInfo.id) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_UNAUTHORIZED\",\r\n message: \"You can only edit your own messages\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n return;\r\n }\r\n\r\n const newVersion = entry.version + 1;\r\n chatStore.applyEdit(entryId, newContent, newVersion);\r\n try {\r\n const envelope: Envelope = {\r\n v: 1,\r\n kind: \"edit\",\r\n roomId: this.room.name,\r\n entryId,\r\n ts: getCurrentTimestamp(),\r\n sender: senderInfo,\r\n payload: {\r\n newContent,\r\n version: newVersion,\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"chat:v1\",\r\n });\r\n } catch (error) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_EDIT_FAILED\",\r\n message: error instanceof Error ? error.message : \"Failed to edit message\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n }\r\n }\r\n\r\n async remove(entryId: string): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ROOM_NOT_READY\",\r\n message: \"Cannot remove message: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const chatStore = useChatStore.getState();\r\n const entry = chatStore.byId[entryId];\r\n if (!entry) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ENTRY_NOT_FOUND\",\r\n message: \"Entry not found\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n if (entry.sender.id !== senderInfo.id) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_UNAUTHORIZED\",\r\n message: \"You can only remove your own messages\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n return;\r\n }\r\n\r\n chatStore.applyRemove(entryId);\r\n try {\r\n const envelope: Envelope = {\r\n v: 1,\r\n kind: \"remove\",\r\n roomId: this.room.name,\r\n entryId,\r\n ts: getCurrentTimestamp(),\r\n sender: senderInfo,\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"chat:v1\",\r\n });\r\n } catch (error) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_REMOVE_FAILED\",\r\n message: error instanceof Error ? error.message : \"Failed to remove message\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n }\r\n }\r\n\r\n async react(entryId: string, emoji: string): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ROOM_NOT_READY\",\r\n message: \"Cannot add reaction: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const chatStore = useChatStore.getState();\r\n const entry = chatStore.byId[entryId];\r\n if (!entry) {\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n if (senderInfo.info) {\r\n chatStore.patch((state) => {\r\n state.participantCache[senderInfo.id] = senderInfo.info!;\r\n });\r\n }\r\n\r\n chatStore.applyReaction(entryId, emoji, senderInfo.id, \"add\");\r\n try {\r\n const envelope: Envelope = {\r\n v: 1,\r\n kind: \"reaction\",\r\n roomId: this.room.name,\r\n entryId,\r\n ts: getCurrentTimestamp(),\r\n sender: senderInfo,\r\n payload: {\r\n emoji,\r\n op: \"add\",\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"chat:v1\",\r\n });\r\n } catch (error) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_REACTION_FAILED\",\r\n message: error instanceof Error ? error.message : \"Failed to add reaction\",\r\n timestamp: Date.now(),\r\n context: { entryId, emoji },\r\n });\r\n }\r\n }\r\n\r\n async unreact(entryId: string, emoji: string): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ROOM_NOT_READY\",\r\n message: \"Cannot remove reaction: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const chatStore = useChatStore.getState();\r\n const entry = chatStore.byId[entryId];\r\n if (!entry) {\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n if (senderInfo.info) {\r\n chatStore.patch((state) => {\r\n state.participantCache[senderInfo.id] = senderInfo.info!;\r\n });\r\n }\r\n\r\n chatStore.applyReaction(entryId, emoji, senderInfo.id, \"remove\");\r\n try {\r\n const envelope: Envelope = {\r\n v: 1,\r\n kind: \"reaction\",\r\n roomId: this.room.name,\r\n entryId,\r\n ts: getCurrentTimestamp(),\r\n sender: senderInfo,\r\n payload: {\r\n emoji,\r\n op: \"remove\",\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"chat:v1\",\r\n });\r\n } catch (error) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_REACTION_FAILED\",\r\n message:\r\n error instanceof Error ? error.message : \"Failed to remove reaction\",\r\n timestamp: Date.now(),\r\n context: { entryId, emoji },\r\n });\r\n }\r\n }\r\n\r\n private handleIncomingMessage(text: string): void {\r\n try {\r\n const parsed = JSON.parse(text);\r\n if (!isValidEnvelope(parsed)) {\r\n logger.warn(\"Invalid envelope received\", parsed);\r\n return;\r\n }\r\n\r\n useChatStore.getState().applyIncoming(parsed);\r\n } catch (error) {\r\n logger.error(\"Error parsing incoming message\", error);\r\n }\r\n }\r\n\r\n private getSenderInfo(): { id: string; info?: ParticipantMetadata } {\r\n const localParticipant = this.room.localParticipant;\r\n const sender: { id: string; info?: ParticipantMetadata } = {\r\n id: localParticipant.identity,\r\n };\r\n\r\n if (localParticipant.metadata) {\r\n try {\r\n sender.info = JSON.parse(localParticipant.metadata) as ParticipantMetadata;\r\n } catch {\r\n // Ignore metadata parsing errors\r\n }\r\n }\r\n\r\n return sender;\r\n }\r\n}\r\n","import { useMemo, useCallback } from \"react\";\r\nimport { useChatStore } from \"./store\";\r\nimport { useFeatureService } from \"../DataChannelContext\";\r\nimport { compareEntries } from \"./utils\";\r\nimport type { ChatService } from \"./service\";\r\nimport type { ChatEntry } from \"./types\";\r\nimport type { ParticipantMetadata } from \"../../state/types\";\r\n\r\ntype Nullable<T> = T | null;\r\n\r\nexport interface UseChatReturn {\r\n entries: ChatEntry[];\r\n isReady: boolean;\r\n getParticipantInfo: (id: string) => Nullable<ParticipantMetadata>;\r\n isOwnEntry: (entry: ChatEntry) => boolean;\r\n send: (content: string) => Promise<void>;\r\n edit: (id: string, content: string) => Promise<void>;\r\n remove: (id: string) => Promise<void>;\r\n react: (id: string, emoji: string) => Promise<void>;\r\n unreact: (id: string, emoji: string) => Promise<void>;\r\n}\r\n\r\nexport function useChat(): UseChatReturn {\r\n const service = useFeatureService<ChatService>(\"chat\");\r\n \r\n const byId = useChatStore(state => state.byId);\r\n const order = useChatStore(state => state.order);\r\n const participantCache = useChatStore(state => state.participantCache);\r\n\r\n const entries = useMemo(() => {\r\n return order\r\n .map(id => byId[id])\r\n .filter((entry): entry is ChatEntry => entry !== undefined)\r\n .sort(compareEntries);\r\n }, [byId, order]);\r\n\r\n const getParticipantInfo = useCallback(\r\n (id: string): Nullable<ParticipantMetadata> => {\r\n return participantCache[id] || null;\r\n },\r\n [participantCache]\r\n );\r\n\r\n const send = useCallback(\r\n async (content: string) => service.send(content),\r\n [service]\r\n );\r\n\r\n const edit = useCallback(\r\n async (id: string, content: string) => service.edit(id, content),\r\n [service]\r\n );\r\n\r\n const remove = useCallback(\r\n async (id: string) => service.remove(id),\r\n [service]\r\n );\r\n\r\n const react = useCallback(\r\n async (id: string, emoji: string) => service.react(id, emoji),\r\n [service]\r\n );\r\n\r\n const unreact = useCallback(\r\n async (id: string, emoji: string) => service.unreact(id, emoji),\r\n [service]\r\n );\r\n\r\n const isOwnEntry = useCallback(\r\n (entry: ChatEntry) => entry.sender.id === service.getLocalParticipantId(),\r\n [service]\r\n );\r\n\r\n return {\r\n entries,\r\n isReady: true,\r\n getParticipantInfo,\r\n isOwnEntry,\r\n send,\r\n edit,\r\n remove,\r\n react,\r\n unreact,\r\n };\r\n}\r\n","import type { Room } from \"livekit-client\";\r\nimport { ChatService, useChatStore } from \"./chat\";\r\nimport type { RealtimeFeature } from \"./types\";\r\n\r\nexport const FEATURES: Record<string, RealtimeFeature> = {\r\n chat: {\r\n name: \"chat\",\r\n createService: (room: Room) => new ChatService(room),\r\n cleanupStore: () => useChatStore.getState().clearChat(),\r\n },\r\n};\r\n\r\nexport const DEFAULT_FEATURES = [\"chat\"];\r\n","import { useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\r\nimport type { Room } from \"livekit-client\";\r\nimport { DataChannelContext, type DataChannelContextValue } from \"./DataChannelContext\";\r\nimport { FEATURES, DEFAULT_FEATURES } from \"./registry\";\r\nimport { createLogger } from \"../utils\";\r\n\r\nconst logger = createLogger(\"channels:provider\");\r\n\r\nexport interface DataChannelProviderProps {\r\n room: Room;\r\n features?: string[];\r\n children: ReactNode;\r\n}\r\n\r\nexport function DataChannelProvider({\r\n room,\r\n features = DEFAULT_FEATURES,\r\n children,\r\n}: DataChannelProviderProps) {\r\n const services = useRef<Map<string, any>>(new Map());\r\n const [isReady, setIsReady] = useState(false);\r\n\r\n useEffect(() => {\r\n if (!room) {\r\n logger.warn(\"DataChannelProvider mounted without room\");\r\n return;\r\n }\r\n\r\n logger.debug(\"Initializing features\", { features });\r\n for (const featureName of features) {\r\n const feature = FEATURES[featureName];\r\n \r\n if (!feature) {\r\n logger.warn(`Feature \"${featureName}\" not found in registry`);\r\n continue;\r\n }\r\n\r\n try {\r\n logger.debug(`Initializing feature: ${featureName}`);\r\n const service = feature.createService(room);\r\n\r\n service.subscribe();\r\n services.current.set(featureName, service);\r\n \r\n logger.info(`Feature \"${featureName}\" initialized`);\r\n } catch (error) {\r\n logger.error(`Failed to initialize feature \"${featureName}\"`, error);\r\n }\r\n }\r\n\r\n setIsReady(true);\r\n logger.info(\"All features initialized\");\r\n return () => {\r\n logger.debug(\"Cleaning up features\");\r\n\r\n // Unsubscribe all services\r\n services.current.forEach((service, name) => {\r\n try {\r\n logger.debug(`Unsubscribing feature: ${name}`);\r\n service.unsubscribe();\r\n } catch (error) {\r\n logger.error(`Failed to unsubscribe feature \"${name}\"`, error);\r\n }\r\n });\r\n\r\n // Clean up stores\r\n for (const featureName of features) {\r\n const feature = FEATURES[featureName];\r\n if (feature?.cleanupStore) {\r\n try {\r\n logger.debug(`Cleaning store for feature: ${featureName}`);\r\n feature.cleanupStore();\r\n } catch (error) {\r\n logger.error(`Failed to cleanup store for \"${featureName}\"`, error);\r\n }\r\n }\r\n }\r\n\r\n services.current.clear();\r\n setIsReady(false);\r\n logger.info(\"Features cleanup complete\");\r\n };\r\n }, [room, features]);\r\n\r\n const contextValue = useMemo<DataChannelContextValue>(\r\n () => ({\r\n services: services.current,\r\n isReady,\r\n }),\r\n [isReady]\r\n );\r\n\r\n return (\r\n <DataChannelContext.Provider value={contextValue}>\r\n {children}\r\n </DataChannelContext.Provider>\r\n );\r\n}\r\n"]}
|
package/dist/channel/index.d.cts
CHANGED
|
@@ -108,7 +108,7 @@ interface ChatActions {
|
|
|
108
108
|
markEntryFailed: (entryId: string) => void;
|
|
109
109
|
applyEdit: (entryId: string, newContent: string, version: number) => void;
|
|
110
110
|
applyRemove: (entryId: string) => void;
|
|
111
|
-
applyReaction: (entryId: string, emoji: string,
|
|
111
|
+
applyReaction: (entryId: string, emoji: string, participantId: string, op: "add" | "remove") => void;
|
|
112
112
|
queuePendingOp: (entryId: string, envelope: Envelope) => void;
|
|
113
113
|
processPendingOps: (entryId: string) => void;
|
|
114
114
|
trimOldEntries: () => void;
|
package/dist/channel/index.d.ts
CHANGED
|
@@ -108,7 +108,7 @@ interface ChatActions {
|
|
|
108
108
|
markEntryFailed: (entryId: string) => void;
|
|
109
109
|
applyEdit: (entryId: string, newContent: string, version: number) => void;
|
|
110
110
|
applyRemove: (entryId: string) => void;
|
|
111
|
-
applyReaction: (entryId: string, emoji: string,
|
|
111
|
+
applyReaction: (entryId: string, emoji: string, participantId: string, op: "add" | "remove") => void;
|
|
112
112
|
queuePendingOp: (entryId: string, envelope: Envelope) => void;
|
|
113
113
|
processPendingOps: (entryId: string) => void;
|
|
114
114
|
trimOldEntries: () => void;
|
package/dist/channel/index.mjs
CHANGED
|
@@ -31,15 +31,15 @@ var defaultChatState = {
|
|
|
31
31
|
participantCache: {},
|
|
32
32
|
maxEntries: 1e3
|
|
33
33
|
};
|
|
34
|
-
function applyReactionToEntry(entry, emoji,
|
|
34
|
+
function applyReactionToEntry(entry, emoji, participantId, op) {
|
|
35
35
|
const emojiSet = entry.reactions[emoji];
|
|
36
36
|
if (!emojiSet) {
|
|
37
37
|
entry.reactions[emoji] = /* @__PURE__ */ new Set();
|
|
38
38
|
}
|
|
39
39
|
if (op === "add") {
|
|
40
|
-
entry.reactions[emoji]?.add(
|
|
40
|
+
entry.reactions[emoji]?.add(participantId);
|
|
41
41
|
} else {
|
|
42
|
-
entry.reactions[emoji]?.delete(
|
|
42
|
+
entry.reactions[emoji]?.delete(participantId);
|
|
43
43
|
if (entry.reactions[emoji]?.size === 0) {
|
|
44
44
|
delete entry.reactions[emoji];
|
|
45
45
|
}
|
|
@@ -194,10 +194,10 @@ var useChatStore = create()(
|
|
|
194
194
|
entry.removedAt = Date.now();
|
|
195
195
|
}
|
|
196
196
|
}),
|
|
197
|
-
applyReaction: (entryId, emoji,
|
|
197
|
+
applyReaction: (entryId, emoji, participantId, op) => set((state) => {
|
|
198
198
|
const entry = state.byId[entryId];
|
|
199
199
|
if (entry) {
|
|
200
|
-
applyReactionToEntry(entry, emoji,
|
|
200
|
+
applyReactionToEntry(entry, emoji, participantId, op);
|
|
201
201
|
}
|
|
202
202
|
}),
|
|
203
203
|
queuePendingOp: (entryId, envelope) => set((state) => {
|