cojson 0.18.36 → 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.
Files changed (76) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +18 -0
  3. package/dist/coValueCore/SessionMap.d.ts +5 -3
  4. package/dist/coValueCore/SessionMap.d.ts.map +1 -1
  5. package/dist/coValueCore/SessionMap.js +19 -9
  6. package/dist/coValueCore/SessionMap.js.map +1 -1
  7. package/dist/coValueCore/coValueCore.d.ts +5 -2
  8. package/dist/coValueCore/coValueCore.d.ts.map +1 -1
  9. package/dist/coValueCore/coValueCore.js +24 -4
  10. package/dist/coValueCore/coValueCore.js.map +1 -1
  11. package/dist/coValueCore/verifiedState.d.ts +1 -3
  12. package/dist/coValueCore/verifiedState.d.ts.map +1 -1
  13. package/dist/coValueCore/verifiedState.js +10 -14
  14. package/dist/coValueCore/verifiedState.js.map +1 -1
  15. package/dist/coValues/group.d.ts +2 -1
  16. package/dist/coValues/group.d.ts.map +1 -1
  17. package/dist/coValues/group.js +21 -18
  18. package/dist/coValues/group.js.map +1 -1
  19. package/dist/exports.d.ts +5 -4
  20. package/dist/exports.d.ts.map +1 -1
  21. package/dist/exports.js +3 -3
  22. package/dist/exports.js.map +1 -1
  23. package/dist/permissions.d.ts +0 -1
  24. package/dist/permissions.d.ts.map +1 -1
  25. package/dist/permissions.js +83 -89
  26. package/dist/permissions.js.map +1 -1
  27. package/dist/queue/LocalTransactionsSyncQueue.d.ts.map +1 -1
  28. package/dist/queue/LocalTransactionsSyncQueue.js +1 -18
  29. package/dist/queue/LocalTransactionsSyncQueue.js.map +1 -1
  30. package/dist/sync.d.ts.map +1 -1
  31. package/dist/sync.js +8 -0
  32. package/dist/sync.js.map +1 -1
  33. package/dist/tests/StorageApiAsync.test.js +8 -8
  34. package/dist/tests/coValueCore.isStreaming.test.js +30 -40
  35. package/dist/tests/coValueCore.isStreaming.test.js.map +1 -1
  36. package/dist/tests/coValueCore.newContentSince.test.js +242 -132
  37. package/dist/tests/coValueCore.newContentSince.test.js.map +1 -1
  38. package/dist/tests/group.inheritance.test.js +47 -1
  39. package/dist/tests/group.inheritance.test.js.map +1 -1
  40. package/dist/tests/group.invite.test.js +4 -9
  41. package/dist/tests/group.invite.test.js.map +1 -1
  42. package/dist/tests/sync.auth.test.js +6 -6
  43. package/dist/tests/sync.load.test.js +11 -75
  44. package/dist/tests/sync.load.test.js.map +1 -1
  45. package/dist/tests/sync.mesh.test.js +2 -2
  46. package/dist/tests/sync.storage.test.js +22 -48
  47. package/dist/tests/sync.storage.test.js.map +1 -1
  48. package/dist/tests/sync.storageAsync.test.js +121 -71
  49. package/dist/tests/sync.storageAsync.test.js.map +1 -1
  50. package/dist/tests/sync.upload.test.js +11 -75
  51. package/dist/tests/sync.upload.test.js.map +1 -1
  52. package/dist/tests/testUtils.d.ts +4 -1
  53. package/dist/tests/testUtils.d.ts.map +1 -1
  54. package/dist/tests/testUtils.js +11 -0
  55. package/dist/tests/testUtils.js.map +1 -1
  56. package/package.json +3 -3
  57. package/src/coValueCore/SessionMap.ts +25 -15
  58. package/src/coValueCore/coValueCore.ts +32 -2
  59. package/src/coValueCore/verifiedState.ts +11 -20
  60. package/src/coValues/group.ts +28 -24
  61. package/src/exports.ts +5 -2
  62. package/src/permissions.ts +98 -119
  63. package/src/queue/LocalTransactionsSyncQueue.ts +1 -20
  64. package/src/sync.ts +9 -0
  65. package/src/tests/StorageApiAsync.test.ts +8 -8
  66. package/src/tests/coValueCore.isStreaming.test.ts +84 -91
  67. package/src/tests/coValueCore.newContentSince.test.ts +246 -141
  68. package/src/tests/group.inheritance.test.ts +61 -0
  69. package/src/tests/group.invite.test.ts +4 -21
  70. package/src/tests/sync.auth.test.ts +6 -6
  71. package/src/tests/sync.load.test.ts +11 -79
  72. package/src/tests/sync.mesh.test.ts +2 -2
  73. package/src/tests/sync.storage.test.ts +22 -51
  74. package/src/tests/sync.storageAsync.test.ts +159 -76
  75. package/src/tests/sync.upload.test.ts +11 -78
  76. package/src/tests/testUtils.ts +16 -0
@@ -7,6 +7,7 @@ import {
7
7
  createThreeConnectedNodes,
8
8
  createTwoConnectedNodes,
9
9
  loadCoValueOrFail,
10
+ setupTestAccount,
10
11
  setupTestNode,
11
12
  } from "./testUtils";
12
13
  import { expectMap } from "../coValue.js";
@@ -1161,4 +1162,64 @@ describe("extend with role mapping", () => {
1161
1162
  expect(map.get("test")).toEqual("Written from the admin");
1162
1163
  expect(mapOnNode2.get("test")).toEqual("Written from the admin");
1163
1164
  });
1165
+
1166
+ test("if an account is revoked on the child but still a member of the parent, transactions should be considered valid", async () => {
1167
+ const alice = await setupTestAccount({
1168
+ connected: true,
1169
+ });
1170
+ const bob = await setupTestAccount({
1171
+ connected: true,
1172
+ });
1173
+ const charlie = await setupTestAccount({
1174
+ connected: true,
1175
+ });
1176
+
1177
+ const group = alice.node.createGroup();
1178
+ const parentGroup = alice.node.createGroup();
1179
+
1180
+ const bobInAlice = await loadCoValueOrFail(alice.node, bob.accountID);
1181
+ group.addMember(bobInAlice, "admin");
1182
+ group.extend(parentGroup, "admin");
1183
+ parentGroup.addMember(bobInAlice, "admin");
1184
+
1185
+ const groupInBob = await loadCoValueOrFail(bob.node, group.id);
1186
+ groupInBob.removeMember(bob.node.getCurrentAgent());
1187
+
1188
+ const charlieInBob = await loadCoValueOrFail(bob.node, charlie.accountID);
1189
+ groupInBob.addMember(charlieInBob, "reader");
1190
+
1191
+ expect(groupInBob.roleOf(charlie.accountID)).toBe("reader");
1192
+ });
1193
+
1194
+ test("if an account is revoked on the parent, their old transactions on the child should stay valid", async () => {
1195
+ const alice = await setupTestAccount({
1196
+ connected: true,
1197
+ });
1198
+ const bob = await setupTestAccount({
1199
+ connected: true,
1200
+ });
1201
+ const charlie = await setupTestAccount({
1202
+ connected: true,
1203
+ });
1204
+
1205
+ const group = alice.node.createGroup();
1206
+ const parentGroup = alice.node.createGroup();
1207
+
1208
+ const bobInAlice = await loadCoValueOrFail(alice.node, bob.accountID);
1209
+ group.extend(parentGroup, "admin");
1210
+ parentGroup.addMember(bobInAlice, "admin");
1211
+
1212
+ const groupInBob = await loadCoValueOrFail(bob.node, group.id);
1213
+ const parentGroupInBob = await loadCoValueOrFail(bob.node, parentGroup.id);
1214
+ const charlieInBob = await loadCoValueOrFail(bob.node, charlie.accountID);
1215
+ groupInBob.addMember(charlieInBob, "reader");
1216
+
1217
+ await new Promise((r) => setTimeout(r, 10));
1218
+
1219
+ parentGroupInBob.removeMember(bob.node.getCurrentAgent());
1220
+
1221
+ const groupInCharlie = await loadCoValueOrFail(charlie.node, group.id);
1222
+
1223
+ expect(groupInCharlie.roleOf(charlie.accountID)).toBe("reader");
1224
+ });
1164
1225
  });
@@ -346,15 +346,9 @@ describe("Group invites", () => {
346
346
  });
347
347
 
348
348
  const group = admin.node.createGroup();
349
- const person = group.createMap({
350
- name: "John Doe",
351
- });
352
349
 
353
350
  // First add member as admin
354
- const memberAccount = await loadCoValueOrFail(
355
- member.node,
356
- member.accountID,
357
- );
351
+ const memberAccount = await loadCoValueOrFail(admin.node, member.accountID);
358
352
  group.addMember(memberAccount, "admin");
359
353
 
360
354
  // Create a reader invite
@@ -367,8 +361,6 @@ describe("Group invites", () => {
367
361
  expect(groupOnMemberNode.roleOf(member.accountID)).toEqual("admin");
368
362
  });
369
363
 
370
- logger.setLevel(LogLevel.DEBUG);
371
-
372
364
  test("invites should be able to upgrade the role of an existing member", async () => {
373
365
  const admin = await setupTestAccount({
374
366
  connected: true,
@@ -381,10 +373,7 @@ describe("Group invites", () => {
381
373
  const group = admin.node.createGroup();
382
374
 
383
375
  // First add member as reader
384
- const memberAccount = await loadCoValueOrFail(
385
- member.node,
386
- member.accountID,
387
- );
376
+ const memberAccount = await loadCoValueOrFail(admin.node, member.accountID);
388
377
  group.addMember(memberAccount, "reader");
389
378
 
390
379
  // Create an admin invite
@@ -401,10 +390,7 @@ describe("Group invites", () => {
401
390
  const reader = await setupTestAccount({
402
391
  connected: true,
403
392
  });
404
- const readerAccount = await loadCoValueOrFail(
405
- member.node,
406
- reader.accountID,
407
- );
393
+ const readerAccount = await loadCoValueOrFail(admin.node, reader.accountID);
408
394
  groupOnMemberNode.addMember(readerAccount, "reader");
409
395
  });
410
396
 
@@ -423,10 +409,7 @@ describe("Group invites", () => {
423
409
  });
424
410
 
425
411
  // First add member as reader
426
- const memberAccount = await loadCoValueOrFail(
427
- member.node,
428
- member.accountID,
429
- );
412
+ const memberAccount = await loadCoValueOrFail(admin.node, member.accountID);
430
413
  group.addMember(memberAccount, "reader");
431
414
  await group.removeMember(memberAccount);
432
415
 
@@ -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 expectContentUntil: header/4",
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 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",
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 expectContentUntil: header/4",
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 expectContentUntil: header/4",
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
- // Generate a large amount of data (about 100MB)
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/1024",
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: 73",
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/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",
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
- 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
- }
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/1024",
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: 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",
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/219",
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 expectContentUntil: header/5",
1390
- "client -> server | CONTENT ParentGroup header: true new: After: 0 New: 5 expectContentUntil: header/7",
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 expectContentUntil: header/5",
156
- "edge-france -> core | CONTENT Group header: true new: After: 0 New: 3 expectContentUntil: header/5",
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
- // Generate a large amount of data (about 100MB)
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: 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",
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/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
- "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: 21 expectContentUntil: header/100",
460
- "client -> server | LOAD Map sessions: header/100",
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/100",
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",
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
- const dataSize = 1 * 200 * 1024;
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 expectContentUntil: header/5",
742
- "client -> server | CONTENT Map header: true new: expectContentUntil: header/1",
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",