@liveblocks/core 3.21.0 → 3.22.0-file1

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/index.cjs CHANGED
@@ -6,7 +6,7 @@ var __export = (target, all) => {
6
6
 
7
7
  // src/version.ts
8
8
  var PKG_NAME = "@liveblocks/core";
9
- var PKG_VERSION = "3.21.0";
9
+ var PKG_VERSION = "3.22.0-file1";
10
10
  var PKG_FORMAT = "cjs";
11
11
 
12
12
  // src/dupe-detection.ts
@@ -1309,6 +1309,7 @@ var nanoid = (t = 21) => crypto.getRandomValues(new Uint8Array(t)).reduce(
1309
1309
  var THREAD_ID_PREFIX = "th";
1310
1310
  var COMMENT_ID_PREFIX = "cm";
1311
1311
  var COMMENT_ATTACHMENT_ID_PREFIX = "at";
1312
+ var STORAGE_FILE_ID_PREFIX = "fl";
1312
1313
  var INBOX_NOTIFICATION_ID_PREFIX = "in";
1313
1314
  function createOptimisticId(prefix) {
1314
1315
  return `${prefix}_${nanoid()}`;
@@ -1322,6 +1323,9 @@ function createCommentId() {
1322
1323
  function createCommentAttachmentId() {
1323
1324
  return createOptimisticId(COMMENT_ATTACHMENT_ID_PREFIX);
1324
1325
  }
1326
+ function createStorageFileId() {
1327
+ return createOptimisticId(STORAGE_FILE_ID_PREFIX);
1328
+ }
1325
1329
  function createInboxNotificationId() {
1326
1330
  return createOptimisticId(INBOX_NOTIFICATION_ID_PREFIX);
1327
1331
  }
@@ -1567,6 +1571,120 @@ function isUrl(string) {
1567
1571
  }
1568
1572
 
1569
1573
  // src/api-client.ts
1574
+ var ROOM_FILE_PART_SIZE = 5 * 1024 * 1024;
1575
+ var ROOM_FILE_RETRY_ATTEMPTS = 10;
1576
+ var ROOM_FILE_RETRY_DELAYS = [
1577
+ 2e3,
1578
+ 2e3,
1579
+ 2e3,
1580
+ 2e3,
1581
+ 2e3,
1582
+ 2e3,
1583
+ 2e3,
1584
+ 2e3,
1585
+ 2e3,
1586
+ 2e3
1587
+ ];
1588
+ async function uploadRoomFile({
1589
+ file,
1590
+ signal,
1591
+ abortErrorMessage,
1592
+ uploadSingle,
1593
+ createMultipartUpload,
1594
+ uploadMultipartPart,
1595
+ completeMultipartUpload,
1596
+ abortMultipartUpload
1597
+ }) {
1598
+ const abortError = createAbortError(abortErrorMessage);
1599
+ if (_optionalChain([signal, 'optionalAccess', _15 => _15.aborted])) {
1600
+ throw abortError;
1601
+ }
1602
+ const handleRetryError = (err) => {
1603
+ if (_optionalChain([signal, 'optionalAccess', _16 => _16.aborted])) {
1604
+ throw abortError;
1605
+ }
1606
+ if (err instanceof HttpError && err.status === 413) {
1607
+ throw err;
1608
+ }
1609
+ return false;
1610
+ };
1611
+ if (file.size <= ROOM_FILE_PART_SIZE) {
1612
+ return autoRetry(
1613
+ uploadSingle,
1614
+ ROOM_FILE_RETRY_ATTEMPTS,
1615
+ ROOM_FILE_RETRY_DELAYS,
1616
+ handleRetryError
1617
+ );
1618
+ }
1619
+ let uploadId;
1620
+ const uploadedParts = [];
1621
+ const multipartUpload = await autoRetry(
1622
+ createMultipartUpload,
1623
+ ROOM_FILE_RETRY_ATTEMPTS,
1624
+ ROOM_FILE_RETRY_DELAYS,
1625
+ handleRetryError
1626
+ );
1627
+ try {
1628
+ uploadId = multipartUpload.uploadId;
1629
+ if (_optionalChain([signal, 'optionalAccess', _17 => _17.aborted])) {
1630
+ throw abortError;
1631
+ }
1632
+ const batches = chunk(splitFileIntoParts(file), 5);
1633
+ for (const parts of batches) {
1634
+ const uploadedPartsPromises = [];
1635
+ for (const { part, partNumber } of parts) {
1636
+ uploadedPartsPromises.push(
1637
+ autoRetry(
1638
+ () => uploadMultipartPart(multipartUpload.uploadId, partNumber, part),
1639
+ ROOM_FILE_RETRY_ATTEMPTS,
1640
+ ROOM_FILE_RETRY_DELAYS,
1641
+ handleRetryError
1642
+ )
1643
+ );
1644
+ }
1645
+ uploadedParts.push(...await Promise.all(uploadedPartsPromises));
1646
+ }
1647
+ if (_optionalChain([signal, 'optionalAccess', _18 => _18.aborted])) {
1648
+ throw abortError;
1649
+ }
1650
+ return completeMultipartUpload(
1651
+ uploadId,
1652
+ uploadedParts.sort((a, b) => a.partNumber - b.partNumber)
1653
+ );
1654
+ } catch (error3) {
1655
+ if (uploadId && isAbortOrTimeoutError(error3)) {
1656
+ try {
1657
+ await abortMultipartUpload(uploadId);
1658
+ } catch (e8) {
1659
+ }
1660
+ }
1661
+ throw error3;
1662
+ }
1663
+ }
1664
+ function splitFileIntoParts(file) {
1665
+ const parts = [];
1666
+ let start = 0;
1667
+ while (start < file.size) {
1668
+ const end = Math.min(start + ROOM_FILE_PART_SIZE, file.size);
1669
+ parts.push({
1670
+ partNumber: parts.length + 1,
1671
+ part: file.slice(start, end)
1672
+ });
1673
+ start = end;
1674
+ }
1675
+ return parts;
1676
+ }
1677
+ function isAbortOrTimeoutError(error3) {
1678
+ return error3 instanceof Error && (error3.name === "AbortError" || error3.name === "TimeoutError");
1679
+ }
1680
+ function createAbortError(message) {
1681
+ if (typeof DOMException === "function") {
1682
+ return new DOMException(message, "AbortError");
1683
+ }
1684
+ const error3 = new Error(message);
1685
+ error3.name = "AbortError";
1686
+ return error3;
1687
+ }
1570
1688
  function commentsResourceForVisibility(visibility) {
1571
1689
  if (visibility === "private") {
1572
1690
  return "comments:private";
@@ -1627,7 +1745,7 @@ function createApiClient({
1627
1745
  url`/v2/c/rooms/${options.roomId}/threads`,
1628
1746
  await authManager.getAuthValue({
1629
1747
  roomId: options.roomId,
1630
- resource: commentsResourceForVisibility(_optionalChain([options, 'access', _15 => _15.query, 'optionalAccess', _16 => _16.visibility])),
1748
+ resource: commentsResourceForVisibility(_optionalChain([options, 'access', _19 => _19.query, 'optionalAccess', _20 => _20.visibility])),
1631
1749
  access: "read"
1632
1750
  }),
1633
1751
  {
@@ -1685,7 +1803,7 @@ function createApiClient({
1685
1803
  hasMentions: options.query.hasMentions
1686
1804
  })
1687
1805
  },
1688
- { signal: _optionalChain([requestOptions, 'optionalAccess', _17 => _17.signal]) }
1806
+ { signal: _optionalChain([requestOptions, 'optionalAccess', _21 => _21.signal]) }
1689
1807
  );
1690
1808
  return result;
1691
1809
  }
@@ -1882,151 +2000,128 @@ function createApiClient({
1882
2000
  }
1883
2001
  async function uploadAttachment(options) {
1884
2002
  const roomId = options.roomId;
1885
- const abortSignal = options.signal;
1886
2003
  const attachment = options.attachment;
1887
- const abortError = abortSignal ? new DOMException(
1888
- `Upload of attachment ${options.attachment.id} was aborted.`,
1889
- "AbortError"
1890
- ) : void 0;
1891
- if (_optionalChain([abortSignal, 'optionalAccess', _18 => _18.aborted])) {
1892
- throw abortError;
1893
- }
1894
- const handleRetryError = (err) => {
1895
- if (_optionalChain([abortSignal, 'optionalAccess', _19 => _19.aborted])) {
1896
- throw abortError;
1897
- }
1898
- if (err instanceof HttpError && err.status === 413) {
1899
- throw err;
1900
- }
1901
- return false;
1902
- };
1903
- const ATTACHMENT_PART_SIZE = 5 * 1024 * 1024;
1904
- const RETRY_ATTEMPTS = 10;
1905
- const RETRY_DELAYS = [
1906
- 2e3,
1907
- 2e3,
1908
- 2e3,
1909
- 2e3,
1910
- 2e3,
1911
- 2e3,
1912
- 2e3,
1913
- 2e3,
1914
- 2e3,
1915
- 2e3
1916
- ];
1917
- function splitFileIntoParts(file) {
1918
- const parts = [];
1919
- let start = 0;
1920
- while (start < file.size) {
1921
- const end = Math.min(start + ATTACHMENT_PART_SIZE, file.size);
1922
- parts.push({
1923
- partNumber: parts.length + 1,
1924
- part: file.slice(start, end)
1925
- });
1926
- start = end;
1927
- }
1928
- return parts;
1929
- }
1930
- if (attachment.size <= ATTACHMENT_PART_SIZE) {
1931
- return autoRetry(
1932
- async () => httpClient.putBlob(
1933
- url`/v2/c/rooms/${roomId}/attachments/${attachment.id}/upload/${encodeURIComponent(attachment.name)}`,
1934
- await authManager.getAuthValue({
1935
- roomId,
1936
- resource: "comments",
1937
- access: "write"
1938
- }),
1939
- attachment.file,
1940
- { fileSize: attachment.size },
1941
- { signal: abortSignal }
1942
- ),
1943
- RETRY_ATTEMPTS,
1944
- RETRY_DELAYS,
1945
- handleRetryError
1946
- );
1947
- } else {
1948
- let uploadId;
1949
- const uploadedParts = [];
1950
- const createMultiPartUpload = await autoRetry(
1951
- async () => httpClient.post(
1952
- url`/v2/c/rooms/${roomId}/attachments/${attachment.id}/multipart/${encodeURIComponent(attachment.name)}`,
2004
+ return uploadRoomFile({
2005
+ file: attachment.file,
2006
+ signal: options.signal,
2007
+ abortErrorMessage: `Upload of attachment ${attachment.id} was aborted.`,
2008
+ uploadSingle: async () => httpClient.putBlob(
2009
+ url`/v2/c/rooms/${roomId}/attachments/${attachment.id}/upload/${encodeURIComponent(attachment.name)}`,
2010
+ await authManager.getAuthValue({
2011
+ roomId,
2012
+ resource: "comments",
2013
+ access: "write"
2014
+ }),
2015
+ attachment.file,
2016
+ { fileSize: attachment.size },
2017
+ { signal: options.signal }
2018
+ ),
2019
+ createMultipartUpload: async () => httpClient.post(
2020
+ url`/v2/c/rooms/${roomId}/attachments/${attachment.id}/multipart/${encodeURIComponent(attachment.name)}`,
2021
+ await authManager.getAuthValue({
2022
+ roomId,
2023
+ resource: "comments",
2024
+ access: "write"
2025
+ }),
2026
+ void 0,
2027
+ { signal: options.signal },
2028
+ { fileSize: attachment.size }
2029
+ ),
2030
+ uploadMultipartPart: async (uploadId, partNumber, part) => httpClient.putBlob(
2031
+ url`/v2/c/rooms/${roomId}/attachments/${attachment.id}/multipart/${uploadId}/${String(partNumber)}`,
2032
+ await authManager.getAuthValue({
2033
+ roomId,
2034
+ resource: "comments",
2035
+ access: "write"
2036
+ }),
2037
+ part,
2038
+ void 0,
2039
+ { signal: options.signal }
2040
+ ),
2041
+ completeMultipartUpload: async (uploadId, parts) => httpClient.post(
2042
+ url`/v2/c/rooms/${roomId}/attachments/${attachment.id}/multipart/${uploadId}/complete`,
2043
+ await authManager.getAuthValue({
2044
+ roomId,
2045
+ resource: "comments",
2046
+ access: "write"
2047
+ }),
2048
+ { parts },
2049
+ { signal: options.signal }
2050
+ ),
2051
+ abortMultipartUpload: async (uploadId) => {
2052
+ await httpClient.rawDelete(
2053
+ url`/v2/c/rooms/${roomId}/attachments/${attachment.id}/multipart/${uploadId}`,
1953
2054
  await authManager.getAuthValue({
1954
2055
  roomId,
1955
2056
  resource: "comments",
1956
2057
  access: "write"
1957
- }),
1958
- void 0,
1959
- { signal: abortSignal },
1960
- { fileSize: attachment.size }
1961
- ),
1962
- RETRY_ATTEMPTS,
1963
- RETRY_DELAYS,
1964
- handleRetryError
1965
- );
1966
- try {
1967
- uploadId = createMultiPartUpload.uploadId;
1968
- const parts = splitFileIntoParts(attachment.file);
1969
- if (_optionalChain([abortSignal, 'optionalAccess', _20 => _20.aborted])) {
1970
- throw abortError;
1971
- }
1972
- const batches = chunk(parts, 5);
1973
- for (const parts2 of batches) {
1974
- const uploadedPartsPromises = [];
1975
- for (const { part, partNumber } of parts2) {
1976
- uploadedPartsPromises.push(
1977
- autoRetry(
1978
- async () => httpClient.putBlob(
1979
- url`/v2/c/rooms/${roomId}/attachments/${attachment.id}/multipart/${createMultiPartUpload.uploadId}/${String(partNumber)}`,
1980
- await authManager.getAuthValue({
1981
- roomId,
1982
- resource: "comments",
1983
- access: "write"
1984
- }),
1985
- part,
1986
- void 0,
1987
- { signal: abortSignal }
1988
- ),
1989
- RETRY_ATTEMPTS,
1990
- RETRY_DELAYS,
1991
- handleRetryError
1992
- )
1993
- );
1994
- }
1995
- uploadedParts.push(...await Promise.all(uploadedPartsPromises));
1996
- }
1997
- if (_optionalChain([abortSignal, 'optionalAccess', _21 => _21.aborted])) {
1998
- throw abortError;
1999
- }
2000
- const sortedUploadedParts = uploadedParts.sort(
2001
- (a, b) => a.partNumber - b.partNumber
2058
+ })
2002
2059
  );
2003
- return httpClient.post(
2004
- url`/v2/c/rooms/${roomId}/attachments/${attachment.id}/multipart/${uploadId}/complete`,
2060
+ }
2061
+ });
2062
+ }
2063
+ async function uploadFile(options) {
2064
+ const roomId = options.roomId;
2065
+ const file = options.file;
2066
+ const fileId = createStorageFileId();
2067
+ return uploadRoomFile({
2068
+ file,
2069
+ signal: options.signal,
2070
+ abortErrorMessage: `Upload of file ${fileId} was aborted.`,
2071
+ uploadSingle: async () => httpClient.putBlob(
2072
+ url`/v2/c/rooms/${roomId}/storage-files/${fileId}/upload/${encodeURIComponent(file.name)}`,
2073
+ await authManager.getAuthValue({
2074
+ roomId,
2075
+ resource: "storage",
2076
+ access: "write"
2077
+ }),
2078
+ file,
2079
+ { fileSize: file.size },
2080
+ { signal: options.signal }
2081
+ ),
2082
+ createMultipartUpload: async () => httpClient.post(
2083
+ url`/v2/c/rooms/${roomId}/storage-files/${fileId}/multipart/${encodeURIComponent(file.name)}`,
2084
+ await authManager.getAuthValue({
2085
+ roomId,
2086
+ resource: "storage",
2087
+ access: "write"
2088
+ }),
2089
+ void 0,
2090
+ { signal: options.signal },
2091
+ { fileSize: file.size }
2092
+ ),
2093
+ uploadMultipartPart: async (uploadId, partNumber, part) => httpClient.putBlob(
2094
+ url`/v2/c/rooms/${roomId}/storage-files/${fileId}/multipart/${uploadId}/${String(partNumber)}`,
2095
+ await authManager.getAuthValue({
2096
+ roomId,
2097
+ resource: "storage",
2098
+ access: "write"
2099
+ }),
2100
+ part,
2101
+ void 0,
2102
+ { signal: options.signal }
2103
+ ),
2104
+ completeMultipartUpload: async (uploadId, parts) => httpClient.post(
2105
+ url`/v2/c/rooms/${roomId}/storage-files/${fileId}/multipart/${uploadId}/complete`,
2106
+ await authManager.getAuthValue({
2107
+ roomId,
2108
+ resource: "storage",
2109
+ access: "write"
2110
+ }),
2111
+ { parts },
2112
+ { signal: options.signal }
2113
+ ),
2114
+ abortMultipartUpload: async (uploadId) => {
2115
+ await httpClient.rawDelete(
2116
+ url`/v2/c/rooms/${roomId}/storage-files/${fileId}/multipart/${uploadId}`,
2005
2117
  await authManager.getAuthValue({
2006
2118
  roomId,
2007
- resource: "comments",
2119
+ resource: "storage",
2008
2120
  access: "write"
2009
- }),
2010
- { parts: sortedUploadedParts },
2011
- { signal: abortSignal }
2121
+ })
2012
2122
  );
2013
- } catch (error3) {
2014
- if (uploadId && _optionalChain([error3, 'optionalAccess', _22 => _22.name]) && (error3.name === "AbortError" || error3.name === "TimeoutError")) {
2015
- try {
2016
- await httpClient.rawDelete(
2017
- url`/v2/c/rooms/${roomId}/attachments/${attachment.id}/multipart/${uploadId}`,
2018
- await authManager.getAuthValue({
2019
- roomId,
2020
- resource: "comments",
2021
- access: "write"
2022
- })
2023
- );
2024
- } catch (e8) {
2025
- }
2026
- }
2027
- throw error3;
2028
2123
  }
2029
- }
2124
+ });
2030
2125
  }
2031
2126
  const attachmentUrlsBatchStoresByRoom = new DefaultMap((roomId) => {
2032
2127
  const batch2 = new Batch(
@@ -2056,6 +2151,34 @@ function createApiClient({
2056
2151
  const batch2 = getOrCreateAttachmentUrlsStore(options.roomId).batch;
2057
2152
  return batch2.get(options.attachmentId);
2058
2153
  }
2154
+ const fileUrlsBatchStoresByRoom = new DefaultMap((roomId) => {
2155
+ const batch2 = new Batch(
2156
+ async (batchedFileIds) => {
2157
+ const fileIds = batchedFileIds.flat();
2158
+ const { urls } = await httpClient.post(
2159
+ url`/v2/c/rooms/${roomId}/storage-files/presigned-urls`,
2160
+ await authManager.getAuthValue({
2161
+ roomId,
2162
+ resource: "storage",
2163
+ access: "read"
2164
+ }),
2165
+ { fileIds }
2166
+ );
2167
+ return urls.map(
2168
+ (url2) => _nullishCoalesce(url2, () => ( new Error("There was an error while getting this file's URL")))
2169
+ );
2170
+ },
2171
+ { delay: 50 }
2172
+ );
2173
+ return createBatchStore(batch2);
2174
+ });
2175
+ function getOrCreateFileUrlsStore(roomId) {
2176
+ return fileUrlsBatchStoresByRoom.getOrCreate(roomId);
2177
+ }
2178
+ function getFileUrl(options) {
2179
+ const batch2 = getOrCreateFileUrlsStore(options.roomId).batch;
2180
+ return batch2.get(options.fileId);
2181
+ }
2059
2182
  async function getSubscriptionSettings(options) {
2060
2183
  return httpClient.get(
2061
2184
  url`/v2/c/rooms/${options.roomId}/subscription-settings`,
@@ -2244,14 +2367,14 @@ function createApiClient({
2244
2367
  async function getInboxNotifications(options) {
2245
2368
  const PAGE_SIZE = 50;
2246
2369
  let query;
2247
- if (_optionalChain([options, 'optionalAccess', _23 => _23.query])) {
2370
+ if (_optionalChain([options, 'optionalAccess', _22 => _22.query])) {
2248
2371
  query = objectToQuery(options.query);
2249
2372
  }
2250
2373
  const json = await httpClient.get(
2251
2374
  url`/v2/c/inbox-notifications`,
2252
2375
  await authManager.getAuthValue({ resource: "personal", access: "write" }),
2253
2376
  {
2254
- cursor: _optionalChain([options, 'optionalAccess', _24 => _24.cursor]),
2377
+ cursor: _optionalChain([options, 'optionalAccess', _23 => _23.cursor]),
2255
2378
  limit: PAGE_SIZE,
2256
2379
  query
2257
2380
  }
@@ -2270,7 +2393,7 @@ function createApiClient({
2270
2393
  }
2271
2394
  async function getInboxNotificationsSince(options) {
2272
2395
  let query;
2273
- if (_optionalChain([options, 'optionalAccess', _25 => _25.query])) {
2396
+ if (_optionalChain([options, 'optionalAccess', _24 => _24.query])) {
2274
2397
  query = objectToQuery(options.query);
2275
2398
  }
2276
2399
  const json = await httpClient.get(
@@ -2299,14 +2422,14 @@ function createApiClient({
2299
2422
  }
2300
2423
  async function getUnreadInboxNotificationsCount(options) {
2301
2424
  let query;
2302
- if (_optionalChain([options, 'optionalAccess', _26 => _26.query])) {
2425
+ if (_optionalChain([options, 'optionalAccess', _25 => _25.query])) {
2303
2426
  query = objectToQuery(options.query);
2304
2427
  }
2305
2428
  const { count } = await httpClient.get(
2306
2429
  url`/v2/c/inbox-notifications/count`,
2307
2430
  await authManager.getAuthValue({ resource: "personal", access: "write" }),
2308
2431
  { query },
2309
- { signal: _optionalChain([options, 'optionalAccess', _27 => _27.signal]) }
2432
+ { signal: _optionalChain([options, 'optionalAccess', _26 => _26.signal]) }
2310
2433
  );
2311
2434
  return count;
2312
2435
  }
@@ -2356,7 +2479,7 @@ function createApiClient({
2356
2479
  url`/v2/c/notification-settings`,
2357
2480
  await authManager.getAuthValue({ resource: "personal", access: "write" }),
2358
2481
  void 0,
2359
- { signal: _optionalChain([options, 'optionalAccess', _28 => _28.signal]) }
2482
+ { signal: _optionalChain([options, 'optionalAccess', _27 => _27.signal]) }
2360
2483
  );
2361
2484
  }
2362
2485
  async function updateNotificationSettings(settings) {
@@ -2368,7 +2491,7 @@ function createApiClient({
2368
2491
  }
2369
2492
  async function getUserThreads_experimental(options) {
2370
2493
  let query;
2371
- if (_optionalChain([options, 'optionalAccess', _29 => _29.query])) {
2494
+ if (_optionalChain([options, 'optionalAccess', _28 => _28.query])) {
2372
2495
  query = objectToQuery(options.query);
2373
2496
  }
2374
2497
  const PAGE_SIZE = 50;
@@ -2376,7 +2499,7 @@ function createApiClient({
2376
2499
  url`/v2/c/threads`,
2377
2500
  await authManager.getAuthValue({ resource: "personal", access: "write" }),
2378
2501
  {
2379
- cursor: _optionalChain([options, 'optionalAccess', _30 => _30.cursor]),
2502
+ cursor: _optionalChain([options, 'optionalAccess', _29 => _29.cursor]),
2380
2503
  query,
2381
2504
  limit: PAGE_SIZE
2382
2505
  }
@@ -2484,6 +2607,10 @@ function createApiClient({
2484
2607
  getAttachmentUrl,
2485
2608
  uploadAttachment,
2486
2609
  getOrCreateAttachmentUrlsStore,
2610
+ // Room storage files
2611
+ getFileUrl,
2612
+ uploadFile,
2613
+ getOrCreateFileUrlsStore,
2487
2614
  // Room storage
2488
2615
  streamStorage,
2489
2616
  // Notifications
@@ -2549,7 +2676,7 @@ var HttpClient = class {
2549
2676
  // These headers are default, but can be overriden by custom headers
2550
2677
  "Content-Type": "application/json; charset=utf-8",
2551
2678
  // Possible header overrides
2552
- ..._optionalChain([options, 'optionalAccess', _31 => _31.headers]),
2679
+ ..._optionalChain([options, 'optionalAccess', _30 => _30.headers]),
2553
2680
  // Cannot be overriden by custom headers
2554
2681
  Authorization: `Bearer ${getBearerTokenFromAuthValue(authValue)}`,
2555
2682
  "X-LB-Client": PKG_VERSION || "dev"
@@ -2557,7 +2684,7 @@ var HttpClient = class {
2557
2684
  });
2558
2685
  const xwarn = response.headers.get("X-LB-Warn");
2559
2686
  if (xwarn) {
2560
- const method = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _32 => _32.method, 'optionalAccess', _33 => _33.toUpperCase, 'call', _34 => _34()]), () => ( "GET"));
2687
+ const method = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _31 => _31.method, 'optionalAccess', _32 => _32.toUpperCase, 'call', _33 => _33()]), () => ( "GET"));
2561
2688
  const msg = `${xwarn} (${method} ${endpoint})`;
2562
2689
  if (response.ok) {
2563
2690
  warn(msg);
@@ -3039,7 +3166,7 @@ var FSM = class {
3039
3166
  });
3040
3167
  }
3041
3168
  #getTargetFn(eventName) {
3042
- return _optionalChain([this, 'access', _35 => _35.#allowedTransitions, 'access', _36 => _36.get, 'call', _37 => _37(this.currentState), 'optionalAccess', _38 => _38.get, 'call', _39 => _39(eventName)]);
3169
+ return _optionalChain([this, 'access', _34 => _34.#allowedTransitions, 'access', _35 => _35.get, 'call', _36 => _36(this.currentState), 'optionalAccess', _37 => _37.get, 'call', _38 => _38(eventName)]);
3043
3170
  }
3044
3171
  /**
3045
3172
  * Exits the current state, and executes any necessary cleanup functions.
@@ -3058,7 +3185,7 @@ var FSM = class {
3058
3185
  this.#currentContext.allowPatching((patchableContext) => {
3059
3186
  levels = _nullishCoalesce(levels, () => ( this.#cleanupStack.length));
3060
3187
  for (let i = 0; i < levels; i++) {
3061
- _optionalChain([this, 'access', _40 => _40.#cleanupStack, 'access', _41 => _41.pop, 'call', _42 => _42(), 'optionalCall', _43 => _43(patchableContext)]);
3188
+ _optionalChain([this, 'access', _39 => _39.#cleanupStack, 'access', _40 => _40.pop, 'call', _41 => _41(), 'optionalCall', _42 => _42(patchableContext)]);
3062
3189
  const entryTime = this.#entryTimesStack.pop();
3063
3190
  if (entryTime !== void 0 && // ...but avoid computing state names if nobody is listening
3064
3191
  this.#eventHub.didExitState.count() > 0) {
@@ -3086,7 +3213,7 @@ var FSM = class {
3086
3213
  this.#currentContext.allowPatching((patchableContext) => {
3087
3214
  for (const pattern of enterPatterns) {
3088
3215
  const enterFn = this.#enterFns.get(pattern);
3089
- const cleanupFn = _optionalChain([enterFn, 'optionalCall', _44 => _44(patchableContext)]);
3216
+ const cleanupFn = _optionalChain([enterFn, 'optionalCall', _43 => _43(patchableContext)]);
3090
3217
  if (typeof cleanupFn === "function") {
3091
3218
  this.#cleanupStack.push(cleanupFn);
3092
3219
  } else {
@@ -3513,7 +3640,7 @@ function createConnectionStateMachine(delegates, options) {
3513
3640
  }
3514
3641
  function waitForActorId(event) {
3515
3642
  const serverMsg = tryParseJson(event.data);
3516
- if (_optionalChain([serverMsg, 'optionalAccess', _45 => _45.type]) === ServerMsgCode.ROOM_STATE) {
3643
+ if (_optionalChain([serverMsg, 'optionalAccess', _44 => _44.type]) === ServerMsgCode.ROOM_STATE) {
3517
3644
  if (options.enableDebugLogging && socketOpenAt !== null) {
3518
3645
  const elapsed = performance.now() - socketOpenAt;
3519
3646
  warn(
@@ -3641,12 +3768,12 @@ function createConnectionStateMachine(delegates, options) {
3641
3768
  const sendHeartbeat = {
3642
3769
  target: "@ok.awaiting-pong",
3643
3770
  effect: (ctx) => {
3644
- _optionalChain([ctx, 'access', _46 => _46.socket, 'optionalAccess', _47 => _47.send, 'call', _48 => _48("ping")]);
3771
+ _optionalChain([ctx, 'access', _45 => _45.socket, 'optionalAccess', _46 => _46.send, 'call', _47 => _47("ping")]);
3645
3772
  }
3646
3773
  };
3647
3774
  const maybeHeartbeat = () => {
3648
3775
  const doc = typeof document !== "undefined" ? document : void 0;
3649
- const canZombie = _optionalChain([doc, 'optionalAccess', _49 => _49.visibilityState]) === "hidden" && delegates.canZombie();
3776
+ const canZombie = _optionalChain([doc, 'optionalAccess', _48 => _48.visibilityState]) === "hidden" && delegates.canZombie();
3650
3777
  return canZombie ? "@idle.zombie" : sendHeartbeat;
3651
3778
  };
3652
3779
  machine.addTimedTransition("@ok.connected", HEARTBEAT_INTERVAL, maybeHeartbeat).addTransitions("@ok.connected", {
@@ -3686,7 +3813,7 @@ function createConnectionStateMachine(delegates, options) {
3686
3813
  // socket, or not. So always check to see if the socket is still OPEN or
3687
3814
  // not. When still OPEN, don't transition.
3688
3815
  EXPLICIT_SOCKET_ERROR: (_, context) => {
3689
- if (_optionalChain([context, 'access', _50 => _50.socket, 'optionalAccess', _51 => _51.readyState]) === 1) {
3816
+ if (_optionalChain([context, 'access', _49 => _49.socket, 'optionalAccess', _50 => _50.readyState]) === 1) {
3690
3817
  return IGNORE;
3691
3818
  }
3692
3819
  return {
@@ -3738,17 +3865,17 @@ function createConnectionStateMachine(delegates, options) {
3738
3865
  machine.send({ type: "NAVIGATOR_ONLINE" });
3739
3866
  }
3740
3867
  function onVisibilityChange() {
3741
- if (_optionalChain([doc, 'optionalAccess', _52 => _52.visibilityState]) === "visible") {
3868
+ if (_optionalChain([doc, 'optionalAccess', _51 => _51.visibilityState]) === "visible") {
3742
3869
  machine.send({ type: "WINDOW_GOT_FOCUS" });
3743
3870
  }
3744
3871
  }
3745
- _optionalChain([win, 'optionalAccess', _53 => _53.addEventListener, 'call', _54 => _54("online", onNetworkBackOnline)]);
3746
- _optionalChain([win, 'optionalAccess', _55 => _55.addEventListener, 'call', _56 => _56("offline", onNetworkOffline)]);
3747
- _optionalChain([root, 'optionalAccess', _57 => _57.addEventListener, 'call', _58 => _58("visibilitychange", onVisibilityChange)]);
3872
+ _optionalChain([win, 'optionalAccess', _52 => _52.addEventListener, 'call', _53 => _53("online", onNetworkBackOnline)]);
3873
+ _optionalChain([win, 'optionalAccess', _54 => _54.addEventListener, 'call', _55 => _55("offline", onNetworkOffline)]);
3874
+ _optionalChain([root, 'optionalAccess', _56 => _56.addEventListener, 'call', _57 => _57("visibilitychange", onVisibilityChange)]);
3748
3875
  return () => {
3749
- _optionalChain([root, 'optionalAccess', _59 => _59.removeEventListener, 'call', _60 => _60("visibilitychange", onVisibilityChange)]);
3750
- _optionalChain([win, 'optionalAccess', _61 => _61.removeEventListener, 'call', _62 => _62("online", onNetworkBackOnline)]);
3751
- _optionalChain([win, 'optionalAccess', _63 => _63.removeEventListener, 'call', _64 => _64("offline", onNetworkOffline)]);
3876
+ _optionalChain([root, 'optionalAccess', _58 => _58.removeEventListener, 'call', _59 => _59("visibilitychange", onVisibilityChange)]);
3877
+ _optionalChain([win, 'optionalAccess', _60 => _60.removeEventListener, 'call', _61 => _61("online", onNetworkBackOnline)]);
3878
+ _optionalChain([win, 'optionalAccess', _62 => _62.removeEventListener, 'call', _63 => _63("offline", onNetworkOffline)]);
3752
3879
  teardownSocket(ctx.socket);
3753
3880
  };
3754
3881
  });
@@ -3837,7 +3964,7 @@ var ManagedSocket = class {
3837
3964
  * message if this is somehow impossible.
3838
3965
  */
3839
3966
  send(data) {
3840
- const socket = _optionalChain([this, 'access', _65 => _65.#machine, 'access', _66 => _66.context, 'optionalAccess', _67 => _67.socket]);
3967
+ const socket = _optionalChain([this, 'access', _64 => _64.#machine, 'access', _65 => _65.context, 'optionalAccess', _66 => _66.socket]);
3841
3968
  if (socket === null) {
3842
3969
  warn("Cannot send: not connected yet", data);
3843
3970
  } else if (socket.readyState !== 1) {
@@ -4299,7 +4426,7 @@ function createStore_forKnowledge() {
4299
4426
  }
4300
4427
  function getKnowledgeForChat(chatId) {
4301
4428
  const globalKnowledge = knowledgeByChatId.getOrCreate(kWILDCARD).get();
4302
- const scopedKnowledge = _nullishCoalesce(_optionalChain([knowledgeByChatId, 'access', _68 => _68.get, 'call', _69 => _69(chatId), 'optionalAccess', _70 => _70.get, 'call', _71 => _71()]), () => ( []));
4429
+ const scopedKnowledge = _nullishCoalesce(_optionalChain([knowledgeByChatId, 'access', _67 => _67.get, 'call', _68 => _68(chatId), 'optionalAccess', _69 => _69.get, 'call', _70 => _70()]), () => ( []));
4303
4430
  return [...globalKnowledge, ...scopedKnowledge];
4304
4431
  }
4305
4432
  return {
@@ -4324,7 +4451,7 @@ function createStore_forTools() {
4324
4451
  return DerivedSignal.from(() => {
4325
4452
  return (
4326
4453
  // A tool that's registered and scoped to a specific chat ID...
4327
- _nullishCoalesce(_optionalChain([(chatId !== void 0 ? toolsByChatId\u03A3.getOrCreate(chatId).getOrCreate(name) : void 0), 'optionalAccess', _72 => _72.get, 'call', _73 => _73()]), () => ( // ...or a globally registered tool
4454
+ _nullishCoalesce(_optionalChain([(chatId !== void 0 ? toolsByChatId\u03A3.getOrCreate(chatId).getOrCreate(name) : void 0), 'optionalAccess', _71 => _71.get, 'call', _72 => _72()]), () => ( // ...or a globally registered tool
4328
4455
  toolsByChatId\u03A3.getOrCreate(kWILDCARD).getOrCreate(name).get()))
4329
4456
  );
4330
4457
  });
@@ -4354,8 +4481,8 @@ function createStore_forTools() {
4354
4481
  const globalTools\u03A3 = toolsByChatId\u03A3.get(kWILDCARD);
4355
4482
  const scopedTools\u03A3 = toolsByChatId\u03A3.get(chatId);
4356
4483
  return Array.from([
4357
- ..._nullishCoalesce(_optionalChain([globalTools\u03A3, 'optionalAccess', _74 => _74.entries, 'call', _75 => _75()]), () => ( [])),
4358
- ..._nullishCoalesce(_optionalChain([scopedTools\u03A3, 'optionalAccess', _76 => _76.entries, 'call', _77 => _77()]), () => ( []))
4484
+ ..._nullishCoalesce(_optionalChain([globalTools\u03A3, 'optionalAccess', _73 => _73.entries, 'call', _74 => _74()]), () => ( [])),
4485
+ ..._nullishCoalesce(_optionalChain([scopedTools\u03A3, 'optionalAccess', _75 => _75.entries, 'call', _76 => _76()]), () => ( []))
4359
4486
  ]).flatMap(([name, tool\u03A3]) => {
4360
4487
  const tool = tool\u03A3.get();
4361
4488
  return tool && (_nullishCoalesce(tool.enabled, () => ( true))) ? [{ name, description: tool.description, parameters: tool.parameters }] : [];
@@ -4458,7 +4585,7 @@ function createStore_forChatMessages(toolsStore, setToolResultFn) {
4458
4585
  } else {
4459
4586
  continue;
4460
4587
  }
4461
- const executeFn = _optionalChain([toolsStore, 'access', _78 => _78.getTool\u03A3, 'call', _79 => _79(toolInvocation.name, message.chatId), 'access', _80 => _80.get, 'call', _81 => _81(), 'optionalAccess', _82 => _82.execute]);
4588
+ const executeFn = _optionalChain([toolsStore, 'access', _77 => _77.getTool\u03A3, 'call', _78 => _78(toolInvocation.name, message.chatId), 'access', _79 => _79.get, 'call', _80 => _80(), 'optionalAccess', _81 => _81.execute]);
4462
4589
  if (executeFn) {
4463
4590
  (async () => {
4464
4591
  const result = await executeFn(toolInvocation.args, {
@@ -4557,8 +4684,8 @@ function createStore_forChatMessages(toolsStore, setToolResultFn) {
4557
4684
  const spine = [];
4558
4685
  let lastVisitedMessage = null;
4559
4686
  for (const message2 of pool.walkUp(leaf.id)) {
4560
- const prev = _nullishCoalesce(_optionalChain([first, 'call', _83 => _83(pool.walkLeft(message2.id, isAlive)), 'optionalAccess', _84 => _84.id]), () => ( null));
4561
- const next = _nullishCoalesce(_optionalChain([first, 'call', _85 => _85(pool.walkRight(message2.id, isAlive)), 'optionalAccess', _86 => _86.id]), () => ( null));
4687
+ const prev = _nullishCoalesce(_optionalChain([first, 'call', _82 => _82(pool.walkLeft(message2.id, isAlive)), 'optionalAccess', _83 => _83.id]), () => ( null));
4688
+ const next = _nullishCoalesce(_optionalChain([first, 'call', _84 => _84(pool.walkRight(message2.id, isAlive)), 'optionalAccess', _85 => _85.id]), () => ( null));
4562
4689
  if (!message2.deletedAt || prev || next) {
4563
4690
  const node = {
4564
4691
  ...message2,
@@ -4624,7 +4751,7 @@ function createStore_forChatMessages(toolsStore, setToolResultFn) {
4624
4751
  const latest = pool.sorted.findRight(
4625
4752
  (m) => m.role === "assistant" && !m.deletedAt
4626
4753
  );
4627
- return _optionalChain([latest, 'optionalAccess', _87 => _87.copilotId]);
4754
+ return _optionalChain([latest, 'optionalAccess', _86 => _86.copilotId]);
4628
4755
  }
4629
4756
  return {
4630
4757
  // Readers
@@ -4655,11 +4782,11 @@ function createStore_forChatMessages(toolsStore, setToolResultFn) {
4655
4782
  *getAutoExecutingMessageIds() {
4656
4783
  for (const messageId of myMessages) {
4657
4784
  const message = getMessageById(messageId);
4658
- if (_optionalChain([message, 'optionalAccess', _88 => _88.role]) === "assistant" && message.status === "awaiting-tool") {
4785
+ if (_optionalChain([message, 'optionalAccess', _87 => _87.role]) === "assistant" && message.status === "awaiting-tool") {
4659
4786
  const isAutoExecuting = message.contentSoFar.some((part) => {
4660
4787
  if (part.type === "tool-invocation" && part.stage === "executing") {
4661
4788
  const tool = toolsStore.getTool\u03A3(part.name, message.chatId).get();
4662
- return typeof _optionalChain([tool, 'optionalAccess', _89 => _89.execute]) === "function";
4789
+ return typeof _optionalChain([tool, 'optionalAccess', _88 => _88.execute]) === "function";
4663
4790
  }
4664
4791
  return false;
4665
4792
  });
@@ -4807,7 +4934,7 @@ function createAi(config) {
4807
4934
  flushPendingDeltas();
4808
4935
  switch (msg.event) {
4809
4936
  case "cmd-failed":
4810
- _optionalChain([pendingCmd, 'optionalAccess', _90 => _90.reject, 'call', _91 => _91(new Error(msg.error))]);
4937
+ _optionalChain([pendingCmd, 'optionalAccess', _89 => _89.reject, 'call', _90 => _90(new Error(msg.error))]);
4811
4938
  break;
4812
4939
  case "settle": {
4813
4940
  context.messagesStore.upsert(msg.message);
@@ -4884,7 +5011,7 @@ function createAi(config) {
4884
5011
  return assertNever(msg, "Unhandled case");
4885
5012
  }
4886
5013
  }
4887
- _optionalChain([pendingCmd, 'optionalAccess', _92 => _92.resolve, 'call', _93 => _93(msg)]);
5014
+ _optionalChain([pendingCmd, 'optionalAccess', _91 => _91.resolve, 'call', _92 => _92(msg)]);
4888
5015
  }
4889
5016
  managedSocket.events.onMessage.subscribe(handleServerMessage);
4890
5017
  managedSocket.events.statusDidChange.subscribe(onStatusDidChange);
@@ -4960,9 +5087,9 @@ function createAi(config) {
4960
5087
  invocationId,
4961
5088
  result,
4962
5089
  generationOptions: {
4963
- copilotId: _optionalChain([options, 'optionalAccess', _94 => _94.copilotId]),
4964
- stream: _optionalChain([options, 'optionalAccess', _95 => _95.stream]),
4965
- timeout: _optionalChain([options, 'optionalAccess', _96 => _96.timeout]),
5090
+ copilotId: _optionalChain([options, 'optionalAccess', _93 => _93.copilotId]),
5091
+ stream: _optionalChain([options, 'optionalAccess', _94 => _94.stream]),
5092
+ timeout: _optionalChain([options, 'optionalAccess', _95 => _95.timeout]),
4966
5093
  // Knowledge and tools aren't coming from the options, but retrieved
4967
5094
  // from the global context
4968
5095
  knowledge: knowledge.length > 0 ? knowledge : void 0,
@@ -4980,7 +5107,7 @@ function createAi(config) {
4980
5107
  }
4981
5108
  }
4982
5109
  const win = typeof window !== "undefined" ? window : void 0;
4983
- _optionalChain([win, 'optionalAccess', _97 => _97.addEventListener, 'call', _98 => _98("beforeunload", handleBeforeUnload, { once: true })]);
5110
+ _optionalChain([win, 'optionalAccess', _96 => _96.addEventListener, 'call', _97 => _97("beforeunload", handleBeforeUnload, { once: true })]);
4984
5111
  return Object.defineProperty(
4985
5112
  {
4986
5113
  [kInternal]: {
@@ -4999,7 +5126,7 @@ function createAi(config) {
4999
5126
  clearChat: (chatId) => sendClientMsgWithResponse({ cmd: "clear-chat", chatId }),
5000
5127
  askUserMessageInChat: async (chatId, userMessage, targetMessageId, options) => {
5001
5128
  const knowledge = context.knowledgeStore.getKnowledgeForChat(chatId);
5002
- const requestKnowledge = _optionalChain([options, 'optionalAccess', _99 => _99.knowledge]) || [];
5129
+ const requestKnowledge = _optionalChain([options, 'optionalAccess', _98 => _98.knowledge]) || [];
5003
5130
  const combinedKnowledge = [...knowledge, ...requestKnowledge];
5004
5131
  const tools = context.toolsStore.getToolDescriptions(chatId);
5005
5132
  messagesStore.markMine(targetMessageId);
@@ -5009,9 +5136,9 @@ function createAi(config) {
5009
5136
  sourceMessage: userMessage,
5010
5137
  targetMessageId,
5011
5138
  generationOptions: {
5012
- copilotId: _optionalChain([options, 'optionalAccess', _100 => _100.copilotId]),
5013
- stream: _optionalChain([options, 'optionalAccess', _101 => _101.stream]),
5014
- timeout: _optionalChain([options, 'optionalAccess', _102 => _102.timeout]),
5139
+ copilotId: _optionalChain([options, 'optionalAccess', _99 => _99.copilotId]),
5140
+ stream: _optionalChain([options, 'optionalAccess', _100 => _100.stream]),
5141
+ timeout: _optionalChain([options, 'optionalAccess', _101 => _101.timeout]),
5015
5142
  // Combine global knowledge with request-specific knowledge
5016
5143
  knowledge: combinedKnowledge.length > 0 ? combinedKnowledge : void 0,
5017
5144
  tools: tools.length > 0 ? tools : void 0
@@ -5083,7 +5210,7 @@ function replaceOrAppend(content, newItem, keyFn, now2) {
5083
5210
  }
5084
5211
  }
5085
5212
  function closePart(prevPart, endedAt) {
5086
- if (_optionalChain([prevPart, 'optionalAccess', _103 => _103.type]) === "reasoning") {
5213
+ if (_optionalChain([prevPart, 'optionalAccess', _102 => _102.type]) === "reasoning") {
5087
5214
  prevPart.endedAt ??= endedAt;
5088
5215
  }
5089
5216
  }
@@ -5098,7 +5225,7 @@ function patchContentWithDelta(content, delta) {
5098
5225
  const lastPart = parts[parts.length - 1];
5099
5226
  switch (delta.type) {
5100
5227
  case "text-delta":
5101
- if (_optionalChain([lastPart, 'optionalAccess', _104 => _104.type]) === "text") {
5228
+ if (_optionalChain([lastPart, 'optionalAccess', _103 => _103.type]) === "text") {
5102
5229
  lastPart.text += delta.textDelta;
5103
5230
  } else {
5104
5231
  closePart(lastPart, now2);
@@ -5106,7 +5233,7 @@ function patchContentWithDelta(content, delta) {
5106
5233
  }
5107
5234
  break;
5108
5235
  case "reasoning-delta":
5109
- if (_optionalChain([lastPart, 'optionalAccess', _105 => _105.type]) === "reasoning") {
5236
+ if (_optionalChain([lastPart, 'optionalAccess', _104 => _104.type]) === "reasoning") {
5110
5237
  lastPart.text += delta.textDelta;
5111
5238
  } else {
5112
5239
  closePart(lastPart, now2);
@@ -5126,8 +5253,8 @@ function patchContentWithDelta(content, delta) {
5126
5253
  break;
5127
5254
  }
5128
5255
  case "tool-delta": {
5129
- if (_optionalChain([lastPart, 'optionalAccess', _106 => _106.type]) === "tool-invocation" && lastPart.stage === "receiving") {
5130
- _optionalChain([lastPart, 'access', _107 => _107.__appendDelta, 'optionalCall', _108 => _108(delta.delta)]);
5256
+ if (_optionalChain([lastPart, 'optionalAccess', _105 => _105.type]) === "tool-invocation" && lastPart.stage === "receiving") {
5257
+ _optionalChain([lastPart, 'access', _106 => _106.__appendDelta, 'optionalCall', _107 => _107(delta.delta)]);
5131
5258
  }
5132
5259
  break;
5133
5260
  }
@@ -5482,7 +5609,7 @@ function explicitAccessForResource(source, resource) {
5482
5609
  }
5483
5610
  function permissionForAccessLevel(resource, access, field = resource) {
5484
5611
  const permissions = PERMISSIONS_BY_RESOURCE[resource][access];
5485
- const permission = _optionalChain([permissions, 'optionalAccess', _109 => _109[0]]);
5612
+ const permission = _optionalChain([permissions, 'optionalAccess', _108 => _108[0]]);
5486
5613
  if (permission !== void 0) {
5487
5614
  return permission;
5488
5615
  }
@@ -5592,7 +5719,7 @@ function createAuthManager(authOptions, onAuthenticate) {
5592
5719
  return void 0;
5593
5720
  }
5594
5721
  async function makeAuthRequest(options) {
5595
- const fetcher = _nullishCoalesce(_optionalChain([authOptions, 'access', _110 => _110.polyfills, 'optionalAccess', _111 => _111.fetch]), () => ( (typeof window === "undefined" ? void 0 : window.fetch)));
5722
+ const fetcher = _nullishCoalesce(_optionalChain([authOptions, 'access', _109 => _109.polyfills, 'optionalAccess', _110 => _110.fetch]), () => ( (typeof window === "undefined" ? void 0 : window.fetch)));
5596
5723
  if (authentication.type === "private") {
5597
5724
  if (fetcher === void 0) {
5598
5725
  throw new StopRetrying(
@@ -5605,14 +5732,14 @@ function createAuthManager(authOptions, onAuthenticate) {
5605
5732
  const parsed = parseAuthToken(response.token);
5606
5733
  if (seenTokens.has(parsed.raw)) {
5607
5734
  const cachedToken = getCachedToken(options);
5608
- if (_optionalChain([cachedToken, 'optionalAccess', _112 => _112.raw]) === parsed.raw) {
5735
+ if (_optionalChain([cachedToken, 'optionalAccess', _111 => _111.raw]) === parsed.raw) {
5609
5736
  return cachedToken;
5610
5737
  }
5611
5738
  throw new StopRetrying(
5612
5739
  "The same Liveblocks auth token was issued from the backend before. Caching Liveblocks tokens is not supported."
5613
5740
  );
5614
5741
  }
5615
- _optionalChain([onAuthenticate, 'optionalCall', _113 => _113(parsed.parsed)]);
5742
+ _optionalChain([onAuthenticate, 'optionalCall', _112 => _112(parsed.parsed)]);
5616
5743
  return parsed;
5617
5744
  }
5618
5745
  if (authentication.type === "custom") {
@@ -5620,7 +5747,7 @@ function createAuthManager(authOptions, onAuthenticate) {
5620
5747
  if (response && typeof response === "object") {
5621
5748
  if (typeof response.token === "string") {
5622
5749
  const parsed = parseAuthToken(response.token);
5623
- _optionalChain([onAuthenticate, 'optionalCall', _114 => _114(parsed.parsed)]);
5750
+ _optionalChain([onAuthenticate, 'optionalCall', _113 => _113(parsed.parsed)]);
5624
5751
  return parsed;
5625
5752
  } else if (typeof response.error === "string") {
5626
5753
  const reason = `Authentication failed: ${"reason" in response && typeof response.reason === "string" ? response.reason : "Forbidden"}`;
@@ -5815,13 +5942,15 @@ var OpCode = Object.freeze({
5815
5942
  DELETE_CRDT: 5,
5816
5943
  DELETE_OBJECT_KEY: 6,
5817
5944
  CREATE_MAP: 7,
5818
- CREATE_REGISTER: 8
5945
+ CREATE_REGISTER: 8,
5946
+ // 9 and 10 are reserved for the parallel LiveText work.
5947
+ CREATE_FILE: 11
5819
5948
  });
5820
5949
  function isIgnoredOp(op) {
5821
5950
  return op.type === OpCode.DELETE_CRDT && op.id === "ACK";
5822
5951
  }
5823
5952
  function isCreateOp(op) {
5824
- return op.type === OpCode.CREATE_OBJECT || op.type === OpCode.CREATE_REGISTER || op.type === OpCode.CREATE_MAP || op.type === OpCode.CREATE_LIST;
5953
+ return op.type === OpCode.CREATE_OBJECT || op.type === OpCode.CREATE_REGISTER || op.type === OpCode.CREATE_FILE || op.type === OpCode.CREATE_MAP || op.type === OpCode.CREATE_LIST;
5825
5954
  }
5826
5955
 
5827
5956
  // src/protocol/StorageNode.ts
@@ -5829,7 +5958,9 @@ var CrdtType = Object.freeze({
5829
5958
  OBJECT: 0,
5830
5959
  LIST: 1,
5831
5960
  MAP: 2,
5832
- REGISTER: 3
5961
+ REGISTER: 3,
5962
+ // 4 is reserved for the parallel LiveText work.
5963
+ FILE: 5
5833
5964
  });
5834
5965
  function isRootStorageNode(node) {
5835
5966
  return node[0] === "root";
@@ -5846,6 +5977,9 @@ function isMapStorageNode(node) {
5846
5977
  function isRegisterStorageNode(node) {
5847
5978
  return node[1].type === CrdtType.REGISTER;
5848
5979
  }
5980
+ function isFileStorageNode(node) {
5981
+ return node[1].type === CrdtType.FILE;
5982
+ }
5849
5983
  function isCompactRootNode(node) {
5850
5984
  return node[0] === "root";
5851
5985
  }
@@ -5868,6 +6002,9 @@ function* compactNodesToNodeStream(compactNodes) {
5868
6002
  case CrdtType.REGISTER:
5869
6003
  yield [cnode[0], { type: CrdtType.REGISTER, parentId: cnode[2], parentKey: cnode[3], data: cnode[4] }];
5870
6004
  break;
6005
+ case CrdtType.FILE:
6006
+ yield [cnode[0], { type: CrdtType.FILE, parentId: cnode[2], parentKey: cnode[3], data: cnode[4] }];
6007
+ break;
5871
6008
  default:
5872
6009
  }
5873
6010
  }
@@ -5896,6 +6033,10 @@ function* nodeStreamToCompactNodes(nodes) {
5896
6033
  const id = node[0];
5897
6034
  const crdt = node[1];
5898
6035
  yield [id, CrdtType.REGISTER, crdt.parentId, crdt.parentKey, crdt.data];
6036
+ } else if (isFileStorageNode(node)) {
6037
+ const id = node[0];
6038
+ const crdt = node[1];
6039
+ yield [id, CrdtType.FILE, crdt.parentId, crdt.parentKey, crdt.data];
5899
6040
  } else {
5900
6041
  }
5901
6042
  }
@@ -6134,12 +6275,12 @@ ${parentKey}`;
6134
6275
  if (isCreateOp(op)) {
6135
6276
  const posKey = this.#posKey(op.parentId, op.parentKey);
6136
6277
  const atPosition = this.#createOpsByPosition.get(posKey);
6137
- _optionalChain([atPosition, 'optionalAccess', _115 => _115.delete, 'call', _116 => _116(opId)]);
6278
+ _optionalChain([atPosition, 'optionalAccess', _114 => _114.delete, 'call', _115 => _115(opId)]);
6138
6279
  if (atPosition !== void 0 && atPosition.size === 0) {
6139
6280
  this.#createOpsByPosition.delete(posKey);
6140
6281
  }
6141
6282
  const inParent = this.#createOpsByParent.get(op.parentId);
6142
- _optionalChain([inParent, 'optionalAccess', _117 => _117.delete, 'call', _118 => _118(opId)]);
6283
+ _optionalChain([inParent, 'optionalAccess', _116 => _116.delete, 'call', _117 => _117(opId)]);
6143
6284
  if (inParent !== void 0 && inParent.size === 0) {
6144
6285
  this.#createOpsByParent.delete(op.parentId);
6145
6286
  }
@@ -6151,14 +6292,14 @@ ${parentKey}`;
6151
6292
  * Empty if none.
6152
6293
  */
6153
6294
  getByParentIdAndKey(parentId, parentKey) {
6154
- return _nullishCoalesce(_optionalChain([this, 'access', _119 => _119.#createOpsByPosition, 'access', _120 => _120.get, 'call', _121 => _121(this.#posKey(parentId, parentKey)), 'optionalAccess', _122 => _122.values, 'call', _123 => _123()]), () => ( []));
6295
+ return _nullishCoalesce(_optionalChain([this, 'access', _118 => _118.#createOpsByPosition, 'access', _119 => _119.get, 'call', _120 => _120(this.#posKey(parentId, parentKey)), 'optionalAccess', _121 => _121.values, 'call', _122 => _122()]), () => ( []));
6155
6296
  }
6156
6297
  /**
6157
6298
  * The still-unacknowledged Create ops with the given `parentId` (across all
6158
6299
  * positions), in dispatch order. O(1) lookup. Empty if none.
6159
6300
  */
6160
6301
  getByParentId(parentId) {
6161
- return _nullishCoalesce(_optionalChain([this, 'access', _124 => _124.#createOpsByParent, 'access', _125 => _125.get, 'call', _126 => _126(parentId), 'optionalAccess', _127 => _127.values, 'call', _128 => _128()]), () => ( []));
6302
+ return _nullishCoalesce(_optionalChain([this, 'access', _123 => _123.#createOpsByParent, 'access', _124 => _124.get, 'call', _125 => _125(parentId), 'optionalAccess', _126 => _126.values, 'call', _127 => _127()]), () => ( []));
6162
6303
  }
6163
6304
  /** All still-unacknowledged ops, in dispatch order. */
6164
6305
  values() {
@@ -6199,7 +6340,7 @@ function createManagedPool(roomId, options) {
6199
6340
  generateId: () => `${getCurrentConnectionId()}:${clock++}`,
6200
6341
  generateOpId: () => `${getCurrentConnectionId()}:${opClock++}`,
6201
6342
  dispatch(ops, reverse, storageUpdates) {
6202
- _optionalChain([onDispatch, 'optionalCall', _129 => _129(ops, reverse, storageUpdates)]);
6343
+ _optionalChain([onDispatch, 'optionalCall', _128 => _128(ops, reverse, storageUpdates)]);
6203
6344
  },
6204
6345
  assertStorageIsWritable: () => {
6205
6346
  if (!isStorageWritable()) {
@@ -6408,6 +6549,91 @@ var AbstractCrdt = class {
6408
6549
  }
6409
6550
  };
6410
6551
 
6552
+ // src/crdts/LiveFile.ts
6553
+ var LiveFile = class _LiveFile extends AbstractCrdt {
6554
+ #data;
6555
+ constructor(data) {
6556
+ super();
6557
+ this.#data = Object.freeze({ ...data });
6558
+ }
6559
+ get data() {
6560
+ return this.#data;
6561
+ }
6562
+ get id() {
6563
+ return this.#data.id;
6564
+ }
6565
+ get name() {
6566
+ return this.#data.name;
6567
+ }
6568
+ get size() {
6569
+ return this.#data.size;
6570
+ }
6571
+ get mimeType() {
6572
+ return this.#data.mimeType;
6573
+ }
6574
+ /** @internal */
6575
+ static _deserialize([id, item], _parentToChildren, pool) {
6576
+ const file = new _LiveFile(item.data);
6577
+ file._attach(id, pool);
6578
+ return file;
6579
+ }
6580
+ /** @internal */
6581
+ _toOps(parentId, parentKey) {
6582
+ if (this._id === void 0) {
6583
+ throw new Error("Cannot serialize LiveFile if parent is missing");
6584
+ }
6585
+ return [
6586
+ {
6587
+ type: OpCode.CREATE_FILE,
6588
+ id: this._id,
6589
+ parentId,
6590
+ parentKey,
6591
+ data: this.#data
6592
+ }
6593
+ ];
6594
+ }
6595
+ /** @internal */
6596
+ _serialize() {
6597
+ if (this.parent.type !== "HasParent") {
6598
+ throw new Error("Cannot serialize LiveFile if parent is missing");
6599
+ }
6600
+ return {
6601
+ type: CrdtType.FILE,
6602
+ parentId: nn(this.parent.node._id, "Parent node expected to have ID"),
6603
+ parentKey: this.parent.key,
6604
+ data: this.#data
6605
+ };
6606
+ }
6607
+ /** @internal */
6608
+ _attachChild(_op) {
6609
+ throw new Error("Method not implemented.");
6610
+ }
6611
+ /** @internal */
6612
+ _detachChild(_crdt) {
6613
+ throw new Error("Method not implemented.");
6614
+ }
6615
+ /** @internal */
6616
+ _apply(op, isLocal) {
6617
+ return super._apply(op, isLocal);
6618
+ }
6619
+ /** @internal */
6620
+ _toTreeNode(key) {
6621
+ return {
6622
+ type: "Json",
6623
+ id: _nullishCoalesce(this._id, () => ( nanoid())),
6624
+ key,
6625
+ payload: this.#data
6626
+ };
6627
+ }
6628
+ /** @internal */
6629
+ _toJSON() {
6630
+ return this.#data;
6631
+ }
6632
+ clone() {
6633
+ return new _LiveFile(this.#data);
6634
+ }
6635
+ };
6636
+
6411
6637
  // src/crdts/LiveRegister.ts
6412
6638
  var LiveRegister = class _LiveRegister extends AbstractCrdt {
6413
6639
  #data;
@@ -6923,7 +7149,7 @@ var LiveList = class _LiveList extends AbstractCrdt {
6923
7149
  #applyInsertUndoRedo(op) {
6924
7150
  const { id, parentKey: key } = op;
6925
7151
  const child = creationOpToLiveNode(op);
6926
- if (_optionalChain([this, 'access', _130 => _130._pool, 'optionalAccess', _131 => _131.getNode, 'call', _132 => _132(id)]) !== void 0) {
7152
+ if (_optionalChain([this, 'access', _129 => _129._pool, 'optionalAccess', _130 => _130.getNode, 'call', _131 => _131(id)]) !== void 0) {
6927
7153
  return { modified: false };
6928
7154
  }
6929
7155
  child._attach(id, nn(this._pool));
@@ -6931,8 +7157,8 @@ var LiveList = class _LiveList extends AbstractCrdt {
6931
7157
  const existingItemIndex = this._indexOfPosition(key);
6932
7158
  let newKey = key;
6933
7159
  if (existingItemIndex !== -1) {
6934
- const before2 = _optionalChain([this, 'access', _133 => _133.#items, 'access', _134 => _134.at, 'call', _135 => _135(existingItemIndex), 'optionalAccess', _136 => _136._parentPos]);
6935
- const after2 = _optionalChain([this, 'access', _137 => _137.#items, 'access', _138 => _138.at, 'call', _139 => _139(existingItemIndex + 1), 'optionalAccess', _140 => _140._parentPos]);
7160
+ const before2 = _optionalChain([this, 'access', _132 => _132.#items, 'access', _133 => _133.at, 'call', _134 => _134(existingItemIndex), 'optionalAccess', _135 => _135._parentPos]);
7161
+ const after2 = _optionalChain([this, 'access', _136 => _136.#items, 'access', _137 => _137.at, 'call', _138 => _138(existingItemIndex + 1), 'optionalAccess', _139 => _139._parentPos]);
6936
7162
  newKey = makePosition(before2, after2);
6937
7163
  child._setParentLink(this, newKey);
6938
7164
  }
@@ -6946,7 +7172,7 @@ var LiveList = class _LiveList extends AbstractCrdt {
6946
7172
  #applySetUndoRedo(op) {
6947
7173
  const { id, parentKey: key } = op;
6948
7174
  const child = creationOpToLiveNode(op);
6949
- if (_optionalChain([this, 'access', _141 => _141._pool, 'optionalAccess', _142 => _142.getNode, 'call', _143 => _143(id)]) !== void 0) {
7175
+ if (_optionalChain([this, 'access', _140 => _140._pool, 'optionalAccess', _141 => _141.getNode, 'call', _142 => _142(id)]) !== void 0) {
6950
7176
  return { modified: false };
6951
7177
  }
6952
7178
  const indexOfItemWithSameKey = this._indexOfPosition(key);
@@ -7067,7 +7293,7 @@ var LiveList = class _LiveList extends AbstractCrdt {
7067
7293
  } else {
7068
7294
  this.#updateItemPositionAt(
7069
7295
  existingItemIndex,
7070
- makePosition(newKey, _optionalChain([this, 'access', _144 => _144.#items, 'access', _145 => _145.at, 'call', _146 => _146(existingItemIndex + 1), 'optionalAccess', _147 => _147._parentPos]))
7296
+ makePosition(newKey, _optionalChain([this, 'access', _143 => _143.#items, 'access', _144 => _144.at, 'call', _145 => _145(existingItemIndex + 1), 'optionalAccess', _146 => _146._parentPos]))
7071
7297
  );
7072
7298
  const previousIndex = this.#items.findIndex((item) => item === child);
7073
7299
  this.#updateItemPosition(child, newKey);
@@ -7094,7 +7320,7 @@ var LiveList = class _LiveList extends AbstractCrdt {
7094
7320
  this,
7095
7321
  makePosition(
7096
7322
  newKey,
7097
- _optionalChain([this, 'access', _148 => _148.#items, 'access', _149 => _149.at, 'call', _150 => _150(existingItemIndex + 1), 'optionalAccess', _151 => _151._parentPos])
7323
+ _optionalChain([this, 'access', _147 => _147.#items, 'access', _148 => _148.at, 'call', _149 => _149(existingItemIndex + 1), 'optionalAccess', _150 => _150._parentPos])
7098
7324
  )
7099
7325
  );
7100
7326
  this.#items.reposition(existingItem);
@@ -7118,7 +7344,7 @@ var LiveList = class _LiveList extends AbstractCrdt {
7118
7344
  existingItemIndex,
7119
7345
  makePosition(
7120
7346
  newKey,
7121
- _optionalChain([this, 'access', _152 => _152.#items, 'access', _153 => _153.at, 'call', _154 => _154(existingItemIndex + 1), 'optionalAccess', _155 => _155._parentPos])
7347
+ _optionalChain([this, 'access', _151 => _151.#items, 'access', _152 => _152.at, 'call', _153 => _153(existingItemIndex + 1), 'optionalAccess', _154 => _154._parentPos])
7122
7348
  )
7123
7349
  );
7124
7350
  }
@@ -7146,7 +7372,7 @@ var LiveList = class _LiveList extends AbstractCrdt {
7146
7372
  if (existingItemIndex !== -1) {
7147
7373
  actualNewKey = makePosition(
7148
7374
  newKey,
7149
- _optionalChain([this, 'access', _156 => _156.#items, 'access', _157 => _157.at, 'call', _158 => _158(existingItemIndex + 1), 'optionalAccess', _159 => _159._parentPos])
7375
+ _optionalChain([this, 'access', _155 => _155.#items, 'access', _156 => _156.at, 'call', _157 => _157(existingItemIndex + 1), 'optionalAccess', _158 => _158._parentPos])
7150
7376
  );
7151
7377
  }
7152
7378
  this.#updateItemPosition(child, actualNewKey);
@@ -7220,14 +7446,14 @@ var LiveList = class _LiveList extends AbstractCrdt {
7220
7446
  * instead of resolving its position against the client's stale view.
7221
7447
  */
7222
7448
  #injectAt(element, index, intent) {
7223
- _optionalChain([this, 'access', _160 => _160._pool, 'optionalAccess', _161 => _161.assertStorageIsWritable, 'call', _162 => _162()]);
7449
+ _optionalChain([this, 'access', _159 => _159._pool, 'optionalAccess', _160 => _160.assertStorageIsWritable, 'call', _161 => _161()]);
7224
7450
  if (index < 0 || index > this.#items.length) {
7225
7451
  throw new Error(
7226
7452
  `Cannot insert list item at index "${index}". index should be between 0 and ${this.#items.length}`
7227
7453
  );
7228
7454
  }
7229
- const before2 = _optionalChain([this, 'access', _163 => _163.#items, 'access', _164 => _164.at, 'call', _165 => _165(index - 1), 'optionalAccess', _166 => _166._parentPos]);
7230
- const after2 = _optionalChain([this, 'access', _167 => _167.#items, 'access', _168 => _168.at, 'call', _169 => _169(index), 'optionalAccess', _170 => _170._parentPos]);
7455
+ const before2 = _optionalChain([this, 'access', _162 => _162.#items, 'access', _163 => _163.at, 'call', _164 => _164(index - 1), 'optionalAccess', _165 => _165._parentPos]);
7456
+ const after2 = _optionalChain([this, 'access', _166 => _166.#items, 'access', _167 => _167.at, 'call', _168 => _168(index), 'optionalAccess', _169 => _169._parentPos]);
7231
7457
  const position = makePosition(before2, after2);
7232
7458
  const value = lsonToLiveNode(element);
7233
7459
  value._setParentLink(this, position);
@@ -7251,7 +7477,7 @@ var LiveList = class _LiveList extends AbstractCrdt {
7251
7477
  * @param targetIndex The index where the element should be after moving.
7252
7478
  */
7253
7479
  move(index, targetIndex) {
7254
- _optionalChain([this, 'access', _171 => _171._pool, 'optionalAccess', _172 => _172.assertStorageIsWritable, 'call', _173 => _173()]);
7480
+ _optionalChain([this, 'access', _170 => _170._pool, 'optionalAccess', _171 => _171.assertStorageIsWritable, 'call', _172 => _172()]);
7255
7481
  if (targetIndex < 0) {
7256
7482
  throw new Error("targetIndex cannot be less than 0");
7257
7483
  }
@@ -7269,11 +7495,11 @@ var LiveList = class _LiveList extends AbstractCrdt {
7269
7495
  let beforePosition = null;
7270
7496
  let afterPosition = null;
7271
7497
  if (index < targetIndex) {
7272
- afterPosition = targetIndex === this.#items.length - 1 ? void 0 : _optionalChain([this, 'access', _174 => _174.#items, 'access', _175 => _175.at, 'call', _176 => _176(targetIndex + 1), 'optionalAccess', _177 => _177._parentPos]);
7498
+ afterPosition = targetIndex === this.#items.length - 1 ? void 0 : _optionalChain([this, 'access', _173 => _173.#items, 'access', _174 => _174.at, 'call', _175 => _175(targetIndex + 1), 'optionalAccess', _176 => _176._parentPos]);
7273
7499
  beforePosition = this.#items.at(targetIndex)._parentPos;
7274
7500
  } else {
7275
7501
  afterPosition = this.#items.at(targetIndex)._parentPos;
7276
- beforePosition = targetIndex === 0 ? void 0 : _optionalChain([this, 'access', _178 => _178.#items, 'access', _179 => _179.at, 'call', _180 => _180(targetIndex - 1), 'optionalAccess', _181 => _181._parentPos]);
7502
+ beforePosition = targetIndex === 0 ? void 0 : _optionalChain([this, 'access', _177 => _177.#items, 'access', _178 => _178.at, 'call', _179 => _179(targetIndex - 1), 'optionalAccess', _180 => _180._parentPos]);
7277
7503
  }
7278
7504
  const position = makePosition(beforePosition, afterPosition);
7279
7505
  const item = this.#items.at(index);
@@ -7308,7 +7534,7 @@ var LiveList = class _LiveList extends AbstractCrdt {
7308
7534
  * @param index The index of the element to delete
7309
7535
  */
7310
7536
  delete(index) {
7311
- _optionalChain([this, 'access', _182 => _182._pool, 'optionalAccess', _183 => _183.assertStorageIsWritable, 'call', _184 => _184()]);
7537
+ _optionalChain([this, 'access', _181 => _181._pool, 'optionalAccess', _182 => _182.assertStorageIsWritable, 'call', _183 => _183()]);
7312
7538
  if (index < 0 || index >= this.#items.length) {
7313
7539
  throw new Error(
7314
7540
  `Cannot delete list item at index "${index}". index should be between 0 and ${this.#items.length - 1}`
@@ -7341,7 +7567,7 @@ var LiveList = class _LiveList extends AbstractCrdt {
7341
7567
  }
7342
7568
  }
7343
7569
  clear() {
7344
- _optionalChain([this, 'access', _185 => _185._pool, 'optionalAccess', _186 => _186.assertStorageIsWritable, 'call', _187 => _187()]);
7570
+ _optionalChain([this, 'access', _184 => _184._pool, 'optionalAccess', _185 => _185.assertStorageIsWritable, 'call', _186 => _186()]);
7345
7571
  if (this._pool) {
7346
7572
  const ops = [];
7347
7573
  const reverseOps = [];
@@ -7375,7 +7601,7 @@ var LiveList = class _LiveList extends AbstractCrdt {
7375
7601
  }
7376
7602
  }
7377
7603
  set(index, item) {
7378
- _optionalChain([this, 'access', _188 => _188._pool, 'optionalAccess', _189 => _189.assertStorageIsWritable, 'call', _190 => _190()]);
7604
+ _optionalChain([this, 'access', _187 => _187._pool, 'optionalAccess', _188 => _188.assertStorageIsWritable, 'call', _189 => _189()]);
7379
7605
  if (index < 0 || index >= this.#items.length) {
7380
7606
  throw new Error(
7381
7607
  `Cannot set list item at index "${index}". index should be between 0 and ${this.#items.length - 1}`
@@ -7534,7 +7760,7 @@ var LiveList = class _LiveList extends AbstractCrdt {
7534
7760
  #shiftItemPosition(index, key) {
7535
7761
  const shiftedPosition = makePosition(
7536
7762
  key,
7537
- this.#items.length > index + 1 ? _optionalChain([this, 'access', _191 => _191.#items, 'access', _192 => _192.at, 'call', _193 => _193(index + 1), 'optionalAccess', _194 => _194._parentPos]) : void 0
7763
+ this.#items.length > index + 1 ? _optionalChain([this, 'access', _190 => _190.#items, 'access', _191 => _191.at, 'call', _192 => _192(index + 1), 'optionalAccess', _193 => _193._parentPos]) : void 0
7538
7764
  );
7539
7765
  this.#updateItemPositionAt(index, shiftedPosition);
7540
7766
  }
@@ -7783,7 +8009,7 @@ var LiveMap = class _LiveMap extends AbstractCrdt {
7783
8009
  * @param value The value of the element to add. Should be serializable to JSON.
7784
8010
  */
7785
8011
  set(key, value) {
7786
- _optionalChain([this, 'access', _195 => _195._pool, 'optionalAccess', _196 => _196.assertStorageIsWritable, 'call', _197 => _197()]);
8012
+ _optionalChain([this, 'access', _194 => _194._pool, 'optionalAccess', _195 => _195.assertStorageIsWritable, 'call', _196 => _196()]);
7787
8013
  const oldValue = this.#map.get(key);
7788
8014
  if (oldValue) {
7789
8015
  oldValue._detach();
@@ -7829,7 +8055,7 @@ var LiveMap = class _LiveMap extends AbstractCrdt {
7829
8055
  * @returns true if an element existed and has been removed, or false if the element does not exist.
7830
8056
  */
7831
8057
  delete(key) {
7832
- _optionalChain([this, 'access', _198 => _198._pool, 'optionalAccess', _199 => _199.assertStorageIsWritable, 'call', _200 => _200()]);
8058
+ _optionalChain([this, 'access', _197 => _197._pool, 'optionalAccess', _198 => _198.assertStorageIsWritable, 'call', _199 => _199()]);
7833
8059
  const item = this.#map.get(key);
7834
8060
  if (item === void 0) {
7835
8061
  return false;
@@ -8441,20 +8667,20 @@ var LiveObject = (_class2 = class _LiveObject extends AbstractCrdt {
8441
8667
  * Caveat: this method will not add changes to the undo/redo stack.
8442
8668
  */
8443
8669
  setLocal(key, value) {
8444
- _optionalChain([this, 'access', _201 => _201._pool, 'optionalAccess', _202 => _202.assertStorageIsWritable, 'call', _203 => _203()]);
8670
+ _optionalChain([this, 'access', _200 => _200._pool, 'optionalAccess', _201 => _201.assertStorageIsWritable, 'call', _202 => _202()]);
8445
8671
  const deleteResult = this.#prepareDelete(key);
8446
8672
  this.#local.set(key, value);
8447
8673
  this.invalidate();
8448
8674
  if (this._pool !== void 0 && this._id !== void 0) {
8449
- const ops = _nullishCoalesce(_optionalChain([deleteResult, 'optionalAccess', _204 => _204[0]]), () => ( []));
8450
- const reverse = _nullishCoalesce(_optionalChain([deleteResult, 'optionalAccess', _205 => _205[1]]), () => ( []));
8451
- const storageUpdates = _nullishCoalesce(_optionalChain([deleteResult, 'optionalAccess', _206 => _206[2]]), () => ( /* @__PURE__ */ new Map()));
8675
+ const ops = _nullishCoalesce(_optionalChain([deleteResult, 'optionalAccess', _203 => _203[0]]), () => ( []));
8676
+ const reverse = _nullishCoalesce(_optionalChain([deleteResult, 'optionalAccess', _204 => _204[1]]), () => ( []));
8677
+ const storageUpdates = _nullishCoalesce(_optionalChain([deleteResult, 'optionalAccess', _205 => _205[2]]), () => ( /* @__PURE__ */ new Map()));
8452
8678
  const existing = storageUpdates.get(this._id);
8453
8679
  storageUpdates.set(this._id, {
8454
8680
  node: this,
8455
8681
  type: "LiveObject",
8456
8682
  updates: {
8457
- ..._optionalChain([existing, 'optionalAccess', _207 => _207.updates]),
8683
+ ..._optionalChain([existing, 'optionalAccess', _206 => _206.updates]),
8458
8684
  [key]: { type: "update" }
8459
8685
  }
8460
8686
  });
@@ -8474,7 +8700,7 @@ var LiveObject = (_class2 = class _LiveObject extends AbstractCrdt {
8474
8700
  * #synced or pool/id are unavailable. Does NOT dispatch.
8475
8701
  */
8476
8702
  #prepareDelete(key) {
8477
- _optionalChain([this, 'access', _208 => _208._pool, 'optionalAccess', _209 => _209.assertStorageIsWritable, 'call', _210 => _210()]);
8703
+ _optionalChain([this, 'access', _207 => _207._pool, 'optionalAccess', _208 => _208.assertStorageIsWritable, 'call', _209 => _209()]);
8478
8704
  const k = key;
8479
8705
  if (this.#local.has(k) && !this.#synced.has(k)) {
8480
8706
  const oldValue2 = this.#local.get(k);
@@ -8550,7 +8776,7 @@ var LiveObject = (_class2 = class _LiveObject extends AbstractCrdt {
8550
8776
  const result = this.#prepareDelete(key);
8551
8777
  if (result) {
8552
8778
  const [ops, reverse, storageUpdates] = result;
8553
- _optionalChain([this, 'access', _211 => _211._pool, 'optionalAccess', _212 => _212.dispatch, 'call', _213 => _213(ops, reverse, storageUpdates)]);
8779
+ _optionalChain([this, 'access', _210 => _210._pool, 'optionalAccess', _211 => _211.dispatch, 'call', _212 => _212(ops, reverse, storageUpdates)]);
8554
8780
  }
8555
8781
  }
8556
8782
  /**
@@ -8558,7 +8784,7 @@ var LiveObject = (_class2 = class _LiveObject extends AbstractCrdt {
8558
8784
  * @param patch The object used to overrides properties
8559
8785
  */
8560
8786
  update(patch) {
8561
- _optionalChain([this, 'access', _214 => _214._pool, 'optionalAccess', _215 => _215.assertStorageIsWritable, 'call', _216 => _216()]);
8787
+ _optionalChain([this, 'access', _213 => _213._pool, 'optionalAccess', _214 => _214.assertStorageIsWritable, 'call', _215 => _215()]);
8562
8788
  if (_LiveObject.detectLargeObjects) {
8563
8789
  const data = {};
8564
8790
  for (const [key, value] of this.#synced) {
@@ -8764,6 +8990,8 @@ function creationOpToLiveNode(op) {
8764
8990
  }
8765
8991
  function creationOpToLson(op) {
8766
8992
  switch (op.type) {
8993
+ case OpCode.CREATE_FILE:
8994
+ return new LiveFile(op.data);
8767
8995
  case OpCode.CREATE_REGISTER:
8768
8996
  return op.data;
8769
8997
  case OpCode.CREATE_OBJECT:
@@ -8794,6 +9022,8 @@ function deserialize(node, parentToChildren, pool) {
8794
9022
  return LiveMap._deserialize(node, parentToChildren, pool);
8795
9023
  } else if (isRegisterStorageNode(node)) {
8796
9024
  return LiveRegister._deserialize(node, parentToChildren, pool);
9025
+ } else if (isFileStorageNode(node)) {
9026
+ return LiveFile._deserialize(node, parentToChildren, pool);
8797
9027
  } else {
8798
9028
  throw new Error("Unexpected CRDT type");
8799
9029
  }
@@ -8807,12 +9037,14 @@ function deserializeToLson(node, parentToChildren, pool) {
8807
9037
  return LiveMap._deserialize(node, parentToChildren, pool);
8808
9038
  } else if (isRegisterStorageNode(node)) {
8809
9039
  return node[1].data;
9040
+ } else if (isFileStorageNode(node)) {
9041
+ return LiveFile._deserialize(node, parentToChildren, pool);
8810
9042
  } else {
8811
9043
  throw new Error("Unexpected CRDT type");
8812
9044
  }
8813
9045
  }
8814
9046
  function isLiveStructure(value) {
8815
- return isLiveList(value) || isLiveMap(value) || isLiveObject(value);
9047
+ return isLiveList(value) || isLiveMap(value) || isLiveObject(value) || isLiveFile(value);
8816
9048
  }
8817
9049
  function isLiveNode(value) {
8818
9050
  return isLiveStructure(value) || isLiveRegister(value);
@@ -8826,6 +9058,9 @@ function isLiveMap(value) {
8826
9058
  function isLiveObject(value) {
8827
9059
  return value instanceof LiveObject;
8828
9060
  }
9061
+ function isLiveFile(value) {
9062
+ return value instanceof LiveFile;
9063
+ }
8829
9064
  function isLiveRegister(value) {
8830
9065
  return value instanceof LiveRegister;
8831
9066
  }
@@ -8835,14 +9070,14 @@ function cloneLson(value) {
8835
9070
  function liveNodeToLson(obj) {
8836
9071
  if (obj instanceof LiveRegister) {
8837
9072
  return obj.data;
8838
- } else if (obj instanceof LiveList || obj instanceof LiveMap || obj instanceof LiveObject) {
9073
+ } else if (obj instanceof LiveList || obj instanceof LiveMap || obj instanceof LiveObject || obj instanceof LiveFile) {
8839
9074
  return obj;
8840
9075
  } else {
8841
9076
  return assertNever(obj, "Unknown AbstractCrdt");
8842
9077
  }
8843
9078
  }
8844
9079
  function lsonToLiveNode(value) {
8845
- if (value instanceof LiveObject || value instanceof LiveMap || value instanceof LiveList) {
9080
+ if (value instanceof LiveObject || value instanceof LiveMap || value instanceof LiveList || value instanceof LiveFile) {
8846
9081
  return value;
8847
9082
  } else {
8848
9083
  return new LiveRegister(value);
@@ -8859,6 +9094,8 @@ function dumpPool(pool) {
8859
9094
  value = "<LiveList>";
8860
9095
  } else if (node instanceof LiveMap) {
8861
9096
  value = "<LiveMap>";
9097
+ } else if (node instanceof LiveFile) {
9098
+ value = stringifyOrLog(node.data);
8862
9099
  } else {
8863
9100
  value = "<LiveObject>";
8864
9101
  }
@@ -8955,6 +9192,15 @@ function diffNodeMap(prev, next) {
8955
9192
  data: crdt.data
8956
9193
  });
8957
9194
  break;
9195
+ case CrdtType.FILE:
9196
+ ops.push({
9197
+ type: OpCode.CREATE_FILE,
9198
+ id,
9199
+ parentId: crdt.parentId,
9200
+ parentKey: crdt.parentKey,
9201
+ data: crdt.data
9202
+ });
9203
+ break;
8958
9204
  case CrdtType.LIST:
8959
9205
  ops.push({
8960
9206
  type: OpCode.CREATE_LIST,
@@ -9045,7 +9291,7 @@ function sendToPanel(message, options) {
9045
9291
  ...message,
9046
9292
  source: "liveblocks-devtools-client"
9047
9293
  };
9048
- if (!(_optionalChain([options, 'optionalAccess', _217 => _217.force]) || _bridgeActive)) {
9294
+ if (!(_optionalChain([options, 'optionalAccess', _216 => _216.force]) || _bridgeActive)) {
9049
9295
  return;
9050
9296
  }
9051
9297
  window.postMessage(fullMsg, "*");
@@ -9053,7 +9299,7 @@ function sendToPanel(message, options) {
9053
9299
  var eventSource = makeEventSource();
9054
9300
  if (process.env.NODE_ENV !== "production" && typeof window !== "undefined") {
9055
9301
  window.addEventListener("message", (event) => {
9056
- if (event.source === window && _optionalChain([event, 'access', _218 => _218.data, 'optionalAccess', _219 => _219.source]) === "liveblocks-devtools-panel") {
9302
+ if (event.source === window && _optionalChain([event, 'access', _217 => _217.data, 'optionalAccess', _218 => _218.source]) === "liveblocks-devtools-panel") {
9057
9303
  eventSource.notify(event.data);
9058
9304
  } else {
9059
9305
  }
@@ -9195,7 +9441,7 @@ function fullSync(room) {
9195
9441
  msg: "room::sync::full",
9196
9442
  roomId: room.id,
9197
9443
  status: room.getStatus(),
9198
- storage: _nullishCoalesce(_optionalChain([root, 'optionalAccess', _220 => _220.toTreeNode, 'call', _221 => _221("root"), 'access', _222 => _222.payload]), () => ( null)),
9444
+ storage: _nullishCoalesce(_optionalChain([root, 'optionalAccess', _219 => _219.toTreeNode, 'call', _220 => _220("root"), 'access', _221 => _221.payload]), () => ( null)),
9199
9445
  me,
9200
9446
  others
9201
9447
  });
@@ -9852,6 +10098,9 @@ function defaultMessageFromContext(context) {
9852
10098
 
9853
10099
  // src/room.ts
9854
10100
  var FEEDS_TIMEOUT = 5e3;
10101
+ function getLiveFileId(file) {
10102
+ return typeof file === "string" ? file : file.id;
10103
+ }
9855
10104
  function connectionAccessFromScopes(scopes) {
9856
10105
  const roomPermissions = normalizeRoomPermissions(scopes);
9857
10106
  const matrix = permissionMatrixFromScopes(roomPermissions);
@@ -9882,15 +10131,15 @@ function installBackgroundTabSpy() {
9882
10131
  const doc = typeof document !== "undefined" ? document : void 0;
9883
10132
  const inBackgroundSince = { current: null };
9884
10133
  function onVisibilityChange() {
9885
- if (_optionalChain([doc, 'optionalAccess', _223 => _223.visibilityState]) === "hidden") {
10134
+ if (_optionalChain([doc, 'optionalAccess', _222 => _222.visibilityState]) === "hidden") {
9886
10135
  inBackgroundSince.current = _nullishCoalesce(inBackgroundSince.current, () => ( Date.now()));
9887
10136
  } else {
9888
10137
  inBackgroundSince.current = null;
9889
10138
  }
9890
10139
  }
9891
- _optionalChain([doc, 'optionalAccess', _224 => _224.addEventListener, 'call', _225 => _225("visibilitychange", onVisibilityChange)]);
10140
+ _optionalChain([doc, 'optionalAccess', _223 => _223.addEventListener, 'call', _224 => _224("visibilitychange", onVisibilityChange)]);
9892
10141
  const unsub = () => {
9893
- _optionalChain([doc, 'optionalAccess', _226 => _226.removeEventListener, 'call', _227 => _227("visibilitychange", onVisibilityChange)]);
10142
+ _optionalChain([doc, 'optionalAccess', _225 => _225.removeEventListener, 'call', _226 => _226("visibilitychange", onVisibilityChange)]);
9894
10143
  };
9895
10144
  return [inBackgroundSince, unsub];
9896
10145
  }
@@ -9914,7 +10163,7 @@ function makeNodeMapBuffer() {
9914
10163
  function topLevelKeysOf(nodes) {
9915
10164
  const keys2 = /* @__PURE__ */ new Set();
9916
10165
  const root = nodes.get("root");
9917
- for (const key in _optionalChain([root, 'optionalAccess', _228 => _228.data])) {
10166
+ for (const key in _optionalChain([root, 'optionalAccess', _227 => _227.data])) {
9918
10167
  keys2.add(key);
9919
10168
  }
9920
10169
  for (const node of nodes.values()) {
@@ -10097,7 +10346,7 @@ function createRoom(options, config) {
10097
10346
  }
10098
10347
  }
10099
10348
  function isStorageWritable() {
10100
- const permissionMatrix = _optionalChain([context, 'access', _229 => _229.dynamicSessionInfoSig, 'access', _230 => _230.get, 'call', _231 => _231(), 'optionalAccess', _232 => _232.permissionMatrix]);
10349
+ const permissionMatrix = _optionalChain([context, 'access', _228 => _228.dynamicSessionInfoSig, 'access', _229 => _229.get, 'call', _230 => _230(), 'optionalAccess', _231 => _231.permissionMatrix]);
10101
10350
  return permissionMatrix !== void 0 ? hasPermissionAccess(permissionMatrix, "storage", "write") : true;
10102
10351
  }
10103
10352
  const eventHub = {
@@ -10209,7 +10458,7 @@ function createRoom(options, config) {
10209
10458
  context.pool
10210
10459
  );
10211
10460
  }
10212
- const canWrite = _nullishCoalesce(_optionalChain([self, 'access', _233 => _233.get, 'call', _234 => _234(), 'optionalAccess', _235 => _235.canWrite]), () => ( true));
10461
+ const canWrite = _nullishCoalesce(_optionalChain([self, 'access', _232 => _232.get, 'call', _233 => _233(), 'optionalAccess', _234 => _234.canWrite]), () => ( true));
10213
10462
  const serverTopLevelKeys = topLevelKeysOf(nodes);
10214
10463
  const root = context.root;
10215
10464
  disableHistory(() => {
@@ -10341,7 +10590,7 @@ function createRoom(options, config) {
10341
10590
  );
10342
10591
  output.reverse.pushLeft(applyOpResult.reverse);
10343
10592
  }
10344
- if (op.type === OpCode.CREATE_LIST || op.type === OpCode.CREATE_MAP || op.type === OpCode.CREATE_OBJECT) {
10593
+ if (op.type === OpCode.CREATE_LIST || op.type === OpCode.CREATE_MAP || op.type === OpCode.CREATE_OBJECT || op.type === OpCode.CREATE_FILE) {
10345
10594
  createdNodeIds.add(op.id);
10346
10595
  }
10347
10596
  }
@@ -10385,6 +10634,7 @@ function createRoom(options, config) {
10385
10634
  case OpCode.CREATE_OBJECT:
10386
10635
  case OpCode.CREATE_LIST:
10387
10636
  case OpCode.CREATE_MAP:
10637
+ case OpCode.CREATE_FILE:
10388
10638
  case OpCode.CREATE_REGISTER: {
10389
10639
  if (op.parentId === void 0) {
10390
10640
  return { modified: false };
@@ -10415,7 +10665,7 @@ function createRoom(options, config) {
10415
10665
  }
10416
10666
  context.myPresence.patch(patch);
10417
10667
  if (context.activeBatch) {
10418
- if (_optionalChain([options2, 'optionalAccess', _236 => _236.addToHistory])) {
10668
+ if (_optionalChain([options2, 'optionalAccess', _235 => _235.addToHistory])) {
10419
10669
  context.activeBatch.reverseOps.pushLeft({
10420
10670
  type: "presence",
10421
10671
  data: oldValues
@@ -10424,7 +10674,7 @@ function createRoom(options, config) {
10424
10674
  context.activeBatch.updates.presence = true;
10425
10675
  } else {
10426
10676
  flushNowOrSoon();
10427
- if (_optionalChain([options2, 'optionalAccess', _237 => _237.addToHistory])) {
10677
+ if (_optionalChain([options2, 'optionalAccess', _236 => _236.addToHistory])) {
10428
10678
  addToUndoStack([{ type: "presence", data: oldValues }]);
10429
10679
  }
10430
10680
  notify({ presence: true });
@@ -10603,11 +10853,11 @@ function createRoom(options, config) {
10603
10853
  break;
10604
10854
  }
10605
10855
  case ServerMsgCode.STORAGE_CHUNK:
10606
- _optionalChain([stopwatch, 'optionalAccess', _238 => _238.lap, 'call', _239 => _239()]);
10856
+ _optionalChain([stopwatch, 'optionalAccess', _237 => _237.lap, 'call', _238 => _238()]);
10607
10857
  nodeMapBuffer.append(compactNodesToNodeStream(message.nodes));
10608
10858
  break;
10609
10859
  case ServerMsgCode.STORAGE_STREAM_END: {
10610
- const timing = _optionalChain([stopwatch, 'optionalAccess', _240 => _240.stop, 'call', _241 => _241()]);
10860
+ const timing = _optionalChain([stopwatch, 'optionalAccess', _239 => _239.stop, 'call', _240 => _240()]);
10611
10861
  if (timing) {
10612
10862
  const ms = (v) => `${v.toFixed(1)}ms`;
10613
10863
  const rest = timing.laps.slice(1);
@@ -10742,11 +10992,11 @@ function createRoom(options, config) {
10742
10992
  } else if (pendingFeedsRequests.has(requestId)) {
10743
10993
  const pending = pendingFeedsRequests.get(requestId);
10744
10994
  pendingFeedsRequests.delete(requestId);
10745
- _optionalChain([pending, 'optionalAccess', _242 => _242.reject, 'call', _243 => _243(err)]);
10995
+ _optionalChain([pending, 'optionalAccess', _241 => _241.reject, 'call', _242 => _242(err)]);
10746
10996
  } else if (pendingFeedMessagesRequests.has(requestId)) {
10747
10997
  const pending = pendingFeedMessagesRequests.get(requestId);
10748
10998
  pendingFeedMessagesRequests.delete(requestId);
10749
- _optionalChain([pending, 'optionalAccess', _244 => _244.reject, 'call', _245 => _245(err)]);
10999
+ _optionalChain([pending, 'optionalAccess', _243 => _243.reject, 'call', _244 => _244(err)]);
10750
11000
  }
10751
11001
  eventHub.feeds.notify(message);
10752
11002
  break;
@@ -10900,10 +11150,10 @@ function createRoom(options, config) {
10900
11150
  timeoutId,
10901
11151
  kind,
10902
11152
  feedId,
10903
- messageId: _optionalChain([options2, 'optionalAccess', _246 => _246.messageId]),
10904
- expectedClientMessageId: _optionalChain([options2, 'optionalAccess', _247 => _247.expectedClientMessageId])
11153
+ messageId: _optionalChain([options2, 'optionalAccess', _245 => _245.messageId]),
11154
+ expectedClientMessageId: _optionalChain([options2, 'optionalAccess', _246 => _246.expectedClientMessageId])
10905
11155
  });
10906
- if (kind === "add-message" && _optionalChain([options2, 'optionalAccess', _248 => _248.expectedClientMessageId]) === void 0) {
11156
+ if (kind === "add-message" && _optionalChain([options2, 'optionalAccess', _247 => _247.expectedClientMessageId]) === void 0) {
10907
11157
  const q = _nullishCoalesce(pendingAddMessageFifoByFeed.get(feedId), () => ( []));
10908
11158
  q.push(requestId);
10909
11159
  pendingAddMessageFifoByFeed.set(feedId, q);
@@ -10954,10 +11204,10 @@ function createRoom(options, config) {
10954
11204
  }
10955
11205
  if (!matched) {
10956
11206
  const q = pendingAddMessageFifoByFeed.get(message.feedId);
10957
- const headId = _optionalChain([q, 'optionalAccess', _249 => _249[0]]);
11207
+ const headId = _optionalChain([q, 'optionalAccess', _248 => _248[0]]);
10958
11208
  if (headId !== void 0) {
10959
11209
  const pending = pendingFeedMutations.get(headId);
10960
- if (_optionalChain([pending, 'optionalAccess', _250 => _250.kind]) === "add-message" && pending.expectedClientMessageId === void 0) {
11210
+ if (_optionalChain([pending, 'optionalAccess', _249 => _249.kind]) === "add-message" && pending.expectedClientMessageId === void 0) {
10961
11211
  settleFeedMutation(headId, "ok");
10962
11212
  }
10963
11213
  }
@@ -10993,7 +11243,7 @@ function createRoom(options, config) {
10993
11243
  const unacknowledgedOps2 = [...context.unacknowledgedOps.values()];
10994
11244
  createOrUpdateRootFromMessage(nodes);
10995
11245
  applyAndSendOfflineOps(unacknowledgedOps2);
10996
- _optionalChain([_resolveStoragePromise, 'optionalCall', _251 => _251()]);
11246
+ _optionalChain([_resolveStoragePromise, 'optionalCall', _250 => _250()]);
10997
11247
  notifyStorageStatus();
10998
11248
  eventHub.storageDidLoad.notify();
10999
11249
  }
@@ -11002,7 +11252,7 @@ function createRoom(options, config) {
11002
11252
  if (!messages.some((msg) => msg.type === ClientMsgCode.FETCH_STORAGE)) {
11003
11253
  messages.push({ type: ClientMsgCode.FETCH_STORAGE });
11004
11254
  nodeMapBuffer.take();
11005
- _optionalChain([stopwatch, 'optionalAccess', _252 => _252.start, 'call', _253 => _253()]);
11255
+ _optionalChain([stopwatch, 'optionalAccess', _251 => _251.start, 'call', _252 => _252()]);
11006
11256
  }
11007
11257
  }
11008
11258
  function startLoadingStorage() {
@@ -11056,10 +11306,10 @@ function createRoom(options, config) {
11056
11306
  const message = {
11057
11307
  type: ClientMsgCode.FETCH_FEEDS,
11058
11308
  requestId,
11059
- cursor: _optionalChain([options2, 'optionalAccess', _254 => _254.cursor]),
11060
- since: _optionalChain([options2, 'optionalAccess', _255 => _255.since]),
11061
- limit: _optionalChain([options2, 'optionalAccess', _256 => _256.limit]),
11062
- metadata: _optionalChain([options2, 'optionalAccess', _257 => _257.metadata])
11309
+ cursor: _optionalChain([options2, 'optionalAccess', _253 => _253.cursor]),
11310
+ since: _optionalChain([options2, 'optionalAccess', _254 => _254.since]),
11311
+ limit: _optionalChain([options2, 'optionalAccess', _255 => _255.limit]),
11312
+ metadata: _optionalChain([options2, 'optionalAccess', _256 => _256.metadata])
11063
11313
  };
11064
11314
  context.buffer.messages.push(message);
11065
11315
  flushNowOrSoon();
@@ -11079,9 +11329,9 @@ function createRoom(options, config) {
11079
11329
  type: ClientMsgCode.FETCH_FEED_MESSAGES,
11080
11330
  requestId,
11081
11331
  feedId,
11082
- cursor: _optionalChain([options2, 'optionalAccess', _258 => _258.cursor]),
11083
- since: _optionalChain([options2, 'optionalAccess', _259 => _259.since]),
11084
- limit: _optionalChain([options2, 'optionalAccess', _260 => _260.limit])
11332
+ cursor: _optionalChain([options2, 'optionalAccess', _257 => _257.cursor]),
11333
+ since: _optionalChain([options2, 'optionalAccess', _258 => _258.since]),
11334
+ limit: _optionalChain([options2, 'optionalAccess', _259 => _259.limit])
11085
11335
  };
11086
11336
  context.buffer.messages.push(message);
11087
11337
  flushNowOrSoon();
@@ -11100,8 +11350,8 @@ function createRoom(options, config) {
11100
11350
  type: ClientMsgCode.ADD_FEED,
11101
11351
  requestId,
11102
11352
  feedId,
11103
- metadata: _optionalChain([options2, 'optionalAccess', _261 => _261.metadata]),
11104
- createdAt: _optionalChain([options2, 'optionalAccess', _262 => _262.createdAt])
11353
+ metadata: _optionalChain([options2, 'optionalAccess', _260 => _260.metadata]),
11354
+ createdAt: _optionalChain([options2, 'optionalAccess', _261 => _261.createdAt])
11105
11355
  };
11106
11356
  context.buffer.messages.push(message);
11107
11357
  flushNowOrSoon();
@@ -11135,15 +11385,15 @@ function createRoom(options, config) {
11135
11385
  function addFeedMessage(feedId, data, options2) {
11136
11386
  const requestId = nanoid();
11137
11387
  const promise = registerFeedMutation(requestId, "add-message", feedId, {
11138
- expectedClientMessageId: _optionalChain([options2, 'optionalAccess', _263 => _263.id])
11388
+ expectedClientMessageId: _optionalChain([options2, 'optionalAccess', _262 => _262.id])
11139
11389
  });
11140
11390
  const message = {
11141
11391
  type: ClientMsgCode.ADD_FEED_MESSAGE,
11142
11392
  requestId,
11143
11393
  feedId,
11144
11394
  data,
11145
- id: _optionalChain([options2, 'optionalAccess', _264 => _264.id]),
11146
- createdAt: _optionalChain([options2, 'optionalAccess', _265 => _265.createdAt])
11395
+ id: _optionalChain([options2, 'optionalAccess', _263 => _263.id]),
11396
+ createdAt: _optionalChain([options2, 'optionalAccess', _264 => _264.createdAt])
11147
11397
  };
11148
11398
  context.buffer.messages.push(message);
11149
11399
  flushNowOrSoon();
@@ -11160,7 +11410,7 @@ function createRoom(options, config) {
11160
11410
  feedId,
11161
11411
  messageId,
11162
11412
  data,
11163
- updatedAt: _optionalChain([options2, 'optionalAccess', _266 => _266.updatedAt])
11413
+ updatedAt: _optionalChain([options2, 'optionalAccess', _265 => _265.updatedAt])
11164
11414
  };
11165
11415
  context.buffer.messages.push(message);
11166
11416
  flushNowOrSoon();
@@ -11367,8 +11617,8 @@ function createRoom(options, config) {
11367
11617
  async function getThreads(options2) {
11368
11618
  return httpClient.getThreads({
11369
11619
  roomId,
11370
- query: _optionalChain([options2, 'optionalAccess', _267 => _267.query]),
11371
- cursor: _optionalChain([options2, 'optionalAccess', _268 => _268.cursor])
11620
+ query: _optionalChain([options2, 'optionalAccess', _266 => _266.query]),
11621
+ cursor: _optionalChain([options2, 'optionalAccess', _267 => _267.cursor])
11372
11622
  });
11373
11623
  }
11374
11624
  async function getThread(threadId) {
@@ -11488,10 +11738,21 @@ function createRoom(options, config) {
11488
11738
  function getAttachmentUrl(attachmentId) {
11489
11739
  return httpClient.getAttachmentUrl({ roomId, attachmentId });
11490
11740
  }
11741
+ async function uploadFile(file, options2 = {}) {
11742
+ const data = await httpClient.uploadFile({
11743
+ roomId,
11744
+ file,
11745
+ signal: options2.signal
11746
+ });
11747
+ return new LiveFile(data);
11748
+ }
11749
+ function getFileUrl(file) {
11750
+ return httpClient.getFileUrl({ roomId, fileId: getLiveFileId(file) });
11751
+ }
11491
11752
  function getSubscriptionSettings(options2) {
11492
11753
  return httpClient.getSubscriptionSettings({
11493
11754
  roomId,
11494
- signal: _optionalChain([options2, 'optionalAccess', _269 => _269.signal])
11755
+ signal: _optionalChain([options2, 'optionalAccess', _268 => _268.signal])
11495
11756
  });
11496
11757
  }
11497
11758
  function updateSubscriptionSettings(settings) {
@@ -11513,7 +11774,7 @@ function createRoom(options, config) {
11513
11774
  {
11514
11775
  [kInternal]: {
11515
11776
  get presenceBuffer() {
11516
- return deepClone(_nullishCoalesce(_optionalChain([context, 'access', _270 => _270.buffer, 'access', _271 => _271.presenceUpdates, 'optionalAccess', _272 => _272.data]), () => ( null)));
11777
+ return deepClone(_nullishCoalesce(_optionalChain([context, 'access', _269 => _269.buffer, 'access', _270 => _270.presenceUpdates, 'optionalAccess', _271 => _271.data]), () => ( null)));
11517
11778
  },
11518
11779
  // prettier-ignore
11519
11780
  get undoStack() {
@@ -11528,15 +11789,15 @@ function createRoom(options, config) {
11528
11789
  return context.yjsProvider;
11529
11790
  },
11530
11791
  setYjsProvider(newProvider) {
11531
- _optionalChain([context, 'access', _273 => _273.yjsProvider, 'optionalAccess', _274 => _274.off, 'call', _275 => _275("status", yjsStatusDidChange)]);
11792
+ _optionalChain([context, 'access', _272 => _272.yjsProvider, 'optionalAccess', _273 => _273.off, 'call', _274 => _274("status", yjsStatusDidChange)]);
11532
11793
  context.yjsProvider = newProvider;
11533
- _optionalChain([newProvider, 'optionalAccess', _276 => _276.on, 'call', _277 => _277("status", yjsStatusDidChange)]);
11794
+ _optionalChain([newProvider, 'optionalAccess', _275 => _275.on, 'call', _276 => _276("status", yjsStatusDidChange)]);
11534
11795
  context.yjsProviderDidChange.notify();
11535
11796
  },
11536
11797
  yjsProviderDidChange: context.yjsProviderDidChange.observable,
11537
11798
  // send metadata when using a text editor
11538
11799
  reportTextEditor,
11539
- getPermissionMatrix: () => _optionalChain([context, 'access', _278 => _278.dynamicSessionInfoSig, 'access', _279 => _279.get, 'call', _280 => _280(), 'optionalAccess', _281 => _281.permissionMatrix]),
11800
+ getPermissionMatrix: () => _optionalChain([context, 'access', _277 => _277.dynamicSessionInfoSig, 'access', _278 => _278.get, 'call', _279 => _279(), 'optionalAccess', _280 => _280.permissionMatrix]),
11540
11801
  // create a text mention when using a text editor
11541
11802
  createTextMention,
11542
11803
  // delete a text mention when using a text editor
@@ -11561,7 +11822,8 @@ function createRoom(options, config) {
11561
11822
  rawSend: (data) => managedSocket.send(data),
11562
11823
  incomingMessage: (data) => handleServerMessage(new MessageEvent("message", { data }))
11563
11824
  },
11564
- attachmentUrlsStore: httpClient.getOrCreateAttachmentUrlsStore(roomId)
11825
+ attachmentUrlsStore: httpClient.getOrCreateAttachmentUrlsStore(roomId),
11826
+ fileUrlsStore: httpClient.getOrCreateFileUrlsStore(roomId)
11565
11827
  },
11566
11828
  id: roomId,
11567
11829
  subscribe: makeClassicSubscribeFn(
@@ -11591,7 +11853,7 @@ ${dumpPool(
11591
11853
  source.dispose();
11592
11854
  }
11593
11855
  eventHub.roomWillDestroy.notify();
11594
- _optionalChain([context, 'access', _282 => _282.yjsProvider, 'optionalAccess', _283 => _283.off, 'call', _284 => _284("status", yjsStatusDidChange)]);
11856
+ _optionalChain([context, 'access', _281 => _281.yjsProvider, 'optionalAccess', _282 => _282.off, 'call', _283 => _283("status", yjsStatusDidChange)]);
11595
11857
  syncSourceForStorage.destroy();
11596
11858
  syncSourceForYjs.destroy();
11597
11859
  uninstallBgTabSpy();
@@ -11659,6 +11921,8 @@ ${dumpPool(
11659
11921
  prepareAttachment,
11660
11922
  uploadAttachment,
11661
11923
  getAttachmentUrl,
11924
+ uploadFile,
11925
+ getFileUrl,
11662
11926
  // Notifications
11663
11927
  getNotificationSettings: getSubscriptionSettings,
11664
11928
  getSubscriptionSettings,
@@ -11753,7 +12017,7 @@ function makeClassicSubscribeFn(roomId, events, errorEvents) {
11753
12017
  }
11754
12018
  if (isLiveNode(first)) {
11755
12019
  const node = first;
11756
- if (_optionalChain([options, 'optionalAccess', _285 => _285.isDeep])) {
12020
+ if (_optionalChain([options, 'optionalAccess', _284 => _284.isDeep])) {
11757
12021
  const storageCallback = second;
11758
12022
  return subscribeToLiveStructureDeeply(node, storageCallback);
11759
12023
  } else {
@@ -11843,8 +12107,8 @@ function createClient(options) {
11843
12107
  const authManager = createAuthManager(options, (token) => {
11844
12108
  currentUserId.set(() => token.uid);
11845
12109
  });
11846
- const fetchPolyfill = _optionalChain([clientOptions, 'access', _286 => _286.polyfills, 'optionalAccess', _287 => _287.fetch]) || /* istanbul ignore next */
11847
- _optionalChain([globalThis, 'access', _288 => _288.fetch, 'optionalAccess', _289 => _289.bind, 'call', _290 => _290(globalThis)]);
12110
+ const fetchPolyfill = _optionalChain([clientOptions, 'access', _285 => _285.polyfills, 'optionalAccess', _286 => _286.fetch]) || /* istanbul ignore next */
12111
+ _optionalChain([globalThis, 'access', _287 => _287.fetch, 'optionalAccess', _288 => _288.bind, 'call', _289 => _289(globalThis)]);
11848
12112
  const httpClient = createApiClient({
11849
12113
  baseUrl,
11850
12114
  fetchPolyfill,
@@ -11861,7 +12125,7 @@ function createClient(options) {
11861
12125
  delegates: {
11862
12126
  createSocket: makeCreateSocketDelegateForAi(
11863
12127
  baseUrl,
11864
- _optionalChain([clientOptions, 'access', _291 => _291.polyfills, 'optionalAccess', _292 => _292.WebSocket])
12128
+ _optionalChain([clientOptions, 'access', _290 => _290.polyfills, 'optionalAccess', _291 => _291.WebSocket])
11865
12129
  ),
11866
12130
  authenticate: async () => {
11867
12131
  const resp = await authManager.getAuthValue({
@@ -11932,7 +12196,7 @@ function createClient(options) {
11932
12196
  createSocket: makeCreateSocketDelegateForRoom(
11933
12197
  roomId,
11934
12198
  baseUrl,
11935
- _optionalChain([clientOptions, 'access', _293 => _293.polyfills, 'optionalAccess', _294 => _294.WebSocket])
12199
+ _optionalChain([clientOptions, 'access', _292 => _292.polyfills, 'optionalAccess', _293 => _293.WebSocket])
11936
12200
  ),
11937
12201
  authenticate: makeAuthDelegateForRoom(roomId, authManager)
11938
12202
  })),
@@ -11954,7 +12218,7 @@ function createClient(options) {
11954
12218
  const shouldConnect = _nullishCoalesce(options2.autoConnect, () => ( true));
11955
12219
  if (shouldConnect) {
11956
12220
  if (typeof atob === "undefined") {
11957
- if (_optionalChain([clientOptions, 'access', _295 => _295.polyfills, 'optionalAccess', _296 => _296.atob]) === void 0) {
12221
+ if (_optionalChain([clientOptions, 'access', _294 => _294.polyfills, 'optionalAccess', _295 => _295.atob]) === void 0) {
11958
12222
  throw new Error(
11959
12223
  "You need to polyfill atob to use the client in your environment. Please follow the instructions at https://liveblocks.io/docs/errors/liveblocks-client/atob-polyfill"
11960
12224
  );
@@ -11966,7 +12230,7 @@ function createClient(options) {
11966
12230
  return leaseRoom(newRoomDetails);
11967
12231
  }
11968
12232
  function getRoom(roomId) {
11969
- const room = _optionalChain([roomsById, 'access', _297 => _297.get, 'call', _298 => _298(roomId), 'optionalAccess', _299 => _299.room]);
12233
+ const room = _optionalChain([roomsById, 'access', _296 => _296.get, 'call', _297 => _297(roomId), 'optionalAccess', _298 => _298.room]);
11970
12234
  return room ? room : null;
11971
12235
  }
11972
12236
  function logout() {
@@ -11982,7 +12246,7 @@ function createClient(options) {
11982
12246
  const batchedResolveUsers = new Batch(
11983
12247
  async (batchedUserIds) => {
11984
12248
  const userIds = batchedUserIds.flat();
11985
- const users = await _optionalChain([resolveUsers, 'optionalCall', _300 => _300({ userIds })]);
12249
+ const users = await _optionalChain([resolveUsers, 'optionalCall', _299 => _299({ userIds })]);
11986
12250
  warnOnceIf(
11987
12251
  !resolveUsers,
11988
12252
  "Set the resolveUsers option in createClient to specify user info."
@@ -11999,7 +12263,7 @@ function createClient(options) {
11999
12263
  const batchedResolveRoomsInfo = new Batch(
12000
12264
  async (batchedRoomIds) => {
12001
12265
  const roomIds = batchedRoomIds.flat();
12002
- const roomsInfo = await _optionalChain([resolveRoomsInfo, 'optionalCall', _301 => _301({ roomIds })]);
12266
+ const roomsInfo = await _optionalChain([resolveRoomsInfo, 'optionalCall', _300 => _300({ roomIds })]);
12003
12267
  warnOnceIf(
12004
12268
  !resolveRoomsInfo,
12005
12269
  "Set the resolveRoomsInfo option in createClient to specify room info."
@@ -12016,7 +12280,7 @@ function createClient(options) {
12016
12280
  const batchedResolveGroupsInfo = new Batch(
12017
12281
  async (batchedGroupIds) => {
12018
12282
  const groupIds = batchedGroupIds.flat();
12019
- const groupsInfo = await _optionalChain([resolveGroupsInfo, 'optionalCall', _302 => _302({ groupIds })]);
12283
+ const groupsInfo = await _optionalChain([resolveGroupsInfo, 'optionalCall', _301 => _301({ groupIds })]);
12020
12284
  warnOnceIf(
12021
12285
  !resolveGroupsInfo,
12022
12286
  "Set the resolveGroupsInfo option in createClient to specify group info."
@@ -12075,7 +12339,7 @@ function createClient(options) {
12075
12339
  }
12076
12340
  };
12077
12341
  const win = typeof window !== "undefined" ? window : void 0;
12078
- _optionalChain([win, 'optionalAccess', _303 => _303.addEventListener, 'call', _304 => _304("beforeunload", maybePreventClose)]);
12342
+ _optionalChain([win, 'optionalAccess', _302 => _302.addEventListener, 'call', _303 => _303("beforeunload", maybePreventClose)]);
12079
12343
  }
12080
12344
  async function getNotificationSettings(options2) {
12081
12345
  const plainSettings = await httpClient.getNotificationSettings(options2);
@@ -12203,7 +12467,7 @@ var commentBodyElementsTypes = {
12203
12467
  mention: "inline"
12204
12468
  };
12205
12469
  function traverseCommentBody(body, elementOrVisitor, possiblyVisitor) {
12206
- if (!body || !_optionalChain([body, 'optionalAccess', _305 => _305.content])) {
12470
+ if (!body || !_optionalChain([body, 'optionalAccess', _304 => _304.content])) {
12207
12471
  return;
12208
12472
  }
12209
12473
  const element = typeof elementOrVisitor === "string" ? elementOrVisitor : void 0;
@@ -12213,13 +12477,13 @@ function traverseCommentBody(body, elementOrVisitor, possiblyVisitor) {
12213
12477
  for (const block of body.content) {
12214
12478
  if (type === "all" || type === "block") {
12215
12479
  if (guard(block)) {
12216
- _optionalChain([visitor, 'optionalCall', _306 => _306(block)]);
12480
+ _optionalChain([visitor, 'optionalCall', _305 => _305(block)]);
12217
12481
  }
12218
12482
  }
12219
12483
  if (type === "all" || type === "inline") {
12220
12484
  for (const inline of block.children) {
12221
12485
  if (guard(inline)) {
12222
- _optionalChain([visitor, 'optionalCall', _307 => _307(inline)]);
12486
+ _optionalChain([visitor, 'optionalCall', _306 => _306(inline)]);
12223
12487
  }
12224
12488
  }
12225
12489
  }
@@ -12389,7 +12653,7 @@ var stringifyCommentBodyPlainElements = {
12389
12653
  text: ({ element }) => element.text,
12390
12654
  link: ({ element }) => _nullishCoalesce(element.text, () => ( element.url)),
12391
12655
  mention: ({ element, user, group }) => {
12392
- return `@${_nullishCoalesce(_nullishCoalesce(_optionalChain([user, 'optionalAccess', _308 => _308.name]), () => ( _optionalChain([group, 'optionalAccess', _309 => _309.name]))), () => ( element.id))}`;
12656
+ return `@${_nullishCoalesce(_nullishCoalesce(_optionalChain([user, 'optionalAccess', _307 => _307.name]), () => ( _optionalChain([group, 'optionalAccess', _308 => _308.name]))), () => ( element.id))}`;
12393
12657
  }
12394
12658
  };
12395
12659
  var stringifyCommentBodyHtmlElements = {
@@ -12419,7 +12683,7 @@ var stringifyCommentBodyHtmlElements = {
12419
12683
  return html`<a href="${href}" target="_blank" rel="noopener noreferrer">${element.text ? html`${element.text}` : element.url}</a>`;
12420
12684
  },
12421
12685
  mention: ({ element, user, group }) => {
12422
- return html`<span data-mention>@${_optionalChain([user, 'optionalAccess', _310 => _310.name]) ? html`${_optionalChain([user, 'optionalAccess', _311 => _311.name])}` : _optionalChain([group, 'optionalAccess', _312 => _312.name]) ? html`${_optionalChain([group, 'optionalAccess', _313 => _313.name])}` : element.id}</span>`;
12686
+ return html`<span data-mention>@${_optionalChain([user, 'optionalAccess', _309 => _309.name]) ? html`${_optionalChain([user, 'optionalAccess', _310 => _310.name])}` : _optionalChain([group, 'optionalAccess', _311 => _311.name]) ? html`${_optionalChain([group, 'optionalAccess', _312 => _312.name])}` : element.id}</span>`;
12423
12687
  }
12424
12688
  };
12425
12689
  var stringifyCommentBodyMarkdownElements = {
@@ -12449,20 +12713,20 @@ var stringifyCommentBodyMarkdownElements = {
12449
12713
  return markdown`[${_nullishCoalesce(element.text, () => ( element.url))}](${href})`;
12450
12714
  },
12451
12715
  mention: ({ element, user, group }) => {
12452
- return markdown`@${_nullishCoalesce(_nullishCoalesce(_optionalChain([user, 'optionalAccess', _314 => _314.name]), () => ( _optionalChain([group, 'optionalAccess', _315 => _315.name]))), () => ( element.id))}`;
12716
+ return markdown`@${_nullishCoalesce(_nullishCoalesce(_optionalChain([user, 'optionalAccess', _313 => _313.name]), () => ( _optionalChain([group, 'optionalAccess', _314 => _314.name]))), () => ( element.id))}`;
12453
12717
  }
12454
12718
  };
12455
12719
  async function stringifyCommentBody(body, options) {
12456
- const format = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _316 => _316.format]), () => ( "plain"));
12457
- const separator = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _317 => _317.separator]), () => ( (format === "markdown" ? "\n\n" : "\n")));
12720
+ const format = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _315 => _315.format]), () => ( "plain"));
12721
+ const separator = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _316 => _316.separator]), () => ( (format === "markdown" ? "\n\n" : "\n")));
12458
12722
  const elements = {
12459
12723
  ...format === "html" ? stringifyCommentBodyHtmlElements : format === "markdown" ? stringifyCommentBodyMarkdownElements : stringifyCommentBodyPlainElements,
12460
- ..._optionalChain([options, 'optionalAccess', _318 => _318.elements])
12724
+ ..._optionalChain([options, 'optionalAccess', _317 => _317.elements])
12461
12725
  };
12462
12726
  const { users: resolvedUsers, groups: resolvedGroupsInfo } = await resolveMentionsInCommentBody(
12463
12727
  body,
12464
- _optionalChain([options, 'optionalAccess', _319 => _319.resolveUsers]),
12465
- _optionalChain([options, 'optionalAccess', _320 => _320.resolveGroupsInfo])
12728
+ _optionalChain([options, 'optionalAccess', _318 => _318.resolveUsers]),
12729
+ _optionalChain([options, 'optionalAccess', _319 => _319.resolveGroupsInfo])
12466
12730
  );
12467
12731
  const blocks = body.content.flatMap((block, blockIndex) => {
12468
12732
  switch (block.type) {
@@ -12544,6 +12808,11 @@ function toPlainLson(lson) {
12544
12808
  liveblocksType: "LiveList",
12545
12809
  data: [...lson].map((item) => toPlainLson(item))
12546
12810
  };
12811
+ } else if (lson instanceof LiveFile) {
12812
+ return {
12813
+ liveblocksType: "LiveFile",
12814
+ data: lson.data
12815
+ };
12547
12816
  } else {
12548
12817
  return lson;
12549
12818
  }
@@ -12597,9 +12866,9 @@ function makePoller(callback, intervalMs, options) {
12597
12866
  const startTime = performance.now();
12598
12867
  const doc = typeof document !== "undefined" ? document : void 0;
12599
12868
  const win = typeof window !== "undefined" ? window : void 0;
12600
- const maxStaleTimeMs = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _321 => _321.maxStaleTimeMs]), () => ( Number.POSITIVE_INFINITY));
12869
+ const maxStaleTimeMs = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _320 => _320.maxStaleTimeMs]), () => ( Number.POSITIVE_INFINITY));
12601
12870
  const context = {
12602
- inForeground: _optionalChain([doc, 'optionalAccess', _322 => _322.visibilityState]) !== "hidden",
12871
+ inForeground: _optionalChain([doc, 'optionalAccess', _321 => _321.visibilityState]) !== "hidden",
12603
12872
  lastSuccessfulPollAt: startTime,
12604
12873
  count: 0,
12605
12874
  backoff: 0
@@ -12680,11 +12949,11 @@ function makePoller(callback, intervalMs, options) {
12680
12949
  pollNowIfStale();
12681
12950
  }
12682
12951
  function onVisibilityChange() {
12683
- setInForeground(_optionalChain([doc, 'optionalAccess', _323 => _323.visibilityState]) !== "hidden");
12952
+ setInForeground(_optionalChain([doc, 'optionalAccess', _322 => _322.visibilityState]) !== "hidden");
12684
12953
  }
12685
- _optionalChain([doc, 'optionalAccess', _324 => _324.addEventListener, 'call', _325 => _325("visibilitychange", onVisibilityChange)]);
12686
- _optionalChain([win, 'optionalAccess', _326 => _326.addEventListener, 'call', _327 => _327("online", onVisibilityChange)]);
12687
- _optionalChain([win, 'optionalAccess', _328 => _328.addEventListener, 'call', _329 => _329("focus", pollNowIfStale)]);
12954
+ _optionalChain([doc, 'optionalAccess', _323 => _323.addEventListener, 'call', _324 => _324("visibilitychange", onVisibilityChange)]);
12955
+ _optionalChain([win, 'optionalAccess', _325 => _325.addEventListener, 'call', _326 => _326("online", onVisibilityChange)]);
12956
+ _optionalChain([win, 'optionalAccess', _327 => _327.addEventListener, 'call', _328 => _328("focus", pollNowIfStale)]);
12688
12957
  fsm.start();
12689
12958
  return {
12690
12959
  inc,
@@ -12829,5 +13098,8 @@ detectDupes(PKG_NAME, PKG_VERSION, PKG_FORMAT);
12829
13098
 
12830
13099
 
12831
13100
 
12832
- exports.ClientMsgCode = ClientMsgCode; exports.CrdtType = CrdtType; exports.DefaultMap = DefaultMap; exports.Deque = Deque; exports.DerivedSignal = DerivedSignal; exports.FeedRequestErrorCode = FeedRequestErrorCode; exports.HttpError = HttpError; exports.LiveList = LiveList; exports.LiveMap = LiveMap; exports.LiveObject = LiveObject; exports.LiveblocksError = LiveblocksError; exports.MENTION_CHARACTER = MENTION_CHARACTER; exports.MutableSignal = MutableSignal; exports.OpCode = OpCode; exports.Permission = Permission; exports.Promise_withResolvers = Promise_withResolvers; exports.ServerMsgCode = ServerMsgCode; exports.Signal = Signal; exports.SortedList = SortedList; exports.TextEditorType = TextEditorType; exports.WebsocketCloseCodes = WebsocketCloseCodes; exports.asPos = asPos; exports.assert = assert; exports.assertNever = assertNever; exports.autoRetry = autoRetry; exports.b64decode = b64decode; exports.batch = batch; exports.checkBounds = checkBounds; exports.chunk = chunk; exports.cloneLson = cloneLson; exports.compactNodesToNodeStream = compactNodesToNodeStream; exports.compactObject = compactObject; exports.console = fancy_console_exports; exports.convertToCommentData = convertToCommentData; exports.convertToCommentUserReaction = convertToCommentUserReaction; exports.convertToGroupData = convertToGroupData; exports.convertToInboxNotificationData = convertToInboxNotificationData; exports.convertToSubscriptionData = convertToSubscriptionData; exports.convertToThreadData = convertToThreadData; exports.convertToUserSubscriptionData = convertToUserSubscriptionData; exports.createClient = createClient; exports.createCommentAttachmentId = createCommentAttachmentId; exports.createCommentId = createCommentId; exports.createInboxNotificationId = createInboxNotificationId; exports.createManagedPool = createManagedPool; exports.createNotificationSettings = createNotificationSettings; exports.createThreadId = createThreadId; exports.deepLiveify = deepLiveify; exports.defineAiTool = defineAiTool; exports.deprecate = deprecate; exports.deprecateIf = deprecateIf; exports.detectDupes = detectDupes; exports.entries = entries; exports.errorIf = errorIf; exports.findLastIndex = findLastIndex; exports.freeze = freeze; exports.generateUrl = generateUrl; exports.getMentionsFromCommentBody = getMentionsFromCommentBody; exports.getSubscriptionKey = getSubscriptionKey; exports.hasPermissionAccess = hasPermissionAccess; exports.html = html; exports.htmlSafe = htmlSafe; exports.isCommentBodyLink = isCommentBodyLink; exports.isCommentBodyMention = isCommentBodyMention; exports.isCommentBodyText = isCommentBodyText; exports.isJsonArray = isJsonArray; exports.isJsonObject = isJsonObject; exports.isJsonScalar = isJsonScalar; exports.isListStorageNode = isListStorageNode; exports.isLiveNode = isLiveNode; exports.isMapStorageNode = isMapStorageNode; exports.isNotificationChannelEnabled = isNotificationChannelEnabled; exports.isNumberOperator = isNumberOperator; exports.isObjectStorageNode = isObjectStorageNode; exports.isPlainObject = isPlainObject; exports.isRegisterStorageNode = isRegisterStorageNode; exports.isRootStorageNode = isRootStorageNode; exports.isStartsWithOperator = isStartsWithOperator; exports.isUrl = isUrl; exports.kInternal = kInternal; exports.keys = keys; exports.makeAbortController = makeAbortController; exports.makeEventSource = makeEventSource; exports.makePoller = makePoller; exports.makePosition = makePosition; exports.mapValues = mapValues; exports.memoizeOnSuccess = memoizeOnSuccess; exports.mergeRoomPermissionScopes = mergeRoomPermissionScopes; exports.nanoid = nanoid; exports.nn = nn; exports.nodeStreamToCompactNodes = nodeStreamToCompactNodes; exports.normalizeRoomAccesses = normalizeRoomAccesses; exports.normalizeRoomPermissions = normalizeRoomPermissions; exports.normalizeUpdateRoomAccesses = normalizeUpdateRoomAccesses; exports.objectToQuery = objectToQuery; exports.patchNotificationSettings = patchNotificationSettings; exports.permissionMatrixFromScopes = permissionMatrixFromScopes; exports.raise = raise; exports.resolveMentionsInCommentBody = resolveMentionsInCommentBody; exports.sanitizeUrl = sanitizeUrl; exports.shallow = shallow; exports.shallow2 = shallow2; exports.stableStringify = stableStringify; exports.stringifyCommentBody = stringifyCommentBody; exports.throwUsageError = throwUsageError; exports.toPlainLson = toPlainLson; exports.tryParseJson = tryParseJson; exports.url = url; exports.urljoin = urljoin; exports.validatePermissionsSet = validatePermissionsSet; exports.wait = wait; exports.warnOnce = warnOnce; exports.warnOnceIf = warnOnceIf; exports.withTimeout = withTimeout;
13101
+
13102
+
13103
+
13104
+ exports.ClientMsgCode = ClientMsgCode; exports.CrdtType = CrdtType; exports.DefaultMap = DefaultMap; exports.Deque = Deque; exports.DerivedSignal = DerivedSignal; exports.FeedRequestErrorCode = FeedRequestErrorCode; exports.HttpError = HttpError; exports.LiveFile = LiveFile; exports.LiveList = LiveList; exports.LiveMap = LiveMap; exports.LiveObject = LiveObject; exports.LiveblocksError = LiveblocksError; exports.MENTION_CHARACTER = MENTION_CHARACTER; exports.MutableSignal = MutableSignal; exports.OpCode = OpCode; exports.Permission = Permission; exports.Promise_withResolvers = Promise_withResolvers; exports.ServerMsgCode = ServerMsgCode; exports.Signal = Signal; exports.SortedList = SortedList; exports.TextEditorType = TextEditorType; exports.WebsocketCloseCodes = WebsocketCloseCodes; exports.asPos = asPos; exports.assert = assert; exports.assertNever = assertNever; exports.autoRetry = autoRetry; exports.b64decode = b64decode; exports.batch = batch; exports.checkBounds = checkBounds; exports.chunk = chunk; exports.cloneLson = cloneLson; exports.compactNodesToNodeStream = compactNodesToNodeStream; exports.compactObject = compactObject; exports.console = fancy_console_exports; exports.convertToCommentData = convertToCommentData; exports.convertToCommentUserReaction = convertToCommentUserReaction; exports.convertToGroupData = convertToGroupData; exports.convertToInboxNotificationData = convertToInboxNotificationData; exports.convertToSubscriptionData = convertToSubscriptionData; exports.convertToThreadData = convertToThreadData; exports.convertToUserSubscriptionData = convertToUserSubscriptionData; exports.createClient = createClient; exports.createCommentAttachmentId = createCommentAttachmentId; exports.createCommentId = createCommentId; exports.createInboxNotificationId = createInboxNotificationId; exports.createManagedPool = createManagedPool; exports.createNotificationSettings = createNotificationSettings; exports.createStorageFileId = createStorageFileId; exports.createThreadId = createThreadId; exports.deepLiveify = deepLiveify; exports.defineAiTool = defineAiTool; exports.deprecate = deprecate; exports.deprecateIf = deprecateIf; exports.detectDupes = detectDupes; exports.entries = entries; exports.errorIf = errorIf; exports.findLastIndex = findLastIndex; exports.freeze = freeze; exports.generateUrl = generateUrl; exports.getMentionsFromCommentBody = getMentionsFromCommentBody; exports.getSubscriptionKey = getSubscriptionKey; exports.hasPermissionAccess = hasPermissionAccess; exports.html = html; exports.htmlSafe = htmlSafe; exports.isCommentBodyLink = isCommentBodyLink; exports.isCommentBodyMention = isCommentBodyMention; exports.isCommentBodyText = isCommentBodyText; exports.isFileStorageNode = isFileStorageNode; exports.isJsonArray = isJsonArray; exports.isJsonObject = isJsonObject; exports.isJsonScalar = isJsonScalar; exports.isListStorageNode = isListStorageNode; exports.isLiveNode = isLiveNode; exports.isMapStorageNode = isMapStorageNode; exports.isNotificationChannelEnabled = isNotificationChannelEnabled; exports.isNumberOperator = isNumberOperator; exports.isObjectStorageNode = isObjectStorageNode; exports.isPlainObject = isPlainObject; exports.isRegisterStorageNode = isRegisterStorageNode; exports.isRootStorageNode = isRootStorageNode; exports.isStartsWithOperator = isStartsWithOperator; exports.isUrl = isUrl; exports.kInternal = kInternal; exports.keys = keys; exports.makeAbortController = makeAbortController; exports.makeEventSource = makeEventSource; exports.makePoller = makePoller; exports.makePosition = makePosition; exports.mapValues = mapValues; exports.memoizeOnSuccess = memoizeOnSuccess; exports.mergeRoomPermissionScopes = mergeRoomPermissionScopes; exports.nanoid = nanoid; exports.nn = nn; exports.nodeStreamToCompactNodes = nodeStreamToCompactNodes; exports.normalizeRoomAccesses = normalizeRoomAccesses; exports.normalizeRoomPermissions = normalizeRoomPermissions; exports.normalizeUpdateRoomAccesses = normalizeUpdateRoomAccesses; exports.objectToQuery = objectToQuery; exports.patchNotificationSettings = patchNotificationSettings; exports.permissionMatrixFromScopes = permissionMatrixFromScopes; exports.raise = raise; exports.resolveMentionsInCommentBody = resolveMentionsInCommentBody; exports.sanitizeUrl = sanitizeUrl; exports.shallow = shallow; exports.shallow2 = shallow2; exports.stableStringify = stableStringify; exports.stringifyCommentBody = stringifyCommentBody; exports.throwUsageError = throwUsageError; exports.toPlainLson = toPlainLson; exports.tryParseJson = tryParseJson; exports.url = url; exports.urljoin = urljoin; exports.validatePermissionsSet = validatePermissionsSet; exports.wait = wait; exports.warnOnce = warnOnce; exports.warnOnceIf = warnOnceIf; exports.withTimeout = withTimeout;
12833
13105
  //# sourceMappingURL=index.cjs.map