cojson 0.13.5 → 0.13.10
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 +16 -0
- package/LICENSE.txt +1 -1
- package/dist/PeerState.d.ts +6 -0
- package/dist/PeerState.d.ts.map +1 -1
- package/dist/PeerState.js +43 -0
- package/dist/PeerState.js.map +1 -1
- package/dist/coValueCore.d.ts +3 -1
- package/dist/coValueCore.d.ts.map +1 -1
- package/dist/coValueCore.js +26 -8
- package/dist/coValueCore.js.map +1 -1
- package/dist/coValueState.d.ts +1 -0
- package/dist/coValueState.d.ts.map +1 -1
- package/dist/coValueState.js +27 -2
- package/dist/coValueState.js.map +1 -1
- package/dist/coValues/group.d.ts +1 -0
- package/dist/coValues/group.d.ts.map +1 -1
- package/dist/coValues/group.js +45 -21
- package/dist/coValues/group.js.map +1 -1
- package/dist/crypto/crypto.d.ts +2 -2
- package/dist/crypto/crypto.d.ts.map +1 -1
- package/dist/permissions.d.ts +1 -0
- package/dist/permissions.d.ts.map +1 -1
- package/dist/permissions.js +19 -3
- package/dist/permissions.js.map +1 -1
- package/dist/storage/FileSystem.d.ts +2 -2
- package/dist/storage/FileSystem.d.ts.map +1 -1
- package/dist/sync.d.ts +14 -4
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +146 -146
- package/dist/sync.js.map +1 -1
- package/dist/tests/SyncStateManager.test.js +51 -46
- package/dist/tests/SyncStateManager.test.js.map +1 -1
- package/dist/tests/coValueCore.test.js +66 -4
- package/dist/tests/coValueCore.test.js.map +1 -1
- package/dist/tests/coValueState.test.js +31 -4
- package/dist/tests/coValueState.test.js.map +1 -1
- package/dist/tests/group.test.js +135 -2
- package/dist/tests/group.test.js.map +1 -1
- package/dist/tests/messagesTestUtils.d.ts +13 -0
- package/dist/tests/messagesTestUtils.d.ts.map +1 -0
- package/dist/tests/messagesTestUtils.js +42 -0
- package/dist/tests/messagesTestUtils.js.map +1 -0
- package/dist/tests/sync.load.test.d.ts +2 -0
- package/dist/tests/sync.load.test.d.ts.map +1 -0
- package/dist/tests/sync.load.test.js +249 -0
- package/dist/tests/sync.load.test.js.map +1 -0
- package/dist/tests/sync.mesh.test.d.ts +2 -0
- package/dist/tests/sync.mesh.test.d.ts.map +1 -0
- package/dist/tests/sync.mesh.test.js +157 -0
- package/dist/tests/sync.mesh.test.js.map +1 -0
- package/dist/tests/sync.peerReconciliation.test.d.ts +2 -0
- package/dist/tests/sync.peerReconciliation.test.d.ts.map +1 -0
- package/dist/tests/sync.peerReconciliation.test.js +166 -0
- package/dist/tests/sync.peerReconciliation.test.js.map +1 -0
- package/dist/tests/sync.storage.test.d.ts +2 -0
- package/dist/tests/sync.storage.test.d.ts.map +1 -0
- package/dist/tests/sync.storage.test.js +201 -0
- package/dist/tests/sync.storage.test.js.map +1 -0
- package/dist/tests/sync.test.js +139 -1048
- package/dist/tests/sync.test.js.map +1 -1
- package/dist/tests/sync.upload.test.d.ts +2 -0
- package/dist/tests/sync.upload.test.d.ts.map +1 -0
- package/dist/tests/sync.upload.test.js +156 -0
- package/dist/tests/sync.upload.test.js.map +1 -0
- package/dist/tests/testUtils.d.ts +76 -33
- package/dist/tests/testUtils.d.ts.map +1 -1
- package/dist/tests/testUtils.js +154 -47
- package/dist/tests/testUtils.js.map +1 -1
- package/package.json +2 -2
- package/src/PeerState.ts +59 -1
- package/src/coValueCore.ts +37 -7
- package/src/coValueState.ts +34 -3
- package/src/coValues/group.ts +83 -45
- package/src/permissions.ts +31 -3
- package/src/sync.ts +169 -185
- package/src/tests/SyncStateManager.test.ts +58 -70
- package/src/tests/coValueCore.test.ts +90 -3
- package/src/tests/coValueState.test.ts +59 -5
- package/src/tests/group.test.ts +250 -2
- package/src/tests/messagesTestUtils.ts +75 -0
- package/src/tests/sync.load.test.ts +327 -0
- package/src/tests/sync.mesh.test.ts +219 -0
- package/src/tests/sync.peerReconciliation.test.ts +251 -0
- package/src/tests/sync.storage.test.ts +259 -0
- package/src/tests/sync.test.ts +170 -1245
- package/src/tests/sync.upload.test.ts +202 -0
- package/src/tests/testUtils.ts +215 -61
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, test } from "vitest";
|
|
2
|
+
|
|
3
|
+
import { SyncMessagesLog, loadCoValueOrFail, setupTestNode } from "./testUtils";
|
|
4
|
+
|
|
5
|
+
describe("client with storage syncs with server", () => {
|
|
6
|
+
let jazzCloud = setupTestNode({
|
|
7
|
+
isSyncServer: true,
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
beforeEach(async () => {
|
|
11
|
+
SyncMessagesLog.clear();
|
|
12
|
+
jazzCloud = setupTestNode({
|
|
13
|
+
isSyncServer: true,
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test("coValue loading (empty storage)", async () => {
|
|
18
|
+
const client = setupTestNode();
|
|
19
|
+
|
|
20
|
+
client.connectToSyncServer();
|
|
21
|
+
client.addStoragePeer();
|
|
22
|
+
|
|
23
|
+
const group = jazzCloud.node.createGroup();
|
|
24
|
+
const map = group.createMap();
|
|
25
|
+
map.set("hello", "world", "trusting");
|
|
26
|
+
|
|
27
|
+
const mapOnClient = await loadCoValueOrFail(client.node, map.id);
|
|
28
|
+
expect(mapOnClient.get("hello")).toEqual("world");
|
|
29
|
+
|
|
30
|
+
expect(
|
|
31
|
+
SyncMessagesLog.getMessages({
|
|
32
|
+
Group: group.core,
|
|
33
|
+
Map: map.core,
|
|
34
|
+
}),
|
|
35
|
+
).toMatchInlineSnapshot(`
|
|
36
|
+
[
|
|
37
|
+
"client -> storage | LOAD Map sessions: empty",
|
|
38
|
+
"storage -> client | KNOWN Map sessions: empty",
|
|
39
|
+
"client -> server | LOAD Map sessions: empty",
|
|
40
|
+
"server -> client | CONTENT Group header: true new: After: 0 New: 3",
|
|
41
|
+
"client -> server | KNOWN Group sessions: header/3",
|
|
42
|
+
"client -> storage | CONTENT Group header: true new: After: 0 New: 3",
|
|
43
|
+
"server -> client | CONTENT Map header: true new: After: 0 New: 1",
|
|
44
|
+
"storage -> client | KNOWN Group sessions: header/3",
|
|
45
|
+
"client -> storage | CONTENT Map header: true new: After: 0 New: 1",
|
|
46
|
+
"client -> server | KNOWN Map sessions: header/1",
|
|
47
|
+
"storage -> client | KNOWN Map sessions: header/1",
|
|
48
|
+
]
|
|
49
|
+
`);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test("coValue loading (synced storage)", async () => {
|
|
53
|
+
const client = setupTestNode();
|
|
54
|
+
|
|
55
|
+
client.connectToSyncServer();
|
|
56
|
+
const { storage } = client.addStoragePeer();
|
|
57
|
+
|
|
58
|
+
storage.coValuesStore = jazzCloud.node.coValuesStore;
|
|
59
|
+
|
|
60
|
+
const group = jazzCloud.node.createGroup();
|
|
61
|
+
const map = group.createMap();
|
|
62
|
+
map.set("hello", "world", "trusting");
|
|
63
|
+
|
|
64
|
+
const mapOnClient = await loadCoValueOrFail(client.node, map.id);
|
|
65
|
+
expect(mapOnClient.get("hello")).toEqual("world");
|
|
66
|
+
|
|
67
|
+
expect(
|
|
68
|
+
SyncMessagesLog.getMessages({
|
|
69
|
+
Group: group.core,
|
|
70
|
+
Map: map.core,
|
|
71
|
+
}),
|
|
72
|
+
).toMatchInlineSnapshot(`
|
|
73
|
+
[
|
|
74
|
+
"client -> storage | LOAD Map sessions: empty",
|
|
75
|
+
"storage -> client | CONTENT Group header: true new: After: 0 New: 3",
|
|
76
|
+
"client -> storage | KNOWN Group sessions: header/3",
|
|
77
|
+
"storage -> client | CONTENT Map header: true new: After: 0 New: 1",
|
|
78
|
+
"client -> server | CONTENT Group header: true new: After: 0 New: 3",
|
|
79
|
+
"server -> client | KNOWN Group sessions: header/3",
|
|
80
|
+
"client -> server | LOAD Map sessions: header/1",
|
|
81
|
+
"client -> storage | KNOWN Map sessions: header/1",
|
|
82
|
+
"server -> client | CONTENT Group header: true new: After: 0 New: 3",
|
|
83
|
+
"client -> server | KNOWN Group sessions: header/3",
|
|
84
|
+
"server -> client | KNOWN Map sessions: header/1",
|
|
85
|
+
]
|
|
86
|
+
`);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
test("coValue with parent groups loading", async () => {
|
|
90
|
+
const client = setupTestNode();
|
|
91
|
+
|
|
92
|
+
client.connectToSyncServer();
|
|
93
|
+
client.addStoragePeer();
|
|
94
|
+
|
|
95
|
+
const group = jazzCloud.node.createGroup();
|
|
96
|
+
const parentGroup = jazzCloud.node.createGroup();
|
|
97
|
+
parentGroup.addMember("everyone", "reader");
|
|
98
|
+
|
|
99
|
+
group.extend(parentGroup);
|
|
100
|
+
|
|
101
|
+
const map = group.createMap();
|
|
102
|
+
map.set("hello", "world");
|
|
103
|
+
|
|
104
|
+
const mapOnClient = await loadCoValueOrFail(client.node, map.id);
|
|
105
|
+
expect(mapOnClient.get("hello")).toEqual("world");
|
|
106
|
+
|
|
107
|
+
expect(
|
|
108
|
+
SyncMessagesLog.getMessages({
|
|
109
|
+
ParentGroup: parentGroup.core,
|
|
110
|
+
Group: group.core,
|
|
111
|
+
Map: map.core,
|
|
112
|
+
}),
|
|
113
|
+
).toMatchInlineSnapshot(`
|
|
114
|
+
[
|
|
115
|
+
"client -> storage | LOAD Map sessions: empty",
|
|
116
|
+
"storage -> client | KNOWN Map sessions: empty",
|
|
117
|
+
"client -> server | LOAD Map sessions: empty",
|
|
118
|
+
"server -> client | CONTENT ParentGroup header: true new: After: 0 New: 6",
|
|
119
|
+
"client -> server | KNOWN ParentGroup sessions: header/6",
|
|
120
|
+
"client -> storage | CONTENT ParentGroup header: true new: After: 0 New: 6",
|
|
121
|
+
"server -> client | CONTENT Group header: true new: After: 0 New: 5",
|
|
122
|
+
"storage -> client | KNOWN ParentGroup sessions: header/6",
|
|
123
|
+
"server -> client | CONTENT Map header: true new: After: 0 New: 1",
|
|
124
|
+
"client -> storage | CONTENT Group header: true new: After: 0 New: 5",
|
|
125
|
+
"storage -> client | KNOWN Group sessions: header/5",
|
|
126
|
+
"client -> server | KNOWN Group sessions: header/5",
|
|
127
|
+
"client -> storage | CONTENT Map header: true new: After: 0 New: 1",
|
|
128
|
+
"storage -> client | KNOWN Map sessions: header/1",
|
|
129
|
+
"client -> server | KNOWN Map sessions: header/1",
|
|
130
|
+
]
|
|
131
|
+
`);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
test("updating a coValue while offline", async () => {
|
|
135
|
+
const client = setupTestNode();
|
|
136
|
+
|
|
137
|
+
client.connectToSyncServer();
|
|
138
|
+
client.addStoragePeer();
|
|
139
|
+
|
|
140
|
+
const group = jazzCloud.node.createGroup();
|
|
141
|
+
const map = group.createMap();
|
|
142
|
+
map.set("hello", "world", "trusting");
|
|
143
|
+
|
|
144
|
+
const mapOnClient = await loadCoValueOrFail(client.node, map.id);
|
|
145
|
+
expect(mapOnClient.get("hello")).toEqual("world");
|
|
146
|
+
|
|
147
|
+
client.node.syncManager.getPeers()[0]?.gracefulShutdown();
|
|
148
|
+
|
|
149
|
+
SyncMessagesLog.clear();
|
|
150
|
+
map.set("hello", "updated", "trusting");
|
|
151
|
+
|
|
152
|
+
client.connectToSyncServer();
|
|
153
|
+
|
|
154
|
+
await map.core.waitForSync();
|
|
155
|
+
|
|
156
|
+
expect(mapOnClient.get("hello")).toEqual("updated");
|
|
157
|
+
|
|
158
|
+
expect(
|
|
159
|
+
SyncMessagesLog.getMessages({
|
|
160
|
+
Group: group.core,
|
|
161
|
+
Map: map.core,
|
|
162
|
+
}),
|
|
163
|
+
).toMatchInlineSnapshot(`
|
|
164
|
+
[
|
|
165
|
+
"client -> server | LOAD Group sessions: header/3",
|
|
166
|
+
"server -> client | KNOWN Group sessions: header/3",
|
|
167
|
+
"client -> server | LOAD Map sessions: header/1",
|
|
168
|
+
"server -> client | CONTENT Map header: false new: After: 1 New: 1",
|
|
169
|
+
"client -> server | KNOWN Map sessions: header/2",
|
|
170
|
+
"client -> storage | CONTENT Map header: false new: After: 1 New: 1",
|
|
171
|
+
"storage -> client | KNOWN Map sessions: header/2",
|
|
172
|
+
]
|
|
173
|
+
`);
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
describe("client syncs with a server with storage", () => {
|
|
178
|
+
let jazzCloud = setupTestNode({
|
|
179
|
+
isSyncServer: true,
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
beforeEach(async () => {
|
|
183
|
+
SyncMessagesLog.clear();
|
|
184
|
+
jazzCloud = setupTestNode({
|
|
185
|
+
isSyncServer: true,
|
|
186
|
+
});
|
|
187
|
+
jazzCloud.addStoragePeer({
|
|
188
|
+
ourName: "server",
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
test("coValue uploading", async () => {
|
|
193
|
+
const client = setupTestNode();
|
|
194
|
+
|
|
195
|
+
client.connectToSyncServer();
|
|
196
|
+
|
|
197
|
+
const group = client.node.createGroup();
|
|
198
|
+
const map = group.createMap();
|
|
199
|
+
map.set("hello", "world", "trusting");
|
|
200
|
+
|
|
201
|
+
await map.core.waitForSync();
|
|
202
|
+
|
|
203
|
+
const mapOnServer = await loadCoValueOrFail(jazzCloud.node, map.id);
|
|
204
|
+
expect(mapOnServer.get("hello")).toEqual("world");
|
|
205
|
+
|
|
206
|
+
expect(
|
|
207
|
+
SyncMessagesLog.getMessages({
|
|
208
|
+
Group: group.core,
|
|
209
|
+
Map: map.core,
|
|
210
|
+
}),
|
|
211
|
+
).toMatchInlineSnapshot(`
|
|
212
|
+
[
|
|
213
|
+
"client -> server | CONTENT Group header: true new: After: 0 New: 3",
|
|
214
|
+
"server -> client | KNOWN Group sessions: header/3",
|
|
215
|
+
"server -> storage | CONTENT Group header: true new: After: 0 New: 3",
|
|
216
|
+
"client -> server | CONTENT Map header: true new: After: 0 New: 1",
|
|
217
|
+
"storage -> server | KNOWN Group sessions: header/3",
|
|
218
|
+
"server -> client | KNOWN Map sessions: header/1",
|
|
219
|
+
"server -> storage | CONTENT Map header: true new: After: 0 New: 1",
|
|
220
|
+
"storage -> server | KNOWN Map sessions: header/1",
|
|
221
|
+
]
|
|
222
|
+
`);
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
test.skip("server restarts", async () => {
|
|
226
|
+
const client = setupTestNode();
|
|
227
|
+
|
|
228
|
+
client.addStoragePeer();
|
|
229
|
+
|
|
230
|
+
const group = client.node.createGroup();
|
|
231
|
+
const map = group.createMap();
|
|
232
|
+
map.set("hello", "world", "trusting");
|
|
233
|
+
|
|
234
|
+
await map.core.waitForSync();
|
|
235
|
+
|
|
236
|
+
jazzCloud.restart();
|
|
237
|
+
|
|
238
|
+
SyncMessagesLog.clear();
|
|
239
|
+
client.addStoragePeer();
|
|
240
|
+
|
|
241
|
+
const mapOnServer = await loadCoValueOrFail(jazzCloud.node, map.id);
|
|
242
|
+
expect(mapOnServer.get("hello")).toEqual("world");
|
|
243
|
+
|
|
244
|
+
expect(
|
|
245
|
+
SyncMessagesLog.getMessages({
|
|
246
|
+
Group: group.core,
|
|
247
|
+
Map: map.core,
|
|
248
|
+
}),
|
|
249
|
+
).toMatchInlineSnapshot(`
|
|
250
|
+
[
|
|
251
|
+
"server -> storage | LOAD Group sessions: header/3",
|
|
252
|
+
"storage -> server | KNOWN Map sessions: header/1",
|
|
253
|
+
"storage -> server | KNOWN Group sessions: empty",
|
|
254
|
+
"server -> storage | LOAD Map sessions: header/1",
|
|
255
|
+
"storage -> server | KNOWN Map sessions: empty",
|
|
256
|
+
]
|
|
257
|
+
`);
|
|
258
|
+
});
|
|
259
|
+
});
|