cojson 0.16.2 → 0.16.4
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 +9 -0
- package/dist/coValue.d.ts +1 -1
- package/dist/coValueContentMessage.d.ts +10 -0
- package/dist/coValueContentMessage.d.ts.map +1 -0
- package/dist/coValueContentMessage.js +46 -0
- package/dist/coValueContentMessage.js.map +1 -0
- package/dist/coValueCore/coValueCore.d.ts.map +1 -1
- package/dist/coValueCore/coValueCore.js +5 -3
- package/dist/coValueCore/coValueCore.js.map +1 -1
- package/dist/coValueCore/verifiedState.d.ts +1 -0
- package/dist/coValueCore/verifiedState.d.ts.map +1 -1
- package/dist/coValueCore/verifiedState.js +14 -27
- package/dist/coValueCore/verifiedState.js.map +1 -1
- package/dist/coValues/group.d.ts.map +1 -1
- package/dist/coValues/group.js +16 -8
- package/dist/coValues/group.js.map +1 -1
- package/dist/localNode.d.ts +6 -1
- package/dist/localNode.d.ts.map +1 -1
- package/dist/localNode.js +7 -2
- package/dist/localNode.js.map +1 -1
- package/dist/queue/LocalTransactionsSyncQueue.d.ts +24 -0
- package/dist/queue/LocalTransactionsSyncQueue.d.ts.map +1 -0
- package/dist/queue/LocalTransactionsSyncQueue.js +55 -0
- package/dist/queue/LocalTransactionsSyncQueue.js.map +1 -0
- package/dist/queue/StoreQueue.d.ts +9 -6
- package/dist/queue/StoreQueue.d.ts.map +1 -1
- package/dist/queue/StoreQueue.js +10 -2
- package/dist/queue/StoreQueue.js.map +1 -1
- package/dist/storage/storageAsync.d.ts +11 -3
- package/dist/storage/storageAsync.d.ts.map +1 -1
- package/dist/storage/storageAsync.js +59 -46
- package/dist/storage/storageAsync.js.map +1 -1
- package/dist/storage/storageSync.d.ts +9 -3
- package/dist/storage/storageSync.d.ts.map +1 -1
- package/dist/storage/storageSync.js +48 -35
- package/dist/storage/storageSync.js.map +1 -1
- package/dist/storage/syncUtils.d.ts +2 -1
- package/dist/storage/syncUtils.d.ts.map +1 -1
- package/dist/storage/syncUtils.js +4 -0
- package/dist/storage/syncUtils.js.map +1 -1
- package/dist/storage/types.d.ts +3 -2
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/sync.d.ts +6 -6
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +33 -56
- package/dist/sync.js.map +1 -1
- package/dist/tests/StorageApiAsync.test.d.ts +2 -0
- package/dist/tests/StorageApiAsync.test.d.ts.map +1 -0
- package/dist/tests/StorageApiAsync.test.js +574 -0
- package/dist/tests/StorageApiAsync.test.js.map +1 -0
- package/dist/tests/StorageApiSync.test.d.ts +2 -0
- package/dist/tests/StorageApiSync.test.d.ts.map +1 -0
- package/dist/tests/StorageApiSync.test.js +426 -0
- package/dist/tests/StorageApiSync.test.js.map +1 -0
- package/dist/tests/StoreQueue.test.js +9 -21
- package/dist/tests/StoreQueue.test.js.map +1 -1
- package/dist/tests/SyncStateManager.test.js +18 -8
- package/dist/tests/SyncStateManager.test.js.map +1 -1
- package/dist/tests/group.inheritance.test.js +79 -2
- package/dist/tests/group.inheritance.test.js.map +1 -1
- package/dist/tests/sync.auth.test.js +22 -10
- package/dist/tests/sync.auth.test.js.map +1 -1
- package/dist/tests/sync.load.test.js +25 -23
- package/dist/tests/sync.load.test.js.map +1 -1
- package/dist/tests/sync.mesh.test.js +12 -6
- package/dist/tests/sync.mesh.test.js.map +1 -1
- package/dist/tests/sync.peerReconciliation.test.js +6 -4
- package/dist/tests/sync.peerReconciliation.test.js.map +1 -1
- package/dist/tests/sync.storage.test.js +8 -14
- package/dist/tests/sync.storage.test.js.map +1 -1
- package/dist/tests/sync.storageAsync.test.js +31 -14
- package/dist/tests/sync.storageAsync.test.js.map +1 -1
- package/dist/tests/sync.test.js +5 -9
- package/dist/tests/sync.test.js.map +1 -1
- package/dist/tests/sync.upload.test.js +31 -1
- package/dist/tests/sync.upload.test.js.map +1 -1
- package/dist/tests/testStorage.d.ts +2 -3
- package/dist/tests/testStorage.d.ts.map +1 -1
- package/dist/tests/testStorage.js +16 -8
- package/dist/tests/testStorage.js.map +1 -1
- package/dist/tests/testUtils.d.ts +3 -0
- package/dist/tests/testUtils.d.ts.map +1 -1
- package/dist/tests/testUtils.js +17 -4
- package/dist/tests/testUtils.js.map +1 -1
- package/package.json +1 -1
- package/src/coValueContentMessage.ts +73 -0
- package/src/coValueCore/coValueCore.ts +14 -5
- package/src/coValueCore/verifiedState.ts +28 -35
- package/src/coValues/group.ts +20 -9
- package/src/localNode.ts +8 -3
- package/src/queue/LocalTransactionsSyncQueue.ts +96 -0
- package/src/queue/StoreQueue.ts +22 -12
- package/src/storage/storageAsync.ts +78 -56
- package/src/storage/storageSync.ts +66 -45
- package/src/storage/syncUtils.ts +9 -1
- package/src/storage/types.ts +6 -5
- package/src/sync.ts +47 -67
- package/src/tests/StorageApiAsync.test.ts +829 -0
- package/src/tests/StorageApiSync.test.ts +628 -0
- package/src/tests/StoreQueue.test.ts +10 -24
- package/src/tests/SyncStateManager.test.ts +22 -21
- package/src/tests/group.inheritance.test.ts +136 -1
- package/src/tests/sync.auth.test.ts +22 -10
- package/src/tests/sync.load.test.ts +27 -24
- package/src/tests/sync.mesh.test.ts +12 -6
- package/src/tests/sync.peerReconciliation.test.ts +6 -4
- package/src/tests/sync.storage.test.ts +8 -14
- package/src/tests/sync.storageAsync.test.ts +39 -14
- package/src/tests/sync.test.ts +6 -14
- package/src/tests/sync.upload.test.ts +38 -1
- package/src/tests/testStorage.ts +19 -13
- package/src/tests/testUtils.ts +24 -5
|
@@ -38,14 +38,6 @@ describe("SyncStateManager", () => {
|
|
|
38
38
|
const updateSpy: GlobalSyncStateListenerCallback = vi.fn();
|
|
39
39
|
const unsubscribe = subscriptionManager.subscribeToUpdates(updateSpy);
|
|
40
40
|
|
|
41
|
-
await client.node.syncManager.syncCoValue(map.core);
|
|
42
|
-
|
|
43
|
-
expect(updateSpy).toHaveBeenCalledWith(
|
|
44
|
-
peerState.id,
|
|
45
|
-
emptyKnownState(map.core.id),
|
|
46
|
-
{ uploaded: false },
|
|
47
|
-
);
|
|
48
|
-
|
|
49
41
|
await waitFor(() => {
|
|
50
42
|
return subscriptionManager.getCurrentSyncState(peerState.id, map.core.id)
|
|
51
43
|
.uploaded;
|
|
@@ -98,13 +90,6 @@ describe("SyncStateManager", () => {
|
|
|
98
90
|
unsubscribe2();
|
|
99
91
|
});
|
|
100
92
|
|
|
101
|
-
await client.node.syncManager.syncCoValue(map.core);
|
|
102
|
-
|
|
103
|
-
expect(updateToJazzCloudSpy).toHaveBeenCalledWith(
|
|
104
|
-
emptyKnownState(map.core.id),
|
|
105
|
-
{ uploaded: false },
|
|
106
|
-
);
|
|
107
|
-
|
|
108
93
|
await waitFor(() => {
|
|
109
94
|
return subscriptionManager.getCurrentSyncState(peerState.id, map.core.id)
|
|
110
95
|
.uploaded;
|
|
@@ -117,7 +102,7 @@ describe("SyncStateManager", () => {
|
|
|
117
102
|
{ uploaded: true },
|
|
118
103
|
);
|
|
119
104
|
|
|
120
|
-
expect(updateToStorageSpy).
|
|
105
|
+
expect(updateToStorageSpy).toHaveBeenCalledWith(
|
|
121
106
|
emptyKnownState(group.core.id),
|
|
122
107
|
{ uploaded: false },
|
|
123
108
|
);
|
|
@@ -133,8 +118,6 @@ describe("SyncStateManager", () => {
|
|
|
133
118
|
const map = group.createMap();
|
|
134
119
|
map.set("key1", "value1", "trusting");
|
|
135
120
|
|
|
136
|
-
await client.node.syncManager.syncCoValue(map.core);
|
|
137
|
-
|
|
138
121
|
const subscriptionManager = client.node.syncManager.syncState;
|
|
139
122
|
|
|
140
123
|
expect(
|
|
@@ -174,8 +157,6 @@ describe("SyncStateManager", () => {
|
|
|
174
157
|
unsubscribe1();
|
|
175
158
|
unsubscribe2();
|
|
176
159
|
|
|
177
|
-
await client.node.syncManager.syncCoValue(map.core);
|
|
178
|
-
|
|
179
160
|
anyUpdateSpy.mockClear();
|
|
180
161
|
|
|
181
162
|
await waitFor(() => {
|
|
@@ -336,6 +317,26 @@ describe("SyncStateManager", () => {
|
|
|
336
317
|
|
|
337
318
|
await map.core.waitForSync();
|
|
338
319
|
|
|
339
|
-
expect(client.node.getCoValue(map.id).
|
|
320
|
+
expect(client.node.getCoValue(map.id).hasVerifiedContent()).toBe(true);
|
|
321
|
+
|
|
322
|
+
// Since only the map is subscribed, the dependencies are pushed after the client requests them
|
|
323
|
+
await waitFor(() => {
|
|
324
|
+
expect(client.node.getCoValue(map.id).isAvailable()).toBe(true);
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
expect(
|
|
328
|
+
SyncMessagesLog.getMessages({
|
|
329
|
+
Map: map.core,
|
|
330
|
+
Group: group.core,
|
|
331
|
+
}),
|
|
332
|
+
).toMatchInlineSnapshot(`
|
|
333
|
+
[
|
|
334
|
+
"server -> client | CONTENT Map header: true new: After: 0 New: 1",
|
|
335
|
+
"client -> server | LOAD Group sessions: empty",
|
|
336
|
+
"client -> server | KNOWN Map sessions: header/1",
|
|
337
|
+
"server -> client | CONTENT Group header: true new: After: 0 New: 3",
|
|
338
|
+
"client -> server | KNOWN Group sessions: header/3",
|
|
339
|
+
]
|
|
340
|
+
`);
|
|
340
341
|
});
|
|
341
342
|
});
|
|
@@ -1,10 +1,19 @@
|
|
|
1
|
-
import { describe, expect, test } from "vitest";
|
|
1
|
+
import { beforeEach, describe, expect, test } from "vitest";
|
|
2
2
|
import {
|
|
3
|
+
SyncMessagesLog,
|
|
3
4
|
createThreeConnectedNodes,
|
|
4
5
|
createTwoConnectedNodes,
|
|
5
6
|
loadCoValueOrFail,
|
|
7
|
+
setupTestNode,
|
|
6
8
|
} from "./testUtils";
|
|
7
9
|
|
|
10
|
+
let jazzCloud: ReturnType<typeof setupTestNode>;
|
|
11
|
+
|
|
12
|
+
beforeEach(async () => {
|
|
13
|
+
SyncMessagesLog.clear();
|
|
14
|
+
jazzCloud = setupTestNode({ isSyncServer: true });
|
|
15
|
+
});
|
|
16
|
+
|
|
8
17
|
describe("extend", () => {
|
|
9
18
|
test("inherited writer roles should work correctly", async () => {
|
|
10
19
|
const { node1, node2 } = await createTwoConnectedNodes("server", "server");
|
|
@@ -143,6 +152,132 @@ describe("extend", () => {
|
|
|
143
152
|
expect(map.get("test")).toEqual("Hello!");
|
|
144
153
|
});
|
|
145
154
|
|
|
155
|
+
test("should not break when checking for cycles on a loaded group", async () => {
|
|
156
|
+
const clientSession1 = setupTestNode({
|
|
157
|
+
connected: true,
|
|
158
|
+
});
|
|
159
|
+
const clientSession2 = clientSession1.spawnNewSession();
|
|
160
|
+
|
|
161
|
+
const group = clientSession1.node.createGroup();
|
|
162
|
+
const childGroup = clientSession1.node.createGroup();
|
|
163
|
+
const group2 = clientSession1.node.createGroup();
|
|
164
|
+
const group3 = clientSession1.node.createGroup();
|
|
165
|
+
|
|
166
|
+
childGroup.extend(group);
|
|
167
|
+
group.extend(group2);
|
|
168
|
+
group2.extend(group3);
|
|
169
|
+
|
|
170
|
+
await group.core.waitForSync();
|
|
171
|
+
await childGroup.core.waitForSync();
|
|
172
|
+
await group2.core.waitForSync();
|
|
173
|
+
await group3.core.waitForSync();
|
|
174
|
+
|
|
175
|
+
const groupOnClientSession2 = await loadCoValueOrFail(
|
|
176
|
+
clientSession2.node,
|
|
177
|
+
group.id,
|
|
178
|
+
);
|
|
179
|
+
const group3OnClientSession2 = await loadCoValueOrFail(
|
|
180
|
+
clientSession2.node,
|
|
181
|
+
group3.id,
|
|
182
|
+
);
|
|
183
|
+
|
|
184
|
+
expect(group3OnClientSession2.isSelfExtension(groupOnClientSession2)).toBe(
|
|
185
|
+
true,
|
|
186
|
+
);
|
|
187
|
+
|
|
188
|
+
// Child groups are not loaded as dependencies, and we want to make sure having a missing child doesn't break the extension
|
|
189
|
+
expect(clientSession2.node.getCoValue(childGroup.id).isAvailable()).toEqual(
|
|
190
|
+
false,
|
|
191
|
+
);
|
|
192
|
+
|
|
193
|
+
group3OnClientSession2.extend(groupOnClientSession2);
|
|
194
|
+
|
|
195
|
+
expect(group3OnClientSession2.getParentGroups()).toEqual([]);
|
|
196
|
+
|
|
197
|
+
const map = group3OnClientSession2.createMap();
|
|
198
|
+
map.set("test", "Hello!");
|
|
199
|
+
|
|
200
|
+
expect(map.get("test")).toEqual("Hello!");
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
test("should extend groups when loaded from a different session", async () => {
|
|
204
|
+
const clientSession1 = setupTestNode({
|
|
205
|
+
connected: true,
|
|
206
|
+
});
|
|
207
|
+
const clientSession2 = clientSession1.spawnNewSession();
|
|
208
|
+
|
|
209
|
+
const group = clientSession1.node.createGroup();
|
|
210
|
+
const group2 = clientSession1.node.createGroup();
|
|
211
|
+
|
|
212
|
+
await group.core.waitForSync();
|
|
213
|
+
await group2.core.waitForSync();
|
|
214
|
+
|
|
215
|
+
const groupOnClientSession2 = await loadCoValueOrFail(
|
|
216
|
+
clientSession2.node,
|
|
217
|
+
group.id,
|
|
218
|
+
);
|
|
219
|
+
const group2OnClientSession2 = await loadCoValueOrFail(
|
|
220
|
+
clientSession2.node,
|
|
221
|
+
group2.id,
|
|
222
|
+
);
|
|
223
|
+
|
|
224
|
+
group2OnClientSession2.extend(groupOnClientSession2);
|
|
225
|
+
|
|
226
|
+
expect(group2OnClientSession2.getParentGroups()).toEqual([
|
|
227
|
+
groupOnClientSession2,
|
|
228
|
+
]);
|
|
229
|
+
|
|
230
|
+
const map = group2OnClientSession2.createMap();
|
|
231
|
+
map.set("test", "Hello!");
|
|
232
|
+
|
|
233
|
+
expect(map.get("test")).toEqual("Hello!");
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
test("should extend groups when there is a cycle in the parent groups", async () => {
|
|
237
|
+
const clientSession1 = setupTestNode({
|
|
238
|
+
connected: true,
|
|
239
|
+
});
|
|
240
|
+
const clientSession2 = clientSession1.spawnNewSession();
|
|
241
|
+
|
|
242
|
+
const group = clientSession1.node.createGroup();
|
|
243
|
+
const group2 = clientSession1.node.createGroup();
|
|
244
|
+
|
|
245
|
+
await group.core.waitForSync();
|
|
246
|
+
await group2.core.waitForSync();
|
|
247
|
+
|
|
248
|
+
const groupOnClientSession2 = await loadCoValueOrFail(
|
|
249
|
+
clientSession2.node,
|
|
250
|
+
group.id,
|
|
251
|
+
);
|
|
252
|
+
const group2OnClientSession2 = await loadCoValueOrFail(
|
|
253
|
+
clientSession2.node,
|
|
254
|
+
group2.id,
|
|
255
|
+
);
|
|
256
|
+
|
|
257
|
+
group.extend(group2);
|
|
258
|
+
group2OnClientSession2.extend(groupOnClientSession2);
|
|
259
|
+
|
|
260
|
+
expect(group.getParentGroups()).toEqual([group2]);
|
|
261
|
+
|
|
262
|
+
expect(group2OnClientSession2.getParentGroups()).toEqual([
|
|
263
|
+
groupOnClientSession2,
|
|
264
|
+
]);
|
|
265
|
+
|
|
266
|
+
await group.core.waitForSync();
|
|
267
|
+
await group2OnClientSession2.core.waitForSync();
|
|
268
|
+
|
|
269
|
+
const group3 = clientSession1.node.createGroup();
|
|
270
|
+
|
|
271
|
+
group3.extend(group2);
|
|
272
|
+
|
|
273
|
+
expect(group3.getParentGroups()).toEqual([group2]);
|
|
274
|
+
|
|
275
|
+
const map = group3.createMap();
|
|
276
|
+
map.set("test", "Hello!");
|
|
277
|
+
|
|
278
|
+
expect(map.get("test")).toEqual("Hello!");
|
|
279
|
+
});
|
|
280
|
+
|
|
146
281
|
test("a writerInvite role should not be inherited", async () => {
|
|
147
282
|
const { node1, node2 } = await createTwoConnectedNodes("server", "server");
|
|
148
283
|
|
|
@@ -53,12 +53,14 @@ describe("LocalNode auth sync", () => {
|
|
|
53
53
|
}),
|
|
54
54
|
).toMatchInlineSnapshot(`
|
|
55
55
|
[
|
|
56
|
-
"client -> server | CONTENT Account header: true new: After: 0 New:
|
|
56
|
+
"client -> server | CONTENT Account header: true new: After: 0 New: 3",
|
|
57
57
|
"client -> server | CONTENT ProfileGroup header: true new: After: 0 New: 5",
|
|
58
58
|
"client -> server | CONTENT Profile header: true new: After: 0 New: 1",
|
|
59
|
-
"
|
|
59
|
+
"client -> server | CONTENT Account header: false new: After: 3 New: 1",
|
|
60
|
+
"server -> client | KNOWN Account sessions: header/3",
|
|
60
61
|
"server -> client | KNOWN ProfileGroup sessions: header/5",
|
|
61
62
|
"server -> client | KNOWN Profile sessions: header/1",
|
|
63
|
+
"server -> client | KNOWN Account sessions: header/4",
|
|
62
64
|
]
|
|
63
65
|
`);
|
|
64
66
|
});
|
|
@@ -114,12 +116,18 @@ describe("LocalNode auth sync", () => {
|
|
|
114
116
|
}),
|
|
115
117
|
).toMatchInlineSnapshot(`
|
|
116
118
|
[
|
|
117
|
-
"client -> server | CONTENT Account header: true new: After: 0 New:
|
|
118
|
-
"client -> server | CONTENT Root header: true new:
|
|
119
|
-
"client -> server | CONTENT Profile header: true new:
|
|
120
|
-
"
|
|
119
|
+
"client -> server | CONTENT Account header: true new: After: 0 New: 3",
|
|
120
|
+
"client -> server | CONTENT Root header: true new: ",
|
|
121
|
+
"client -> server | CONTENT Profile header: true new: ",
|
|
122
|
+
"client -> server | CONTENT Root header: false new: After: 0 New: 1",
|
|
123
|
+
"client -> server | CONTENT Profile header: false new: After: 0 New: 1",
|
|
124
|
+
"client -> server | CONTENT Account header: false new: After: 3 New: 2",
|
|
125
|
+
"server -> client | KNOWN Account sessions: header/3",
|
|
126
|
+
"server -> client | KNOWN Root sessions: header/0",
|
|
127
|
+
"server -> client | KNOWN Profile sessions: header/0",
|
|
121
128
|
"server -> client | KNOWN Root sessions: header/1",
|
|
122
129
|
"server -> client | KNOWN Profile sessions: header/1",
|
|
130
|
+
"server -> client | KNOWN Account sessions: header/5",
|
|
123
131
|
]
|
|
124
132
|
`);
|
|
125
133
|
});
|
|
@@ -168,13 +176,15 @@ describe("LocalNode auth sync", () => {
|
|
|
168
176
|
}),
|
|
169
177
|
).toMatchInlineSnapshot(`
|
|
170
178
|
[
|
|
171
|
-
"creation-node -> server | CONTENT Account header: true new: After: 0 New:
|
|
179
|
+
"creation-node -> server | CONTENT Account header: true new: After: 0 New: 3",
|
|
172
180
|
"creation-node -> server | CONTENT ProfileGroup header: true new: After: 0 New: 5",
|
|
173
181
|
"creation-node -> server | CONTENT Profile header: true new: After: 0 New: 1",
|
|
182
|
+
"creation-node -> server | CONTENT Account header: false new: After: 3 New: 1",
|
|
174
183
|
"auth-node -> server | LOAD Account sessions: empty",
|
|
175
|
-
"server -> creation-node | KNOWN Account sessions: header/
|
|
184
|
+
"server -> creation-node | KNOWN Account sessions: header/3",
|
|
176
185
|
"server -> creation-node | KNOWN ProfileGroup sessions: header/5",
|
|
177
186
|
"server -> creation-node | KNOWN Profile sessions: header/1",
|
|
187
|
+
"server -> creation-node | KNOWN Account sessions: header/4",
|
|
178
188
|
"server -> auth-node | CONTENT Account header: true new: After: 0 New: 4",
|
|
179
189
|
"auth-node -> server | KNOWN Account sessions: header/4",
|
|
180
190
|
"auth-node -> server | LOAD Profile sessions: empty",
|
|
@@ -236,12 +246,14 @@ describe("LocalNode auth sync", () => {
|
|
|
236
246
|
}),
|
|
237
247
|
).toMatchInlineSnapshot(`
|
|
238
248
|
[
|
|
239
|
-
"creation-node -> server | CONTENT Account header: true new: After: 0 New:
|
|
249
|
+
"creation-node -> server | CONTENT Account header: true new: After: 0 New: 3",
|
|
240
250
|
"creation-node -> server | CONTENT ProfileGroup header: true new: After: 0 New: 5",
|
|
241
251
|
"creation-node -> server | CONTENT Profile header: true new: After: 0 New: 1",
|
|
242
|
-
"
|
|
252
|
+
"creation-node -> server | CONTENT Account header: false new: After: 3 New: 1",
|
|
253
|
+
"server -> creation-node | KNOWN Account sessions: header/3",
|
|
243
254
|
"server -> creation-node | KNOWN ProfileGroup sessions: header/5",
|
|
244
255
|
"server -> creation-node | KNOWN Profile sessions: header/1",
|
|
256
|
+
"server -> creation-node | KNOWN Account sessions: header/4",
|
|
245
257
|
"auth-node -> server | LOAD Account sessions: empty",
|
|
246
258
|
"server -> auth-node | CONTENT Account header: true new: After: 0 New: 4",
|
|
247
259
|
"auth-node -> server | KNOWN Account sessions: header/4",
|
|
@@ -15,15 +15,15 @@ import {
|
|
|
15
15
|
waitFor,
|
|
16
16
|
} from "./testUtils";
|
|
17
17
|
|
|
18
|
-
// We want to simulate a real world communication that happens asynchronously
|
|
19
|
-
TEST_NODE_CONFIG.withAsyncPeers = true;
|
|
20
|
-
|
|
21
18
|
let jazzCloud: ReturnType<typeof setupTestNode>;
|
|
22
19
|
|
|
23
20
|
// Set a short timeout to make the tests on unavailable complete faster
|
|
24
21
|
setCoValueLoadingRetryDelay(100);
|
|
25
22
|
|
|
26
23
|
beforeEach(async () => {
|
|
24
|
+
// We want to simulate a real world communication that happens asynchronously
|
|
25
|
+
TEST_NODE_CONFIG.withAsyncPeers = true;
|
|
26
|
+
|
|
27
27
|
SyncMessagesLog.clear();
|
|
28
28
|
jazzCloud = setupTestNode({ isSyncServer: true });
|
|
29
29
|
});
|
|
@@ -295,10 +295,9 @@ describe("loading coValues from server", () => {
|
|
|
295
295
|
[
|
|
296
296
|
"client -> server | LOAD Group sessions: header/3",
|
|
297
297
|
"client -> server | LOAD Map sessions: header/1",
|
|
298
|
-
"server -> client | CONTENT Group header: true new: After: 0 New: 3",
|
|
299
|
-
"server -> client | CONTENT Map header: true new: After: 0 New: 2",
|
|
300
298
|
"server -> client | CONTENT Map header: false new: After: 1 New: 1",
|
|
301
|
-
"
|
|
299
|
+
"server -> client | KNOWN Group sessions: header/3",
|
|
300
|
+
"server -> client | CONTENT Map header: false new: After: 1 New: 1",
|
|
302
301
|
"client -> server | KNOWN Map sessions: header/2",
|
|
303
302
|
"client -> server | KNOWN Map sessions: header/2",
|
|
304
303
|
]
|
|
@@ -340,11 +339,10 @@ describe("loading coValues from server", () => {
|
|
|
340
339
|
[
|
|
341
340
|
"client -> server | LOAD Group sessions: header/5",
|
|
342
341
|
"client -> server | LOAD Map sessions: header/2",
|
|
343
|
-
"server -> client | CONTENT
|
|
344
|
-
"server -> client | CONTENT Map header: true new: After: 0 New: 2",
|
|
342
|
+
"server -> client | CONTENT Map header: false new: After: 1 New: 1",
|
|
345
343
|
"client -> server | CONTENT Map header: false new: After: 0 New: 1",
|
|
344
|
+
"server -> client | KNOWN Group sessions: header/5",
|
|
346
345
|
"server -> client | CONTENT Map header: false new: After: 1 New: 1",
|
|
347
|
-
"client -> server | KNOWN Group sessions: header/5",
|
|
348
346
|
"client -> server | KNOWN Map sessions: header/3",
|
|
349
347
|
"server -> client | KNOWN Map sessions: header/3",
|
|
350
348
|
"client -> server | KNOWN Map sessions: header/3",
|
|
@@ -550,6 +548,8 @@ describe("loading coValues from server", () => {
|
|
|
550
548
|
});
|
|
551
549
|
|
|
552
550
|
test("should handle reconnections in the middle of a load with a persistent peer", async () => {
|
|
551
|
+
TEST_NODE_CONFIG.withAsyncPeers = false; // To avoid flakiness
|
|
552
|
+
|
|
553
553
|
const client = setupTestNode();
|
|
554
554
|
const connection1 = client.connectToSyncServer({
|
|
555
555
|
persistent: true,
|
|
@@ -591,9 +591,9 @@ describe("loading coValues from server", () => {
|
|
|
591
591
|
"server -> client | CONTENT Group header: true new: After: 0 New: 5",
|
|
592
592
|
"client -> server | KNOWN Group sessions: header/5",
|
|
593
593
|
"client -> server | LOAD Map sessions: empty",
|
|
594
|
-
"client -> server | LOAD Group sessions: header/5",
|
|
595
594
|
"server -> client | KNOWN Group sessions: header/5",
|
|
596
595
|
"server -> client | CONTENT Map header: true new: After: 0 New: 1",
|
|
596
|
+
"client -> server | LOAD Group sessions: header/5",
|
|
597
597
|
"client -> server | KNOWN Map sessions: header/1",
|
|
598
598
|
]
|
|
599
599
|
`);
|
|
@@ -634,7 +634,7 @@ describe("loading coValues from server", () => {
|
|
|
634
634
|
"server -> client | CONTENT Map header: true new: After: 0 New: 1",
|
|
635
635
|
"client -> server | KNOWN ParentGroup sessions: header/6",
|
|
636
636
|
"client -> server | LOAD Group sessions: empty",
|
|
637
|
-
"client -> server | KNOWN Map sessions:
|
|
637
|
+
"client -> server | KNOWN Map sessions: header/1",
|
|
638
638
|
"server -> client | CONTENT Group header: true new: After: 0 New: 5",
|
|
639
639
|
"client -> server | KNOWN Group sessions: header/5",
|
|
640
640
|
]
|
|
@@ -677,8 +677,8 @@ describe("loading coValues from server", () => {
|
|
|
677
677
|
"server -> client | CONTENT Group header: true new: After: 0 New: 5",
|
|
678
678
|
"server -> client | CONTENT Map header: true new: After: 0 New: 1",
|
|
679
679
|
"client -> server | LOAD ParentGroup sessions: empty",
|
|
680
|
-
"client -> server | KNOWN Group sessions:
|
|
681
|
-
"client -> server | KNOWN Map sessions:
|
|
680
|
+
"client -> server | KNOWN Group sessions: header/5",
|
|
681
|
+
"client -> server | KNOWN Map sessions: header/1",
|
|
682
682
|
"server -> client | CONTENT ParentGroup header: true new: After: 0 New: 6",
|
|
683
683
|
"client -> server | KNOWN ParentGroup sessions: header/6",
|
|
684
684
|
]
|
|
@@ -723,8 +723,8 @@ describe("loading coValues from server", () => {
|
|
|
723
723
|
"server -> client | CONTENT Group header: true new: After: 0 New: 5",
|
|
724
724
|
"server -> client | CONTENT Map header: true new: After: 0 New: 1",
|
|
725
725
|
"client -> server | LOAD Account sessions: empty",
|
|
726
|
-
"client -> server | KNOWN Group sessions:
|
|
727
|
-
"client -> server | KNOWN Map sessions:
|
|
726
|
+
"client -> server | KNOWN Group sessions: header/0",
|
|
727
|
+
"client -> server | KNOWN Map sessions: header/0",
|
|
728
728
|
"server -> client | CONTENT Account header: true new: After: 0 New: 4",
|
|
729
729
|
"client -> server | KNOWN Account sessions: header/4",
|
|
730
730
|
"client -> server | KNOWN Group sessions: header/5",
|
|
@@ -787,7 +787,7 @@ describe("loading coValues from server", () => {
|
|
|
787
787
|
"server -> client | CONTENT Map header: true new: After: 0 New: 1 | After: 0 New: 1",
|
|
788
788
|
"client -> server | KNOWN Group sessions: header/5",
|
|
789
789
|
"client -> server | LOAD Account sessions: empty",
|
|
790
|
-
"client -> server | KNOWN Map sessions:
|
|
790
|
+
"client -> server | KNOWN Map sessions: header/1",
|
|
791
791
|
"server -> client | CONTENT Account header: true new: After: 0 New: 4",
|
|
792
792
|
"client -> server | KNOWN Account sessions: header/4",
|
|
793
793
|
"client -> server | KNOWN Map sessions: header/2",
|
|
@@ -851,8 +851,8 @@ describe("loading coValues from server", () => {
|
|
|
851
851
|
"server -> client | CONTENT Group header: true new: After: 0 New: 5",
|
|
852
852
|
"server -> client | CONTENT Map header: true new: After: 0 New: 1",
|
|
853
853
|
"client -> server | LOAD Account sessions: empty",
|
|
854
|
-
"client -> server | KNOWN Group sessions:
|
|
855
|
-
"client -> server | KNOWN Map sessions:
|
|
854
|
+
"client -> server | KNOWN Group sessions: header/0",
|
|
855
|
+
"client -> server | KNOWN Map sessions: header/0",
|
|
856
856
|
"server -> client | CONTENT Account header: true new: After: 0 New: 4",
|
|
857
857
|
"server -> client | CONTENT Account header: true new: After: 0 New: 4",
|
|
858
858
|
"client -> server | KNOWN Account sessions: header/4",
|
|
@@ -922,7 +922,7 @@ describe("loading coValues from server", () => {
|
|
|
922
922
|
"client -> server | LOAD Map sessions: empty",
|
|
923
923
|
"server -> client | CONTENT Map header: true new: After: 0 New: 1",
|
|
924
924
|
"client -> server | LOAD Account sessions: empty",
|
|
925
|
-
"client -> server | KNOWN Map sessions:
|
|
925
|
+
"client -> server | KNOWN Map sessions: header/0",
|
|
926
926
|
"server -> client | CONTENT Account header: true new: After: 0 New: 4",
|
|
927
927
|
"server -> client | CONTENT Account header: true new: After: 0 New: 4",
|
|
928
928
|
"client -> server | KNOWN Account sessions: header/4",
|
|
@@ -960,14 +960,17 @@ describe("loading coValues from server", () => {
|
|
|
960
960
|
}),
|
|
961
961
|
).toMatchInlineSnapshot(`
|
|
962
962
|
[
|
|
963
|
-
"client -> server | CONTENT
|
|
964
|
-
"client -> server | CONTENT
|
|
963
|
+
"client -> server | CONTENT Group header: true new: After: 0 New: 3",
|
|
964
|
+
"client -> server | CONTENT ParentGroup header: true new: After: 0 New: 6",
|
|
965
|
+
"client -> server | CONTENT Group header: false new: After: 3 New: 3",
|
|
966
|
+
"client -> server | CONTENT ParentGroup header: false new: After: 6 New: 2",
|
|
965
967
|
"client -> server | CONTENT Map header: true new: After: 0 New: 1",
|
|
966
|
-
"server -> client |
|
|
967
|
-
"server -> client | KNOWN ParentGroup sessions:
|
|
968
|
+
"server -> client | KNOWN Group sessions: header/3",
|
|
969
|
+
"server -> client | KNOWN ParentGroup sessions: header/6",
|
|
968
970
|
"server -> client | KNOWN Group sessions: header/6",
|
|
971
|
+
"server -> client | KNOWN ParentGroup sessions: header/8",
|
|
969
972
|
"server -> client | KNOWN Map sessions: header/1",
|
|
970
|
-
"client -> server | CONTENT
|
|
973
|
+
"client -> server | CONTENT ParentGroup header: true new: ",
|
|
971
974
|
]
|
|
972
975
|
`);
|
|
973
976
|
});
|
|
@@ -142,19 +142,26 @@ describe("multiple clients syncing with the a cloud-like server mesh", () => {
|
|
|
142
142
|
}),
|
|
143
143
|
).toMatchInlineSnapshot(`
|
|
144
144
|
[
|
|
145
|
-
"edge-france -> storage | CONTENT Group header: true new: After: 0 New:
|
|
146
|
-
"edge-france -> core | CONTENT
|
|
147
|
-
"edge-france -> core | CONTENT Group header: true new: After: 0 New: 5",
|
|
145
|
+
"edge-france -> storage | CONTENT Group header: true new: After: 0 New: 3",
|
|
146
|
+
"edge-france -> core | CONTENT Group header: true new: After: 0 New: 3",
|
|
148
147
|
"edge-france -> storage | CONTENT ParentGroup header: true new: After: 0 New: 6",
|
|
148
|
+
"edge-france -> core | CONTENT ParentGroup header: true new: After: 0 New: 6",
|
|
149
|
+
"edge-france -> storage | CONTENT Group header: false new: After: 3 New: 2",
|
|
150
|
+
"edge-france -> core | CONTENT Group header: false new: After: 3 New: 2",
|
|
149
151
|
"edge-france -> storage | CONTENT Map header: true new: After: 0 New: 1",
|
|
150
152
|
"edge-france -> core | CONTENT Map header: true new: After: 0 New: 1",
|
|
153
|
+
"core -> edge-france | KNOWN Group sessions: header/3",
|
|
154
|
+
"core -> storage | CONTENT Group header: true new: After: 0 New: 3",
|
|
151
155
|
"core -> edge-france | KNOWN ParentGroup sessions: header/6",
|
|
152
156
|
"core -> storage | CONTENT ParentGroup header: true new: After: 0 New: 6",
|
|
153
157
|
"core -> edge-france | KNOWN Group sessions: header/5",
|
|
154
|
-
"core -> storage | CONTENT Group header:
|
|
158
|
+
"core -> storage | CONTENT Group header: false new: After: 3 New: 2",
|
|
155
159
|
"core -> edge-france | KNOWN Map sessions: header/1",
|
|
156
160
|
"core -> storage | CONTENT Map header: true new: After: 0 New: 1",
|
|
161
|
+
"edge-france -> core | CONTENT ParentGroup header: true new: ",
|
|
157
162
|
"client -> edge-italy | LOAD Map sessions: empty",
|
|
163
|
+
"core -> edge-france | KNOWN ParentGroup sessions: header/6",
|
|
164
|
+
"core -> storage | CONTENT ParentGroup header: true new: ",
|
|
158
165
|
"edge-italy -> storage | LOAD Map sessions: empty",
|
|
159
166
|
"storage -> edge-italy | KNOWN Map sessions: empty",
|
|
160
167
|
"edge-italy -> core | LOAD Map sessions: empty",
|
|
@@ -509,8 +516,7 @@ describe("multiple clients syncing with the a cloud-like server mesh", () => {
|
|
|
509
516
|
).toMatchInlineSnapshot(`
|
|
510
517
|
[
|
|
511
518
|
"edge -> storage | CONTENT Group header: true new: After: 0 New: 5",
|
|
512
|
-
"edge -> storage | CONTENT Map header: true new:
|
|
513
|
-
"edge -> storage | CONTENT Map header: false new: After: 0 New: 73",
|
|
519
|
+
"edge -> storage | CONTENT Map header: true new: After: 0 New: 73",
|
|
514
520
|
"edge -> storage | CONTENT Map header: false new: After: 73 New: 73",
|
|
515
521
|
"edge -> storage | CONTENT Map header: false new: After: 146 New: 54",
|
|
516
522
|
]
|
|
@@ -47,6 +47,8 @@ describe("peer reconciliation", () => {
|
|
|
47
47
|
"server -> client | KNOWN Map sessions: empty",
|
|
48
48
|
"server -> client | KNOWN Group sessions: header/3",
|
|
49
49
|
"server -> client | KNOWN Map sessions: header/1",
|
|
50
|
+
"client -> server | CONTENT Group header: true new: ",
|
|
51
|
+
"client -> server | CONTENT Map header: true new: ",
|
|
50
52
|
]
|
|
51
53
|
`);
|
|
52
54
|
});
|
|
@@ -203,7 +205,7 @@ describe("peer reconciliation", () => {
|
|
|
203
205
|
"server -> client | KNOWN CORRECTION Map sessions: empty",
|
|
204
206
|
"client -> server | CONTENT Map header: true new: After: 0 New: 2",
|
|
205
207
|
"server -> client | LOAD Group sessions: empty",
|
|
206
|
-
"server -> client | KNOWN Map sessions:
|
|
208
|
+
"server -> client | KNOWN Map sessions: header/2",
|
|
207
209
|
"client -> server | CONTENT Group header: true new: After: 0 New: 3",
|
|
208
210
|
"server -> client | KNOWN Group sessions: header/3",
|
|
209
211
|
]
|
|
@@ -276,8 +278,8 @@ describe("peer reconciliation", () => {
|
|
|
276
278
|
"client -> server | CONTENT Profile header: true new: After: 0 New: 1",
|
|
277
279
|
"client -> server | CONTENT Map header: false new: After: 1 New: 1",
|
|
278
280
|
"server -> client | LOAD Account sessions: empty",
|
|
279
|
-
"server -> client | KNOWN ProfileGroup sessions:
|
|
280
|
-
"server -> client | KNOWN Profile sessions:
|
|
281
|
+
"server -> client | KNOWN ProfileGroup sessions: header/0",
|
|
282
|
+
"server -> client | KNOWN Profile sessions: header/0",
|
|
281
283
|
"server -> client | KNOWN CORRECTION Map sessions: empty",
|
|
282
284
|
"client -> server | CONTENT Account header: true new: After: 0 New: 4",
|
|
283
285
|
"client -> server | CONTENT Map header: true new: After: 0 New: 2",
|
|
@@ -285,7 +287,7 @@ describe("peer reconciliation", () => {
|
|
|
285
287
|
"server -> client | KNOWN ProfileGroup sessions: header/5",
|
|
286
288
|
"server -> client | KNOWN Profile sessions: header/1",
|
|
287
289
|
"server -> client | LOAD Group sessions: empty",
|
|
288
|
-
"server -> client | KNOWN Map sessions:
|
|
290
|
+
"server -> client | KNOWN Map sessions: header/2",
|
|
289
291
|
"client -> server | CONTENT Group header: true new: After: 0 New: 3",
|
|
290
292
|
"server -> client | KNOWN Group sessions: header/3",
|
|
291
293
|
]
|
|
@@ -181,13 +181,11 @@ describe("client with storage syncs with server", () => {
|
|
|
181
181
|
[
|
|
182
182
|
"client -> server | LOAD Group sessions: header/3",
|
|
183
183
|
"client -> server | LOAD Map sessions: header/1",
|
|
184
|
-
"server -> client | CONTENT Group header: true new: After: 0 New: 3",
|
|
185
|
-
"server -> client | CONTENT Map header: true new: After: 0 New: 2",
|
|
186
184
|
"server -> client | CONTENT Map header: false new: After: 1 New: 1",
|
|
187
|
-
"
|
|
188
|
-
"
|
|
185
|
+
"server -> client | KNOWN Group sessions: header/3",
|
|
186
|
+
"server -> client | CONTENT Map header: false new: After: 1 New: 1",
|
|
189
187
|
"client -> server | KNOWN Map sessions: header/2",
|
|
190
|
-
"client -> storage | CONTENT Map header:
|
|
188
|
+
"client -> storage | CONTENT Map header: false new: After: 1 New: 1",
|
|
191
189
|
"client -> server | KNOWN Map sessions: header/2",
|
|
192
190
|
"client -> storage | CONTENT Map header: false new: After: 1 New: 1",
|
|
193
191
|
]
|
|
@@ -291,20 +289,16 @@ describe("client syncs with a server with storage", () => {
|
|
|
291
289
|
[
|
|
292
290
|
"client -> storage | CONTENT Group header: true new: After: 0 New: 5",
|
|
293
291
|
"client -> server | CONTENT Group header: true new: After: 0 New: 5",
|
|
294
|
-
"client -> storage | CONTENT Map header: true new:
|
|
295
|
-
"client ->
|
|
292
|
+
"client -> storage | CONTENT Map header: true new: After: 0 New: 73",
|
|
293
|
+
"client -> server | CONTENT Map header: true new: After: 0 New: 73",
|
|
296
294
|
"client -> storage | CONTENT Map header: false new: After: 73 New: 73",
|
|
297
|
-
"client -> storage | CONTENT Map header: false new: After: 146 New: 54",
|
|
298
|
-
"client -> server | CONTENT Map header: true new: expectContentUntil: header/200",
|
|
299
|
-
"client -> server | CONTENT Map header: false new: After: 0 New: 73",
|
|
300
295
|
"client -> server | CONTENT Map header: false new: After: 73 New: 73",
|
|
296
|
+
"client -> storage | CONTENT Map header: false new: After: 146 New: 54",
|
|
301
297
|
"client -> server | CONTENT Map header: false new: After: 146 New: 54",
|
|
302
298
|
"server -> client | KNOWN Group sessions: header/5",
|
|
303
299
|
"server -> storage | CONTENT Group header: true new: After: 0 New: 5",
|
|
304
|
-
"server -> client | KNOWN Map sessions: header/0",
|
|
305
|
-
"server -> storage | CONTENT Map header: true new: expectContentUntil: header/200",
|
|
306
300
|
"server -> client | KNOWN Map sessions: header/73",
|
|
307
|
-
"server -> storage | CONTENT Map header:
|
|
301
|
+
"server -> storage | CONTENT Map header: true new: After: 0 New: 73",
|
|
308
302
|
"server -> client | KNOWN Map sessions: header/146",
|
|
309
303
|
"server -> storage | CONTENT Map header: false new: After: 73 New: 73",
|
|
310
304
|
"server -> client | KNOWN Map sessions: header/200",
|
|
@@ -410,7 +404,7 @@ describe("client syncs with a server with storage", () => {
|
|
|
410
404
|
|
|
411
405
|
const correctionSpy = vi.fn();
|
|
412
406
|
|
|
413
|
-
client.node.storage?.store(newContentChunks
|
|
407
|
+
client.node.storage?.store(newContentChunks[1]!, correctionSpy);
|
|
414
408
|
|
|
415
409
|
expect(correctionSpy).not.toHaveBeenCalled();
|
|
416
410
|
|