cojson 0.8.32 → 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.
- package/CHANGELOG.md +15 -0
- package/dist/native/coValueCore.js +73 -37
- package/dist/native/coValueCore.js.map +1 -1
- package/dist/native/coValues/coMap.js +2 -2
- package/dist/native/coValues/coMap.js.map +1 -1
- package/dist/native/coValues/group.js +132 -5
- package/dist/native/coValues/group.js.map +1 -1
- package/dist/native/exports.js +5 -2
- package/dist/native/exports.js.map +1 -1
- package/dist/native/ids.js +33 -0
- package/dist/native/ids.js.map +1 -1
- package/dist/native/permissions.js +206 -145
- package/dist/native/permissions.js.map +1 -1
- package/dist/native/storage/index.js +8 -4
- package/dist/native/storage/index.js.map +1 -1
- package/dist/native/sync.js +41 -31
- package/dist/native/sync.js.map +1 -1
- package/dist/web/coValueCore.js +73 -37
- package/dist/web/coValueCore.js.map +1 -1
- package/dist/web/coValues/coMap.js +2 -2
- package/dist/web/coValues/coMap.js.map +1 -1
- package/dist/web/coValues/group.js +132 -5
- package/dist/web/coValues/group.js.map +1 -1
- package/dist/web/exports.js +5 -2
- package/dist/web/exports.js.map +1 -1
- package/dist/web/ids.js +33 -0
- package/dist/web/ids.js.map +1 -1
- package/dist/web/permissions.js +206 -145
- package/dist/web/permissions.js.map +1 -1
- package/dist/web/storage/index.js +8 -4
- package/dist/web/storage/index.js.map +1 -1
- package/dist/web/sync.js +41 -31
- package/dist/web/sync.js.map +1 -1
- package/package.json +1 -1
- package/src/coValueCore.ts +119 -46
- package/src/coValues/coMap.ts +3 -6
- package/src/coValues/group.ts +219 -6
- package/src/exports.ts +18 -3
- package/src/ids.ts +48 -0
- package/src/permissions.ts +297 -204
- package/src/storage/index.ts +12 -4
- package/src/sync.ts +43 -34
- package/src/tests/group.test.ts +152 -1
- package/src/tests/permissions.test.ts +785 -2
- package/src/tests/sync.test.ts +29 -0
- package/src/tests/testUtils.ts +102 -1
package/src/tests/sync.test.ts
CHANGED
|
@@ -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", () => {
|
package/src/tests/testUtils.ts
CHANGED
|
@@ -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
|
+
}
|