cojson 0.19.0 → 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.
Files changed (51) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +8 -0
  3. package/dist/coValue.d.ts +12 -0
  4. package/dist/coValue.d.ts.map +1 -1
  5. package/dist/coValue.js +3 -0
  6. package/dist/coValue.js.map +1 -1
  7. package/dist/coValueCore/coValueCore.d.ts.map +1 -1
  8. package/dist/coValueCore/coValueCore.js +2 -9
  9. package/dist/coValueCore/coValueCore.js.map +1 -1
  10. package/dist/coValues/coList.d.ts +7 -11
  11. package/dist/coValues/coList.d.ts.map +1 -1
  12. package/dist/coValues/coList.js +22 -17
  13. package/dist/coValues/coList.js.map +1 -1
  14. package/dist/coValues/coMap.d.ts +9 -15
  15. package/dist/coValues/coMap.d.ts.map +1 -1
  16. package/dist/coValues/coMap.js +20 -10
  17. package/dist/coValues/coMap.js.map +1 -1
  18. package/dist/coValues/coStream.d.ts +4 -2
  19. package/dist/coValues/coStream.d.ts.map +1 -1
  20. package/dist/coValues/coStream.js +11 -0
  21. package/dist/coValues/coStream.js.map +1 -1
  22. package/dist/tests/coList.test.js +20 -0
  23. package/dist/tests/coList.test.js.map +1 -1
  24. package/dist/tests/coMap.test.js +20 -0
  25. package/dist/tests/coMap.test.js.map +1 -1
  26. package/dist/tests/coStream.test.js +20 -0
  27. package/dist/tests/coStream.test.js.map +1 -1
  28. package/dist/tests/group.invite.test.js +7 -8
  29. package/dist/tests/group.invite.test.js.map +1 -1
  30. package/dist/tests/group.roleOf.test.js +2 -5
  31. package/dist/tests/group.roleOf.test.js.map +1 -1
  32. package/dist/tests/sync.load.test.js +2 -4
  33. package/dist/tests/sync.load.test.js.map +1 -1
  34. package/dist/tests/sync.storage.test.js +89 -0
  35. package/dist/tests/sync.storage.test.js.map +1 -1
  36. package/dist/tests/sync.storageAsync.test.js +88 -0
  37. package/dist/tests/sync.storageAsync.test.js.map +1 -1
  38. package/package.json +3 -3
  39. package/src/coValue.ts +14 -0
  40. package/src/coValueCore/coValueCore.ts +3 -11
  41. package/src/coValues/coList.ts +29 -36
  42. package/src/coValues/coMap.ts +26 -29
  43. package/src/coValues/coStream.ts +16 -4
  44. package/src/tests/coList.test.ts +28 -0
  45. package/src/tests/coMap.test.ts +28 -0
  46. package/src/tests/coStream.test.ts +28 -0
  47. package/src/tests/group.invite.test.ts +7 -19
  48. package/src/tests/group.roleOf.test.ts +2 -4
  49. package/src/tests/sync.load.test.ts +2 -8
  50. package/src/tests/sync.storage.test.ts +109 -0
  51. 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
- await group.removeMember(memberAccount);
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
- const updatedMap = expectMap(mapOnNode2.core.getCurrentContent());
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(updatedMap.get("fromAdmin")).toEqual("Written from admin");
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
- const coValue = expectMap(
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
- const mapOnClient = expectMap(
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
  });