cojson 0.18.32 → 0.18.34
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/SyncStateManager.d.ts.map +1 -1
- package/dist/SyncStateManager.js +2 -2
- package/dist/SyncStateManager.js.map +1 -1
- package/dist/coValueCore/SessionMap.d.ts +1 -0
- package/dist/coValueCore/SessionMap.d.ts.map +1 -1
- package/dist/coValueCore/SessionMap.js +22 -12
- package/dist/coValueCore/SessionMap.js.map +1 -1
- package/dist/coValueCore/coValueCore.d.ts +14 -9
- package/dist/coValueCore/coValueCore.d.ts.map +1 -1
- package/dist/coValueCore/coValueCore.js +65 -51
- package/dist/coValueCore/coValueCore.js.map +1 -1
- package/dist/coValueCore/verifiedState.d.ts +5 -3
- package/dist/coValueCore/verifiedState.d.ts.map +1 -1
- package/dist/coValueCore/verifiedState.js +93 -76
- package/dist/coValueCore/verifiedState.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 +24 -4
- package/dist/coValues/group.js.map +1 -1
- package/dist/knownState.d.ts +9 -1
- package/dist/knownState.d.ts.map +1 -1
- package/dist/knownState.js +29 -3
- package/dist/knownState.js.map +1 -1
- package/dist/localNode.d.ts.map +1 -1
- package/dist/localNode.js +3 -3
- package/dist/localNode.js.map +1 -1
- package/dist/queue/LocalTransactionsSyncQueue.d.ts +10 -9
- package/dist/queue/LocalTransactionsSyncQueue.d.ts.map +1 -1
- package/dist/queue/LocalTransactionsSyncQueue.js +53 -32
- package/dist/queue/LocalTransactionsSyncQueue.js.map +1 -1
- package/dist/storage/knownState.js +2 -2
- package/dist/storage/knownState.js.map +1 -1
- package/dist/sync.d.ts +1 -2
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +8 -3
- package/dist/sync.js.map +1 -1
- package/dist/tests/PureJSCrypto.test.js +1 -1
- package/dist/tests/PureJSCrypto.test.js.map +1 -1
- package/dist/tests/StorageApiAsync.test.js +11 -11
- package/dist/tests/StorageApiAsync.test.js.map +1 -1
- package/dist/tests/StorageApiSync.test.js +3 -3
- package/dist/tests/StorageApiSync.test.js.map +1 -1
- package/dist/tests/WasmCrypto.test.js +1 -1
- package/dist/tests/WasmCrypto.test.js.map +1 -1
- package/dist/tests/coPlainText.test.js +13 -14
- package/dist/tests/coPlainText.test.js.map +1 -1
- package/dist/tests/coStream.test.js +12 -12
- package/dist/tests/coStream.test.js.map +1 -1
- package/dist/tests/coValueCore.isCompletelyDownloaded.test.d.ts +2 -0
- package/dist/tests/coValueCore.isCompletelyDownloaded.test.d.ts.map +1 -0
- package/dist/tests/coValueCore.isCompletelyDownloaded.test.js +422 -0
- package/dist/tests/coValueCore.isCompletelyDownloaded.test.js.map +1 -0
- package/dist/tests/coValueCore.isStreaming.test.d.ts +2 -0
- package/dist/tests/coValueCore.isStreaming.test.d.ts.map +1 -0
- package/dist/tests/coValueCore.isStreaming.test.js +232 -0
- package/dist/tests/coValueCore.isStreaming.test.js.map +1 -0
- package/dist/tests/coValueCore.newContentSince.test.d.ts +2 -0
- package/dist/tests/coValueCore.newContentSince.test.d.ts.map +1 -0
- package/dist/tests/coValueCore.newContentSince.test.js +808 -0
- package/dist/tests/coValueCore.newContentSince.test.js.map +1 -0
- package/dist/tests/coreWasm.test.js +2 -2
- package/dist/tests/coreWasm.test.js.map +1 -1
- package/dist/tests/group.childKeyRotation.test.d.ts +2 -0
- package/dist/tests/group.childKeyRotation.test.d.ts.map +1 -0
- package/dist/tests/group.childKeyRotation.test.js +261 -0
- package/dist/tests/group.childKeyRotation.test.js.map +1 -0
- package/dist/tests/group.removeMember.test.js +1 -114
- package/dist/tests/group.removeMember.test.js.map +1 -1
- package/dist/tests/knownState.test.js +83 -11
- package/dist/tests/knownState.test.js.map +1 -1
- package/dist/tests/sync.auth.test.js +6 -6
- package/dist/tests/sync.load.test.js +67 -4
- package/dist/tests/sync.load.test.js.map +1 -1
- package/dist/tests/sync.mesh.test.js +41 -40
- package/dist/tests/sync.mesh.test.js.map +1 -1
- package/dist/tests/sync.peerReconciliation.test.js +1 -1
- package/dist/tests/sync.storage.test.js +29 -28
- package/dist/tests/sync.storage.test.js.map +1 -1
- package/dist/tests/sync.storageAsync.test.js +26 -25
- package/dist/tests/sync.storageAsync.test.js.map +1 -1
- package/dist/tests/sync.upload.test.js +96 -40
- package/dist/tests/sync.upload.test.js.map +1 -1
- package/dist/tests/testUtils.d.ts +12 -8
- package/dist/tests/testUtils.d.ts.map +1 -1
- package/dist/tests/testUtils.js +39 -8
- package/dist/tests/testUtils.js.map +1 -1
- package/package.json +3 -3
- package/src/SyncStateManager.ts +5 -2
- package/src/coValueCore/SessionMap.ts +39 -12
- package/src/coValueCore/coValueCore.ts +81 -66
- package/src/coValueCore/verifiedState.ts +139 -109
- package/src/coValues/group.ts +27 -4
- package/src/knownState.ts +49 -5
- package/src/localNode.ts +7 -5
- package/src/queue/LocalTransactionsSyncQueue.ts +77 -68
- package/src/storage/knownState.ts +2 -2
- package/src/sync.ts +7 -3
- package/src/tests/PureJSCrypto.test.ts +1 -2
- package/src/tests/StorageApiAsync.test.ts +11 -11
- package/src/tests/StorageApiSync.test.ts +3 -3
- package/src/tests/WasmCrypto.test.ts +1 -2
- package/src/tests/coPlainText.test.ts +13 -14
- package/src/tests/coStream.test.ts +12 -12
- package/src/tests/coValueCore.isCompletelyDownloaded.test.ts +590 -0
- package/src/tests/coValueCore.isStreaming.test.ts +353 -0
- package/src/tests/coValueCore.newContentSince.test.ts +966 -0
- package/src/tests/coreWasm.test.ts +2 -2
- package/src/tests/group.childKeyRotation.test.ts +431 -0
- package/src/tests/group.removeMember.test.ts +1 -184
- package/src/tests/knownState.test.ts +108 -11
- package/src/tests/sync.auth.test.ts +6 -6
- package/src/tests/sync.load.test.ts +79 -4
- package/src/tests/sync.mesh.test.ts +41 -40
- package/src/tests/sync.peerReconciliation.test.ts +1 -1
- package/src/tests/sync.storage.test.ts +29 -28
- package/src/tests/sync.storageAsync.test.ts +26 -25
- package/src/tests/sync.upload.test.ts +106 -40
- package/src/tests/testUtils.ts +43 -9
|
@@ -7,9 +7,10 @@ import {
|
|
|
7
7
|
setSessionCounter,
|
|
8
8
|
updateSessionCounter,
|
|
9
9
|
cloneKnownState,
|
|
10
|
-
|
|
10
|
+
isKnownStateSubsetOf,
|
|
11
11
|
type CoValueKnownState,
|
|
12
12
|
type KnownStateSessions,
|
|
13
|
+
areCurrentSessionsInSyncWith,
|
|
13
14
|
} from "../knownState.js";
|
|
14
15
|
import { RawCoID, SessionID } from "../ids.js";
|
|
15
16
|
|
|
@@ -547,14 +548,14 @@ describe("knownState", () => {
|
|
|
547
548
|
});
|
|
548
549
|
});
|
|
549
550
|
|
|
550
|
-
describe("
|
|
551
|
+
describe("areCurrentSessionsInSyncWith", () => {
|
|
551
552
|
test("should return true when all counters match", () => {
|
|
552
553
|
const session1 = "session-1" as SessionID;
|
|
553
554
|
const session2 = "session-2" as SessionID;
|
|
554
555
|
const from = { [session1]: 5, [session2]: 10 };
|
|
555
556
|
const to = { [session1]: 5, [session2]: 10 };
|
|
556
557
|
|
|
557
|
-
const result =
|
|
558
|
+
const result = areCurrentSessionsInSyncWith(from, to);
|
|
558
559
|
|
|
559
560
|
expect(result).toBe(true);
|
|
560
561
|
});
|
|
@@ -564,7 +565,7 @@ describe("knownState", () => {
|
|
|
564
565
|
const from = { [session1]: 5 };
|
|
565
566
|
const to = { [session1]: 3 };
|
|
566
567
|
|
|
567
|
-
const result =
|
|
568
|
+
const result = areCurrentSessionsInSyncWith(from, to);
|
|
568
569
|
|
|
569
570
|
expect(result).toBe(false);
|
|
570
571
|
});
|
|
@@ -574,7 +575,7 @@ describe("knownState", () => {
|
|
|
574
575
|
const from = { [session1]: 5 };
|
|
575
576
|
const to = {};
|
|
576
577
|
|
|
577
|
-
const result =
|
|
578
|
+
const result = areCurrentSessionsInSyncWith(from, to);
|
|
578
579
|
|
|
579
580
|
expect(result).toBe(false);
|
|
580
581
|
});
|
|
@@ -584,7 +585,7 @@ describe("knownState", () => {
|
|
|
584
585
|
const from = {};
|
|
585
586
|
const to = { [session1]: 5 };
|
|
586
587
|
|
|
587
|
-
const result =
|
|
588
|
+
const result = areCurrentSessionsInSyncWith(from, to);
|
|
588
589
|
|
|
589
590
|
expect(result).toBe(true);
|
|
590
591
|
});
|
|
@@ -593,7 +594,7 @@ describe("knownState", () => {
|
|
|
593
594
|
const from = {};
|
|
594
595
|
const to = {};
|
|
595
596
|
|
|
596
|
-
const result =
|
|
597
|
+
const result = areCurrentSessionsInSyncWith(from, to);
|
|
597
598
|
|
|
598
599
|
expect(result).toBe(true);
|
|
599
600
|
});
|
|
@@ -613,7 +614,7 @@ describe("knownState", () => {
|
|
|
613
614
|
[session3]: 15,
|
|
614
615
|
};
|
|
615
616
|
|
|
616
|
-
const result =
|
|
617
|
+
const result = areCurrentSessionsInSyncWith(from, to);
|
|
617
618
|
|
|
618
619
|
expect(result).toBe(true);
|
|
619
620
|
});
|
|
@@ -633,7 +634,7 @@ describe("knownState", () => {
|
|
|
633
634
|
[session3]: 15,
|
|
634
635
|
};
|
|
635
636
|
|
|
636
|
-
const result =
|
|
637
|
+
const result = areCurrentSessionsInSyncWith(from, to);
|
|
637
638
|
|
|
638
639
|
expect(result).toBe(false);
|
|
639
640
|
});
|
|
@@ -647,7 +648,7 @@ describe("knownState", () => {
|
|
|
647
648
|
[session2]: 10,
|
|
648
649
|
};
|
|
649
650
|
|
|
650
|
-
const result =
|
|
651
|
+
const result = areCurrentSessionsInSyncWith(from, to);
|
|
651
652
|
|
|
652
653
|
expect(result).toBe(true);
|
|
653
654
|
});
|
|
@@ -657,9 +658,105 @@ describe("knownState", () => {
|
|
|
657
658
|
const from = { [session1]: 5 };
|
|
658
659
|
const to = { [session1]: 10 };
|
|
659
660
|
|
|
660
|
-
const result =
|
|
661
|
+
const result = areCurrentSessionsInSyncWith(from, to);
|
|
661
662
|
|
|
662
663
|
expect(result).toBe(false);
|
|
663
664
|
});
|
|
664
665
|
});
|
|
666
|
+
|
|
667
|
+
describe("isKnownStateSubsetOf", () => {
|
|
668
|
+
test("should return true when all counters match", () => {
|
|
669
|
+
const session1 = "session-1" as SessionID;
|
|
670
|
+
const session2 = "session-2" as SessionID;
|
|
671
|
+
const from = { [session1]: 5, [session2]: 10 };
|
|
672
|
+
const to = { [session1]: 5, [session2]: 10 };
|
|
673
|
+
|
|
674
|
+
const result = isKnownStateSubsetOf(from, to);
|
|
675
|
+
|
|
676
|
+
expect(result).toBe(true);
|
|
677
|
+
});
|
|
678
|
+
|
|
679
|
+
test("should return false when the current session counter is higher than the target", () => {
|
|
680
|
+
const session1 = "session-1" as SessionID;
|
|
681
|
+
const from = { [session1]: 5 };
|
|
682
|
+
const to = { [session1]: 3 };
|
|
683
|
+
|
|
684
|
+
const result = isKnownStateSubsetOf(from, to);
|
|
685
|
+
|
|
686
|
+
expect(result).toBe(false);
|
|
687
|
+
});
|
|
688
|
+
|
|
689
|
+
test("should return true when the target session counter is higher than the target", () => {
|
|
690
|
+
const session1 = "session-1" as SessionID;
|
|
691
|
+
const from = { [session1]: 5 };
|
|
692
|
+
const to = { [session1]: 10 };
|
|
693
|
+
|
|
694
|
+
const result = isKnownStateSubsetOf(from, to);
|
|
695
|
+
|
|
696
|
+
expect(result).toBe(true);
|
|
697
|
+
});
|
|
698
|
+
|
|
699
|
+
test("should return false when session is missing in to", () => {
|
|
700
|
+
const session1 = "session-1" as SessionID;
|
|
701
|
+
const from = { [session1]: 5 };
|
|
702
|
+
const to = {};
|
|
703
|
+
|
|
704
|
+
const result = isKnownStateSubsetOf(from, to);
|
|
705
|
+
|
|
706
|
+
expect(result).toBe(false);
|
|
707
|
+
});
|
|
708
|
+
|
|
709
|
+
test("should return true when from is empty", () => {
|
|
710
|
+
const session1 = "session-1" as SessionID;
|
|
711
|
+
const from = {};
|
|
712
|
+
const to = { [session1]: 5 };
|
|
713
|
+
|
|
714
|
+
const result = isKnownStateSubsetOf(from, to);
|
|
715
|
+
|
|
716
|
+
expect(result).toBe(true);
|
|
717
|
+
});
|
|
718
|
+
|
|
719
|
+
test("should return true when both are empty", () => {
|
|
720
|
+
const from = {};
|
|
721
|
+
const to = {};
|
|
722
|
+
|
|
723
|
+
const result = isKnownStateSubsetOf(from, to);
|
|
724
|
+
|
|
725
|
+
expect(result).toBe(true);
|
|
726
|
+
});
|
|
727
|
+
|
|
728
|
+
test("should handle multiple sessions", () => {
|
|
729
|
+
const session1 = "session-1" as SessionID;
|
|
730
|
+
const session2 = "session-2" as SessionID;
|
|
731
|
+
const session3 = "session-3" as SessionID;
|
|
732
|
+
const from = {
|
|
733
|
+
[session1]: 5,
|
|
734
|
+
[session2]: 10,
|
|
735
|
+
[session3]: 15,
|
|
736
|
+
};
|
|
737
|
+
const to = {
|
|
738
|
+
[session1]: 5,
|
|
739
|
+
[session2]: 10,
|
|
740
|
+
[session3]: 15,
|
|
741
|
+
};
|
|
742
|
+
|
|
743
|
+
const result = isKnownStateSubsetOf(from, to);
|
|
744
|
+
|
|
745
|
+
expect(result).toBe(true);
|
|
746
|
+
});
|
|
747
|
+
|
|
748
|
+
test("should not check sessions in to that are not in from", () => {
|
|
749
|
+
const session1 = "session-1" as SessionID;
|
|
750
|
+
const session2 = "session-2" as SessionID;
|
|
751
|
+
const from = { [session1]: 5 };
|
|
752
|
+
const to = {
|
|
753
|
+
[session1]: 5,
|
|
754
|
+
[session2]: 10,
|
|
755
|
+
};
|
|
756
|
+
|
|
757
|
+
const result = isKnownStateSubsetOf(from, to);
|
|
758
|
+
|
|
759
|
+
expect(result).toBe(true);
|
|
760
|
+
});
|
|
761
|
+
});
|
|
665
762
|
});
|
|
@@ -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 expectContentUntil: header/4",
|
|
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 expectContentUntil: header/5",
|
|
120
|
+
"client -> server | CONTENT Root header: true new: expectContentUntil: header/1",
|
|
121
|
+
"client -> server | CONTENT Profile header: true new: expectContentUntil: header/1",
|
|
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 expectContentUntil: header/4",
|
|
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 expectContentUntil: header/4",
|
|
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",
|
|
@@ -576,8 +576,7 @@ describe("loading coValues from server", () => {
|
|
|
576
576
|
[
|
|
577
577
|
"client -> server | LOAD Map sessions: empty",
|
|
578
578
|
"server -> client | CONTENT Group header: true new: After: 0 New: 5",
|
|
579
|
-
"server -> client | CONTENT Map header: true new:
|
|
580
|
-
"server -> client | CONTENT Map header: false new: After: 0 New: 73",
|
|
579
|
+
"server -> client | CONTENT Map header: true new: After: 0 New: 73 expectContentUntil: header/1024",
|
|
581
580
|
"server -> client | CONTENT Map header: false new: After: 73 New: 73",
|
|
582
581
|
"server -> client | CONTENT Map header: false new: After: 146 New: 73",
|
|
583
582
|
"server -> client | CONTENT Map header: false new: After: 219 New: 73",
|
|
@@ -593,7 +592,83 @@ describe("loading coValues from server", () => {
|
|
|
593
592
|
"server -> client | CONTENT Map header: false new: After: 949 New: 73",
|
|
594
593
|
"server -> client | CONTENT Map header: false new: After: 1022 New: 2",
|
|
595
594
|
"client -> server | KNOWN Group sessions: header/5",
|
|
595
|
+
"client -> server | KNOWN Map sessions: header/73",
|
|
596
|
+
"client -> server | KNOWN Map sessions: header/146",
|
|
597
|
+
"client -> server | KNOWN Map sessions: header/219",
|
|
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",
|
|
610
|
+
]
|
|
611
|
+
`);
|
|
612
|
+
});
|
|
613
|
+
|
|
614
|
+
test("streaming a large update", async () => {
|
|
615
|
+
const group = jazzCloud.node.createGroup();
|
|
616
|
+
group.addMember("everyone", "writer");
|
|
617
|
+
|
|
618
|
+
const largeMap = group.createMap();
|
|
619
|
+
|
|
620
|
+
await largeMap.core.waitForSync();
|
|
621
|
+
|
|
622
|
+
const client = setupTestNode({
|
|
623
|
+
connected: true,
|
|
624
|
+
});
|
|
625
|
+
const mapOnClient = await loadCoValueOrFail(client.node, largeMap.id);
|
|
626
|
+
|
|
627
|
+
// Generate a large amount of data (about 100MB)
|
|
628
|
+
const dataSize = 1 * 1024 * 1024;
|
|
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
|
+
}
|
|
638
|
+
|
|
639
|
+
await waitFor(() => {
|
|
640
|
+
expect(mapOnClient.core.knownState()).toEqual(largeMap.core.knownState());
|
|
641
|
+
});
|
|
642
|
+
|
|
643
|
+
expect(mapOnClient.get(`key${chunks - 1}`)).toEqual(value);
|
|
644
|
+
|
|
645
|
+
expect(
|
|
646
|
+
SyncMessagesLog.getMessages({
|
|
647
|
+
Group: group.core,
|
|
648
|
+
Map: largeMap.core,
|
|
649
|
+
}),
|
|
650
|
+
).toMatchInlineSnapshot(`
|
|
651
|
+
[
|
|
652
|
+
"client -> server | LOAD Map sessions: empty",
|
|
653
|
+
"server -> client | CONTENT Group header: true new: After: 0 New: 5",
|
|
654
|
+
"server -> client | CONTENT Map header: true new: ",
|
|
655
|
+
"client -> server | KNOWN Group sessions: header/5",
|
|
596
656
|
"client -> server | KNOWN Map sessions: header/0",
|
|
657
|
+
"server -> client | CONTENT Map header: false new: After: 0 New: 73 expectContentUntil: header/1024",
|
|
658
|
+
"server -> client | CONTENT Map header: false new: After: 73 New: 73",
|
|
659
|
+
"server -> client | CONTENT Map header: false new: After: 146 New: 73",
|
|
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",
|
|
597
672
|
"client -> server | KNOWN Map sessions: header/73",
|
|
598
673
|
"client -> server | KNOWN Map sessions: header/146",
|
|
599
674
|
"client -> server | KNOWN Map sessions: header/219",
|
|
@@ -1311,8 +1386,8 @@ describe("loading coValues from server", () => {
|
|
|
1311
1386
|
}),
|
|
1312
1387
|
).toMatchInlineSnapshot(`
|
|
1313
1388
|
[
|
|
1314
|
-
"client -> server | CONTENT Group header: true new: After: 0 New: 3",
|
|
1315
|
-
"client -> server | CONTENT ParentGroup header: true new: After: 0 New: 5",
|
|
1389
|
+
"client -> server | CONTENT Group header: true new: After: 0 New: 3 expectContentUntil: header/5",
|
|
1390
|
+
"client -> server | CONTENT ParentGroup header: true new: After: 0 New: 5 expectContentUntil: header/7",
|
|
1316
1391
|
"client -> server | CONTENT Group header: false new: After: 3 New: 2",
|
|
1317
1392
|
"client -> server | CONTENT ParentGroup header: false new: After: 5 New: 2",
|
|
1318
1393
|
"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 expectContentUntil: header/5",
|
|
156
|
+
"edge-france -> core | CONTENT Group header: true new: After: 0 New: 3 expectContentUntil: header/5",
|
|
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",
|
|
@@ -320,7 +320,7 @@ describe("multiple clients syncing with the a cloud-like server mesh", () => {
|
|
|
320
320
|
expect(mapOnItalianClient.get("hello")).toEqual("world");
|
|
321
321
|
expect(mapOnFrenchClient.get("hello")).toEqual("world");
|
|
322
322
|
|
|
323
|
-
const msg = map.core.
|
|
323
|
+
const msg = map.core.newContentSince(undefined)?.[0];
|
|
324
324
|
assert(msg);
|
|
325
325
|
|
|
326
326
|
msg.new[mesh.edgeFrance.node.currentSessionID]!.newTransactions.push({
|
|
@@ -498,11 +498,11 @@ describe("multiple clients syncing with the a cloud-like server mesh", () => {
|
|
|
498
498
|
).toMatchInlineSnapshot(`
|
|
499
499
|
[
|
|
500
500
|
"edge -> storage | CONTENT Group header: true new: After: 0 New: 5",
|
|
501
|
-
"edge -> storage | CONTENT Map header: true new: After: 0 New:
|
|
502
|
-
"edge -> storage | CONTENT Map header: false new: After:
|
|
503
|
-
"edge -> storage | CONTENT Map header: false new: After:
|
|
504
|
-
"edge -> storage | CONTENT Map header: false new: After:
|
|
505
|
-
"edge -> storage | CONTENT Map header: false new: After:
|
|
501
|
+
"edge -> storage | CONTENT Map header: true new: After: 0 New: 21 expectContentUntil: header/100",
|
|
502
|
+
"edge -> storage | CONTENT Map header: false new: After: 21 New: 21",
|
|
503
|
+
"edge -> storage | CONTENT Map header: false new: After: 42 New: 21",
|
|
504
|
+
"edge -> storage | CONTENT Map header: false new: After: 63 New: 21",
|
|
505
|
+
"edge -> storage | CONTENT Map header: false new: After: 84 New: 16",
|
|
506
506
|
]
|
|
507
507
|
`);
|
|
508
508
|
|
|
@@ -549,11 +549,10 @@ describe("multiple clients syncing with the a cloud-like server mesh", () => {
|
|
|
549
549
|
"edge -> storage | LOAD Map sessions: empty",
|
|
550
550
|
"storage -> edge | CONTENT Group header: true new: After: 0 New: 5",
|
|
551
551
|
"edge -> core | LOAD Group sessions: header/5",
|
|
552
|
-
"storage -> edge | CONTENT Map header: true new: After: 0 New:
|
|
552
|
+
"storage -> edge | CONTENT Map header: true new: After: 0 New: 21 expectContentUntil: header/100",
|
|
553
553
|
"edge -> core | LOAD Map sessions: header/100",
|
|
554
554
|
"edge -> client | CONTENT Group header: true new: After: 0 New: 5",
|
|
555
|
-
"edge -> client | CONTENT Map header: true new:
|
|
556
|
-
"edge -> client | CONTENT Map header: false new: After: 0 New: 41",
|
|
555
|
+
"edge -> client | CONTENT Map header: true new: After: 0 New: 21 expectContentUntil: header/100",
|
|
557
556
|
"core -> storage | LOAD Group sessions: empty",
|
|
558
557
|
"storage -> core | KNOWN Group sessions: empty",
|
|
559
558
|
"core -> edge | KNOWN Group sessions: empty",
|
|
@@ -562,40 +561,42 @@ describe("multiple clients syncing with the a cloud-like server mesh", () => {
|
|
|
562
561
|
"core -> edge | KNOWN Map sessions: empty",
|
|
563
562
|
"client -> edge | KNOWN Group sessions: header/5",
|
|
564
563
|
"client -> storage | CONTENT Group header: true new: After: 0 New: 5",
|
|
565
|
-
"client -> edge | KNOWN Map sessions: header/
|
|
566
|
-
"client -> storage | CONTENT Map header: true new: ",
|
|
567
|
-
"
|
|
568
|
-
"
|
|
569
|
-
"storage -> edge | CONTENT Map header: true new: After: 41 New: 21",
|
|
570
|
-
"edge -> client | CONTENT Map header: false new: After: 41 New: 21",
|
|
564
|
+
"client -> edge | KNOWN Map sessions: header/21",
|
|
565
|
+
"client -> storage | CONTENT Map header: true new: After: 0 New: 21",
|
|
566
|
+
"storage -> edge | CONTENT Map header: true new: After: 21 New: 21",
|
|
567
|
+
"edge -> client | CONTENT Map header: false new: After: 21 New: 21 expectContentUntil: header/100",
|
|
571
568
|
"edge -> core | CONTENT Group header: true new: After: 0 New: 5",
|
|
572
|
-
"edge -> core | CONTENT Map header: true new:
|
|
573
|
-
"edge -> core | CONTENT Map header: false new: After:
|
|
574
|
-
"
|
|
575
|
-
"client ->
|
|
576
|
-
"
|
|
577
|
-
"
|
|
578
|
-
"edge ->
|
|
579
|
-
"edge -> client | CONTENT Map header: false new: After: 62 New: 21",
|
|
569
|
+
"edge -> core | CONTENT Map header: true new: After: 0 New: 21 expectContentUntil: header/100",
|
|
570
|
+
"edge -> core | CONTENT Map header: false new: After: 21 New: 21",
|
|
571
|
+
"client -> edge | KNOWN Map sessions: header/42",
|
|
572
|
+
"client -> storage | CONTENT Map header: false new: After: 21 New: 21",
|
|
573
|
+
"storage -> edge | CONTENT Map header: true new: After: 42 New: 21",
|
|
574
|
+
"edge -> core | CONTENT Map header: false new: After: 42 New: 21 expectContentUntil: header/100",
|
|
575
|
+
"edge -> client | CONTENT Map header: false new: After: 42 New: 21 expectContentUntil: header/100",
|
|
580
576
|
"core -> edge | KNOWN Group sessions: header/5",
|
|
581
577
|
"core -> storage | CONTENT Group header: true new: After: 0 New: 5",
|
|
582
|
-
"core -> edge | KNOWN Map sessions: header/
|
|
583
|
-
"core -> storage | CONTENT Map header: true new: ",
|
|
584
|
-
"core -> edge | KNOWN Map sessions: header/
|
|
585
|
-
"core -> storage | CONTENT Map header: false new: After:
|
|
586
|
-
"core -> edge | KNOWN Map sessions: header/
|
|
587
|
-
"core -> storage | CONTENT Map header: false new: After:
|
|
588
|
-
"
|
|
589
|
-
"
|
|
590
|
-
"
|
|
591
|
-
"
|
|
592
|
-
"
|
|
593
|
-
"
|
|
594
|
-
"
|
|
578
|
+
"core -> edge | KNOWN Map sessions: header/21",
|
|
579
|
+
"core -> storage | CONTENT Map header: true new: After: 0 New: 21",
|
|
580
|
+
"core -> edge | KNOWN Map sessions: header/42",
|
|
581
|
+
"core -> storage | CONTENT Map header: false new: After: 21 New: 21",
|
|
582
|
+
"core -> edge | KNOWN Map sessions: header/63",
|
|
583
|
+
"core -> storage | CONTENT Map header: false new: After: 42 New: 21",
|
|
584
|
+
"client -> edge | KNOWN Map sessions: header/63",
|
|
585
|
+
"client -> storage | CONTENT Map header: false new: After: 42 New: 21",
|
|
586
|
+
"storage -> edge | CONTENT Map header: true new: After: 63 New: 21",
|
|
587
|
+
"edge -> core | CONTENT Map header: false new: After: 63 New: 21 expectContentUntil: header/100",
|
|
588
|
+
"edge -> client | CONTENT Map header: false new: After: 63 New: 21 expectContentUntil: header/100",
|
|
589
|
+
"core -> edge | KNOWN Map sessions: header/84",
|
|
590
|
+
"core -> storage | CONTENT Map header: false new: After: 63 New: 21",
|
|
591
|
+
"client -> edge | KNOWN Map sessions: header/84",
|
|
592
|
+
"client -> storage | CONTENT Map header: false new: After: 63 New: 21",
|
|
593
|
+
"storage -> edge | CONTENT Map header: true new: After: 84 New: 16",
|
|
594
|
+
"edge -> core | CONTENT Map header: false new: After: 84 New: 16",
|
|
595
|
+
"edge -> client | CONTENT Map header: false new: After: 84 New: 16",
|
|
595
596
|
"core -> edge | KNOWN Map sessions: header/100",
|
|
596
|
-
"core -> storage | CONTENT Map header: false new: After:
|
|
597
|
+
"core -> storage | CONTENT Map header: false new: After: 84 New: 16",
|
|
597
598
|
"client -> edge | KNOWN Map sessions: header/100",
|
|
598
|
-
"client -> storage | CONTENT Map header: false new: After:
|
|
599
|
+
"client -> storage | CONTENT Map header: false new: After: 84 New: 16",
|
|
599
600
|
]
|
|
600
601
|
`);
|
|
601
602
|
|
|
@@ -281,8 +281,8 @@ describe("peer reconciliation", () => {
|
|
|
281
281
|
"client -> server | CONTENT ProfileGroup header: true new: After: 0 New: 5",
|
|
282
282
|
"server -> client | KNOWN Account sessions: header/4",
|
|
283
283
|
"server -> client | KNOWN ProfileGroup sessions: header/5",
|
|
284
|
-
"server -> client | KNOWN CORRECTION Map sessions: empty",
|
|
285
284
|
"server -> client | KNOWN Profile sessions: header/1",
|
|
285
|
+
"server -> client | KNOWN CORRECTION Map sessions: empty",
|
|
286
286
|
"server -> client | KNOWN ProfileGroup sessions: header/5",
|
|
287
287
|
"client -> server | CONTENT Map header: true new: After: 0 New: 2",
|
|
288
288
|
"server -> client | LOAD Group sessions: empty",
|
|
@@ -382,28 +382,28 @@ describe("client syncs with a server with storage", () => {
|
|
|
382
382
|
[
|
|
383
383
|
"client -> storage | CONTENT Group header: true new: After: 0 New: 5",
|
|
384
384
|
"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:
|
|
392
|
-
"client -> server | CONTENT Map header: false new: After:
|
|
393
|
-
"client -> storage | CONTENT Map header: false new: After:
|
|
394
|
-
"client -> server | CONTENT Map header: false new: After:
|
|
385
|
+
"client -> storage | CONTENT Map header: true new: After: 0 New: 21 expectContentUntil: header/100",
|
|
386
|
+
"client -> server | CONTENT Map header: true new: After: 0 New: 21 expectContentUntil: header/100",
|
|
387
|
+
"client -> storage | CONTENT Map header: false new: After: 21 New: 21",
|
|
388
|
+
"client -> server | CONTENT Map header: false new: After: 21 New: 21",
|
|
389
|
+
"client -> storage | CONTENT Map header: false new: After: 42 New: 21",
|
|
390
|
+
"client -> server | CONTENT Map header: false new: After: 42 New: 21",
|
|
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",
|
|
395
395
|
"server -> client | KNOWN Group sessions: header/5",
|
|
396
396
|
"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/
|
|
404
|
-
"server -> storage | CONTENT Map header: false new: After:
|
|
397
|
+
"server -> client | KNOWN Map sessions: header/21",
|
|
398
|
+
"server -> storage | CONTENT Map header: true new: After: 0 New: 21",
|
|
399
|
+
"server -> client | KNOWN Map sessions: header/42",
|
|
400
|
+
"server -> storage | CONTENT Map header: false new: After: 21 New: 21",
|
|
401
|
+
"server -> client | KNOWN Map sessions: header/63",
|
|
402
|
+
"server -> storage | CONTENT Map header: false new: After: 42 New: 21",
|
|
403
|
+
"server -> client | KNOWN Map sessions: header/84",
|
|
404
|
+
"server -> storage | CONTENT Map header: false new: After: 63 New: 21",
|
|
405
405
|
"server -> client | KNOWN Map sessions: header/100",
|
|
406
|
-
"server -> storage | CONTENT Map header: false new: After:
|
|
406
|
+
"server -> storage | CONTENT Map header: false new: After: 84 New: 16",
|
|
407
407
|
]
|
|
408
408
|
`);
|
|
409
409
|
|
|
@@ -456,13 +456,14 @@ describe("client syncs with a server with storage", () => {
|
|
|
456
456
|
"client -> storage | LOAD Map sessions: empty",
|
|
457
457
|
"storage -> client | CONTENT Group header: true new: After: 0 New: 5",
|
|
458
458
|
"client -> server | LOAD Group sessions: header/5",
|
|
459
|
-
"storage -> client | CONTENT Map header: true new: After: 0 New:
|
|
459
|
+
"storage -> client | CONTENT Map header: true new: After: 0 New: 21 expectContentUntil: header/100",
|
|
460
460
|
"client -> server | LOAD Map sessions: header/100",
|
|
461
461
|
"server -> client | KNOWN Group sessions: header/5",
|
|
462
462
|
"server -> client | KNOWN Map sessions: header/100",
|
|
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:
|
|
463
|
+
"storage -> client | CONTENT Map header: true new: After: 21 New: 21",
|
|
464
|
+
"storage -> client | CONTENT Map header: true new: After: 42 New: 21",
|
|
465
|
+
"storage -> client | CONTENT Map header: true new: After: 63 New: 21",
|
|
466
|
+
"storage -> client | CONTENT Map header: true new: After: 84 New: 16",
|
|
466
467
|
]
|
|
467
468
|
`);
|
|
468
469
|
});
|
|
@@ -497,7 +498,7 @@ describe("client syncs with a server with storage", () => {
|
|
|
497
498
|
|
|
498
499
|
await largeMap.core.waitForSync();
|
|
499
500
|
|
|
500
|
-
const newContentChunks = largeMap.core.
|
|
501
|
+
const newContentChunks = largeMap.core.newContentSince(
|
|
501
502
|
emptyKnownState(largeMap.id),
|
|
502
503
|
);
|
|
503
504
|
|
|
@@ -610,7 +611,7 @@ describe("client syncs with a server with storage", () => {
|
|
|
610
611
|
SyncMessagesLog.clear(); // We want to focus on the sync messages happening from now
|
|
611
612
|
|
|
612
613
|
// Import the group in the client, to have the dependencies availble and test that the import persists on storage
|
|
613
|
-
const groupContent = group.core.
|
|
614
|
+
const groupContent = group.core.newContentSince(undefined)?.[0];
|
|
614
615
|
assert(groupContent);
|
|
615
616
|
client.node.syncManager.handleNewContent(groupContent, "import");
|
|
616
617
|
expect(storage.getKnownState(groupContent.id)).toEqual(
|
|
@@ -618,7 +619,7 @@ describe("client syncs with a server with storage", () => {
|
|
|
618
619
|
);
|
|
619
620
|
|
|
620
621
|
// Export the map content with the two sessions
|
|
621
|
-
const mapContent = mapOnBob.core.
|
|
622
|
+
const mapContent = mapOnBob.core.newContentSince(undefined)?.[0];
|
|
622
623
|
assert(mapContent);
|
|
623
624
|
|
|
624
625
|
// Tamper Bob's session
|
|
@@ -737,8 +738,8 @@ describe("client syncs with a server with storage", () => {
|
|
|
737
738
|
}),
|
|
738
739
|
).toMatchInlineSnapshot(`
|
|
739
740
|
[
|
|
740
|
-
"client -> server | CONTENT Group header: true new: After: 0 New: 3",
|
|
741
|
-
"client -> server | CONTENT Map header: true new: ",
|
|
741
|
+
"client -> server | CONTENT Group header: true new: After: 0 New: 3 expectContentUntil: header/5",
|
|
742
|
+
"client -> server | CONTENT Map header: true new: expectContentUntil: header/1",
|
|
742
743
|
"client -> server | CONTENT Group header: false new: After: 3 New: 2",
|
|
743
744
|
"client -> server | CONTENT Map header: false new: After: 0 New: 1",
|
|
744
745
|
"server -> client | KNOWN Group sessions: header/3",
|