cojson 0.18.37 → 0.18.38
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/coValueCore/SessionMap.d.ts +5 -3
- package/dist/coValueCore/SessionMap.d.ts.map +1 -1
- package/dist/coValueCore/SessionMap.js +19 -9
- package/dist/coValueCore/SessionMap.js.map +1 -1
- package/dist/coValueCore/coValueCore.d.ts +5 -2
- package/dist/coValueCore/coValueCore.d.ts.map +1 -1
- package/dist/coValueCore/coValueCore.js +24 -4
- package/dist/coValueCore/coValueCore.js.map +1 -1
- package/dist/coValueCore/verifiedState.d.ts +1 -3
- package/dist/coValueCore/verifiedState.d.ts.map +1 -1
- package/dist/coValueCore/verifiedState.js +10 -14
- package/dist/coValueCore/verifiedState.js.map +1 -1
- package/dist/exports.d.ts +3 -3
- package/dist/exports.d.ts.map +1 -1
- package/dist/exports.js +3 -3
- package/dist/exports.js.map +1 -1
- package/dist/permissions.d.ts +0 -1
- package/dist/permissions.d.ts.map +1 -1
- package/dist/permissions.js +34 -58
- package/dist/permissions.js.map +1 -1
- package/dist/queue/LocalTransactionsSyncQueue.d.ts.map +1 -1
- package/dist/queue/LocalTransactionsSyncQueue.js +1 -18
- package/dist/queue/LocalTransactionsSyncQueue.js.map +1 -1
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +8 -0
- package/dist/sync.js.map +1 -1
- package/dist/tests/StorageApiAsync.test.js +8 -8
- package/dist/tests/coValueCore.isStreaming.test.js +30 -40
- package/dist/tests/coValueCore.isStreaming.test.js.map +1 -1
- package/dist/tests/coValueCore.newContentSince.test.js +242 -132
- package/dist/tests/coValueCore.newContentSince.test.js.map +1 -1
- package/dist/tests/sync.auth.test.js +6 -6
- package/dist/tests/sync.load.test.js +11 -75
- package/dist/tests/sync.load.test.js.map +1 -1
- package/dist/tests/sync.mesh.test.js +2 -2
- package/dist/tests/sync.storage.test.js +22 -48
- package/dist/tests/sync.storage.test.js.map +1 -1
- package/dist/tests/sync.storageAsync.test.js +121 -71
- package/dist/tests/sync.storageAsync.test.js.map +1 -1
- package/dist/tests/sync.upload.test.js +11 -75
- package/dist/tests/sync.upload.test.js.map +1 -1
- package/dist/tests/testUtils.d.ts +4 -1
- package/dist/tests/testUtils.d.ts.map +1 -1
- package/dist/tests/testUtils.js +11 -0
- package/dist/tests/testUtils.js.map +1 -1
- package/package.json +3 -3
- package/src/coValueCore/SessionMap.ts +25 -15
- package/src/coValueCore/coValueCore.ts +32 -2
- package/src/coValueCore/verifiedState.ts +11 -20
- package/src/exports.ts +3 -2
- package/src/permissions.ts +34 -66
- package/src/queue/LocalTransactionsSyncQueue.ts +1 -20
- package/src/sync.ts +9 -0
- package/src/tests/StorageApiAsync.test.ts +8 -8
- package/src/tests/coValueCore.isStreaming.test.ts +84 -91
- package/src/tests/coValueCore.newContentSince.test.ts +246 -141
- package/src/tests/sync.auth.test.ts +6 -6
- package/src/tests/sync.load.test.ts +11 -79
- package/src/tests/sync.mesh.test.ts +2 -2
- package/src/tests/sync.storage.test.ts +22 -51
- package/src/tests/sync.storageAsync.test.ts +159 -76
- package/src/tests/sync.upload.test.ts +11 -78
- package/src/tests/testUtils.ts +16 -0
|
@@ -53,7 +53,7 @@ describe("LocalNode auth sync", () => {
|
|
|
53
53
|
}),
|
|
54
54
|
).toMatchInlineSnapshot(`
|
|
55
55
|
[
|
|
56
|
-
"client -> server | CONTENT Account header: true new: After: 0 New: 3
|
|
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",
|
|
@@ -116,9 +116,9 @@ describe("LocalNode auth sync", () => {
|
|
|
116
116
|
}),
|
|
117
117
|
).toMatchInlineSnapshot(`
|
|
118
118
|
[
|
|
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:
|
|
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
122
|
"client -> server | CONTENT Root header: false new: After: 0 New: 1",
|
|
123
123
|
"client -> server | CONTENT Profile header: false new: After: 0 New: 1",
|
|
124
124
|
"client -> server | CONTENT Account header: false new: After: 3 New: 2",
|
|
@@ -176,7 +176,7 @@ describe("LocalNode auth sync", () => {
|
|
|
176
176
|
}),
|
|
177
177
|
).toMatchInlineSnapshot(`
|
|
178
178
|
[
|
|
179
|
-
"creation-node -> server | CONTENT Account header: true new: After: 0 New: 3
|
|
179
|
+
"creation-node -> server | CONTENT Account header: true new: After: 0 New: 3",
|
|
180
180
|
"creation-node -> server | CONTENT ProfileGroup header: true new: After: 0 New: 5",
|
|
181
181
|
"creation-node -> server | CONTENT Profile header: true new: After: 0 New: 1",
|
|
182
182
|
"creation-node -> server | CONTENT Account header: false new: After: 3 New: 1",
|
|
@@ -246,7 +246,7 @@ describe("LocalNode auth sync", () => {
|
|
|
246
246
|
}),
|
|
247
247
|
).toMatchInlineSnapshot(`
|
|
248
248
|
[
|
|
249
|
-
"creation-node -> server | CONTENT Account header: true new: After: 0 New: 3
|
|
249
|
+
"creation-node -> server | CONTENT Account header: true new: After: 0 New: 3",
|
|
250
250
|
"creation-node -> server | CONTENT ProfileGroup header: true new: After: 0 New: 5",
|
|
251
251
|
"creation-node -> server | CONTENT Profile header: true new: After: 0 New: 1",
|
|
252
252
|
"creation-node -> server | CONTENT Account header: false new: After: 3 New: 1",
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
SyncMessagesLog,
|
|
10
10
|
TEST_NODE_CONFIG,
|
|
11
11
|
blockMessageTypeOnOutgoingPeer,
|
|
12
|
+
fillCoMapWithLargeData,
|
|
12
13
|
getSyncServerConnectedPeer,
|
|
13
14
|
loadCoValueOrFail,
|
|
14
15
|
setupTestAccount,
|
|
@@ -547,17 +548,7 @@ describe("loading coValues from server", () => {
|
|
|
547
548
|
|
|
548
549
|
const largeMap = group.createMap();
|
|
549
550
|
|
|
550
|
-
|
|
551
|
-
const dataSize = 1 * 1024 * 1024;
|
|
552
|
-
const chunkSize = 1024; // 1KB chunks
|
|
553
|
-
const chunks = dataSize / chunkSize;
|
|
554
|
-
|
|
555
|
-
const value = Buffer.alloc(chunkSize, `value$`).toString("base64");
|
|
556
|
-
|
|
557
|
-
for (let i = 0; i < chunks; i++) {
|
|
558
|
-
const key = `key${i}`;
|
|
559
|
-
largeMap.set(key, value, "trusting");
|
|
560
|
-
}
|
|
551
|
+
fillCoMapWithLargeData(largeMap);
|
|
561
552
|
|
|
562
553
|
const client = setupTestNode({
|
|
563
554
|
connected: true,
|
|
@@ -576,37 +567,13 @@ describe("loading coValues from server", () => {
|
|
|
576
567
|
[
|
|
577
568
|
"client -> server | LOAD Map sessions: empty",
|
|
578
569
|
"server -> client | CONTENT Group header: true new: After: 0 New: 5",
|
|
579
|
-
"server -> client | CONTENT Map header: true new: After: 0 New: 73 expectContentUntil: header/
|
|
570
|
+
"server -> client | CONTENT Map header: true new: After: 0 New: 73 expectContentUntil: header/200",
|
|
580
571
|
"server -> client | CONTENT Map header: false new: After: 73 New: 73",
|
|
581
|
-
"server -> client | CONTENT Map header: false new: After: 146 New:
|
|
582
|
-
"server -> client | CONTENT Map header: false new: After: 219 New: 73",
|
|
583
|
-
"server -> client | CONTENT Map header: false new: After: 292 New: 73",
|
|
584
|
-
"server -> client | CONTENT Map header: false new: After: 365 New: 73",
|
|
585
|
-
"server -> client | CONTENT Map header: false new: After: 438 New: 73",
|
|
586
|
-
"server -> client | CONTENT Map header: false new: After: 511 New: 73",
|
|
587
|
-
"server -> client | CONTENT Map header: false new: After: 584 New: 73",
|
|
588
|
-
"server -> client | CONTENT Map header: false new: After: 657 New: 73",
|
|
589
|
-
"server -> client | CONTENT Map header: false new: After: 730 New: 73",
|
|
590
|
-
"server -> client | CONTENT Map header: false new: After: 803 New: 73",
|
|
591
|
-
"server -> client | CONTENT Map header: false new: After: 876 New: 73",
|
|
592
|
-
"server -> client | CONTENT Map header: false new: After: 949 New: 73",
|
|
593
|
-
"server -> client | CONTENT Map header: false new: After: 1022 New: 2",
|
|
572
|
+
"server -> client | CONTENT Map header: false new: After: 146 New: 54",
|
|
594
573
|
"client -> server | KNOWN Group sessions: header/5",
|
|
595
574
|
"client -> server | KNOWN Map sessions: header/73",
|
|
596
575
|
"client -> server | KNOWN Map sessions: header/146",
|
|
597
|
-
"client -> server | KNOWN Map sessions: header/
|
|
598
|
-
"client -> server | KNOWN Map sessions: header/292",
|
|
599
|
-
"client -> server | KNOWN Map sessions: header/365",
|
|
600
|
-
"client -> server | KNOWN Map sessions: header/438",
|
|
601
|
-
"client -> server | KNOWN Map sessions: header/511",
|
|
602
|
-
"client -> server | KNOWN Map sessions: header/584",
|
|
603
|
-
"client -> server | KNOWN Map sessions: header/657",
|
|
604
|
-
"client -> server | KNOWN Map sessions: header/730",
|
|
605
|
-
"client -> server | KNOWN Map sessions: header/803",
|
|
606
|
-
"client -> server | KNOWN Map sessions: header/876",
|
|
607
|
-
"client -> server | KNOWN Map sessions: header/949",
|
|
608
|
-
"client -> server | KNOWN Map sessions: header/1022",
|
|
609
|
-
"client -> server | KNOWN Map sessions: header/1024",
|
|
576
|
+
"client -> server | KNOWN Map sessions: header/200",
|
|
610
577
|
]
|
|
611
578
|
`);
|
|
612
579
|
});
|
|
@@ -625,23 +592,12 @@ describe("loading coValues from server", () => {
|
|
|
625
592
|
const mapOnClient = await loadCoValueOrFail(client.node, largeMap.id);
|
|
626
593
|
|
|
627
594
|
// Generate a large amount of data (about 100MB)
|
|
628
|
-
|
|
629
|
-
const chunkSize = 1024; // 1KB chunks
|
|
630
|
-
const chunks = dataSize / chunkSize;
|
|
631
|
-
|
|
632
|
-
const value = Buffer.alloc(chunkSize, `value$`).toString("base64");
|
|
633
|
-
|
|
634
|
-
for (let i = 0; i < chunks; i++) {
|
|
635
|
-
const key = `key${i}`;
|
|
636
|
-
largeMap.set(key, value, "trusting");
|
|
637
|
-
}
|
|
595
|
+
fillCoMapWithLargeData(largeMap);
|
|
638
596
|
|
|
639
597
|
await waitFor(() => {
|
|
640
598
|
expect(mapOnClient.core.knownState()).toEqual(largeMap.core.knownState());
|
|
641
599
|
});
|
|
642
600
|
|
|
643
|
-
expect(mapOnClient.get(`key${chunks - 1}`)).toEqual(value);
|
|
644
|
-
|
|
645
601
|
expect(
|
|
646
602
|
SyncMessagesLog.getMessages({
|
|
647
603
|
Group: group.core,
|
|
@@ -654,36 +610,12 @@ describe("loading coValues from server", () => {
|
|
|
654
610
|
"server -> client | CONTENT Map header: true new: ",
|
|
655
611
|
"client -> server | KNOWN Group sessions: header/5",
|
|
656
612
|
"client -> server | KNOWN Map sessions: header/0",
|
|
657
|
-
"server -> client | CONTENT Map header: false new: After: 0 New: 73 expectContentUntil: header/
|
|
613
|
+
"server -> client | CONTENT Map header: false new: After: 0 New: 73 expectContentUntil: header/200",
|
|
658
614
|
"server -> client | CONTENT Map header: false new: After: 73 New: 73",
|
|
659
|
-
"server -> client | CONTENT Map header: false new: After: 146 New:
|
|
660
|
-
"server -> client | CONTENT Map header: false new: After: 219 New: 73",
|
|
661
|
-
"server -> client | CONTENT Map header: false new: After: 292 New: 73",
|
|
662
|
-
"server -> client | CONTENT Map header: false new: After: 365 New: 73",
|
|
663
|
-
"server -> client | CONTENT Map header: false new: After: 438 New: 73",
|
|
664
|
-
"server -> client | CONTENT Map header: false new: After: 511 New: 73",
|
|
665
|
-
"server -> client | CONTENT Map header: false new: After: 584 New: 73",
|
|
666
|
-
"server -> client | CONTENT Map header: false new: After: 657 New: 73",
|
|
667
|
-
"server -> client | CONTENT Map header: false new: After: 730 New: 73",
|
|
668
|
-
"server -> client | CONTENT Map header: false new: After: 803 New: 73",
|
|
669
|
-
"server -> client | CONTENT Map header: false new: After: 876 New: 73",
|
|
670
|
-
"server -> client | CONTENT Map header: false new: After: 949 New: 73",
|
|
671
|
-
"server -> client | CONTENT Map header: false new: After: 1022 New: 2",
|
|
615
|
+
"server -> client | CONTENT Map header: false new: After: 146 New: 54",
|
|
672
616
|
"client -> server | KNOWN Map sessions: header/73",
|
|
673
617
|
"client -> server | KNOWN Map sessions: header/146",
|
|
674
|
-
"client -> server | KNOWN Map sessions: header/
|
|
675
|
-
"client -> server | KNOWN Map sessions: header/292",
|
|
676
|
-
"client -> server | KNOWN Map sessions: header/365",
|
|
677
|
-
"client -> server | KNOWN Map sessions: header/438",
|
|
678
|
-
"client -> server | KNOWN Map sessions: header/511",
|
|
679
|
-
"client -> server | KNOWN Map sessions: header/584",
|
|
680
|
-
"client -> server | KNOWN Map sessions: header/657",
|
|
681
|
-
"client -> server | KNOWN Map sessions: header/730",
|
|
682
|
-
"client -> server | KNOWN Map sessions: header/803",
|
|
683
|
-
"client -> server | KNOWN Map sessions: header/876",
|
|
684
|
-
"client -> server | KNOWN Map sessions: header/949",
|
|
685
|
-
"client -> server | KNOWN Map sessions: header/1022",
|
|
686
|
-
"client -> server | KNOWN Map sessions: header/1024",
|
|
618
|
+
"client -> server | KNOWN Map sessions: header/200",
|
|
687
619
|
]
|
|
688
620
|
`);
|
|
689
621
|
});
|
|
@@ -1386,8 +1318,8 @@ describe("loading coValues from server", () => {
|
|
|
1386
1318
|
}),
|
|
1387
1319
|
).toMatchInlineSnapshot(`
|
|
1388
1320
|
[
|
|
1389
|
-
"client -> server | CONTENT Group header: true new: After: 0 New: 3
|
|
1390
|
-
"client -> server | CONTENT ParentGroup header: true new: After: 0 New: 5
|
|
1321
|
+
"client -> server | CONTENT Group header: true new: After: 0 New: 3",
|
|
1322
|
+
"client -> server | CONTENT ParentGroup header: true new: After: 0 New: 5",
|
|
1391
1323
|
"client -> server | CONTENT Group header: false new: After: 3 New: 2",
|
|
1392
1324
|
"client -> server | CONTENT ParentGroup header: false new: After: 5 New: 2",
|
|
1393
1325
|
"client -> server | CONTENT Map header: true new: After: 0 New: 1",
|
|
@@ -152,8 +152,8 @@ describe("multiple clients syncing with the a cloud-like server mesh", () => {
|
|
|
152
152
|
}),
|
|
153
153
|
).toMatchInlineSnapshot(`
|
|
154
154
|
[
|
|
155
|
-
"edge-france -> storage | CONTENT Group header: true new: After: 0 New: 3
|
|
156
|
-
"edge-france -> core | CONTENT Group header: true new: After: 0 New: 3
|
|
155
|
+
"edge-france -> storage | CONTENT Group header: true new: After: 0 New: 3",
|
|
156
|
+
"edge-france -> core | CONTENT Group header: true new: After: 0 New: 3",
|
|
157
157
|
"edge-france -> storage | CONTENT ParentGroup header: true new: After: 0 New: 5",
|
|
158
158
|
"edge-france -> core | CONTENT ParentGroup header: true new: After: 0 New: 5",
|
|
159
159
|
"edge-france -> storage | CONTENT Group header: false new: After: 3 New: 2",
|
|
@@ -8,12 +8,12 @@ import {
|
|
|
8
8
|
vi,
|
|
9
9
|
} from "vitest";
|
|
10
10
|
|
|
11
|
-
import { setMaxRecommendedTxSize } from "../config";
|
|
12
11
|
import { emptyKnownState } from "../exports";
|
|
13
12
|
import {
|
|
14
13
|
SyncMessagesLog,
|
|
15
14
|
TEST_NODE_CONFIG,
|
|
16
15
|
createTestMetricReader,
|
|
16
|
+
fillCoMapWithLargeData,
|
|
17
17
|
loadCoValueOrFail,
|
|
18
18
|
setupTestNode,
|
|
19
19
|
tearDownTestMetricReader,
|
|
@@ -29,7 +29,6 @@ describe("client with storage syncs with server", () => {
|
|
|
29
29
|
|
|
30
30
|
beforeEach(async () => {
|
|
31
31
|
SyncMessagesLog.clear();
|
|
32
|
-
setMaxRecommendedTxSize(100 * 1024);
|
|
33
32
|
jazzCloud = setupTestNode({
|
|
34
33
|
isSyncServer: true,
|
|
35
34
|
});
|
|
@@ -338,7 +337,6 @@ describe("client syncs with a server with storage", () => {
|
|
|
338
337
|
});
|
|
339
338
|
|
|
340
339
|
test("loading a large coValue from storage", async () => {
|
|
341
|
-
setMaxRecommendedTxSize(1000);
|
|
342
340
|
const client = setupTestNode();
|
|
343
341
|
|
|
344
342
|
client.connectToSyncServer({
|
|
@@ -354,15 +352,7 @@ describe("client syncs with a server with storage", () => {
|
|
|
354
352
|
|
|
355
353
|
const largeMap = group.createMap();
|
|
356
354
|
|
|
357
|
-
|
|
358
|
-
const chunks = 100;
|
|
359
|
-
|
|
360
|
-
const value = "1".repeat(10);
|
|
361
|
-
|
|
362
|
-
for (let i = 0; i < chunks; i++) {
|
|
363
|
-
const key = `key${i}`;
|
|
364
|
-
largeMap.set(key, value, "trusting");
|
|
365
|
-
}
|
|
355
|
+
fillCoMapWithLargeData(largeMap);
|
|
366
356
|
|
|
367
357
|
await largeMap.core.waitForSync();
|
|
368
358
|
|
|
@@ -382,28 +372,20 @@ describe("client syncs with a server with storage", () => {
|
|
|
382
372
|
[
|
|
383
373
|
"client -> storage | CONTENT Group header: true new: After: 0 New: 5",
|
|
384
374
|
"client -> server | CONTENT Group header: true new: After: 0 New: 5",
|
|
385
|
-
"client -> storage | CONTENT Map header: true new: After: 0 New:
|
|
386
|
-
"client -> server | CONTENT Map header: true new: After: 0 New:
|
|
387
|
-
"client -> storage | CONTENT Map header: false new: After:
|
|
388
|
-
"client -> server | CONTENT Map header: false new: After:
|
|
389
|
-
"client -> storage | CONTENT Map header: false new: After:
|
|
390
|
-
"client -> server | CONTENT Map header: false new: After:
|
|
391
|
-
"client -> storage | CONTENT Map header: false new: After: 63 New: 21",
|
|
392
|
-
"client -> server | CONTENT Map header: false new: After: 63 New: 21",
|
|
393
|
-
"client -> storage | CONTENT Map header: false new: After: 84 New: 16",
|
|
394
|
-
"client -> server | CONTENT Map header: false new: After: 84 New: 16",
|
|
375
|
+
"client -> storage | CONTENT Map header: true new: After: 0 New: 73 expectContentUntil: header/200",
|
|
376
|
+
"client -> server | CONTENT Map header: true new: After: 0 New: 73 expectContentUntil: header/200",
|
|
377
|
+
"client -> storage | CONTENT Map header: false new: After: 73 New: 73",
|
|
378
|
+
"client -> server | CONTENT Map header: false new: After: 73 New: 73",
|
|
379
|
+
"client -> storage | CONTENT Map header: false new: After: 146 New: 54",
|
|
380
|
+
"client -> server | CONTENT Map header: false new: After: 146 New: 54",
|
|
395
381
|
"server -> client | KNOWN Group sessions: header/5",
|
|
396
382
|
"server -> storage | CONTENT Group header: true new: After: 0 New: 5",
|
|
397
|
-
"server -> client | KNOWN Map sessions: header/
|
|
398
|
-
"server -> storage | CONTENT Map header: true new: After: 0 New:
|
|
399
|
-
"server -> client | KNOWN Map sessions: header/
|
|
400
|
-
"server -> storage | CONTENT Map header: false new: After:
|
|
401
|
-
"server -> client | KNOWN Map sessions: header/
|
|
402
|
-
"server -> storage | CONTENT Map header: false new: After:
|
|
403
|
-
"server -> client | KNOWN Map sessions: header/84",
|
|
404
|
-
"server -> storage | CONTENT Map header: false new: After: 63 New: 21",
|
|
405
|
-
"server -> client | KNOWN Map sessions: header/100",
|
|
406
|
-
"server -> storage | CONTENT Map header: false new: After: 84 New: 16",
|
|
383
|
+
"server -> client | KNOWN Map sessions: header/73",
|
|
384
|
+
"server -> storage | CONTENT Map header: true new: After: 0 New: 73",
|
|
385
|
+
"server -> client | KNOWN Map sessions: header/146",
|
|
386
|
+
"server -> storage | CONTENT Map header: false new: After: 73 New: 73",
|
|
387
|
+
"server -> client | KNOWN Map sessions: header/200",
|
|
388
|
+
"server -> storage | CONTENT Map header: false new: After: 146 New: 54",
|
|
407
389
|
]
|
|
408
390
|
`);
|
|
409
391
|
|
|
@@ -456,14 +438,12 @@ describe("client syncs with a server with storage", () => {
|
|
|
456
438
|
"client -> storage | LOAD Map sessions: empty",
|
|
457
439
|
"storage -> client | CONTENT Group header: true new: After: 0 New: 5",
|
|
458
440
|
"client -> server | LOAD Group sessions: header/5",
|
|
459
|
-
"storage -> client | CONTENT Map header: true new: After: 0 New:
|
|
460
|
-
"client -> server | LOAD Map sessions: header/
|
|
441
|
+
"storage -> client | CONTENT Map header: true new: After: 0 New: 73 expectContentUntil: header/200",
|
|
442
|
+
"client -> server | LOAD Map sessions: header/200",
|
|
461
443
|
"server -> client | KNOWN Group sessions: header/5",
|
|
462
|
-
"server -> client | KNOWN Map sessions: header/
|
|
463
|
-
"storage -> client | CONTENT Map header: true new: After:
|
|
464
|
-
"storage -> client | CONTENT Map header: true new: After:
|
|
465
|
-
"storage -> client | CONTENT Map header: true new: After: 63 New: 21",
|
|
466
|
-
"storage -> client | CONTENT Map header: true new: After: 84 New: 16",
|
|
444
|
+
"server -> client | KNOWN Map sessions: header/200",
|
|
445
|
+
"storage -> client | CONTENT Map header: true new: After: 73 New: 73",
|
|
446
|
+
"storage -> client | CONTENT Map header: true new: After: 146 New: 54",
|
|
467
447
|
]
|
|
468
448
|
`);
|
|
469
449
|
});
|
|
@@ -485,16 +465,7 @@ describe("client syncs with a server with storage", () => {
|
|
|
485
465
|
const largeMap = group.createMap();
|
|
486
466
|
|
|
487
467
|
// Generate a large amount of data (about 100MB)
|
|
488
|
-
|
|
489
|
-
const chunkSize = 1024; // 1KB chunks
|
|
490
|
-
const chunks = dataSize / chunkSize;
|
|
491
|
-
|
|
492
|
-
const value = Buffer.alloc(chunkSize, `value$`).toString("base64");
|
|
493
|
-
|
|
494
|
-
for (let i = 0; i < chunks; i++) {
|
|
495
|
-
const key = `key${i}`;
|
|
496
|
-
largeMap.set(key, value, "trusting");
|
|
497
|
-
}
|
|
468
|
+
fillCoMapWithLargeData(largeMap);
|
|
498
469
|
|
|
499
470
|
await largeMap.core.waitForSync();
|
|
500
471
|
|
|
@@ -738,8 +709,8 @@ describe("client syncs with a server with storage", () => {
|
|
|
738
709
|
}),
|
|
739
710
|
).toMatchInlineSnapshot(`
|
|
740
711
|
[
|
|
741
|
-
"client -> server | CONTENT Group header: true new: After: 0 New: 3
|
|
742
|
-
"client -> server | CONTENT Map header: true new:
|
|
712
|
+
"client -> server | CONTENT Group header: true new: After: 0 New: 3",
|
|
713
|
+
"client -> server | CONTENT Map header: true new: ",
|
|
743
714
|
"client -> server | CONTENT Group header: false new: After: 3 New: 2",
|
|
744
715
|
"client -> server | CONTENT Map header: false new: After: 0 New: 1",
|
|
745
716
|
"server -> client | KNOWN Group sessions: header/3",
|
|
@@ -1,23 +1,20 @@
|
|
|
1
1
|
import { assert, beforeEach, describe, expect, test, vi } from "vitest";
|
|
2
2
|
|
|
3
|
-
import { setMaxRecommendedTxSize } from "../config";
|
|
4
3
|
import { emptyKnownState } from "../exports";
|
|
5
4
|
import {
|
|
6
5
|
SyncMessagesLog,
|
|
7
6
|
TEST_NODE_CONFIG,
|
|
7
|
+
fillCoMapWithLargeData,
|
|
8
8
|
loadCoValueOrFail,
|
|
9
9
|
setupTestNode,
|
|
10
10
|
waitFor,
|
|
11
11
|
} from "./testUtils";
|
|
12
12
|
import { getDbPath } from "./testStorage";
|
|
13
|
+
import { expectMap } from "../coValue";
|
|
13
14
|
|
|
14
15
|
// We want to simulate a real world communication that happens asynchronously
|
|
15
16
|
TEST_NODE_CONFIG.withAsyncPeers = true;
|
|
16
17
|
|
|
17
|
-
beforeEach(async () => {
|
|
18
|
-
setMaxRecommendedTxSize(100 * 1024);
|
|
19
|
-
});
|
|
20
|
-
|
|
21
18
|
describe("client with storage syncs with server", () => {
|
|
22
19
|
let jazzCloud: ReturnType<typeof setupTestNode>;
|
|
23
20
|
|
|
@@ -214,7 +211,7 @@ describe("client with storage syncs with server", () => {
|
|
|
214
211
|
).toMatchInlineSnapshot(`
|
|
215
212
|
[
|
|
216
213
|
"client -> storage | CONTENT Group header: true new: After: 0 New: 3",
|
|
217
|
-
"client -> storage | CONTENT InitialMap header: true new:
|
|
214
|
+
"client -> storage | CONTENT InitialMap header: true new: ",
|
|
218
215
|
"client -> storage | CONTENT ChildMap header: true new: After: 0 New: 1",
|
|
219
216
|
"client -> storage | CONTENT InitialMap header: false new: After: 0 New: 1",
|
|
220
217
|
]
|
|
@@ -267,7 +264,6 @@ describe("client syncs with a server with storage", () => {
|
|
|
267
264
|
});
|
|
268
265
|
|
|
269
266
|
test("large coValue streaming", async () => {
|
|
270
|
-
setMaxRecommendedTxSize(1000);
|
|
271
267
|
const client = setupTestNode();
|
|
272
268
|
|
|
273
269
|
client.connectToSyncServer({
|
|
@@ -283,15 +279,7 @@ describe("client syncs with a server with storage", () => {
|
|
|
283
279
|
|
|
284
280
|
const largeMap = group.createMap();
|
|
285
281
|
|
|
286
|
-
|
|
287
|
-
const chunks = 100;
|
|
288
|
-
|
|
289
|
-
const value = "1".repeat(10);
|
|
290
|
-
|
|
291
|
-
for (let i = 0; i < chunks; i++) {
|
|
292
|
-
const key = `key${i}`;
|
|
293
|
-
largeMap.set(key, value, "trusting");
|
|
294
|
-
}
|
|
282
|
+
fillCoMapWithLargeData(largeMap);
|
|
295
283
|
|
|
296
284
|
await largeMap.core.waitForSync();
|
|
297
285
|
|
|
@@ -304,28 +292,20 @@ describe("client syncs with a server with storage", () => {
|
|
|
304
292
|
[
|
|
305
293
|
"client -> storage | CONTENT Group header: true new: After: 0 New: 5",
|
|
306
294
|
"client -> server | CONTENT Group header: true new: After: 0 New: 5",
|
|
307
|
-
"client -> storage | CONTENT Map header: true new: After: 0 New:
|
|
308
|
-
"client -> server | CONTENT Map header: true new: After: 0 New:
|
|
309
|
-
"client -> storage | CONTENT Map header: false new: After:
|
|
310
|
-
"client -> server | CONTENT Map header: false new: After:
|
|
311
|
-
"client -> storage | CONTENT Map header: false new: After:
|
|
312
|
-
"client -> server | CONTENT Map header: false new: After:
|
|
313
|
-
"client -> storage | CONTENT Map header: false new: After: 63 New: 21",
|
|
314
|
-
"client -> server | CONTENT Map header: false new: After: 63 New: 21",
|
|
315
|
-
"client -> storage | CONTENT Map header: false new: After: 84 New: 16",
|
|
316
|
-
"client -> server | CONTENT Map header: false new: After: 84 New: 16",
|
|
295
|
+
"client -> storage | CONTENT Map header: true new: After: 0 New: 73 expectContentUntil: header/200",
|
|
296
|
+
"client -> server | CONTENT Map header: true new: After: 0 New: 73 expectContentUntil: header/200",
|
|
297
|
+
"client -> storage | CONTENT Map header: false new: After: 73 New: 73",
|
|
298
|
+
"client -> server | CONTENT Map header: false new: After: 73 New: 73",
|
|
299
|
+
"client -> storage | CONTENT Map header: false new: After: 146 New: 54",
|
|
300
|
+
"client -> server | CONTENT Map header: false new: After: 146 New: 54",
|
|
317
301
|
"server -> client | KNOWN Group sessions: header/5",
|
|
318
302
|
"server -> storage | CONTENT Group header: true new: After: 0 New: 5",
|
|
319
|
-
"server -> client | KNOWN Map sessions: header/
|
|
320
|
-
"server -> storage | CONTENT Map header: true new: After: 0 New:
|
|
321
|
-
"server -> client | KNOWN Map sessions: header/
|
|
322
|
-
"server -> storage | CONTENT Map header: false new: After:
|
|
323
|
-
"server -> client | KNOWN Map sessions: header/
|
|
324
|
-
"server -> storage | CONTENT Map header: false new: After:
|
|
325
|
-
"server -> client | KNOWN Map sessions: header/84",
|
|
326
|
-
"server -> storage | CONTENT Map header: false new: After: 63 New: 21",
|
|
327
|
-
"server -> client | KNOWN Map sessions: header/100",
|
|
328
|
-
"server -> storage | CONTENT Map header: false new: After: 84 New: 16",
|
|
303
|
+
"server -> client | KNOWN Map sessions: header/73",
|
|
304
|
+
"server -> storage | CONTENT Map header: true new: After: 0 New: 73",
|
|
305
|
+
"server -> client | KNOWN Map sessions: header/146",
|
|
306
|
+
"server -> storage | CONTENT Map header: false new: After: 73 New: 73",
|
|
307
|
+
"server -> client | KNOWN Map sessions: header/200",
|
|
308
|
+
"server -> storage | CONTENT Map header: false new: After: 146 New: 54",
|
|
329
309
|
]
|
|
330
310
|
`);
|
|
331
311
|
|
|
@@ -357,19 +337,17 @@ describe("client syncs with a server with storage", () => {
|
|
|
357
337
|
"client -> storage | LOAD Map sessions: empty",
|
|
358
338
|
"storage -> client | CONTENT Group header: true new: After: 0 New: 5",
|
|
359
339
|
"client -> server | LOAD Group sessions: header/5",
|
|
360
|
-
"storage -> client | CONTENT Map header: true new: After: 0 New:
|
|
361
|
-
"client -> server | LOAD Map sessions: header/
|
|
362
|
-
"storage -> client | CONTENT Map header: true new: After:
|
|
363
|
-
"storage -> client | CONTENT Map header: true new: After:
|
|
364
|
-
"storage -> client | CONTENT Map header: true new: After: 63 New: 21",
|
|
365
|
-
"storage -> client | CONTENT Map header: true new: After: 84 New: 16",
|
|
340
|
+
"storage -> client | CONTENT Map header: true new: After: 0 New: 73 expectContentUntil: header/200",
|
|
341
|
+
"client -> server | LOAD Map sessions: header/200",
|
|
342
|
+
"storage -> client | CONTENT Map header: true new: After: 73 New: 73",
|
|
343
|
+
"storage -> client | CONTENT Map header: true new: After: 146 New: 54",
|
|
366
344
|
"server -> client | KNOWN Group sessions: header/5",
|
|
367
|
-
"server -> client | KNOWN Map sessions: header/
|
|
345
|
+
"server -> client | KNOWN Map sessions: header/200",
|
|
368
346
|
]
|
|
369
347
|
`);
|
|
370
348
|
});
|
|
371
349
|
|
|
372
|
-
test("
|
|
350
|
+
test("streaming a large coValue with multiple sessions", async () => {
|
|
373
351
|
const client = setupTestNode();
|
|
374
352
|
|
|
375
353
|
client.connectToSyncServer({
|
|
@@ -385,18 +363,142 @@ describe("client syncs with a server with storage", () => {
|
|
|
385
363
|
|
|
386
364
|
const largeMap = group.createMap();
|
|
387
365
|
|
|
388
|
-
|
|
389
|
-
const dataSize = 1 * 200 * 1024;
|
|
390
|
-
const chunkSize = 1024; // 1KB chunks
|
|
391
|
-
const chunks = dataSize / chunkSize;
|
|
366
|
+
fillCoMapWithLargeData(largeMap);
|
|
392
367
|
|
|
393
|
-
|
|
368
|
+
await largeMap.core.waitForSync();
|
|
369
|
+
|
|
370
|
+
// Fill the map with the data from 5 different sessions
|
|
371
|
+
for (let i = 0; i < 5; i++) {
|
|
372
|
+
const newSession = client.spawnNewSession();
|
|
373
|
+
newSession.connectToSyncServer({
|
|
374
|
+
syncServer: jazzCloud.node,
|
|
375
|
+
ourName: "session " + i,
|
|
376
|
+
});
|
|
377
|
+
const mapInNewSession = await loadCoValueOrFail(
|
|
378
|
+
newSession.node,
|
|
379
|
+
largeMap.id,
|
|
380
|
+
);
|
|
381
|
+
|
|
382
|
+
// Alternate between small and large sessions
|
|
383
|
+
if (i % 2 === 0) {
|
|
384
|
+
mapInNewSession.set("hello", "world2", "trusting");
|
|
385
|
+
} else {
|
|
386
|
+
fillCoMapWithLargeData(mapInNewSession);
|
|
387
|
+
}
|
|
394
388
|
|
|
395
|
-
|
|
396
|
-
const key = `key${i}`;
|
|
397
|
-
largeMap.set(key, value, "trusting");
|
|
389
|
+
await mapInNewSession.core.waitForSync();
|
|
398
390
|
}
|
|
399
391
|
|
|
392
|
+
let largeMapOnServer = expectMap(
|
|
393
|
+
jazzCloud.node.getCoValue(largeMap.id).getCurrentContent(),
|
|
394
|
+
);
|
|
395
|
+
await waitFor(async () => {
|
|
396
|
+
expect(largeMapOnServer.core.knownState()).toEqual(
|
|
397
|
+
largeMap.core.knownState(),
|
|
398
|
+
);
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
SyncMessagesLog.clear();
|
|
402
|
+
|
|
403
|
+
// We want to simulate the situation where the content was only partially synced
|
|
404
|
+
// so we extract some chunks from the current coMap and import them into a new sync server
|
|
405
|
+
const groupContent = group.core.newContentSince(undefined) ?? [];
|
|
406
|
+
const largeMapContent =
|
|
407
|
+
largeMap.core.newContentSince(undefined)?.slice(0, 4) ?? [];
|
|
408
|
+
|
|
409
|
+
client.restart();
|
|
410
|
+
|
|
411
|
+
const newSyncServer = setupTestNode({
|
|
412
|
+
isSyncServer: true,
|
|
413
|
+
});
|
|
414
|
+
|
|
415
|
+
for (const content of [...groupContent, ...largeMapContent]) {
|
|
416
|
+
content.expectContentUntil = undefined; // Since the chunks are a partial, turn off the streaming infomation that would be invalid
|
|
417
|
+
newSyncServer.node.syncManager.handleNewContent(content, "import");
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
const largeMapOnNewSyncServer = newSyncServer.node.getCoValue(largeMap.id);
|
|
421
|
+
|
|
422
|
+
// We want to enforce that the new sync server has less content than the original sync server
|
|
423
|
+
expect(largeMapOnNewSyncServer.knownState()).not.toEqual(
|
|
424
|
+
largeMap.core.knownState(),
|
|
425
|
+
);
|
|
426
|
+
|
|
427
|
+
client.connectToSyncServer({
|
|
428
|
+
ourName: "client",
|
|
429
|
+
syncServer: newSyncServer.node,
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
client.addStorage({
|
|
433
|
+
ourName: "client",
|
|
434
|
+
storage,
|
|
435
|
+
});
|
|
436
|
+
|
|
437
|
+
const mapLoadedFromStorage = await loadCoValueOrFail(
|
|
438
|
+
client.node,
|
|
439
|
+
largeMap.id,
|
|
440
|
+
);
|
|
441
|
+
|
|
442
|
+
await mapLoadedFromStorage.core.waitForSync();
|
|
443
|
+
|
|
444
|
+
expect(
|
|
445
|
+
SyncMessagesLog.getMessages({
|
|
446
|
+
Group: group.core,
|
|
447
|
+
Map: largeMap.core,
|
|
448
|
+
}),
|
|
449
|
+
).toMatchInlineSnapshot(`
|
|
450
|
+
[
|
|
451
|
+
"client -> storage | LOAD Map sessions: empty",
|
|
452
|
+
"storage -> client | CONTENT Group header: true new: After: 0 New: 5",
|
|
453
|
+
"client -> server | LOAD Group sessions: header/5",
|
|
454
|
+
"storage -> client | CONTENT Map header: true new: After: 0 New: 73 expectContentUntil: header/603",
|
|
455
|
+
"client -> server | LOAD Map sessions: header/603",
|
|
456
|
+
"storage -> client | CONTENT Map header: true new: After: 73 New: 73",
|
|
457
|
+
"storage -> client | CONTENT Map header: true new: After: 146 New: 54",
|
|
458
|
+
"storage -> client | CONTENT Map header: true new: After: 0 New: 1 | After: 0 New: 73",
|
|
459
|
+
"storage -> client | CONTENT Map header: true new: After: 73 New: 73",
|
|
460
|
+
"storage -> client | CONTENT Map header: true new: After: 146 New: 54",
|
|
461
|
+
"storage -> client | CONTENT Map header: true new: After: 0 New: 1 | After: 0 New: 73",
|
|
462
|
+
"storage -> client | CONTENT Map header: true new: After: 73 New: 73",
|
|
463
|
+
"storage -> client | CONTENT Map header: true new: After: 146 New: 54",
|
|
464
|
+
"storage -> client | CONTENT Map header: true new: After: 0 New: 1",
|
|
465
|
+
"server -> client | KNOWN Group sessions: header/5",
|
|
466
|
+
"server -> client | KNOWN Map sessions: header/292",
|
|
467
|
+
"client -> server | CONTENT Map header: false new: After: 146 New: 54 | After: 0 New: 1 | After: 146 New: 54 expectContentUntil: header/603",
|
|
468
|
+
"client -> server | CONTENT Map header: false new: After: 0 New: 73",
|
|
469
|
+
"client -> server | CONTENT Map header: false new: After: 73 New: 73",
|
|
470
|
+
"client -> server | CONTENT Map header: false new: After: 0 New: 1 | After: 146 New: 54 | After: 0 New: 1",
|
|
471
|
+
"server -> client | KNOWN Map sessions: header/401",
|
|
472
|
+
"server -> client | KNOWN Map sessions: header/474",
|
|
473
|
+
"server -> client | KNOWN Map sessions: header/547",
|
|
474
|
+
"server -> client | KNOWN Map sessions: header/603",
|
|
475
|
+
]
|
|
476
|
+
`);
|
|
477
|
+
|
|
478
|
+
// The sync should be completed successfully and the map on the new sync server should have the same known state as the original map
|
|
479
|
+
expect(largeMapOnNewSyncServer.knownState()).toEqual(
|
|
480
|
+
largeMap.core.knownState(),
|
|
481
|
+
);
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
test("storing stale data should not compromise the signatures", async () => {
|
|
485
|
+
const client = setupTestNode();
|
|
486
|
+
|
|
487
|
+
client.connectToSyncServer({
|
|
488
|
+
syncServer: jazzCloud.node,
|
|
489
|
+
});
|
|
490
|
+
|
|
491
|
+
const { storage } = await client.addAsyncStorage({
|
|
492
|
+
ourName: "client",
|
|
493
|
+
});
|
|
494
|
+
|
|
495
|
+
const group = client.node.createGroup();
|
|
496
|
+
group.addMember("everyone", "writer");
|
|
497
|
+
|
|
498
|
+
const largeMap = group.createMap();
|
|
499
|
+
|
|
500
|
+
fillCoMapWithLargeData(largeMap);
|
|
501
|
+
|
|
400
502
|
await largeMap.core.waitForSync();
|
|
401
503
|
|
|
402
504
|
const newContentChunks = largeMap.core.newContentSince(
|
|
@@ -438,8 +540,6 @@ describe("client syncs with a server with storage", () => {
|
|
|
438
540
|
});
|
|
439
541
|
|
|
440
542
|
test("large coValue streaming from cold server", async () => {
|
|
441
|
-
setMaxRecommendedTxSize(1000);
|
|
442
|
-
|
|
443
543
|
const server = setupTestNode({
|
|
444
544
|
isSyncServer: true,
|
|
445
545
|
});
|
|
@@ -462,17 +562,7 @@ describe("client syncs with a server with storage", () => {
|
|
|
462
562
|
|
|
463
563
|
const largeMap = group.createMap();
|
|
464
564
|
|
|
465
|
-
|
|
466
|
-
const dataSize = 1 * 10 * 1024;
|
|
467
|
-
const chunkSize = 1024; // 1KB chunks
|
|
468
|
-
const chunks = dataSize / chunkSize;
|
|
469
|
-
|
|
470
|
-
const value = Buffer.alloc(chunkSize, `value$`).toString("base64");
|
|
471
|
-
|
|
472
|
-
for (let i = 0; i < chunks; i++) {
|
|
473
|
-
const key = `key${i}`;
|
|
474
|
-
largeMap.set(key, value, "trusting");
|
|
475
|
-
}
|
|
565
|
+
fillCoMapWithLargeData(largeMap);
|
|
476
566
|
|
|
477
567
|
await largeMap.core.waitForSync();
|
|
478
568
|
|
|
@@ -510,17 +600,10 @@ describe("client syncs with a server with storage", () => {
|
|
|
510
600
|
"client -> storage | LOAD Map sessions: empty",
|
|
511
601
|
"storage -> client | CONTENT Group header: true new: After: 0 New: 5",
|
|
512
602
|
"client -> server | LOAD Group sessions: header/5",
|
|
513
|
-
"storage -> client | CONTENT Map header: true new: After: 0 New:
|
|
514
|
-
"client -> server | LOAD Map sessions: header/
|
|
515
|
-
"storage -> client | CONTENT Map header: true new: After:
|
|
516
|
-
"storage -> client | CONTENT Map header: true new: After:
|
|
517
|
-
"storage -> client | CONTENT Map header: true new: After: 3 New: 1",
|
|
518
|
-
"storage -> client | CONTENT Map header: true new: After: 4 New: 1",
|
|
519
|
-
"storage -> client | CONTENT Map header: true new: After: 5 New: 1",
|
|
520
|
-
"storage -> client | CONTENT Map header: true new: After: 6 New: 1",
|
|
521
|
-
"storage -> client | CONTENT Map header: true new: After: 7 New: 1",
|
|
522
|
-
"storage -> client | CONTENT Map header: true new: After: 8 New: 1",
|
|
523
|
-
"storage -> client | CONTENT Map header: true new: After: 9 New: 1",
|
|
603
|
+
"storage -> client | CONTENT Map header: true new: After: 0 New: 73 expectContentUntil: header/200",
|
|
604
|
+
"client -> server | LOAD Map sessions: header/200",
|
|
605
|
+
"storage -> client | CONTENT Map header: true new: After: 73 New: 73",
|
|
606
|
+
"storage -> client | CONTENT Map header: true new: After: 146 New: 54",
|
|
524
607
|
]
|
|
525
608
|
`);
|
|
526
609
|
});
|