@liveblocks/react 2.16.0 → 2.16.1-ai

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.
@@ -224,13 +224,15 @@ import {
224
224
  console as console2,
225
225
  DefaultMap,
226
226
  DerivedSignal,
227
+ HttpError,
227
228
  kInternal,
228
229
  MutableSignal as MutableSignal2,
229
230
  nanoid,
230
231
  nn,
231
232
  shallow as shallow3,
232
233
  Signal,
233
- stringify
234
+ stringify,
235
+ unstringify
234
236
  } from "@liveblocks/core";
235
237
 
236
238
  // src/lib/autobind.ts
@@ -280,16 +282,16 @@ function matchesMetadata(thread, q) {
280
282
  const metadata = thread.metadata;
281
283
  return q.metadata === void 0 || Object.entries(q.metadata).every(
282
284
  ([key, op]) => (
283
- // Ignore explicit-undefined filters
284
- // Boolean logic: op? => value matches the operator
285
- op === void 0 || matchesOperator(metadata[key], op)
285
+ // NOTE: `op` can be explicitly-`undefined` here, which ideally would not
286
+ // mean "filter for absence" like it does now, as this does not match the
287
+ // backend behavior at the moment. For an in-depth discussion, see
288
+ // https://liveblocks.slack.com/archives/C02PZL7QAAW/p1728546988505989
289
+ matchesOperator(metadata[key], op)
286
290
  )
287
291
  );
288
292
  }
289
293
  function matchesOperator(value, op) {
290
- if (op === null) {
291
- return value === void 0;
292
- } else if (isStartsWithOperator(op)) {
294
+ if (isStartsWithOperator(op)) {
293
295
  return typeof value === "string" && value.startsWith(op.startsWith);
294
296
  } else {
295
297
  return value === op;
@@ -834,7 +836,7 @@ var UmbrellaStore = class {
834
836
  );
835
837
  const loadingUserThreads = new DefaultMap(
836
838
  (queryKey) => {
837
- const query = JSON.parse(queryKey);
839
+ const query = unstringify(queryKey);
838
840
  const resource = new PaginatedResource(async (cursor) => {
839
841
  const result = await this.#client[kInternal].httpClient.getUserThreads_experimental({
840
842
  cursor,
@@ -876,7 +878,7 @@ var UmbrellaStore = class {
876
878
  );
877
879
  const loadingRoomThreads = new DefaultMap(
878
880
  (queryKey) => {
879
- const [roomId, query] = JSON.parse(queryKey);
881
+ const [roomId, query] = unstringify(queryKey);
880
882
  const resource = new PaginatedResource(async (cursor) => {
881
883
  const result = await this.#client[kInternal].httpClient.getThreads({
882
884
  roomId,
@@ -939,7 +941,10 @@ var UmbrellaStore = class {
939
941
  const resource = new SinglePageResource(async () => {
940
942
  const room = this.#client.getRoom(roomId);
941
943
  if (room === null) {
942
- throw new Error(`Room '${roomId}' is not available on client`);
944
+ throw new HttpError(
945
+ `Room '${roomId}' is not available on client`,
946
+ 479
947
+ );
943
948
  }
944
949
  const result = await room.getNotificationSettings();
945
950
  this.roomNotificationSettings.update(roomId, result);
@@ -962,7 +967,10 @@ var UmbrellaStore = class {
962
967
  const resource = new SinglePageResource(async () => {
963
968
  const room = this.#client.getRoom(roomId);
964
969
  if (room === null) {
965
- throw new Error(`Room '${roomId}' is not available on client`);
970
+ throw new HttpError(
971
+ `Room '${roomId}' is not available on client`,
972
+ 479
973
+ );
966
974
  }
967
975
  const result = await room[kInternal].listTextVersions();
968
976
  this.historyVersions.update(roomId, result.versions);
@@ -1818,15 +1826,8 @@ function useMarkInboxNotificationAsRead_withClient(client) {
1818
1826
  optimisticId
1819
1827
  );
1820
1828
  },
1821
- (err) => {
1829
+ () => {
1822
1830
  store.optimisticUpdates.remove(optimisticId);
1823
- client[kInternal2].emitError(
1824
- {
1825
- type: "MARK_INBOX_NOTIFICATION_AS_READ_ERROR",
1826
- inboxNotificationId
1827
- },
1828
- err
1829
- );
1830
1831
  }
1831
1832
  );
1832
1833
  },
@@ -1845,13 +1846,8 @@ function useMarkAllInboxNotificationsAsRead_withClient(client) {
1845
1846
  () => {
1846
1847
  store.markAllInboxNotificationsRead(optimisticId, readAt);
1847
1848
  },
1848
- (err) => {
1849
+ () => {
1849
1850
  store.optimisticUpdates.remove(optimisticId);
1850
- client[kInternal2].emitError(
1851
- // No roomId, threadId, commentId to include for this error
1852
- { type: "MARK_ALL_INBOX_NOTIFICATIONS_AS_READ_ERROR" },
1853
- err
1854
- );
1855
1851
  }
1856
1852
  );
1857
1853
  }, [client]);
@@ -1870,12 +1866,8 @@ function useDeleteInboxNotification_withClient(client) {
1870
1866
  () => {
1871
1867
  store.deleteInboxNotification(inboxNotificationId, optimisticId);
1872
1868
  },
1873
- (err) => {
1869
+ () => {
1874
1870
  store.optimisticUpdates.remove(optimisticId);
1875
- client[kInternal2].emitError(
1876
- { type: "DELETE_INBOX_NOTIFICATION_ERROR", inboxNotificationId },
1877
- err
1878
- );
1879
1871
  }
1880
1872
  );
1881
1873
  },
@@ -1894,12 +1886,8 @@ function useDeleteAllInboxNotifications_withClient(client) {
1894
1886
  () => {
1895
1887
  store.deleteAllInboxNotifications(optimisticId);
1896
1888
  },
1897
- (err) => {
1889
+ () => {
1898
1890
  store.optimisticUpdates.remove(optimisticId);
1899
- client[kInternal2].emitError(
1900
- { type: "DELETE_ALL_INBOX_NOTIFICATIONS_ERROR" },
1901
- err
1902
- );
1903
1891
  }
1904
1892
  );
1905
1893
  }, [client]);
@@ -2061,7 +2049,6 @@ function createSharedContext(client) {
2061
2049
  useUser: (userId) => useUser_withClient(client, userId),
2062
2050
  useRoomInfo: (roomId) => useRoomInfo_withClient(client, roomId),
2063
2051
  useIsInsideRoom,
2064
- useErrorListener,
2065
2052
  useSyncStatus: useSyncStatus2
2066
2053
  },
2067
2054
  suspense: {
@@ -2069,7 +2056,6 @@ function createSharedContext(client) {
2069
2056
  useUser: (userId) => useUserSuspense_withClient(client, userId),
2070
2057
  useRoomInfo: (roomId) => useRoomInfoSuspense_withClient(client, roomId),
2071
2058
  useIsInsideRoom,
2072
- useErrorListener,
2073
2059
  useSyncStatus: useSyncStatus2
2074
2060
  }
2075
2061
  };
@@ -2249,14 +2235,104 @@ function useSyncStatusSmooth_withClient(client) {
2249
2235
  function useSyncStatus(options) {
2250
2236
  return useSyncStatus_withClient(useClient(), options);
2251
2237
  }
2252
- function useErrorListener(callback) {
2253
- const client = useClient();
2254
- const savedCallback = useLatest(callback);
2255
- useEffect3(
2256
- () => client.events.error.subscribe((e) => savedCallback.current(e)),
2257
- [client, savedCallback]
2258
- );
2259
- }
2238
+
2239
+ // src/types/errors.ts
2240
+ var CreateThreadError = class extends Error {
2241
+ constructor(cause, context) {
2242
+ super("Create thread failed.");
2243
+ this.cause = cause;
2244
+ this.context = context;
2245
+ this.name = "CreateThreadError";
2246
+ }
2247
+ };
2248
+ var DeleteThreadError = class extends Error {
2249
+ constructor(cause, context) {
2250
+ super("Delete thread failed.");
2251
+ this.cause = cause;
2252
+ this.context = context;
2253
+ this.name = "DeleteThreadError";
2254
+ }
2255
+ };
2256
+ var EditThreadMetadataError = class extends Error {
2257
+ constructor(cause, context) {
2258
+ super("Edit thread metadata failed.");
2259
+ this.cause = cause;
2260
+ this.context = context;
2261
+ this.name = "EditThreadMetadataError";
2262
+ }
2263
+ };
2264
+ var MarkThreadAsResolvedError = class extends Error {
2265
+ constructor(cause, context) {
2266
+ super("Mark thread as resolved failed.");
2267
+ this.cause = cause;
2268
+ this.context = context;
2269
+ this.name = "MarkThreadAsResolvedError";
2270
+ }
2271
+ };
2272
+ var MarkThreadAsUnresolvedError = class extends Error {
2273
+ constructor(cause, context) {
2274
+ super("Mark thread as unresolved failed.");
2275
+ this.cause = cause;
2276
+ this.context = context;
2277
+ this.name = "MarkThreadAsUnresolvedError";
2278
+ }
2279
+ };
2280
+ var CreateCommentError = class extends Error {
2281
+ constructor(cause, context) {
2282
+ super("Create comment failed.");
2283
+ this.cause = cause;
2284
+ this.context = context;
2285
+ this.name = "CreateCommentError";
2286
+ }
2287
+ };
2288
+ var EditCommentError = class extends Error {
2289
+ constructor(cause, context) {
2290
+ super("Edit comment failed.");
2291
+ this.cause = cause;
2292
+ this.context = context;
2293
+ this.name = "EditCommentError";
2294
+ }
2295
+ };
2296
+ var DeleteCommentError = class extends Error {
2297
+ constructor(cause, context) {
2298
+ super("Delete comment failed.");
2299
+ this.cause = cause;
2300
+ this.context = context;
2301
+ this.name = "DeleteCommentError";
2302
+ }
2303
+ };
2304
+ var AddReactionError = class extends Error {
2305
+ constructor(cause, context) {
2306
+ super("Add reaction failed.");
2307
+ this.cause = cause;
2308
+ this.context = context;
2309
+ this.name = "AddReactionError";
2310
+ }
2311
+ };
2312
+ var RemoveReactionError = class extends Error {
2313
+ constructor(cause, context) {
2314
+ super("Remove reaction failed.");
2315
+ this.cause = cause;
2316
+ this.context = context;
2317
+ this.name = "RemoveReactionError";
2318
+ }
2319
+ };
2320
+ var MarkInboxNotificationAsReadError = class extends Error {
2321
+ constructor(cause, context) {
2322
+ super("Mark inbox notification as read failed.");
2323
+ this.cause = cause;
2324
+ this.context = context;
2325
+ this.name = "MarkInboxNotificationAsReadError";
2326
+ }
2327
+ };
2328
+ var UpdateNotificationSettingsError = class extends Error {
2329
+ constructor(cause, context) {
2330
+ super("Update notification settings failed.");
2331
+ this.cause = cause;
2332
+ this.context = context;
2333
+ this.name = "UpdateNotificationSettingsError";
2334
+ }
2335
+ };
2260
2336
 
2261
2337
  // src/room.tsx
2262
2338
  import { shallow as shallow5 } from "@liveblocks/client";
@@ -2267,8 +2343,9 @@ import {
2267
2343
  createThreadId,
2268
2344
  DefaultMap as DefaultMap2,
2269
2345
  errorIf,
2270
- HttpError,
2346
+ HttpError as HttpError2,
2271
2347
  kInternal as kInternal3,
2348
+ makeEventSource,
2272
2349
  makePoller as makePoller2,
2273
2350
  ServerMsgCode
2274
2351
  } from "@liveblocks/core";
@@ -2362,6 +2439,14 @@ function getCurrentUserId(client) {
2362
2439
  }
2363
2440
  return userId;
2364
2441
  }
2442
+ function handleApiError(err) {
2443
+ const message = `Request failed with status ${err.status}: ${err.message}`;
2444
+ if (err.details?.error === "FORBIDDEN") {
2445
+ const detailedMessage = [message, err.details.suggestion, err.details.docs].filter(Boolean).join("\n");
2446
+ console3.error(detailedMessage);
2447
+ }
2448
+ return new Error(message);
2449
+ }
2365
2450
  var _extras2 = /* @__PURE__ */ new WeakMap();
2366
2451
  var _bundles2 = /* @__PURE__ */ new WeakMap();
2367
2452
  function getOrCreateRoomContextBundle(client) {
@@ -2382,21 +2467,19 @@ function getRoomExtrasForClient(client) {
2382
2467
  }
2383
2468
  function makeRoomExtrasForClient(client) {
2384
2469
  const store = getUmbrellaStoreForClient(client);
2385
- function onMutationFailure(optimisticId, context, innerError) {
2470
+ const commentsErrorEventSource = makeEventSource();
2471
+ function onMutationFailure(innerError, optimisticId, createPublicError) {
2386
2472
  store.optimisticUpdates.remove(optimisticId);
2387
- if (innerError instanceof HttpError) {
2388
- if (innerError.status === 403) {
2389
- const detailedMessage = [
2390
- innerError.message,
2391
- innerError.details?.suggestion,
2392
- innerError.details?.docs
2393
- ].filter(Boolean).join("\n");
2394
- console3.error(detailedMessage);
2395
- }
2396
- client[kInternal3].emitError(context, innerError);
2397
- } else {
2398
- throw innerError;
2473
+ if (innerError instanceof HttpError2) {
2474
+ const error = handleApiError(innerError);
2475
+ commentsErrorEventSource.notify(createPublicError(error));
2476
+ return;
2399
2477
  }
2478
+ if (innerError instanceof HttpError2) {
2479
+ handleApiError(innerError);
2480
+ return;
2481
+ }
2482
+ throw innerError;
2400
2483
  }
2401
2484
  const threadsPollersByRoomId = new DefaultMap2(
2402
2485
  (roomId) => makePoller2(
@@ -2442,6 +2525,7 @@ function makeRoomExtrasForClient(client) {
2442
2525
  );
2443
2526
  return {
2444
2527
  store,
2528
+ commentsErrorEventSource: commentsErrorEventSource.observable,
2445
2529
  onMutationFailure,
2446
2530
  getOrCreateThreadsPollerForRoomId: threadsPollersByRoomId.getOrCreate.bind(
2447
2531
  threadsPollersByRoomId
@@ -2467,6 +2551,7 @@ function makeRoomContextBundle(client) {
2467
2551
  useBroadcastEvent,
2468
2552
  useOthersListener,
2469
2553
  useLostConnectionListener,
2554
+ useErrorListener,
2470
2555
  useEventListener,
2471
2556
  useHistory,
2472
2557
  useUndo,
@@ -2512,6 +2597,7 @@ function makeRoomContextBundle(client) {
2512
2597
  useBroadcastEvent,
2513
2598
  useOthersListener,
2514
2599
  useLostConnectionListener,
2600
+ useErrorListener,
2515
2601
  useEventListener,
2516
2602
  useHistory,
2517
2603
  useUndo,
@@ -2547,7 +2633,8 @@ function makeRoomContextBundle(client) {
2547
2633
  useRoomNotificationSettings: useRoomNotificationSettingsSuspense,
2548
2634
  useUpdateRoomNotificationSettings,
2549
2635
  ...shared.suspense
2550
- }
2636
+ },
2637
+ useCommentsErrorListener
2551
2638
  };
2552
2639
  return Object.defineProperty(bundle, kInternal3, {
2553
2640
  enumerable: false
@@ -2808,6 +2895,14 @@ function useLostConnectionListener(callback) {
2808
2895
  [room, savedCallback]
2809
2896
  );
2810
2897
  }
2898
+ function useErrorListener(callback) {
2899
+ const room = useRoom();
2900
+ const savedCallback = useLatest(callback);
2901
+ useEffect5(
2902
+ () => room.events.error.subscribe((e) => savedCallback.current(e)),
2903
+ [room, savedCallback]
2904
+ );
2905
+ }
2811
2906
  function useEventListener(callback) {
2812
2907
  const room = useRoom();
2813
2908
  const savedCallback = useLatest(callback);
@@ -3017,6 +3112,14 @@ function useThreads(options = {}) {
3017
3112
  useScrollToCommentOnLoadEffect(scrollOnLoad, result);
3018
3113
  return result;
3019
3114
  }
3115
+ function useCommentsErrorListener(callback) {
3116
+ const client = useClient();
3117
+ const savedCallback = useLatest(callback);
3118
+ const { commentsErrorEventSource } = getRoomExtrasForClient(client);
3119
+ useEffect5(() => {
3120
+ return commentsErrorEventSource.subscribe(savedCallback.current);
3121
+ }, [savedCallback, commentsErrorEventSource]);
3122
+ }
3020
3123
  function useCreateThread() {
3021
3124
  return useCreateRoomThread(useRoom().id);
3022
3125
  }
@@ -3070,16 +3173,15 @@ function useCreateRoomThread(roomId) {
3070
3173
  store.createThread(optimisticId, thread);
3071
3174
  },
3072
3175
  (err) => onMutationFailure(
3176
+ err,
3073
3177
  optimisticId,
3074
- {
3075
- type: "CREATE_THREAD_ERROR",
3178
+ (err2) => new CreateThreadError(err2, {
3076
3179
  roomId,
3077
3180
  threadId,
3078
3181
  commentId,
3079
3182
  body,
3080
3183
  metadata
3081
- },
3082
- err
3184
+ })
3083
3185
  )
3084
3186
  );
3085
3187
  return newThread;
@@ -3111,9 +3213,9 @@ function useDeleteRoomThread(roomId) {
3111
3213
  store.deleteThread(threadId, optimisticId);
3112
3214
  },
3113
3215
  (err) => onMutationFailure(
3216
+ err,
3114
3217
  optimisticId,
3115
- { type: "DELETE_THREAD_ERROR", roomId, threadId },
3116
- err
3218
+ (err2) => new DeleteThreadError(err2, { roomId, threadId })
3117
3219
  )
3118
3220
  );
3119
3221
  },
@@ -3146,14 +3248,13 @@ function useEditRoomThreadMetadata(roomId) {
3146
3248
  store.patchThread(threadId, optimisticId, { metadata: metadata2 }, updatedAt)
3147
3249
  ),
3148
3250
  (err) => onMutationFailure(
3251
+ err,
3149
3252
  optimisticId,
3150
- {
3151
- type: "EDIT_THREAD_METADATA_ERROR",
3253
+ (error) => new EditThreadMetadataError(error, {
3152
3254
  roomId,
3153
3255
  threadId,
3154
3256
  metadata
3155
- },
3156
- err
3257
+ })
3157
3258
  )
3158
3259
  );
3159
3260
  },
@@ -3191,15 +3292,14 @@ function useCreateRoomComment(roomId) {
3191
3292
  store.createComment(newComment, optimisticId);
3192
3293
  },
3193
3294
  (err) => onMutationFailure(
3295
+ err,
3194
3296
  optimisticId,
3195
- {
3196
- type: "CREATE_COMMENT_ERROR",
3297
+ (err2) => new CreateCommentError(err2, {
3197
3298
  roomId,
3198
3299
  threadId,
3199
3300
  commentId,
3200
3301
  body
3201
- },
3202
- err
3302
+ })
3203
3303
  )
3204
3304
  );
3205
3305
  return comment;
@@ -3247,9 +3347,14 @@ function useEditRoomComment(roomId) {
3247
3347
  store.editComment(threadId, optimisticId, editedComment);
3248
3348
  },
3249
3349
  (err) => onMutationFailure(
3350
+ err,
3250
3351
  optimisticId,
3251
- { type: "EDIT_COMMENT_ERROR", roomId, threadId, commentId, body },
3252
- err
3352
+ (error) => new EditCommentError(error, {
3353
+ roomId,
3354
+ threadId,
3355
+ commentId,
3356
+ body
3357
+ })
3253
3358
  )
3254
3359
  );
3255
3360
  },
@@ -3277,9 +3382,13 @@ function useDeleteRoomComment(roomId) {
3277
3382
  store.deleteComment(threadId, optimisticId, commentId, deletedAt);
3278
3383
  },
3279
3384
  (err) => onMutationFailure(
3385
+ err,
3280
3386
  optimisticId,
3281
- { type: "DELETE_COMMENT_ERROR", roomId, threadId, commentId },
3282
- err
3387
+ (error) => new DeleteCommentError(error, {
3388
+ roomId,
3389
+ threadId,
3390
+ commentId
3391
+ })
3283
3392
  )
3284
3393
  );
3285
3394
  },
@@ -3317,15 +3426,14 @@ function useAddRoomCommentReaction(roomId) {
3317
3426
  );
3318
3427
  },
3319
3428
  (err) => onMutationFailure(
3429
+ err,
3320
3430
  optimisticId,
3321
- {
3322
- type: "ADD_REACTION_ERROR",
3431
+ (error) => new AddReactionError(error, {
3323
3432
  roomId,
3324
3433
  threadId,
3325
3434
  commentId,
3326
3435
  emoji
3327
- },
3328
- err
3436
+ })
3329
3437
  )
3330
3438
  );
3331
3439
  },
@@ -3362,15 +3470,14 @@ function useRemoveRoomCommentReaction(roomId) {
3362
3470
  );
3363
3471
  },
3364
3472
  (err) => onMutationFailure(
3473
+ err,
3365
3474
  optimisticId,
3366
- {
3367
- type: "REMOVE_REACTION_ERROR",
3475
+ (error) => new RemoveReactionError(error, {
3368
3476
  roomId,
3369
3477
  threadId,
3370
3478
  commentId,
3371
3479
  emoji
3372
- },
3373
- err
3480
+ })
3374
3481
  )
3375
3482
  );
3376
3483
  },
@@ -3410,13 +3517,11 @@ function useMarkRoomThreadAsRead(roomId) {
3410
3517
  },
3411
3518
  (err) => {
3412
3519
  onMutationFailure(
3520
+ err,
3413
3521
  optimisticId,
3414
- {
3415
- type: "MARK_INBOX_NOTIFICATION_AS_READ_ERROR",
3416
- roomId,
3522
+ (error) => new MarkInboxNotificationAsReadError(error, {
3417
3523
  inboxNotificationId: inboxNotification.id
3418
- },
3419
- err
3524
+ })
3420
3525
  );
3421
3526
  return;
3422
3527
  }
@@ -3449,9 +3554,12 @@ function useMarkRoomThreadAsResolved(roomId) {
3449
3554
  );
3450
3555
  },
3451
3556
  (err) => onMutationFailure(
3557
+ err,
3452
3558
  optimisticId,
3453
- { type: "MARK_THREAD_AS_RESOLVED_ERROR", roomId, threadId },
3454
- err
3559
+ (error) => new MarkThreadAsResolvedError(error, {
3560
+ roomId,
3561
+ threadId
3562
+ })
3455
3563
  )
3456
3564
  );
3457
3565
  },
@@ -3482,9 +3590,12 @@ function useMarkRoomThreadAsUnresolved(roomId) {
3482
3590
  );
3483
3591
  },
3484
3592
  (err) => onMutationFailure(
3593
+ err,
3485
3594
  optimisticId,
3486
- { type: "MARK_THREAD_AS_UNRESOLVED_ERROR", roomId, threadId },
3487
- err
3595
+ (error) => new MarkThreadAsUnresolvedError(error, {
3596
+ roomId,
3597
+ threadId
3598
+ })
3488
3599
  )
3489
3600
  );
3490
3601
  },
@@ -3634,9 +3745,11 @@ function useUpdateRoomNotificationSettings() {
3634
3745
  store.updateRoomNotificationSettings(room.id, optimisticId, settings2);
3635
3746
  },
3636
3747
  (err) => onMutationFailure(
3748
+ err,
3637
3749
  optimisticId,
3638
- { type: "UPDATE_NOTIFICATION_SETTINGS_ERROR", roomId: room.id },
3639
- err
3750
+ (error) => new UpdateNotificationSettingsError(error, {
3751
+ roomId: room.id
3752
+ })
3640
3753
  )
3641
3754
  );
3642
3755
  },
@@ -3849,7 +3962,7 @@ export {
3849
3962
  _useUserThreads_experimental,
3850
3963
  _useUserThreadsSuspense_experimental,
3851
3964
  useSyncStatus,
3852
- useErrorListener,
3965
+ CreateThreadError,
3853
3966
  useStatus,
3854
3967
  useReportTextEditor,
3855
3968
  useYjsProvider,
@@ -3860,12 +3973,14 @@ export {
3860
3973
  useStorageStatus,
3861
3974
  useBatch,
3862
3975
  useLostConnectionListener,
3976
+ useErrorListener,
3863
3977
  useHistory,
3864
3978
  useUndo,
3865
3979
  useRedo,
3866
3980
  useCanUndo,
3867
3981
  useCanRedo,
3868
3982
  useOthersConnectionIds,
3983
+ useCommentsErrorListener,
3869
3984
  useCreateRoomThread,
3870
3985
  useDeleteRoomThread,
3871
3986
  useEditRoomThreadMetadata,
@@ -3925,4 +4040,4 @@ export {
3925
4040
  _useStorageRoot,
3926
4041
  _useUpdateMyPresence
3927
4042
  };
3928
- //# sourceMappingURL=chunk-JZBPCFEX.mjs.map
4043
+ //# sourceMappingURL=chunk-FQKGWA7O.mjs.map