@liveblocks/core 2.0.5 → 2.1.0

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.mjs 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 = "2.0.5";
9
+ var PKG_VERSION = "2.1.0";
10
10
  var PKG_FORMAT = "esm";
11
11
 
12
12
  // src/dupe-detection.ts
@@ -72,14 +72,17 @@ function nn(value, errmsg = "Expected value to be non-nullable") {
72
72
 
73
73
  // src/lib/controlledPromise.ts
74
74
  function controlledPromise() {
75
- let flagger;
76
- const promise = new Promise((res) => {
77
- flagger = res;
75
+ let resolve;
76
+ let reject;
77
+ const promise = new Promise((res, rej) => {
78
+ resolve = res;
79
+ reject = rej;
78
80
  });
79
- if (!flagger) {
80
- throw new Error("Should never happen");
81
- }
82
- return [promise, flagger];
81
+ return [promise, resolve, reject];
82
+ }
83
+ function Promise_withResolvers() {
84
+ const [promise, resolve, reject] = controlledPromise();
85
+ return { promise, resolve, reject };
83
86
  }
84
87
 
85
88
  // src/lib/EventSource.ts
@@ -634,6 +637,15 @@ async function withTimeout(promise, millis, errmsg) {
634
637
  });
635
638
  return Promise.race([promise, timer$]).finally(() => clearTimeout(timerID));
636
639
  }
640
+ function memoize(factoryFn) {
641
+ let cached = null;
642
+ return () => {
643
+ if (cached === null) {
644
+ cached = { value: factoryFn() };
645
+ }
646
+ return cached.value;
647
+ };
648
+ }
637
649
 
638
650
  // src/protocol/ServerMsg.ts
639
651
  var ServerMsgCode = /* @__PURE__ */ ((ServerMsgCode2) => {
@@ -1604,7 +1616,7 @@ function startSyncStream(room) {
1604
1616
  // When storage initializes, send the update
1605
1617
  room.events.storageDidLoad.subscribeOnce(() => partialSyncStorage(room)),
1606
1618
  // Any time storage updates, send the new storage root
1607
- room.events.storage.subscribe(() => partialSyncStorage(room)),
1619
+ room.events.storageBatch.subscribe(() => partialSyncStorage(room)),
1608
1620
  // Any time "me" or "others" updates, send the new values accordingly
1609
1621
  room.events.self.subscribe(() => partialSyncMe(room)),
1610
1622
  room.events.others.subscribe(() => partialSyncOthers(room)),
@@ -5541,7 +5553,7 @@ function createRoom(options, config) {
5541
5553
  myPresence: makeEventSource(),
5542
5554
  others: makeEventSource(),
5543
5555
  error: makeEventSource(),
5544
- storage: makeEventSource(),
5556
+ storageBatch: makeEventSource(),
5545
5557
  history: makeEventSource(),
5546
5558
  storageDidLoad: makeEventSource(),
5547
5559
  storageStatus: makeEventSource(),
@@ -5751,7 +5763,7 @@ function createRoom(options, config) {
5751
5763
  }
5752
5764
  if (storageUpdates !== void 0 && storageUpdates.size > 0) {
5753
5765
  const updates2 = Array.from(storageUpdates.values());
5754
- eventHub.storage.notify(updates2);
5766
+ eventHub.storageBatch.notify(updates2);
5755
5767
  }
5756
5768
  notifyStorageStatus();
5757
5769
  });
@@ -6415,6 +6427,27 @@ ${Array.from(traces).join("\n\n")}`
6415
6427
  eventHub.storageStatus.notify(storageStatus);
6416
6428
  }
6417
6429
  }
6430
+ function isPresenceReady() {
6431
+ return self.current !== null;
6432
+ }
6433
+ async function waitUntilPresenceReady() {
6434
+ while (!isPresenceReady()) {
6435
+ const { promise, resolve } = Promise_withResolvers();
6436
+ const unsub1 = events.self.subscribeOnce(resolve);
6437
+ const unsub2 = events.status.subscribeOnce(resolve);
6438
+ await promise;
6439
+ unsub1();
6440
+ unsub2();
6441
+ }
6442
+ }
6443
+ function isStorageReady() {
6444
+ return getStorageSnapshot() !== null;
6445
+ }
6446
+ async function waitUntilStorageReady() {
6447
+ while (!isStorageReady()) {
6448
+ await getStorage();
6449
+ }
6450
+ }
6418
6451
  const others_forDevTools = new DerivedRef(
6419
6452
  context.others,
6420
6453
  (others) => others.map((other, index) => userToTreeNode(`Other ${index}`, other))
@@ -6427,7 +6460,9 @@ ${Array.from(traces).join("\n\n")}`
6427
6460
  self: eventHub.self.observable,
6428
6461
  myPresence: eventHub.myPresence.observable,
6429
6462
  error: eventHub.error.observable,
6430
- storage: eventHub.storage.observable,
6463
+ /** @deprecated */
6464
+ storage: eventHub.storageBatch.observable,
6465
+ storageBatch: eventHub.storageBatch.observable,
6431
6466
  history: eventHub.history.observable,
6432
6467
  storageDidLoad: eventHub.storageDidLoad.observable,
6433
6468
  storageStatus: eventHub.storageStatus.observable,
@@ -6578,6 +6613,10 @@ ${Array.from(traces).join("\n\n")}`
6578
6613
  getStorage,
6579
6614
  getStorageSnapshot,
6580
6615
  getStorageStatus,
6616
+ isPresenceReady,
6617
+ isStorageReady,
6618
+ waitUntilPresenceReady: memoize(waitUntilPresenceReady),
6619
+ waitUntilStorageReady: memoize(waitUntilStorageReady),
6581
6620
  events,
6582
6621
  // Core
6583
6622
  getStatus: () => managedSocket.getStatus(),
@@ -6594,7 +6633,7 @@ ${Array.from(traces).join("\n\n")}`
6594
6633
  }
6595
6634
  function makeClassicSubscribeFn(events) {
6596
6635
  function subscribeToLiveStructureDeeply(node, callback) {
6597
- return events.storage.subscribe((updates) => {
6636
+ return events.storageBatch.subscribe((updates) => {
6598
6637
  const relatedUpdates = updates.filter(
6599
6638
  (update) => isSameNodeOrChildOf(update.node, node)
6600
6639
  );
@@ -6604,7 +6643,7 @@ function makeClassicSubscribeFn(events) {
6604
6643
  });
6605
6644
  }
6606
6645
  function subscribeToLiveStructureShallowly(node, callback) {
6607
- return events.storage.subscribe((updates) => {
6646
+ return events.storageBatch.subscribe((updates) => {
6608
6647
  for (const update of updates) {
6609
6648
  if (update.node._id === node._id) {
6610
6649
  callback(update.node);
@@ -6656,7 +6695,7 @@ function makeClassicSubscribeFn(events) {
6656
6695
  if (second === void 0 || typeof first === "function") {
6657
6696
  if (typeof first === "function") {
6658
6697
  const storageCallback = first;
6659
- return events.storage.subscribe(storageCallback);
6698
+ return events.storageBatch.subscribe(storageCallback);
6660
6699
  } else {
6661
6700
  throw new Error("Please specify a listener callback");
6662
6701
  }