cojson 0.8.34 → 0.8.35

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 (46) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/native/coValueCore.js +73 -37
  3. package/dist/native/coValueCore.js.map +1 -1
  4. package/dist/native/coValues/coMap.js +2 -2
  5. package/dist/native/coValues/coMap.js.map +1 -1
  6. package/dist/native/coValues/group.js +132 -5
  7. package/dist/native/coValues/group.js.map +1 -1
  8. package/dist/native/exports.js +5 -2
  9. package/dist/native/exports.js.map +1 -1
  10. package/dist/native/ids.js +33 -0
  11. package/dist/native/ids.js.map +1 -1
  12. package/dist/native/permissions.js +206 -145
  13. package/dist/native/permissions.js.map +1 -1
  14. package/dist/native/storage/index.js +8 -4
  15. package/dist/native/storage/index.js.map +1 -1
  16. package/dist/native/sync.js +41 -25
  17. package/dist/native/sync.js.map +1 -1
  18. package/dist/web/coValueCore.js +73 -37
  19. package/dist/web/coValueCore.js.map +1 -1
  20. package/dist/web/coValues/coMap.js +2 -2
  21. package/dist/web/coValues/coMap.js.map +1 -1
  22. package/dist/web/coValues/group.js +132 -5
  23. package/dist/web/coValues/group.js.map +1 -1
  24. package/dist/web/exports.js +5 -2
  25. package/dist/web/exports.js.map +1 -1
  26. package/dist/web/ids.js +33 -0
  27. package/dist/web/ids.js.map +1 -1
  28. package/dist/web/permissions.js +206 -145
  29. package/dist/web/permissions.js.map +1 -1
  30. package/dist/web/storage/index.js +8 -4
  31. package/dist/web/storage/index.js.map +1 -1
  32. package/dist/web/sync.js +41 -25
  33. package/dist/web/sync.js.map +1 -1
  34. package/package.json +1 -1
  35. package/src/coValueCore.ts +119 -46
  36. package/src/coValues/coMap.ts +3 -6
  37. package/src/coValues/group.ts +219 -6
  38. package/src/exports.ts +18 -3
  39. package/src/ids.ts +48 -0
  40. package/src/permissions.ts +297 -204
  41. package/src/storage/index.ts +12 -4
  42. package/src/sync.ts +43 -26
  43. package/src/tests/group.test.ts +152 -1
  44. package/src/tests/permissions.test.ts +785 -2
  45. package/src/tests/sync.test.ts +29 -0
  46. package/src/tests/testUtils.ts +102 -1
@@ -1437,6 +1437,7 @@ describe("sync - extra tests", () => {
1437
1437
  const reasonableMemoryUsage = 1; // 500 MB
1438
1438
  expect(memoryUsage).toBeLessThan(reasonableMemoryUsage);
1439
1439
  });
1440
+
1440
1441
  test("Node correctly handles and recovers from network partitions", async () => {
1441
1442
  // Create three nodes
1442
1443
  const [admin1, session1] = randomAnonymousAccountAndSessionID();
@@ -1872,6 +1873,34 @@ describe("SyncManager.addPeer", () => {
1872
1873
  expect(closeSpy).not.toHaveBeenCalled();
1873
1874
  expect(firstPeer.closed).toBe(true);
1874
1875
  });
1876
+
1877
+ test("when adding a server peer the local coValues should be sent to it", async () => {
1878
+ // Setup nodes
1879
+ const client = createTestNode();
1880
+ const jazzCloud = createTestNode();
1881
+
1882
+ // Connect nodes initially
1883
+ const [connectionWithClientAsPeer, jazzCloudConnectionAsPeer] =
1884
+ connectedPeers("connectionWithClient", "jazzCloudConnection", {
1885
+ peer1role: "client",
1886
+ peer2role: "server",
1887
+ });
1888
+
1889
+ jazzCloud.syncManager.addPeer(connectionWithClientAsPeer);
1890
+
1891
+ const group = client.createGroup();
1892
+ const map = group.createMap();
1893
+ map.set("key1", "value1", "trusting");
1894
+
1895
+ client.syncManager.addPeer(jazzCloudConnectionAsPeer);
1896
+
1897
+ await client.syncManager.waitForUploadIntoPeer(
1898
+ jazzCloudConnectionAsPeer.id,
1899
+ map.core.id,
1900
+ );
1901
+
1902
+ expect(jazzCloud.coValuesStore.get(map.id).state.type).toBe("available");
1903
+ });
1875
1904
  });
1876
1905
 
1877
1906
  describe("loadCoValueCore with retry", () => {
@@ -1,8 +1,11 @@
1
1
  import { expect } from "vitest";
2
2
  import { ControlledAgent } from "../coValues/account.js";
3
3
  import { WasmCrypto } from "../crypto/WasmCrypto.js";
4
+ import { CoID, RawCoValue } from "../exports.js";
4
5
  import { SessionID } from "../ids.js";
5
6
  import { LocalNode } from "../localNode.js";
7
+ import { connectedPeers } from "../streamUtils.js";
8
+ import { Peer } from "../sync.js";
6
9
  import { expectGroup } from "../typeUtils/expectGroup.js";
7
10
 
8
11
  const Crypto = await WasmCrypto.create();
@@ -23,6 +26,93 @@ export function createTestNode() {
23
26
  return new LocalNode(admin, session, Crypto);
24
27
  }
25
28
 
29
+ export function createTwoConnectedNodes(
30
+ node1Role: Peer["role"],
31
+ node2Role: Peer["role"],
32
+ ) {
33
+ // Setup nodes
34
+ const node1 = createTestNode();
35
+ const node2 = createTestNode();
36
+
37
+ // Connect nodes initially
38
+ const [node1ToNode2Peer, node2ToNode1Peer] = connectedPeers(
39
+ "node1ToNode2",
40
+ "node2ToNode1",
41
+ {
42
+ peer1role: node2Role,
43
+ peer2role: node1Role,
44
+ },
45
+ );
46
+
47
+ node1.syncManager.addPeer(node1ToNode2Peer);
48
+ node2.syncManager.addPeer(node2ToNode1Peer);
49
+
50
+ return {
51
+ node1,
52
+ node2,
53
+ node1ToNode2Peer,
54
+ node2ToNode1Peer,
55
+ };
56
+ }
57
+
58
+ export function createThreeConnectedNodes(
59
+ node1Role: Peer["role"],
60
+ node2Role: Peer["role"],
61
+ node3Role: Peer["role"],
62
+ ) {
63
+ // Setup nodes
64
+ const node1 = createTestNode();
65
+ const node2 = createTestNode();
66
+ const node3 = createTestNode();
67
+
68
+ // Connect nodes initially
69
+ const [node1ToNode2Peer, node2ToNode1Peer] = connectedPeers(
70
+ "node1ToNode2",
71
+ "node2ToNode1",
72
+ {
73
+ peer1role: node2Role,
74
+ peer2role: node1Role,
75
+ },
76
+ );
77
+
78
+ const [node1ToNode3Peer, node3ToNode1Peer] = connectedPeers(
79
+ "node1ToNode3",
80
+ "node3ToNode1",
81
+ {
82
+ peer1role: node3Role,
83
+ peer2role: node1Role,
84
+ },
85
+ );
86
+
87
+ const [node2ToNode3Peer, node3ToNode2Peer] = connectedPeers(
88
+ "node2ToNode3",
89
+ "node3ToNode2",
90
+ {
91
+ peer1role: node3Role,
92
+ peer2role: node2Role,
93
+ },
94
+ );
95
+
96
+ node1.syncManager.addPeer(node1ToNode2Peer);
97
+ node1.syncManager.addPeer(node1ToNode3Peer);
98
+ node2.syncManager.addPeer(node2ToNode1Peer);
99
+ node2.syncManager.addPeer(node2ToNode3Peer);
100
+ node3.syncManager.addPeer(node3ToNode1Peer);
101
+ node3.syncManager.addPeer(node3ToNode2Peer);
102
+
103
+ return {
104
+ node1,
105
+ node2,
106
+ node3,
107
+ node1ToNode2Peer,
108
+ node2ToNode1Peer,
109
+ node1ToNode3Peer,
110
+ node3ToNode1Peer,
111
+ node2ToNode3Peer,
112
+ node3ToNode2Peer,
113
+ };
114
+ }
115
+
26
116
  export function newGroup() {
27
117
  const [admin, sessionID] = randomAnonymousAccountAndSessionID();
28
118
 
@@ -58,7 +148,7 @@ export function groupWithTwoAdmins() {
58
148
  }
59
149
 
60
150
  expect(group.get(otherAdmin.id)).toEqual("admin");
61
- return { groupCore, admin, otherAdmin, node };
151
+ return { group, groupCore, admin, otherAdmin, node };
62
152
  }
63
153
 
64
154
  export function newGroupHighLevel() {
@@ -126,3 +216,14 @@ export function waitFor(callback: () => boolean | void) {
126
216
  }, 100);
127
217
  });
128
218
  }
219
+
220
+ export async function loadCoValueOrFail<V extends RawCoValue>(
221
+ node: LocalNode,
222
+ id: CoID<V>,
223
+ ): Promise<V> {
224
+ const value = await node.load(id);
225
+ if (value === "unavailable") {
226
+ throw new Error("CoValue not found");
227
+ }
228
+ return value;
229
+ }