vg-x07df 1.6.2 → 1.6.3
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 +137 -131
- package/dist/channel/index.cjs.map +1 -1
- package/dist/channel/index.d.cts +2 -2
- package/dist/channel/index.d.ts +2 -2
- package/dist/channel/index.mjs +137 -131
- package/dist/channel/index.mjs.map +1 -1
- package/dist/index.cjs +801 -690
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +226 -561
- package/dist/index.d.ts +226 -561
- package/dist/index.mjs +792 -679
- package/dist/index.mjs.map +1 -1
- package/dist/{types-CLweuTEn.d.cts → types-CWNlFnPU.d.cts} +10 -3
- package/dist/{types-CLweuTEn.d.ts → types-CWNlFnPU.d.ts} +10 -3
- package/package.json +1 -1
package/dist/channel/index.cjs
CHANGED
|
@@ -8,11 +8,117 @@ var nanoid = require('nanoid');
|
|
|
8
8
|
var jsxRuntime = require('react/jsx-runtime');
|
|
9
9
|
|
|
10
10
|
// src/channel/DataChannelProvider.tsx
|
|
11
|
-
|
|
11
|
+
|
|
12
|
+
// src/utils/logger.ts
|
|
13
|
+
var LOG_LEVELS = {
|
|
14
|
+
debug: 0,
|
|
15
|
+
info: 1,
|
|
16
|
+
warn: 2,
|
|
17
|
+
error: 3
|
|
18
|
+
};
|
|
19
|
+
var CallpadLoggerImpl = class _CallpadLoggerImpl {
|
|
20
|
+
constructor(namespace = "callpad", options = {}) {
|
|
21
|
+
this.namespace = namespace;
|
|
22
|
+
this.level = options.level ?? this.getDefaultLevel();
|
|
23
|
+
this.enableDebug = options.enableDebug ?? this.shouldEnableDebug();
|
|
24
|
+
if (options.customLogger) {
|
|
25
|
+
this.customLogger = options.customLogger;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
getDefaultLevel() {
|
|
29
|
+
const envLevel = typeof window !== "undefined" ? window.__CALLPAD_LOG_LEVEL__ : typeof globalThis !== "undefined" && globalThis.process?.env?.CALLPAD_LOG_LEVEL;
|
|
30
|
+
if (envLevel && this.isValidLogLevel(envLevel)) {
|
|
31
|
+
return envLevel;
|
|
32
|
+
}
|
|
33
|
+
const isProduction = typeof globalThis !== "undefined" && globalThis.process?.env?.NODE_ENV === "production";
|
|
34
|
+
return isProduction ? "warn" : "info";
|
|
35
|
+
}
|
|
36
|
+
shouldEnableDebug() {
|
|
37
|
+
const debugEnv = typeof window !== "undefined" ? window.__DEBUG__ : typeof globalThis !== "undefined" && globalThis.process?.env?.DEBUG;
|
|
38
|
+
if (!debugEnv) return false;
|
|
39
|
+
const debugPatterns = debugEnv.split(/[\s,]+/);
|
|
40
|
+
return debugPatterns.some((pattern) => {
|
|
41
|
+
if (pattern === "*") return true;
|
|
42
|
+
if (pattern.endsWith("*")) {
|
|
43
|
+
const prefix = pattern.slice(0, -1);
|
|
44
|
+
return this.namespace.startsWith(prefix);
|
|
45
|
+
}
|
|
46
|
+
return this.namespace === pattern;
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
isValidLogLevel(level) {
|
|
50
|
+
return Object.keys(LOG_LEVELS).includes(level);
|
|
51
|
+
}
|
|
52
|
+
shouldLog(level) {
|
|
53
|
+
if (level === "debug" && !this.enableDebug) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
return LOG_LEVELS[level] >= LOG_LEVELS[this.level];
|
|
57
|
+
}
|
|
58
|
+
formatMessage(level, message, meta) {
|
|
59
|
+
if (!this.shouldLog(level)) return;
|
|
60
|
+
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
61
|
+
const prefix = `[${timestamp}] [${this.namespace}] [${level.toUpperCase()}]`;
|
|
62
|
+
if (this.customLogger) {
|
|
63
|
+
this.customLogger(level, message, meta);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const logMethod = level === "error" ? console.error : level === "warn" ? console.warn : level === "info" ? console.info : console.log;
|
|
67
|
+
if (meta !== void 0) {
|
|
68
|
+
logMethod(`${prefix} ${message}`, meta);
|
|
69
|
+
} else {
|
|
70
|
+
logMethod(`${prefix} ${message}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
debug(message, meta) {
|
|
74
|
+
this.formatMessage("debug", message, meta);
|
|
75
|
+
}
|
|
76
|
+
info(message, meta) {
|
|
77
|
+
this.formatMessage("info", message, meta);
|
|
78
|
+
}
|
|
79
|
+
warn(message, meta) {
|
|
80
|
+
this.formatMessage("warn", message, meta);
|
|
81
|
+
}
|
|
82
|
+
error(message, meta) {
|
|
83
|
+
this.formatMessage("error", message, meta);
|
|
84
|
+
}
|
|
85
|
+
child(namespace) {
|
|
86
|
+
const childNamespace = `${this.namespace}:${namespace}`;
|
|
87
|
+
const childOptions = {
|
|
88
|
+
level: this.level,
|
|
89
|
+
enableDebug: this.enableDebug
|
|
90
|
+
};
|
|
91
|
+
if (this.customLogger) {
|
|
92
|
+
childOptions.customLogger = this.customLogger;
|
|
93
|
+
}
|
|
94
|
+
return new _CallpadLoggerImpl(childNamespace, childOptions);
|
|
95
|
+
}
|
|
96
|
+
setLevel(level) {
|
|
97
|
+
this.level = level;
|
|
98
|
+
}
|
|
99
|
+
isLevelEnabled(level) {
|
|
100
|
+
return this.shouldLog(level);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
var rootLogger = null;
|
|
104
|
+
function createLogger(namespace, options) {
|
|
105
|
+
if (!namespace) {
|
|
106
|
+
if (!rootLogger) {
|
|
107
|
+
rootLogger = new CallpadLoggerImpl("callpad", options);
|
|
108
|
+
}
|
|
109
|
+
return rootLogger;
|
|
110
|
+
}
|
|
111
|
+
return new CallpadLoggerImpl(`callpad:${namespace}`, options);
|
|
112
|
+
}
|
|
113
|
+
var DataChannelContext = react.createContext(
|
|
114
|
+
null
|
|
115
|
+
);
|
|
12
116
|
function useDataChannelContext() {
|
|
13
117
|
const context = react.useContext(DataChannelContext);
|
|
14
118
|
if (!context) {
|
|
15
|
-
throw new Error(
|
|
119
|
+
throw new Error(
|
|
120
|
+
"useDataChannelContext must be used within DataChannelProvider"
|
|
121
|
+
);
|
|
16
122
|
}
|
|
17
123
|
return context;
|
|
18
124
|
}
|
|
@@ -26,6 +132,32 @@ function useFeatureService(featureName) {
|
|
|
26
132
|
}
|
|
27
133
|
return service;
|
|
28
134
|
}
|
|
135
|
+
|
|
136
|
+
// src/state/types.ts
|
|
137
|
+
var defaultState = {
|
|
138
|
+
initiated: false,
|
|
139
|
+
session: null,
|
|
140
|
+
incomingInvite: null,
|
|
141
|
+
outgoingInvites: {},
|
|
142
|
+
errors: []
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
// src/state/store.ts
|
|
146
|
+
var useRtcStore = zustand.create()(
|
|
147
|
+
immer.immer((set) => ({
|
|
148
|
+
...defaultState,
|
|
149
|
+
patch: (fn) => set((state) => {
|
|
150
|
+
fn(state);
|
|
151
|
+
}),
|
|
152
|
+
reset: () => set(() => defaultState),
|
|
153
|
+
addError: (error) => set((state) => {
|
|
154
|
+
state.errors.push(error);
|
|
155
|
+
}),
|
|
156
|
+
clearErrors: () => set((state) => {
|
|
157
|
+
state.errors = [];
|
|
158
|
+
})
|
|
159
|
+
}))
|
|
160
|
+
);
|
|
29
161
|
var defaultChatState = {
|
|
30
162
|
byId: {},
|
|
31
163
|
order: [],
|
|
@@ -249,32 +381,6 @@ var useChatStore = zustand.create()(
|
|
|
249
381
|
clearChat: () => set(() => defaultChatState)
|
|
250
382
|
}))
|
|
251
383
|
);
|
|
252
|
-
|
|
253
|
-
// src/state/types.ts
|
|
254
|
-
var defaultState = {
|
|
255
|
-
initiated: false,
|
|
256
|
-
session: null,
|
|
257
|
-
incomingInvite: null,
|
|
258
|
-
outgoingInvites: {},
|
|
259
|
-
errors: []
|
|
260
|
-
};
|
|
261
|
-
|
|
262
|
-
// src/state/store.ts
|
|
263
|
-
var useRtcStore = zustand.create()(
|
|
264
|
-
immer.immer((set) => ({
|
|
265
|
-
...defaultState,
|
|
266
|
-
patch: (fn) => set((state) => {
|
|
267
|
-
fn(state);
|
|
268
|
-
}),
|
|
269
|
-
reset: () => set(() => defaultState),
|
|
270
|
-
addError: (error) => set((state) => {
|
|
271
|
-
state.errors.push(error);
|
|
272
|
-
}),
|
|
273
|
-
clearErrors: () => set((state) => {
|
|
274
|
-
state.errors = [];
|
|
275
|
-
})
|
|
276
|
-
}))
|
|
277
|
-
);
|
|
278
384
|
function compareEntries(a, b) {
|
|
279
385
|
if (a.createdAt !== b.createdAt) {
|
|
280
386
|
return a.createdAt - b.createdAt;
|
|
@@ -325,108 +431,6 @@ function getCurrentTimestamp() {
|
|
|
325
431
|
return Date.now();
|
|
326
432
|
}
|
|
327
433
|
|
|
328
|
-
// src/utils/logger.ts
|
|
329
|
-
var LOG_LEVELS = {
|
|
330
|
-
debug: 0,
|
|
331
|
-
info: 1,
|
|
332
|
-
warn: 2,
|
|
333
|
-
error: 3
|
|
334
|
-
};
|
|
335
|
-
var CallpadLoggerImpl = class _CallpadLoggerImpl {
|
|
336
|
-
constructor(namespace = "callpad", options = {}) {
|
|
337
|
-
this.namespace = namespace;
|
|
338
|
-
this.level = options.level ?? this.getDefaultLevel();
|
|
339
|
-
this.enableDebug = options.enableDebug ?? this.shouldEnableDebug();
|
|
340
|
-
if (options.customLogger) {
|
|
341
|
-
this.customLogger = options.customLogger;
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
getDefaultLevel() {
|
|
345
|
-
const envLevel = typeof window !== "undefined" ? window.__CALLPAD_LOG_LEVEL__ : typeof globalThis !== "undefined" && globalThis.process?.env?.CALLPAD_LOG_LEVEL;
|
|
346
|
-
if (envLevel && this.isValidLogLevel(envLevel)) {
|
|
347
|
-
return envLevel;
|
|
348
|
-
}
|
|
349
|
-
const isProduction = typeof globalThis !== "undefined" && globalThis.process?.env?.NODE_ENV === "production";
|
|
350
|
-
return isProduction ? "warn" : "info";
|
|
351
|
-
}
|
|
352
|
-
shouldEnableDebug() {
|
|
353
|
-
const debugEnv = typeof window !== "undefined" ? window.__DEBUG__ : typeof globalThis !== "undefined" && globalThis.process?.env?.DEBUG;
|
|
354
|
-
if (!debugEnv) return false;
|
|
355
|
-
const debugPatterns = debugEnv.split(/[\s,]+/);
|
|
356
|
-
return debugPatterns.some((pattern) => {
|
|
357
|
-
if (pattern === "*") return true;
|
|
358
|
-
if (pattern.endsWith("*")) {
|
|
359
|
-
const prefix = pattern.slice(0, -1);
|
|
360
|
-
return this.namespace.startsWith(prefix);
|
|
361
|
-
}
|
|
362
|
-
return this.namespace === pattern;
|
|
363
|
-
});
|
|
364
|
-
}
|
|
365
|
-
isValidLogLevel(level) {
|
|
366
|
-
return Object.keys(LOG_LEVELS).includes(level);
|
|
367
|
-
}
|
|
368
|
-
shouldLog(level) {
|
|
369
|
-
if (level === "debug" && !this.enableDebug) {
|
|
370
|
-
return false;
|
|
371
|
-
}
|
|
372
|
-
return LOG_LEVELS[level] >= LOG_LEVELS[this.level];
|
|
373
|
-
}
|
|
374
|
-
formatMessage(level, message, meta) {
|
|
375
|
-
if (!this.shouldLog(level)) return;
|
|
376
|
-
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
377
|
-
const prefix = `[${timestamp}] [${this.namespace}] [${level.toUpperCase()}]`;
|
|
378
|
-
if (this.customLogger) {
|
|
379
|
-
this.customLogger(level, message, meta);
|
|
380
|
-
return;
|
|
381
|
-
}
|
|
382
|
-
const logMethod = level === "error" ? console.error : level === "warn" ? console.warn : level === "info" ? console.info : console.log;
|
|
383
|
-
if (meta !== void 0) {
|
|
384
|
-
logMethod(`${prefix} ${message}`, meta);
|
|
385
|
-
} else {
|
|
386
|
-
logMethod(`${prefix} ${message}`);
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
debug(message, meta) {
|
|
390
|
-
this.formatMessage("debug", message, meta);
|
|
391
|
-
}
|
|
392
|
-
info(message, meta) {
|
|
393
|
-
this.formatMessage("info", message, meta);
|
|
394
|
-
}
|
|
395
|
-
warn(message, meta) {
|
|
396
|
-
this.formatMessage("warn", message, meta);
|
|
397
|
-
}
|
|
398
|
-
error(message, meta) {
|
|
399
|
-
this.formatMessage("error", message, meta);
|
|
400
|
-
}
|
|
401
|
-
child(namespace) {
|
|
402
|
-
const childNamespace = `${this.namespace}:${namespace}`;
|
|
403
|
-
const childOptions = {
|
|
404
|
-
level: this.level,
|
|
405
|
-
enableDebug: this.enableDebug
|
|
406
|
-
};
|
|
407
|
-
if (this.customLogger) {
|
|
408
|
-
childOptions.customLogger = this.customLogger;
|
|
409
|
-
}
|
|
410
|
-
return new _CallpadLoggerImpl(childNamespace, childOptions);
|
|
411
|
-
}
|
|
412
|
-
setLevel(level) {
|
|
413
|
-
this.level = level;
|
|
414
|
-
}
|
|
415
|
-
isLevelEnabled(level) {
|
|
416
|
-
return this.shouldLog(level);
|
|
417
|
-
}
|
|
418
|
-
};
|
|
419
|
-
var rootLogger = null;
|
|
420
|
-
function createLogger(namespace, options) {
|
|
421
|
-
if (!namespace) {
|
|
422
|
-
if (!rootLogger) {
|
|
423
|
-
rootLogger = new CallpadLoggerImpl("callpad", options);
|
|
424
|
-
}
|
|
425
|
-
return rootLogger;
|
|
426
|
-
}
|
|
427
|
-
return new CallpadLoggerImpl(`callpad:${namespace}`, options);
|
|
428
|
-
}
|
|
429
|
-
|
|
430
434
|
// src/channel/chat/service.ts
|
|
431
435
|
var logger = createLogger("chat");
|
|
432
436
|
var ChatService = class {
|
|
@@ -765,7 +769,9 @@ var ChatService = class {
|
|
|
765
769
|
};
|
|
766
770
|
if (localParticipant.metadata) {
|
|
767
771
|
try {
|
|
768
|
-
sender.info = JSON.parse(
|
|
772
|
+
sender.info = JSON.parse(
|
|
773
|
+
localParticipant.metadata
|
|
774
|
+
);
|
|
769
775
|
} catch {
|
|
770
776
|
}
|
|
771
777
|
}
|
|
@@ -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 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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/logger.ts","../../src/channel/DataChannelContext.ts","../../src/state/types.ts","../../src/state/store.ts","../../src/channel/chat/store.ts","../../src/channel/chat/utils.ts","../../src/channel/chat/service.ts","../../src/channel/chat/useChat.ts","../../src/channel/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":["/**\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 { 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>(\r\n null\r\n);\r\n\r\nexport function useDataChannelContext(): DataChannelContextValue {\r\n const context = useContext(DataChannelContext);\r\n if (!context) {\r\n throw new Error(\r\n \"useDataChannelContext must be used within DataChannelProvider\"\r\n );\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","type Nullable<T> = T | null;\r\n\r\nexport type CallParticipantRole = \"HOST\" | \"PARTICIPANT\" | \"GUEST\";\r\n\r\nexport interface Profile {\r\n userId: string;\r\n username: string | null;\r\n firstName: string | null;\r\n lastName: string | null;\r\n profilePhoto: string | null;\r\n}\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: \"initializing\" | \"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\"> | undefined;\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 { 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","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): {\r\n valid: boolean;\r\n error?: string;\r\n} {\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 (\r\n data.kind === \"entry\" ||\r\n data.kind === \"edit\" ||\r\n data.kind === \"reaction\"\r\n ) {\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","import { ConnectionState, type Room } from \"livekit-client\";\r\nimport { useRtcStore } from \"../../state/store\";\r\nimport type { ParticipantMetadata } from \"../../state/types\";\r\nimport { createLogger } from \"../../utils\";\r\nimport { useChatStore } from \"./store\";\r\nimport type { ChatEntry, Envelope } from \"./types\";\r\nimport {\r\n generateEntryId,\r\n getCurrentTimestamp,\r\n isValidEnvelope,\r\n validateContent,\r\n} 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:\r\n 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:\r\n 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:\r\n 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:\r\n 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(\r\n localParticipant.metadata\r\n ) 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 { useCallback, useMemo } from \"react\";\r\nimport type { ParticipantMetadata } from \"../../state/types\";\r\nimport { useFeatureService } from \"../DataChannelContext\";\r\nimport type { ChatService } from \"./service\";\r\nimport { useChatStore } from \"./store\";\r\nimport type { ChatEntry } from \"./types\";\r\nimport { compareEntries } from \"./utils\";\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 type { Room } from \"livekit-client\";\r\nimport { type ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { createLogger } from \"../utils\";\r\nimport {\r\n DataChannelContext,\r\n type DataChannelContextValue,\r\n} from \"./DataChannelContext\";\r\nimport { DEFAULT_FEATURES, FEATURES } from \"./registry\";\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
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { ReactNode } from 'react';
|
|
3
2
|
import { Room } from 'livekit-client';
|
|
3
|
+
import { ReactNode } from 'react';
|
|
4
4
|
import * as immer from 'immer';
|
|
5
5
|
import * as zustand from 'zustand';
|
|
6
|
-
import { P as ParticipantMetadata } from '../types-
|
|
6
|
+
import { P as ParticipantMetadata } from '../types-CWNlFnPU.cjs';
|
|
7
7
|
|
|
8
8
|
interface DataChannelProviderProps {
|
|
9
9
|
room: Room;
|