cojson 0.8.38 → 0.8.39

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.
Files changed (33) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/native/PeerState.js +11 -2
  3. package/dist/native/PeerState.js.map +1 -1
  4. package/dist/native/{SyncStateSubscriptionManager.js → SyncStateManager.js} +35 -24
  5. package/dist/native/SyncStateManager.js.map +1 -0
  6. package/dist/native/coValueCore.js +3 -0
  7. package/dist/native/coValueCore.js.map +1 -1
  8. package/dist/native/exports.js.map +1 -1
  9. package/dist/native/sync.js +34 -10
  10. package/dist/native/sync.js.map +1 -1
  11. package/dist/web/PeerState.js +11 -2
  12. package/dist/web/PeerState.js.map +1 -1
  13. package/dist/web/{SyncStateSubscriptionManager.js → SyncStateManager.js} +35 -24
  14. package/dist/web/SyncStateManager.js.map +1 -0
  15. package/dist/web/coValueCore.js +3 -0
  16. package/dist/web/coValueCore.js.map +1 -1
  17. package/dist/web/exports.js.map +1 -1
  18. package/dist/web/sync.js +34 -10
  19. package/dist/web/sync.js.map +1 -1
  20. package/package.json +1 -1
  21. package/src/PeerState.ts +12 -2
  22. package/src/{SyncStateSubscriptionManager.ts → SyncStateManager.ts} +48 -35
  23. package/src/coValueCore.ts +6 -0
  24. package/src/exports.ts +2 -1
  25. package/src/sync.ts +57 -23
  26. package/src/tests/PeerState.test.ts +49 -0
  27. package/src/tests/PriorityBasedMessageQueue.test.ts +6 -73
  28. package/src/tests/{SyncStateSubscriptionManager.test.ts → SyncStateManager.test.ts} +109 -25
  29. package/src/tests/group.test.ts +6 -9
  30. package/src/tests/sync.test.ts +112 -71
  31. package/src/tests/testUtils.ts +108 -4
  32. package/dist/native/SyncStateSubscriptionManager.js.map +0 -1
  33. package/dist/web/SyncStateSubscriptionManager.js.map +0 -1
@@ -1,18 +1,21 @@
1
- import { describe, expect, test, vi } from "vitest";
1
+ import { afterEach, describe, expect, test, vi } from "vitest";
2
2
  import { expectMap } from "../coValue.js";
3
- import { CoValueHeader } from "../coValueCore.js";
4
- import { RawAccountID } from "../coValues/account.js";
5
- import { MapOpPayload, RawCoMap } from "../coValues/coMap.js";
6
- import { RawGroup } from "../coValues/group.js";
3
+ import type { CoValueHeader } from "../coValueCore.js";
4
+ import type { RawAccountID } from "../coValues/account.js";
5
+ import { type MapOpPayload, RawCoMap } from "../coValues/coMap.js";
6
+ import type { RawGroup } from "../coValues/group.js";
7
7
  import { WasmCrypto } from "../crypto/WasmCrypto.js";
8
8
  import { stableStringify } from "../jsonStringify.js";
9
9
  import { LocalNode } from "../localNode.js";
10
10
  import { getPriorityFromHeader } from "../priority.js";
11
11
  import { connectedPeers, newQueuePair } from "../streamUtils.js";
12
- import { SyncMessage } from "../sync.js";
12
+ import type { SyncMessage } from "../sync.js";
13
13
  import {
14
+ blockMessageTypeOnOutgoingPeer,
15
+ createTestMetricReader,
14
16
  createTestNode,
15
17
  randomAnonymousAccountAndSessionID,
18
+ tearDownTestMetricReader,
16
19
  waitFor,
17
20
  } from "./testUtils.js";
18
21
 
@@ -1654,12 +1657,7 @@ describe("SyncManager - knownStates vs optimisticKnownStates", () => {
1654
1657
  await client.syncManager.actuallySyncCoValue(mapOnClient.core);
1655
1658
 
1656
1659
  // Wait for the full sync to complete
1657
- await waitFor(() => {
1658
- return client.syncManager.syncStateSubscriptionManager.getIsCoValueFullyUploadedIntoPeer(
1659
- "jazzCloudConnection",
1660
- mapOnClient.core.id,
1661
- );
1662
- });
1660
+ await mapOnClient.core.waitForSync();
1663
1661
 
1664
1662
  const peerStateClient = client.syncManager.peers["jazzCloudConnection"]!;
1665
1663
  const peerStateJazzCloud =
@@ -1687,31 +1685,17 @@ describe("SyncManager - knownStates vs optimisticKnownStates", () => {
1687
1685
  map.set("key1", "value1", "trusting");
1688
1686
 
1689
1687
  await client.syncManager.actuallySyncCoValue(map.core);
1690
- await waitFor(() => {
1691
- return client.syncManager.syncStateSubscriptionManager.getIsCoValueFullyUploadedIntoPeer(
1692
- "jazzCloudConnection",
1693
- map.core.id,
1694
- );
1695
- });
1688
+ await map.core.waitForSync();
1696
1689
 
1697
1690
  // Block the content messages
1698
1691
  // The main difference between optimisticKnownStates and knownStates is that
1699
1692
  // optimisticKnownStates is updated when the content messages are sent,
1700
1693
  // while knownStates is only updated when we receive the "known" messages
1701
1694
  // that are acknowledging the receipt of the content messages
1702
- const push = jazzCloudConnectionAsPeer.outgoing.push;
1703
- const pushSpy = vi.spyOn(jazzCloudConnectionAsPeer.outgoing, "push");
1704
-
1705
- const blockedMessages: SyncMessage[] = [];
1706
-
1707
- pushSpy.mockImplementation(async (msg) => {
1708
- if (msg.action === "content") {
1709
- blockedMessages.push(msg);
1710
- return Promise.resolve();
1711
- }
1712
-
1713
- return push.call(jazzCloudConnectionAsPeer.outgoing, msg);
1714
- });
1695
+ const outgoing = blockMessageTypeOnOutgoingPeer(
1696
+ jazzCloudConnectionAsPeer,
1697
+ "content",
1698
+ );
1715
1699
 
1716
1700
  map.set("key2", "value2", "trusting");
1717
1701
 
@@ -1726,18 +1710,10 @@ describe("SyncManager - knownStates vs optimisticKnownStates", () => {
1726
1710
  // Restore the implementation of push and send the blocked messages
1727
1711
  // After this the full sync can be completed and the other node will
1728
1712
  // respond with a "known" message acknowledging the receipt of the content messages
1729
- pushSpy.mockRestore();
1713
+ outgoing.unblock();
1714
+ await outgoing.sendBlockedMessages();
1730
1715
 
1731
- for (const msg of blockedMessages) {
1732
- await jazzCloudConnectionAsPeer.outgoing.push(msg);
1733
- }
1734
-
1735
- await waitFor(() => {
1736
- return client.syncManager.syncStateSubscriptionManager.getIsCoValueFullyUploadedIntoPeer(
1737
- "jazzCloudConnection",
1738
- map.core.id,
1739
- );
1740
- });
1716
+ await map.core.waitForSync();
1741
1717
 
1742
1718
  expect(peerState.optimisticKnownStates.get(map.core.id)).toEqual(
1743
1719
  peerState.knownStates.get(map.core.id),
@@ -1757,12 +1733,7 @@ describe("SyncManager.addPeer", () => {
1757
1733
  await client.syncManager.actuallySyncCoValue(map.core);
1758
1734
 
1759
1735
  // Wait for initial sync
1760
- await waitFor(() => {
1761
- return client.syncManager.syncStateSubscriptionManager.getIsCoValueFullyUploadedIntoPeer(
1762
- "jazzCloudConnection",
1763
- map.core.id,
1764
- );
1765
- });
1736
+ await map.core.waitForSync();
1766
1737
 
1767
1738
  // Store the initial known states
1768
1739
  const initialKnownStates =
@@ -1802,12 +1773,7 @@ describe("SyncManager.addPeer", () => {
1802
1773
  await client.syncManager.actuallySyncCoValue(map.core);
1803
1774
 
1804
1775
  // Wait for initial sync
1805
- await waitFor(() => {
1806
- return client.syncManager.syncStateSubscriptionManager.getIsCoValueFullyUploadedIntoPeer(
1807
- "jazzCloudConnection",
1808
- map.core.id,
1809
- );
1810
- });
1776
+ await map.core.waitForSync();
1811
1777
 
1812
1778
  // Connect second peer with different ID
1813
1779
  const [brandNewPeer] = connectedPeers("brandNewPeer", "unusedPeer", {
@@ -1894,10 +1860,7 @@ describe("SyncManager.addPeer", () => {
1894
1860
 
1895
1861
  client.syncManager.addPeer(jazzCloudConnectionAsPeer);
1896
1862
 
1897
- await client.syncManager.waitForUploadIntoPeer(
1898
- jazzCloudConnectionAsPeer.id,
1899
- map.core.id,
1900
- );
1863
+ await map.core.waitForSync();
1901
1864
 
1902
1865
  expect(jazzCloud.coValuesStore.get(map.id).state.type).toBe("available");
1903
1866
  });
@@ -1960,7 +1923,7 @@ describe("loadCoValueCore with retry", () => {
1960
1923
  });
1961
1924
  });
1962
1925
 
1963
- describe("waitForUploadIntoPeer", () => {
1926
+ describe("waitForSyncWithPeer", () => {
1964
1927
  test("should resolve when the coValue is fully uploaded into the peer", async () => {
1965
1928
  const { client, jazzCloudConnectionAsPeer: peer } =
1966
1929
  createTwoConnectedNodes();
@@ -1973,12 +1936,7 @@ describe("waitForUploadIntoPeer", () => {
1973
1936
  await client.syncManager.actuallySyncCoValue(map.core);
1974
1937
 
1975
1938
  await expect(
1976
- Promise.race([
1977
- client.syncManager.waitForUploadIntoPeer(peer.id, map.core.id),
1978
- new Promise((_, reject) =>
1979
- setTimeout(() => reject(new Error("Timeout")), 100),
1980
- ),
1981
- ]),
1939
+ client.syncManager.waitForSyncWithPeer(peer.id, map.core.id, 100),
1982
1940
  ).resolves.toBe(true);
1983
1941
  });
1984
1942
 
@@ -1998,16 +1956,99 @@ describe("waitForUploadIntoPeer", () => {
1998
1956
  await client.syncManager.actuallySyncCoValue(map.core);
1999
1957
 
2000
1958
  await expect(
2001
- Promise.race([
2002
- client.syncManager.waitForUploadIntoPeer(peer.id, map.core.id),
2003
- new Promise((_, reject) =>
2004
- setTimeout(() => reject(new Error("Timeout")), 100),
2005
- ),
2006
- ]),
1959
+ client.syncManager.waitForSyncWithPeer(peer.id, map.core.id, 100),
2007
1960
  ).rejects.toThrow("Timeout");
2008
1961
  });
2009
1962
  });
2010
1963
 
1964
+ describe("metrics", () => {
1965
+ afterEach(() => {
1966
+ tearDownTestMetricReader();
1967
+ });
1968
+
1969
+ test("should correctly track the number of connected peers", async () => {
1970
+ const metricReader = createTestMetricReader();
1971
+ const [admin, session] = randomAnonymousAccountAndSessionID();
1972
+ const node = new LocalNode(admin, session, Crypto);
1973
+
1974
+ let connectedPeers = await metricReader.getMetricValue("jazz.peers", {
1975
+ role: "peer",
1976
+ });
1977
+ expect(connectedPeers).toBeUndefined();
1978
+ let connectedServerPeers = await metricReader.getMetricValue("jazz.peers", {
1979
+ role: "server",
1980
+ });
1981
+ expect(connectedServerPeers).toBeUndefined();
1982
+
1983
+ // Add a first peer
1984
+ const [inPeer1, outPeer1] = newQueuePair();
1985
+ node.syncManager.addPeer({
1986
+ id: "peer-1",
1987
+ incoming: inPeer1,
1988
+ outgoing: outPeer1,
1989
+ role: "peer",
1990
+ crashOnClose: false,
1991
+ });
1992
+
1993
+ connectedPeers = await metricReader.getMetricValue("jazz.peers", {
1994
+ role: "peer",
1995
+ });
1996
+ expect(connectedPeers).toBe(1);
1997
+
1998
+ // Add another peer
1999
+ const [inPeer2, outPeer2] = newQueuePair();
2000
+ node.syncManager.addPeer({
2001
+ id: "peer-2",
2002
+ incoming: inPeer2,
2003
+ outgoing: outPeer2,
2004
+ role: "peer",
2005
+ crashOnClose: false,
2006
+ });
2007
+
2008
+ connectedPeers = await metricReader.getMetricValue("jazz.peers", {
2009
+ role: "peer",
2010
+ });
2011
+ expect(connectedPeers).toBe(2);
2012
+
2013
+ // Add a server peer
2014
+ const [inServer1, outServer1] = newQueuePair();
2015
+ node.syncManager.addPeer({
2016
+ id: "server-1",
2017
+ incoming: inServer1,
2018
+ outgoing: outServer1,
2019
+ role: "server",
2020
+ crashOnClose: false,
2021
+ });
2022
+ connectedServerPeers = await metricReader.getMetricValue("jazz.peers", {
2023
+ role: "server",
2024
+ });
2025
+ expect(connectedServerPeers).toBe(1);
2026
+ connectedPeers = await metricReader.getMetricValue("jazz.peers", {
2027
+ role: "peer",
2028
+ });
2029
+ expect(connectedPeers).toBe(2);
2030
+
2031
+ // @ts-expect-error Simulating peer-1 closing
2032
+ await outPeer1.push("Disconnected");
2033
+ await waitFor(() => node.syncManager.peers["peer-1"]?.closed);
2034
+
2035
+ connectedPeers = await metricReader.getMetricValue("jazz.peers", {
2036
+ role: "peer",
2037
+ });
2038
+ expect(connectedPeers).toBe(1);
2039
+
2040
+ // @ts-expect-error Simulating server-1 closing
2041
+ await outServer1.push("Disconnected");
2042
+
2043
+ await waitFor(() => node.syncManager.peers["server-1"]?.closed);
2044
+
2045
+ connectedServerPeers = await metricReader.getMetricValue("jazz.peers", {
2046
+ role: "server",
2047
+ });
2048
+ expect(connectedServerPeers).toBe(0);
2049
+ });
2050
+ });
2051
+
2011
2052
  function groupContentEx(group: RawGroup) {
2012
2053
  return {
2013
2054
  action: "content",
@@ -1,11 +1,18 @@
1
- import { expect } from "vitest";
1
+ import { metrics } from "@opentelemetry/api";
2
+ import {
3
+ AggregationTemporality,
4
+ InMemoryMetricExporter,
5
+ MeterProvider,
6
+ MetricReader,
7
+ } from "@opentelemetry/sdk-metrics";
8
+ import { expect, vi } from "vitest";
2
9
  import { ControlledAgent } from "../coValues/account.js";
3
10
  import { WasmCrypto } from "../crypto/WasmCrypto.js";
4
- import { CoID, RawCoValue } from "../exports.js";
5
- import { SessionID } from "../ids.js";
11
+ import type { CoID, RawCoValue } from "../exports.js";
12
+ import type { SessionID } from "../ids.js";
6
13
  import { LocalNode } from "../localNode.js";
7
14
  import { connectedPeers } from "../streamUtils.js";
8
- import { Peer } from "../sync.js";
15
+ import type { Peer, SyncMessage } from "../sync.js";
9
16
  import { expectGroup } from "../typeUtils/expectGroup.js";
10
17
 
11
18
  const Crypto = await WasmCrypto.create();
@@ -233,6 +240,35 @@ export async function loadCoValueOrFail<V extends RawCoValue>(
233
240
  return value;
234
241
  }
235
242
 
243
+ export function blockMessageTypeOnOutgoingPeer(
244
+ peer: Peer,
245
+ messageType: SyncMessage["action"],
246
+ ) {
247
+ const push = peer.outgoing.push;
248
+ const pushSpy = vi.spyOn(peer.outgoing, "push");
249
+
250
+ const blockedMessages: SyncMessage[] = [];
251
+
252
+ pushSpy.mockImplementation(async (msg) => {
253
+ if (msg.action === messageType) {
254
+ blockedMessages.push(msg);
255
+ return Promise.resolve();
256
+ }
257
+
258
+ return push.call(peer.outgoing, msg);
259
+ });
260
+
261
+ return {
262
+ sendBlockedMessages: async () => {
263
+ for (const msg of blockedMessages) {
264
+ await push.call(peer.outgoing, msg);
265
+ }
266
+ blockedMessages.length = 0;
267
+ },
268
+ unblock: () => pushSpy.mockRestore(),
269
+ };
270
+ }
271
+
236
272
  export function hotSleep(ms: number) {
237
273
  const before = Date.now();
238
274
  while (Date.now() < before + ms) {
@@ -240,3 +276,71 @@ export function hotSleep(ms: number) {
240
276
  }
241
277
  return before;
242
278
  }
279
+
280
+ /**
281
+ * This is a test metric reader that uses an in-memory metric exporter and exposes a method to get the value of a metric given its name and attributes.
282
+ *
283
+ * This is useful for testing the values of metrics that are collected by the SDK.
284
+ *
285
+ * TODO: We may want to rethink how we access metrics (see `getMetricValue` method) to make it more flexible.
286
+ */
287
+ class TestMetricReader extends MetricReader {
288
+ private _exporter = new InMemoryMetricExporter(
289
+ AggregationTemporality.CUMULATIVE,
290
+ );
291
+
292
+ protected onShutdown(): Promise<void> {
293
+ throw new Error("Method not implemented.");
294
+ }
295
+ protected onForceFlush(): Promise<void> {
296
+ throw new Error("Method not implemented.");
297
+ }
298
+
299
+ async getMetricValue(
300
+ name: string,
301
+ attributes: { [key: string]: string | number } = {},
302
+ ) {
303
+ await this.collectAndExport();
304
+ const metric = this._exporter
305
+ .getMetrics()[0]
306
+ ?.scopeMetrics[0]?.metrics.find((m) => m.descriptor.name === name);
307
+
308
+ const dp = metric?.dataPoints.find(
309
+ (dp) => JSON.stringify(dp.attributes) === JSON.stringify(attributes),
310
+ );
311
+
312
+ this._exporter.reset();
313
+
314
+ return dp?.value;
315
+ }
316
+
317
+ async collectAndExport(): Promise<void> {
318
+ const result = await this.collect();
319
+ await new Promise<void>((resolve, reject) => {
320
+ this._exporter.export(result.resourceMetrics, (result) => {
321
+ if (result.error != null) {
322
+ reject(result.error);
323
+ } else {
324
+ resolve();
325
+ }
326
+ });
327
+ });
328
+ }
329
+ }
330
+
331
+ export function createTestMetricReader() {
332
+ const metricReader = new TestMetricReader();
333
+ const success = metrics.setGlobalMeterProvider(
334
+ new MeterProvider({
335
+ readers: [metricReader],
336
+ }),
337
+ );
338
+
339
+ expect(success).toBe(true);
340
+
341
+ return metricReader;
342
+ }
343
+
344
+ export function tearDownTestMetricReader() {
345
+ metrics.disable();
346
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"SyncStateSubscriptionManager.js","sourceRoot":"","sources":["../../src/SyncStateSubscriptionManager.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,eAAe,GAChB,MAAM,WAAW,CAAC;AAiBnB,MAAM,OAAO,4BAA4B;IACvC,YAAoB,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;QAEpC,cAAS,GAAG,IAAI,GAAG,EAAmC,CAAC;QACvD,qBAAgB,GAAG,IAAI,GAAG,EAG/B,CAAC;IAN2C,CAAC;IAQhD,kBAAkB,CAAC,QAAyC;QAC1D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE7B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC;IAED,sBAAsB,CACpB,MAAc,EACd,QAAuC;QAEvC,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;QAEjE,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC/C,CAAC;QAED,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAExB,OAAO,GAAG,EAAE;YACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,MAAc,EAAE,EAAW;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAE5C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEzD,mDAAmD;QACnD,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACjD,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,eAAe,CAAC,EAAE,CAAC,CAAC;QAEnE,gEAAgE;QAChE,sBAAsB;QACtB,MAAM,SAAS,GAAG,EAAqB,CAAC;QAExC,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,EAAE,CACvC,IAAI,CAAC,iCAAiC,CAAC,MAAM,EAAE,EAAE,CAAC,CACnD,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE;YACjC,UAAU,EAAE;gBACV,UAAU,EAAE,IAAI;gBAChB,GAAG,EAAE,aAAa;aACnB;SACF,CAAC,CAAC;QAEH,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,aAAa;YAAE,OAAO;QAE3B,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;YACrC,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,iCAAiC,CAAC,MAAc,EAAE,EAAW;QAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE3D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACrC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE5C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,oBAAoB,CACzB,OAAO,CAAC,UAAU,EAAE,CAAC,QAAQ,EAC7B,UAAU,CAAC,QAAQ,CACpB,CAAC;IACJ,CAAC;CACF;AAED,SAAS,oBAAoB,CAC3B,IAA4B,EAC5B,EAA0B;IAE1B,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;YACtC,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAI,EAAW;IACnC,IAAI,KAAoB,CAAC;IACzB,OAAO,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,KAAK,GAAG,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"SyncStateSubscriptionManager.js","sourceRoot":"","sources":["../../src/SyncStateSubscriptionManager.ts"],"names":[],"mappings":"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"}