cojson 0.18.38 → 0.19.1
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 +15 -0
- package/dist/coValue.d.ts +12 -0
- package/dist/coValue.d.ts.map +1 -1
- package/dist/coValue.js +3 -0
- package/dist/coValue.js.map +1 -1
- package/dist/coValueCore/coValueCore.d.ts.map +1 -1
- package/dist/coValueCore/coValueCore.js +2 -9
- package/dist/coValueCore/coValueCore.js.map +1 -1
- package/dist/coValues/coList.d.ts +7 -11
- package/dist/coValues/coList.d.ts.map +1 -1
- package/dist/coValues/coList.js +22 -17
- package/dist/coValues/coList.js.map +1 -1
- package/dist/coValues/coMap.d.ts +9 -15
- package/dist/coValues/coMap.d.ts.map +1 -1
- package/dist/coValues/coMap.js +20 -10
- package/dist/coValues/coMap.js.map +1 -1
- package/dist/coValues/coStream.d.ts +4 -2
- package/dist/coValues/coStream.d.ts.map +1 -1
- package/dist/coValues/coStream.js +11 -0
- package/dist/coValues/coStream.js.map +1 -1
- package/dist/tests/coList.test.js +20 -0
- package/dist/tests/coList.test.js.map +1 -1
- package/dist/tests/coMap.test.js +20 -0
- package/dist/tests/coMap.test.js.map +1 -1
- package/dist/tests/coStream.test.js +20 -0
- package/dist/tests/coStream.test.js.map +1 -1
- package/dist/tests/group.invite.test.js +7 -8
- package/dist/tests/group.invite.test.js.map +1 -1
- package/dist/tests/group.roleOf.test.js +2 -5
- package/dist/tests/group.roleOf.test.js.map +1 -1
- package/dist/tests/sync.load.test.js +2 -4
- package/dist/tests/sync.load.test.js.map +1 -1
- package/dist/tests/sync.storage.test.js +89 -0
- package/dist/tests/sync.storage.test.js.map +1 -1
- package/dist/tests/sync.storageAsync.test.js +88 -0
- package/dist/tests/sync.storageAsync.test.js.map +1 -1
- package/package.json +3 -3
- package/src/coValue.ts +14 -0
- package/src/coValueCore/coValueCore.ts +3 -11
- package/src/coValues/coList.ts +29 -36
- package/src/coValues/coMap.ts +26 -29
- package/src/coValues/coStream.ts +16 -4
- package/src/tests/coList.test.ts +28 -0
- package/src/tests/coMap.test.ts +28 -0
- package/src/tests/coStream.test.ts +28 -0
- package/src/tests/group.invite.test.ts +7 -19
- package/src/tests/group.roleOf.test.ts +2 -4
- package/src/tests/sync.load.test.ts +2 -8
- package/src/tests/sync.storage.test.ts +109 -0
- package/src/tests/sync.storageAsync.test.ts +107 -0
|
@@ -99,9 +99,7 @@ describe("Group invites", () => {
|
|
|
99
99
|
await newMember.node.acceptInvite(group.id, inviteSecret);
|
|
100
100
|
|
|
101
101
|
await waitFor(() => {
|
|
102
|
-
expect(
|
|
103
|
-
expectMap(personOnNewMemberNode.core.getCurrentContent()).get("name"),
|
|
104
|
-
).toEqual("John Doe");
|
|
102
|
+
expect(personOnNewMemberNode.get("name")).toEqual("John Doe");
|
|
105
103
|
});
|
|
106
104
|
|
|
107
105
|
const groupOnNewMemberNode = await loadCoValueOrFail(
|
|
@@ -137,9 +135,7 @@ describe("Group invites", () => {
|
|
|
137
135
|
await newMember.node.acceptInvite(group.id, inviteSecret);
|
|
138
136
|
|
|
139
137
|
await waitFor(() => {
|
|
140
|
-
expect(
|
|
141
|
-
expectMap(personOnNewMemberNode.core.getCurrentContent()).get("name"),
|
|
142
|
-
).toEqual("John Doe");
|
|
138
|
+
expect(personOnNewMemberNode.get("name")).toEqual("John Doe");
|
|
143
139
|
});
|
|
144
140
|
|
|
145
141
|
const groupOnNewMemberNode = await loadCoValueOrFail(
|
|
@@ -220,9 +216,7 @@ describe("Group invites", () => {
|
|
|
220
216
|
await newMember.node.acceptInvite(group.id, inviteSecret);
|
|
221
217
|
|
|
222
218
|
await waitFor(() => {
|
|
223
|
-
expect(
|
|
224
|
-
expectMap(personOnNewMemberNode.core.getCurrentContent()).get("name"),
|
|
225
|
-
).toEqual("John Doe");
|
|
219
|
+
expect(personOnNewMemberNode.get("name")).toEqual("John Doe");
|
|
226
220
|
});
|
|
227
221
|
|
|
228
222
|
const groupOnNewMemberNode = await loadCoValueOrFail(
|
|
@@ -246,9 +240,7 @@ describe("Group invites", () => {
|
|
|
246
240
|
const personOnReaderNode = await loadCoValueOrFail(reader.node, person.id);
|
|
247
241
|
|
|
248
242
|
await waitFor(() => {
|
|
249
|
-
expect(
|
|
250
|
-
expectMap(personOnReaderNode.core.getCurrentContent()).get("name"),
|
|
251
|
-
).toEqual("John Doe");
|
|
243
|
+
expect(personOnReaderNode.get("name")).toEqual("John Doe");
|
|
252
244
|
});
|
|
253
245
|
});
|
|
254
246
|
|
|
@@ -278,9 +270,7 @@ describe("Group invites", () => {
|
|
|
278
270
|
await newMember.node.acceptInvite(group.id, inviteSecret);
|
|
279
271
|
|
|
280
272
|
await waitFor(() => {
|
|
281
|
-
expect(
|
|
282
|
-
expectMap(personOnNewMemberNode.core.getCurrentContent()).get("name"),
|
|
283
|
-
).toEqual("John Doe");
|
|
273
|
+
expect(personOnNewMemberNode.get("name")).toEqual("John Doe");
|
|
284
274
|
});
|
|
285
275
|
|
|
286
276
|
const groupOnNewMemberNode = await loadCoValueOrFail(
|
|
@@ -304,9 +294,7 @@ describe("Group invites", () => {
|
|
|
304
294
|
const personOnReaderNode = await loadCoValueOrFail(reader.node, person.id);
|
|
305
295
|
|
|
306
296
|
await waitFor(() => {
|
|
307
|
-
expect(
|
|
308
|
-
expectMap(personOnReaderNode.core.getCurrentContent()).get("name"),
|
|
309
|
-
).toEqual("John Doe");
|
|
297
|
+
expect(personOnReaderNode.get("name")).toEqual("John Doe");
|
|
310
298
|
});
|
|
311
299
|
});
|
|
312
300
|
|
|
@@ -411,7 +399,7 @@ describe("Group invites", () => {
|
|
|
411
399
|
// First add member as reader
|
|
412
400
|
const memberAccount = await loadCoValueOrFail(admin.node, member.accountID);
|
|
413
401
|
group.addMember(memberAccount, "reader");
|
|
414
|
-
|
|
402
|
+
group.removeMember(memberAccount);
|
|
415
403
|
|
|
416
404
|
// Create a new reader invite
|
|
417
405
|
const inviteSecret = group.createInvite("reader");
|
|
@@ -329,8 +329,7 @@ describe("roleOf", () => {
|
|
|
329
329
|
expect(mapOnNode2.get("test")).toEqual("Written from everyone");
|
|
330
330
|
|
|
331
331
|
await waitFor(async () => {
|
|
332
|
-
|
|
333
|
-
expect(updatedMap.get("fromAdmin")).toEqual("Written from admin");
|
|
332
|
+
expect(mapOnNode2.get("fromAdmin")).toEqual("Written from admin");
|
|
334
333
|
});
|
|
335
334
|
});
|
|
336
335
|
|
|
@@ -374,9 +373,8 @@ describe("roleOf", () => {
|
|
|
374
373
|
expect(mapOnNode2.get("test")).toEqual("Updated after the upgrade");
|
|
375
374
|
|
|
376
375
|
await waitFor(async () => {
|
|
377
|
-
const updatedMap = expectMap(mapOnNode2.core.getCurrentContent());
|
|
378
376
|
// Get the new content after the invalidation caused by group update
|
|
379
|
-
expect(
|
|
377
|
+
expect(mapOnNode2.get("fromAdmin")).toEqual("Written from admin");
|
|
380
378
|
});
|
|
381
379
|
});
|
|
382
380
|
|
|
@@ -481,10 +481,7 @@ describe("loading coValues from server", () => {
|
|
|
481
481
|
map.set("fromServer", "updated", "trusting");
|
|
482
482
|
|
|
483
483
|
await waitFor(() => {
|
|
484
|
-
|
|
485
|
-
client.node.expectCoValueLoaded(map.id).getCurrentContent(),
|
|
486
|
-
);
|
|
487
|
-
expect(coValue.get("fromServer")).toEqual("updated");
|
|
484
|
+
expect(map.get("fromServer")).toEqual("updated");
|
|
488
485
|
});
|
|
489
486
|
|
|
490
487
|
expect(
|
|
@@ -1257,10 +1254,7 @@ describe("loading coValues from server", () => {
|
|
|
1257
1254
|
|
|
1258
1255
|
// Wait for the update to arrive on the initial client
|
|
1259
1256
|
await waitFor(() => {
|
|
1260
|
-
|
|
1261
|
-
client.node.getCoValue(map.core.id).getCurrentContent(),
|
|
1262
|
-
);
|
|
1263
|
-
expect(mapOnClient.get("newAccountClient")).toBe(true);
|
|
1257
|
+
expect(map.get("newAccountClient")).toBe(true);
|
|
1264
1258
|
});
|
|
1265
1259
|
|
|
1266
1260
|
// The edge server should wait for the new Account to be available before sending the Map update
|
|
@@ -733,4 +733,113 @@ describe("client syncs with a server with storage", () => {
|
|
|
733
733
|
]
|
|
734
734
|
`);
|
|
735
735
|
});
|
|
736
|
+
|
|
737
|
+
test("large parent group streaming from storage", async () => {
|
|
738
|
+
const syncServer = setupTestNode({
|
|
739
|
+
isSyncServer: true,
|
|
740
|
+
});
|
|
741
|
+
const { storage } = syncServer.addStorage({
|
|
742
|
+
ourName: "syncServer",
|
|
743
|
+
});
|
|
744
|
+
|
|
745
|
+
const alice = setupTestNode();
|
|
746
|
+
alice.connectToSyncServer({
|
|
747
|
+
syncServer: syncServer.node,
|
|
748
|
+
});
|
|
749
|
+
|
|
750
|
+
const parentGroup = alice.node.createGroup();
|
|
751
|
+
const group = alice.node.createGroup();
|
|
752
|
+
group.extend(parentGroup);
|
|
753
|
+
|
|
754
|
+
const map = group.createMap();
|
|
755
|
+
|
|
756
|
+
fillCoMapWithLargeData(parentGroup);
|
|
757
|
+
|
|
758
|
+
parentGroup.addMember("everyone", "reader");
|
|
759
|
+
|
|
760
|
+
map.set("hello", "world");
|
|
761
|
+
|
|
762
|
+
await map.core.waitForSync();
|
|
763
|
+
await parentGroup.core.waitForSync();
|
|
764
|
+
|
|
765
|
+
expect(
|
|
766
|
+
SyncMessagesLog.getMessages({
|
|
767
|
+
Group: group.core,
|
|
768
|
+
ParentGroup: parentGroup.core,
|
|
769
|
+
Map: map.core,
|
|
770
|
+
}),
|
|
771
|
+
).toMatchInlineSnapshot(`
|
|
772
|
+
[
|
|
773
|
+
"client -> server | CONTENT ParentGroup header: true new: After: 0 New: 3",
|
|
774
|
+
"client -> server | CONTENT Group header: true new: After: 0 New: 5",
|
|
775
|
+
"client -> server | CONTENT Map header: true new: ",
|
|
776
|
+
"client -> server | CONTENT ParentGroup header: false new: After: 3 New: 73 expectContentUntil: header/205",
|
|
777
|
+
"client -> server | CONTENT ParentGroup header: false new: After: 76 New: 73",
|
|
778
|
+
"client -> server | CONTENT ParentGroup header: false new: After: 149 New: 56",
|
|
779
|
+
"client -> server | CONTENT Map header: false new: After: 0 New: 1",
|
|
780
|
+
"server -> client | KNOWN ParentGroup sessions: header/3",
|
|
781
|
+
"syncServer -> storage | CONTENT ParentGroup header: true new: After: 0 New: 3",
|
|
782
|
+
"server -> client | KNOWN Group sessions: header/5",
|
|
783
|
+
"syncServer -> storage | CONTENT Group header: true new: After: 0 New: 5",
|
|
784
|
+
"server -> client | KNOWN Map sessions: header/0",
|
|
785
|
+
"syncServer -> storage | CONTENT Map header: true new: ",
|
|
786
|
+
"server -> client | KNOWN ParentGroup sessions: header/76",
|
|
787
|
+
"syncServer -> storage | CONTENT ParentGroup header: false new: After: 3 New: 73",
|
|
788
|
+
"server -> client | KNOWN ParentGroup sessions: header/149",
|
|
789
|
+
"syncServer -> storage | CONTENT ParentGroup header: false new: After: 76 New: 73",
|
|
790
|
+
"server -> client | KNOWN ParentGroup sessions: header/205",
|
|
791
|
+
"syncServer -> storage | CONTENT ParentGroup header: false new: After: 149 New: 56",
|
|
792
|
+
"server -> client | KNOWN Map sessions: header/1",
|
|
793
|
+
"syncServer -> storage | CONTENT Map header: false new: After: 0 New: 1",
|
|
794
|
+
]
|
|
795
|
+
`);
|
|
796
|
+
|
|
797
|
+
SyncMessagesLog.clear();
|
|
798
|
+
|
|
799
|
+
syncServer.restart();
|
|
800
|
+
syncServer.addStorage({
|
|
801
|
+
ourName: "syncServer",
|
|
802
|
+
storage,
|
|
803
|
+
});
|
|
804
|
+
|
|
805
|
+
const bob = setupTestNode();
|
|
806
|
+
bob.connectToSyncServer({
|
|
807
|
+
syncServer: syncServer.node,
|
|
808
|
+
ourName: "bob",
|
|
809
|
+
});
|
|
810
|
+
|
|
811
|
+
let mapOnBob = await loadCoValueOrFail(bob.node, map.id);
|
|
812
|
+
|
|
813
|
+
await mapOnBob.core.waitForAsync((value) => value.isCompletelyDownloaded());
|
|
814
|
+
|
|
815
|
+
expect(
|
|
816
|
+
SyncMessagesLog.getMessages({
|
|
817
|
+
ParentGroup: parentGroup.core,
|
|
818
|
+
Group: group.core,
|
|
819
|
+
Map: map.core,
|
|
820
|
+
}),
|
|
821
|
+
).toMatchInlineSnapshot(`
|
|
822
|
+
[
|
|
823
|
+
"bob -> server | LOAD Map sessions: empty",
|
|
824
|
+
"syncServer -> storage | LOAD Map sessions: empty",
|
|
825
|
+
"storage -> syncServer | CONTENT ParentGroup header: true new: After: 0 New: 76 expectContentUntil: header/205",
|
|
826
|
+
"storage -> syncServer | CONTENT Group header: true new: After: 0 New: 5",
|
|
827
|
+
"storage -> syncServer | CONTENT Map header: true new: After: 0 New: 1",
|
|
828
|
+
"server -> bob | CONTENT ParentGroup header: true new: After: 0 New: 76 expectContentUntil: header/205",
|
|
829
|
+
"server -> bob | CONTENT Group header: true new: After: 0 New: 5",
|
|
830
|
+
"server -> bob | CONTENT Map header: true new: After: 0 New: 1",
|
|
831
|
+
"storage -> syncServer | CONTENT ParentGroup header: true new: After: 76 New: 73",
|
|
832
|
+
"server -> bob | CONTENT ParentGroup header: false new: After: 76 New: 73 expectContentUntil: header/205",
|
|
833
|
+
"bob -> server | KNOWN ParentGroup sessions: header/76",
|
|
834
|
+
"bob -> server | KNOWN Group sessions: header/5",
|
|
835
|
+
"bob -> server | KNOWN Map sessions: header/1",
|
|
836
|
+
"bob -> server | KNOWN ParentGroup sessions: header/149",
|
|
837
|
+
"storage -> syncServer | CONTENT ParentGroup header: true new: After: 149 New: 56",
|
|
838
|
+
"server -> bob | CONTENT ParentGroup header: false new: After: 149 New: 56",
|
|
839
|
+
"bob -> server | KNOWN ParentGroup sessions: header/205",
|
|
840
|
+
]
|
|
841
|
+
`);
|
|
842
|
+
|
|
843
|
+
expect(mapOnBob.get("hello")).toEqual("world");
|
|
844
|
+
});
|
|
736
845
|
});
|
|
@@ -640,4 +640,111 @@ describe("client syncs with a server with storage", () => {
|
|
|
640
640
|
await client.node.syncManager.waitForAllCoValuesSync();
|
|
641
641
|
await client2.node.syncManager.waitForAllCoValuesSync();
|
|
642
642
|
});
|
|
643
|
+
|
|
644
|
+
test("large parent group streaming from storage", async () => {
|
|
645
|
+
const syncServer = setupTestNode({
|
|
646
|
+
isSyncServer: true,
|
|
647
|
+
});
|
|
648
|
+
const { storage } = await syncServer.addAsyncStorage({
|
|
649
|
+
ourName: "syncServer",
|
|
650
|
+
});
|
|
651
|
+
|
|
652
|
+
const alice = setupTestNode();
|
|
653
|
+
alice.connectToSyncServer({
|
|
654
|
+
syncServer: syncServer.node,
|
|
655
|
+
});
|
|
656
|
+
|
|
657
|
+
const parentGroup = alice.node.createGroup();
|
|
658
|
+
const group = alice.node.createGroup();
|
|
659
|
+
group.extend(parentGroup);
|
|
660
|
+
|
|
661
|
+
const map = group.createMap();
|
|
662
|
+
|
|
663
|
+
fillCoMapWithLargeData(parentGroup);
|
|
664
|
+
|
|
665
|
+
parentGroup.addMember("everyone", "reader");
|
|
666
|
+
|
|
667
|
+
map.set("hello", "world");
|
|
668
|
+
|
|
669
|
+
await map.core.waitForSync();
|
|
670
|
+
await parentGroup.core.waitForSync();
|
|
671
|
+
|
|
672
|
+
expect(
|
|
673
|
+
SyncMessagesLog.getMessages({
|
|
674
|
+
Group: group.core,
|
|
675
|
+
ParentGroup: parentGroup.core,
|
|
676
|
+
Map: map.core,
|
|
677
|
+
}),
|
|
678
|
+
).toMatchInlineSnapshot(`
|
|
679
|
+
[
|
|
680
|
+
"client -> server | CONTENT ParentGroup header: true new: After: 0 New: 3",
|
|
681
|
+
"client -> server | CONTENT Group header: true new: After: 0 New: 5",
|
|
682
|
+
"client -> server | CONTENT Map header: true new: ",
|
|
683
|
+
"client -> server | CONTENT ParentGroup header: false new: After: 3 New: 73 expectContentUntil: header/205",
|
|
684
|
+
"client -> server | CONTENT ParentGroup header: false new: After: 76 New: 73",
|
|
685
|
+
"client -> server | CONTENT ParentGroup header: false new: After: 149 New: 56",
|
|
686
|
+
"client -> server | CONTENT Map header: false new: After: 0 New: 1",
|
|
687
|
+
"server -> client | KNOWN ParentGroup sessions: header/3",
|
|
688
|
+
"syncServer -> storage | CONTENT ParentGroup header: true new: After: 0 New: 3",
|
|
689
|
+
"server -> client | KNOWN Group sessions: header/5",
|
|
690
|
+
"syncServer -> storage | CONTENT Group header: true new: After: 0 New: 5",
|
|
691
|
+
"server -> client | KNOWN Map sessions: header/0",
|
|
692
|
+
"syncServer -> storage | CONTENT Map header: true new: ",
|
|
693
|
+
"server -> client | KNOWN ParentGroup sessions: header/76",
|
|
694
|
+
"syncServer -> storage | CONTENT ParentGroup header: false new: After: 3 New: 73",
|
|
695
|
+
"server -> client | KNOWN ParentGroup sessions: header/149",
|
|
696
|
+
"syncServer -> storage | CONTENT ParentGroup header: false new: After: 76 New: 73",
|
|
697
|
+
"server -> client | KNOWN ParentGroup sessions: header/205",
|
|
698
|
+
"syncServer -> storage | CONTENT ParentGroup header: false new: After: 149 New: 56",
|
|
699
|
+
"server -> client | KNOWN Map sessions: header/1",
|
|
700
|
+
"syncServer -> storage | CONTENT Map header: false new: After: 0 New: 1",
|
|
701
|
+
]
|
|
702
|
+
`);
|
|
703
|
+
|
|
704
|
+
SyncMessagesLog.clear();
|
|
705
|
+
|
|
706
|
+
syncServer.restart();
|
|
707
|
+
syncServer.addStorage({
|
|
708
|
+
ourName: "syncServer",
|
|
709
|
+
storage,
|
|
710
|
+
});
|
|
711
|
+
|
|
712
|
+
const bob = setupTestNode();
|
|
713
|
+
bob.connectToSyncServer({
|
|
714
|
+
syncServer: syncServer.node,
|
|
715
|
+
ourName: "bob",
|
|
716
|
+
});
|
|
717
|
+
|
|
718
|
+
const mapOnBob = await loadCoValueOrFail(bob.node, map.id);
|
|
719
|
+
|
|
720
|
+
expect(mapOnBob.get("hello")).toEqual("world");
|
|
721
|
+
|
|
722
|
+
expect(
|
|
723
|
+
SyncMessagesLog.getMessages({
|
|
724
|
+
ParentGroup: parentGroup.core,
|
|
725
|
+
Group: group.core,
|
|
726
|
+
Map: map.core,
|
|
727
|
+
}),
|
|
728
|
+
).toMatchInlineSnapshot(`
|
|
729
|
+
[
|
|
730
|
+
"bob -> server | LOAD Map sessions: empty",
|
|
731
|
+
"syncServer -> storage | LOAD Map sessions: empty",
|
|
732
|
+
"storage -> syncServer | CONTENT ParentGroup header: true new: After: 0 New: 76 expectContentUntil: header/205",
|
|
733
|
+
"storage -> syncServer | CONTENT ParentGroup header: true new: After: 76 New: 73",
|
|
734
|
+
"storage -> syncServer | CONTENT ParentGroup header: true new: After: 149 New: 56",
|
|
735
|
+
"storage -> syncServer | CONTENT Group header: true new: After: 0 New: 5",
|
|
736
|
+
"storage -> syncServer | CONTENT Map header: true new: After: 0 New: 1",
|
|
737
|
+
"server -> bob | CONTENT ParentGroup header: true new: After: 0 New: 76 expectContentUntil: header/205",
|
|
738
|
+
"server -> bob | CONTENT ParentGroup header: false new: After: 76 New: 73",
|
|
739
|
+
"server -> bob | CONTENT ParentGroup header: false new: After: 149 New: 56",
|
|
740
|
+
"server -> bob | CONTENT Group header: true new: After: 0 New: 5",
|
|
741
|
+
"server -> bob | CONTENT Map header: true new: After: 0 New: 1",
|
|
742
|
+
"bob -> server | KNOWN ParentGroup sessions: header/76",
|
|
743
|
+
"bob -> server | KNOWN ParentGroup sessions: header/149",
|
|
744
|
+
"bob -> server | KNOWN ParentGroup sessions: header/205",
|
|
745
|
+
"bob -> server | KNOWN Group sessions: header/5",
|
|
746
|
+
"bob -> server | KNOWN Map sessions: header/1",
|
|
747
|
+
]
|
|
748
|
+
`);
|
|
749
|
+
});
|
|
643
750
|
});
|