cojson 0.18.5 → 0.18.7
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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +18 -0
- package/dist/coValueContentMessage.d.ts +2 -0
- package/dist/coValueContentMessage.d.ts.map +1 -1
- package/dist/coValueContentMessage.js +7 -0
- package/dist/coValueContentMessage.js.map +1 -1
- package/dist/coValueCore/SessionMap.d.ts +2 -2
- package/dist/coValueCore/SessionMap.d.ts.map +1 -1
- package/dist/coValueCore/SessionMap.js +2 -4
- package/dist/coValueCore/SessionMap.js.map +1 -1
- package/dist/coValueCore/branching.d.ts +35 -13
- package/dist/coValueCore/branching.d.ts.map +1 -1
- package/dist/coValueCore/branching.js +55 -37
- package/dist/coValueCore/branching.js.map +1 -1
- package/dist/coValueCore/coValueCore.d.ts +15 -7
- package/dist/coValueCore/coValueCore.d.ts.map +1 -1
- package/dist/coValueCore/coValueCore.js +126 -35
- package/dist/coValueCore/coValueCore.js.map +1 -1
- package/dist/coValueCore/verifiedState.d.ts +4 -2
- package/dist/coValueCore/verifiedState.d.ts.map +1 -1
- package/dist/coValueCore/verifiedState.js +6 -4
- package/dist/coValueCore/verifiedState.js.map +1 -1
- package/dist/coValues/coList.d.ts +8 -2
- package/dist/coValues/coList.d.ts.map +1 -1
- package/dist/coValues/coList.js +95 -58
- package/dist/coValues/coList.js.map +1 -1
- package/dist/coValues/coMap.d.ts +2 -2
- package/dist/coValues/coMap.d.ts.map +1 -1
- package/dist/coValues/coMap.js +8 -8
- package/dist/coValues/coMap.js.map +1 -1
- package/dist/coValues/group.d.ts.map +1 -1
- package/dist/coValues/group.js +14 -1
- package/dist/coValues/group.js.map +1 -1
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +8 -0
- package/dist/config.js.map +1 -1
- package/dist/crypto/PureJSCrypto.d.ts.map +1 -1
- package/dist/crypto/PureJSCrypto.js +14 -6
- package/dist/crypto/PureJSCrypto.js.map +1 -1
- package/dist/exports.d.ts +5 -4
- package/dist/exports.d.ts.map +1 -1
- package/dist/exports.js +3 -3
- package/dist/exports.js.map +1 -1
- package/dist/ids.d.ts +1 -0
- package/dist/ids.d.ts.map +1 -1
- package/dist/ids.js.map +1 -1
- package/dist/localNode.d.ts.map +1 -1
- package/dist/localNode.js +7 -2
- package/dist/localNode.js.map +1 -1
- package/dist/storage/storageAsync.d.ts.map +1 -1
- package/dist/storage/storageAsync.js +7 -4
- package/dist/storage/storageAsync.js.map +1 -1
- package/dist/storage/storageSync.d.ts.map +1 -1
- package/dist/storage/storageSync.js +7 -4
- package/dist/storage/storageSync.js.map +1 -1
- package/dist/sync.d.ts +1 -3
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +8 -18
- package/dist/sync.js.map +1 -1
- package/dist/tests/branching.test.js +166 -4
- package/dist/tests/branching.test.js.map +1 -1
- package/dist/tests/coList.test.js +367 -1
- package/dist/tests/coList.test.js.map +1 -1
- package/dist/tests/coValueCore.test.js +45 -1
- package/dist/tests/coValueCore.test.js.map +1 -1
- package/dist/tests/messagesTestUtils.d.ts +1 -1
- package/dist/tests/sync.content.test.d.ts +2 -0
- package/dist/tests/sync.content.test.d.ts.map +1 -0
- package/dist/tests/sync.content.test.js +120 -0
- package/dist/tests/sync.content.test.js.map +1 -0
- package/dist/tests/sync.load.test.js +4 -4
- package/dist/tests/sync.load.test.js.map +1 -1
- package/dist/tests/sync.storage.test.js +1 -1
- package/dist/tests/sync.storageAsync.test.js +6 -10
- package/dist/tests/sync.storageAsync.test.js.map +1 -1
- package/dist/tests/sync.upload.test.js +2 -2
- package/dist/tests/testUtils.d.ts +2 -2
- package/package.json +2 -2
- package/src/coValueContentMessage.ts +13 -0
- package/src/coValueCore/SessionMap.ts +2 -2
- package/src/coValueCore/branching.ts +105 -60
- package/src/coValueCore/coValueCore.ts +163 -41
- package/src/coValueCore/verifiedState.ts +8 -0
- package/src/coValues/coList.ts +129 -78
- package/src/coValues/coMap.ts +10 -12
- package/src/coValues/group.ts +14 -1
- package/src/config.ts +9 -0
- package/src/crypto/PureJSCrypto.ts +25 -13
- package/src/exports.ts +13 -2
- package/src/ids.ts +1 -0
- package/src/localNode.ts +8 -2
- package/src/storage/storageAsync.ts +8 -5
- package/src/storage/storageSync.ts +8 -4
- package/src/sync.ts +8 -32
- package/src/tests/branching.test.ts +255 -4
- package/src/tests/coList.test.ts +529 -1
- package/src/tests/coValueCore.test.ts +62 -2
- package/src/tests/sync.content.test.ts +153 -0
- package/src/tests/sync.load.test.ts +4 -4
- package/src/tests/sync.storage.test.ts +1 -1
- package/src/tests/sync.storageAsync.test.ts +9 -12
- package/src/tests/sync.upload.test.ts +2 -2
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, test } from "vitest";
|
|
2
|
+
|
|
3
|
+
import { SyncMessagesLog, TEST_NODE_CONFIG, setupTestNode } from "./testUtils";
|
|
4
|
+
|
|
5
|
+
// We want to simulate a real world communication that happens asynchronously
|
|
6
|
+
TEST_NODE_CONFIG.withAsyncPeers = true;
|
|
7
|
+
|
|
8
|
+
describe("handling content messages", () => {
|
|
9
|
+
beforeEach(async () => {
|
|
10
|
+
SyncMessagesLog.clear();
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
test("dependencies are included when syncing new content to clients", async () => {
|
|
14
|
+
/*
|
|
15
|
+
* Initial Setup:
|
|
16
|
+
* core <-- edge <-- client1
|
|
17
|
+
*/
|
|
18
|
+
const core = setupTestNode();
|
|
19
|
+
|
|
20
|
+
const edge = setupTestNode();
|
|
21
|
+
edge.connectToSyncServer({
|
|
22
|
+
ourName: "edge",
|
|
23
|
+
syncServerName: "core",
|
|
24
|
+
syncServer: core.node,
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const client1 = setupTestNode();
|
|
28
|
+
client1.connectToSyncServer({
|
|
29
|
+
ourName: "client1",
|
|
30
|
+
syncServerName: "edge",
|
|
31
|
+
syncServer: edge.node,
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// Create a map with a dependency on the client.
|
|
35
|
+
// Everythig will sync all the way back to core.
|
|
36
|
+
const group = client1.node.createGroup();
|
|
37
|
+
const map = group.createMap();
|
|
38
|
+
map.set("hello", "world", "trusting");
|
|
39
|
+
await map.core.waitForSync();
|
|
40
|
+
|
|
41
|
+
/*
|
|
42
|
+
* Add another client:
|
|
43
|
+
*
|
|
44
|
+
* |-- client1
|
|
45
|
+
* core <-- edge <--|
|
|
46
|
+
* |-- client2
|
|
47
|
+
*
|
|
48
|
+
*/
|
|
49
|
+
const client2 = setupTestNode();
|
|
50
|
+
const { peerStateOnServer: client2PeerStateOnEdge } =
|
|
51
|
+
client2.connectToSyncServer({
|
|
52
|
+
ourName: "client2",
|
|
53
|
+
syncServerName: "edge",
|
|
54
|
+
syncServer: edge.node,
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
client2PeerStateOnEdge.setOptimisticKnownState(map.core.id, {
|
|
58
|
+
id: map.core.id,
|
|
59
|
+
header: false,
|
|
60
|
+
sessions: {},
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// Update the map on client1.
|
|
64
|
+
// This should sync the map AND its dependencies to the new client.
|
|
65
|
+
map.set("hello2", "world2", "trusting");
|
|
66
|
+
await map.core.waitForSync();
|
|
67
|
+
|
|
68
|
+
const syncMessages = SyncMessagesLog.getMessages({
|
|
69
|
+
Group: group.core,
|
|
70
|
+
Map: map.core,
|
|
71
|
+
});
|
|
72
|
+
expect(
|
|
73
|
+
syncMessages.some((msg) =>
|
|
74
|
+
msg.startsWith("edge -> client2 | CONTENT Map"),
|
|
75
|
+
),
|
|
76
|
+
).toBe(true);
|
|
77
|
+
expect(
|
|
78
|
+
syncMessages.some((msg) =>
|
|
79
|
+
msg.startsWith("edge -> client2 | CONTENT Group"),
|
|
80
|
+
),
|
|
81
|
+
).toBe(true);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
test("dependencies are excluded when syncing new content to servers", async () => {
|
|
85
|
+
/*
|
|
86
|
+
* Initial Setup:
|
|
87
|
+
* core1 <-- edge <-- client
|
|
88
|
+
*/
|
|
89
|
+
const core1 = setupTestNode();
|
|
90
|
+
|
|
91
|
+
const edge = setupTestNode();
|
|
92
|
+
edge.connectToSyncServer({
|
|
93
|
+
ourName: "edge",
|
|
94
|
+
syncServerName: "core1",
|
|
95
|
+
syncServer: core1.node,
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
const client = setupTestNode();
|
|
99
|
+
client.connectToSyncServer({
|
|
100
|
+
ourName: "client",
|
|
101
|
+
syncServerName: "edge",
|
|
102
|
+
syncServer: edge.node,
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
// Create a map with a dependency on the client.
|
|
106
|
+
// Everythig will sync all the way back to core1.
|
|
107
|
+
const group = client.node.createGroup();
|
|
108
|
+
const map = group.createMap();
|
|
109
|
+
map.set("hello", "world", "trusting");
|
|
110
|
+
await map.core.waitForSync();
|
|
111
|
+
|
|
112
|
+
/*
|
|
113
|
+
* Add another core:
|
|
114
|
+
*
|
|
115
|
+
* core1 <--
|
|
116
|
+
* |
|
|
117
|
+
* |-- edge <-- client
|
|
118
|
+
* |
|
|
119
|
+
* core2 <--
|
|
120
|
+
*/
|
|
121
|
+
const core2 = setupTestNode();
|
|
122
|
+
const { peerState: core2PeerStateOnEdge } = edge.connectToSyncServer({
|
|
123
|
+
ourName: "edge",
|
|
124
|
+
syncServerName: "core2",
|
|
125
|
+
syncServer: core2.node,
|
|
126
|
+
skipReconciliation: true,
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
core2PeerStateOnEdge.setOptimisticKnownState(map.core.id, {
|
|
130
|
+
id: map.core.id,
|
|
131
|
+
header: false,
|
|
132
|
+
sessions: {},
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
// Update the map on the client.
|
|
136
|
+
// This should sync ONLY the map back to both cores.
|
|
137
|
+
map.set("hello2", "world2", "trusting");
|
|
138
|
+
await map.core.waitForSync();
|
|
139
|
+
|
|
140
|
+
const syncMessages = SyncMessagesLog.getMessages({
|
|
141
|
+
Group: group.core,
|
|
142
|
+
Map: map.core,
|
|
143
|
+
});
|
|
144
|
+
expect(
|
|
145
|
+
syncMessages.some((msg) => msg.startsWith("edge -> core2 | CONTENT Map")),
|
|
146
|
+
).toBe(true);
|
|
147
|
+
expect(
|
|
148
|
+
syncMessages.some((msg) =>
|
|
149
|
+
msg.startsWith("edge -> core2 | CONTENT Group"),
|
|
150
|
+
),
|
|
151
|
+
).toBe(false);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
@@ -171,10 +171,10 @@ describe("loading coValues from server", () => {
|
|
|
171
171
|
[
|
|
172
172
|
"client -> server | LOAD Branch sessions: empty",
|
|
173
173
|
"server -> client | CONTENT Group header: true new: After: 0 New: 5",
|
|
174
|
-
"server -> client | CONTENT Map header: true new: After: 0 New:
|
|
174
|
+
"server -> client | CONTENT Map header: true new: After: 0 New: 3",
|
|
175
175
|
"server -> client | CONTENT Branch header: true new: After: 0 New: 2",
|
|
176
176
|
"client -> server | KNOWN Group sessions: header/5",
|
|
177
|
-
"client -> server | KNOWN Map sessions: header/
|
|
177
|
+
"client -> server | KNOWN Map sessions: header/3",
|
|
178
178
|
"client -> server | KNOWN Branch sessions: header/2",
|
|
179
179
|
]
|
|
180
180
|
`);
|
|
@@ -507,9 +507,9 @@ describe("loading coValues from server", () => {
|
|
|
507
507
|
connected: true,
|
|
508
508
|
});
|
|
509
509
|
|
|
510
|
-
await loadCoValueOrFail(client.node, largeMap.id);
|
|
510
|
+
const mapOnClient = await loadCoValueOrFail(client.node, largeMap.id);
|
|
511
511
|
|
|
512
|
-
await
|
|
512
|
+
await mapOnClient.core.waitForFullStreaming();
|
|
513
513
|
|
|
514
514
|
expect(
|
|
515
515
|
SyncMessagesLog.getMessages({
|
|
@@ -238,7 +238,7 @@ describe("client with storage syncs with server", () => {
|
|
|
238
238
|
[
|
|
239
239
|
"client -> storage | LOAD Branch sessions: empty",
|
|
240
240
|
"storage -> client | CONTENT Group header: true new: After: 0 New: 3",
|
|
241
|
-
"storage -> client | CONTENT Map header: true new: After: 0 New:
|
|
241
|
+
"storage -> client | CONTENT Map header: true new: After: 0 New: 3",
|
|
242
242
|
"storage -> client | CONTENT Branch header: true new: After: 0 New: 2",
|
|
243
243
|
]
|
|
244
244
|
`);
|
|
@@ -14,12 +14,15 @@ import { getDbPath } from "./testStorage";
|
|
|
14
14
|
// We want to simulate a real world communication that happens asynchronously
|
|
15
15
|
TEST_NODE_CONFIG.withAsyncPeers = true;
|
|
16
16
|
|
|
17
|
+
beforeEach(async () => {
|
|
18
|
+
setMaxRecommendedTxSize(100 * 1024);
|
|
19
|
+
});
|
|
20
|
+
|
|
17
21
|
describe("client with storage syncs with server", () => {
|
|
18
22
|
let jazzCloud: ReturnType<typeof setupTestNode>;
|
|
19
23
|
|
|
20
24
|
beforeEach(async () => {
|
|
21
25
|
vi.resetAllMocks();
|
|
22
|
-
setMaxRecommendedTxSize(100 * 1024);
|
|
23
26
|
SyncMessagesLog.clear();
|
|
24
27
|
jazzCloud = setupTestNode({
|
|
25
28
|
isSyncServer: true,
|
|
@@ -434,6 +437,8 @@ describe("client syncs with a server with storage", () => {
|
|
|
434
437
|
});
|
|
435
438
|
|
|
436
439
|
test("large coValue streaming from cold server", async () => {
|
|
440
|
+
setMaxRecommendedTxSize(1000);
|
|
441
|
+
|
|
437
442
|
const server = setupTestNode({
|
|
438
443
|
isSyncServer: true,
|
|
439
444
|
});
|
|
@@ -470,8 +475,6 @@ describe("client syncs with a server with storage", () => {
|
|
|
470
475
|
|
|
471
476
|
await largeMap.core.waitForSync();
|
|
472
477
|
|
|
473
|
-
SyncMessagesLog.clear();
|
|
474
|
-
|
|
475
478
|
server.restart();
|
|
476
479
|
|
|
477
480
|
server.addStorage({
|
|
@@ -491,9 +494,10 @@ describe("client syncs with a server with storage", () => {
|
|
|
491
494
|
storage,
|
|
492
495
|
});
|
|
493
496
|
|
|
494
|
-
|
|
497
|
+
SyncMessagesLog.clear();
|
|
495
498
|
|
|
496
|
-
await
|
|
499
|
+
const mapOnClient2 = await loadCoValueOrFail(client.node, largeMap.id);
|
|
500
|
+
await mapOnClient2.core.waitForFullStreaming();
|
|
497
501
|
|
|
498
502
|
expect(
|
|
499
503
|
SyncMessagesLog.getMessages({
|
|
@@ -516,13 +520,6 @@ describe("client syncs with a server with storage", () => {
|
|
|
516
520
|
"storage -> client | CONTENT Map header: true new: After: 7 New: 1",
|
|
517
521
|
"storage -> client | CONTENT Map header: true new: After: 8 New: 1",
|
|
518
522
|
"storage -> client | CONTENT Map header: true new: After: 9 New: 1",
|
|
519
|
-
"storage -> client | CONTENT Map header: true new: After: 10 New: 0",
|
|
520
|
-
"server -> storage | LOAD Group sessions: empty",
|
|
521
|
-
"storage -> server | CONTENT Group header: true new: After: 0 New: 5",
|
|
522
|
-
"server -> client | KNOWN Group sessions: header/5",
|
|
523
|
-
"server -> storage | LOAD Map sessions: empty",
|
|
524
|
-
"storage -> server | CONTENT Map header: true new: After: 0 New: 1 expectContentUntil: header/10",
|
|
525
|
-
"server -> client | KNOWN Map sessions: header/10",
|
|
526
523
|
]
|
|
527
524
|
`);
|
|
528
525
|
});
|
|
@@ -92,11 +92,11 @@ describe("client to server upload", () => {
|
|
|
92
92
|
"server -> client | CONTENT Map header: true new: After: 0 New: 2",
|
|
93
93
|
"client -> server | KNOWN Group sessions: header/5",
|
|
94
94
|
"client -> server | KNOWN Map sessions: header/2",
|
|
95
|
-
"client -> server | LOAD Branch sessions: empty",
|
|
96
|
-
"server -> client | KNOWN Branch sessions: empty",
|
|
97
95
|
"client -> server | CONTENT Branch header: true new: After: 0 New: 1",
|
|
96
|
+
"client -> server | CONTENT Map header: false new: After: 0 New: 1",
|
|
98
97
|
"client -> server | CONTENT Branch header: false new: After: 1 New: 1",
|
|
99
98
|
"server -> client | KNOWN Branch sessions: header/1",
|
|
99
|
+
"server -> client | KNOWN Map sessions: header/3",
|
|
100
100
|
"server -> client | KNOWN Branch sessions: header/2",
|
|
101
101
|
]
|
|
102
102
|
`);
|