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
@@ -1,23 +1,20 @@
1
1
  import { assert, beforeEach, describe, expect, test, vi } from "vitest";
2
2
 
3
- import { setMaxRecommendedTxSize } from "../config";
4
3
  import { emptyKnownState } from "../exports";
5
4
  import {
6
5
  SyncMessagesLog,
7
6
  TEST_NODE_CONFIG,
7
+ fillCoMapWithLargeData,
8
8
  loadCoValueOrFail,
9
9
  setupTestNode,
10
10
  waitFor,
11
11
  } from "./testUtils";
12
12
  import { getDbPath } from "./testStorage";
13
+ import { expectMap } from "../coValue";
13
14
 
14
15
  // We want to simulate a real world communication that happens asynchronously
15
16
  TEST_NODE_CONFIG.withAsyncPeers = true;
16
17
 
17
- beforeEach(async () => {
18
- setMaxRecommendedTxSize(100 * 1024);
19
- });
20
-
21
18
  describe("client with storage syncs with server", () => {
22
19
  let jazzCloud: ReturnType<typeof setupTestNode>;
23
20
 
@@ -214,7 +211,7 @@ describe("client with storage syncs with server", () => {
214
211
  ).toMatchInlineSnapshot(`
215
212
  [
216
213
  "client -> storage | CONTENT Group header: true new: After: 0 New: 3",
217
- "client -> storage | CONTENT InitialMap header: true new: expectContentUntil: header/1",
214
+ "client -> storage | CONTENT InitialMap header: true new: ",
218
215
  "client -> storage | CONTENT ChildMap header: true new: After: 0 New: 1",
219
216
  "client -> storage | CONTENT InitialMap header: false new: After: 0 New: 1",
220
217
  ]
@@ -267,7 +264,6 @@ describe("client syncs with a server with storage", () => {
267
264
  });
268
265
 
269
266
  test("large coValue streaming", async () => {
270
- setMaxRecommendedTxSize(1000);
271
267
  const client = setupTestNode();
272
268
 
273
269
  client.connectToSyncServer({
@@ -283,15 +279,7 @@ describe("client syncs with a server with storage", () => {
283
279
 
284
280
  const largeMap = group.createMap();
285
281
 
286
- // Generate a large amount of data (about 100MB)
287
- const chunks = 100;
288
-
289
- const value = "1".repeat(10);
290
-
291
- for (let i = 0; i < chunks; i++) {
292
- const key = `key${i}`;
293
- largeMap.set(key, value, "trusting");
294
- }
282
+ fillCoMapWithLargeData(largeMap);
295
283
 
296
284
  await largeMap.core.waitForSync();
297
285
 
@@ -304,28 +292,20 @@ describe("client syncs with a server with storage", () => {
304
292
  [
305
293
  "client -> storage | CONTENT Group header: true new: After: 0 New: 5",
306
294
  "client -> server | CONTENT Group header: true new: After: 0 New: 5",
307
- "client -> storage | CONTENT Map header: true new: After: 0 New: 21 expectContentUntil: header/100",
308
- "client -> server | CONTENT Map header: true new: After: 0 New: 21 expectContentUntil: header/100",
309
- "client -> storage | CONTENT Map header: false new: After: 21 New: 21",
310
- "client -> server | CONTENT Map header: false new: After: 21 New: 21",
311
- "client -> storage | CONTENT Map header: false new: After: 42 New: 21",
312
- "client -> server | CONTENT Map header: false new: After: 42 New: 21",
313
- "client -> storage | CONTENT Map header: false new: After: 63 New: 21",
314
- "client -> server | CONTENT Map header: false new: After: 63 New: 21",
315
- "client -> storage | CONTENT Map header: false new: After: 84 New: 16",
316
- "client -> server | CONTENT Map header: false new: After: 84 New: 16",
295
+ "client -> storage | CONTENT Map header: true new: After: 0 New: 73 expectContentUntil: header/200",
296
+ "client -> server | CONTENT Map header: true new: After: 0 New: 73 expectContentUntil: header/200",
297
+ "client -> storage | CONTENT Map header: false new: After: 73 New: 73",
298
+ "client -> server | CONTENT Map header: false new: After: 73 New: 73",
299
+ "client -> storage | CONTENT Map header: false new: After: 146 New: 54",
300
+ "client -> server | CONTENT Map header: false new: After: 146 New: 54",
317
301
  "server -> client | KNOWN Group sessions: header/5",
318
302
  "server -> storage | CONTENT Group header: true new: After: 0 New: 5",
319
- "server -> client | KNOWN Map sessions: header/21",
320
- "server -> storage | CONTENT Map header: true new: After: 0 New: 21",
321
- "server -> client | KNOWN Map sessions: header/42",
322
- "server -> storage | CONTENT Map header: false new: After: 21 New: 21",
323
- "server -> client | KNOWN Map sessions: header/63",
324
- "server -> storage | CONTENT Map header: false new: After: 42 New: 21",
325
- "server -> client | KNOWN Map sessions: header/84",
326
- "server -> storage | CONTENT Map header: false new: After: 63 New: 21",
327
- "server -> client | KNOWN Map sessions: header/100",
328
- "server -> storage | CONTENT Map header: false new: After: 84 New: 16",
303
+ "server -> client | KNOWN Map sessions: header/73",
304
+ "server -> storage | CONTENT Map header: true new: After: 0 New: 73",
305
+ "server -> client | KNOWN Map sessions: header/146",
306
+ "server -> storage | CONTENT Map header: false new: After: 73 New: 73",
307
+ "server -> client | KNOWN Map sessions: header/200",
308
+ "server -> storage | CONTENT Map header: false new: After: 146 New: 54",
329
309
  ]
330
310
  `);
331
311
 
@@ -357,19 +337,17 @@ describe("client syncs with a server with storage", () => {
357
337
  "client -> storage | LOAD Map sessions: empty",
358
338
  "storage -> client | CONTENT Group header: true new: After: 0 New: 5",
359
339
  "client -> server | LOAD Group sessions: header/5",
360
- "storage -> client | CONTENT Map header: true new: After: 0 New: 21 expectContentUntil: header/100",
361
- "client -> server | LOAD Map sessions: header/100",
362
- "storage -> client | CONTENT Map header: true new: After: 21 New: 21",
363
- "storage -> client | CONTENT Map header: true new: After: 42 New: 21",
364
- "storage -> client | CONTENT Map header: true new: After: 63 New: 21",
365
- "storage -> client | CONTENT Map header: true new: After: 84 New: 16",
340
+ "storage -> client | CONTENT Map header: true new: After: 0 New: 73 expectContentUntil: header/200",
341
+ "client -> server | LOAD Map sessions: header/200",
342
+ "storage -> client | CONTENT Map header: true new: After: 73 New: 73",
343
+ "storage -> client | CONTENT Map header: true new: After: 146 New: 54",
366
344
  "server -> client | KNOWN Group sessions: header/5",
367
- "server -> client | KNOWN Map sessions: header/100",
345
+ "server -> client | KNOWN Map sessions: header/200",
368
346
  ]
369
347
  `);
370
348
  });
371
349
 
372
- test("storing stale data should not compromise the signatures", async () => {
350
+ test("streaming a large coValue with multiple sessions", async () => {
373
351
  const client = setupTestNode();
374
352
 
375
353
  client.connectToSyncServer({
@@ -385,18 +363,142 @@ describe("client syncs with a server with storage", () => {
385
363
 
386
364
  const largeMap = group.createMap();
387
365
 
388
- // Generate a large amount of data (about 100MB)
389
- const dataSize = 1 * 200 * 1024;
390
- const chunkSize = 1024; // 1KB chunks
391
- const chunks = dataSize / chunkSize;
366
+ fillCoMapWithLargeData(largeMap);
392
367
 
393
- const value = Buffer.alloc(chunkSize, `value$`).toString("base64");
368
+ await largeMap.core.waitForSync();
369
+
370
+ // Fill the map with the data from 5 different sessions
371
+ for (let i = 0; i < 5; i++) {
372
+ const newSession = client.spawnNewSession();
373
+ newSession.connectToSyncServer({
374
+ syncServer: jazzCloud.node,
375
+ ourName: "session " + i,
376
+ });
377
+ const mapInNewSession = await loadCoValueOrFail(
378
+ newSession.node,
379
+ largeMap.id,
380
+ );
381
+
382
+ // Alternate between small and large sessions
383
+ if (i % 2 === 0) {
384
+ mapInNewSession.set("hello", "world2", "trusting");
385
+ } else {
386
+ fillCoMapWithLargeData(mapInNewSession);
387
+ }
394
388
 
395
- for (let i = 0; i < chunks; i++) {
396
- const key = `key${i}`;
397
- largeMap.set(key, value, "trusting");
389
+ await mapInNewSession.core.waitForSync();
398
390
  }
399
391
 
392
+ let largeMapOnServer = expectMap(
393
+ jazzCloud.node.getCoValue(largeMap.id).getCurrentContent(),
394
+ );
395
+ await waitFor(async () => {
396
+ expect(largeMapOnServer.core.knownState()).toEqual(
397
+ largeMap.core.knownState(),
398
+ );
399
+ });
400
+
401
+ SyncMessagesLog.clear();
402
+
403
+ // We want to simulate the situation where the content was only partially synced
404
+ // so we extract some chunks from the current coMap and import them into a new sync server
405
+ const groupContent = group.core.newContentSince(undefined) ?? [];
406
+ const largeMapContent =
407
+ largeMap.core.newContentSince(undefined)?.slice(0, 4) ?? [];
408
+
409
+ client.restart();
410
+
411
+ const newSyncServer = setupTestNode({
412
+ isSyncServer: true,
413
+ });
414
+
415
+ for (const content of [...groupContent, ...largeMapContent]) {
416
+ content.expectContentUntil = undefined; // Since the chunks are a partial, turn off the streaming infomation that would be invalid
417
+ newSyncServer.node.syncManager.handleNewContent(content, "import");
418
+ }
419
+
420
+ const largeMapOnNewSyncServer = newSyncServer.node.getCoValue(largeMap.id);
421
+
422
+ // We want to enforce that the new sync server has less content than the original sync server
423
+ expect(largeMapOnNewSyncServer.knownState()).not.toEqual(
424
+ largeMap.core.knownState(),
425
+ );
426
+
427
+ client.connectToSyncServer({
428
+ ourName: "client",
429
+ syncServer: newSyncServer.node,
430
+ });
431
+
432
+ client.addStorage({
433
+ ourName: "client",
434
+ storage,
435
+ });
436
+
437
+ const mapLoadedFromStorage = await loadCoValueOrFail(
438
+ client.node,
439
+ largeMap.id,
440
+ );
441
+
442
+ await mapLoadedFromStorage.core.waitForSync();
443
+
444
+ expect(
445
+ SyncMessagesLog.getMessages({
446
+ Group: group.core,
447
+ Map: largeMap.core,
448
+ }),
449
+ ).toMatchInlineSnapshot(`
450
+ [
451
+ "client -> storage | LOAD Map sessions: empty",
452
+ "storage -> client | CONTENT Group header: true new: After: 0 New: 5",
453
+ "client -> server | LOAD Group sessions: header/5",
454
+ "storage -> client | CONTENT Map header: true new: After: 0 New: 73 expectContentUntil: header/603",
455
+ "client -> server | LOAD Map sessions: header/603",
456
+ "storage -> client | CONTENT Map header: true new: After: 73 New: 73",
457
+ "storage -> client | CONTENT Map header: true new: After: 146 New: 54",
458
+ "storage -> client | CONTENT Map header: true new: After: 0 New: 1 | After: 0 New: 73",
459
+ "storage -> client | CONTENT Map header: true new: After: 73 New: 73",
460
+ "storage -> client | CONTENT Map header: true new: After: 146 New: 54",
461
+ "storage -> client | CONTENT Map header: true new: After: 0 New: 1 | After: 0 New: 73",
462
+ "storage -> client | CONTENT Map header: true new: After: 73 New: 73",
463
+ "storage -> client | CONTENT Map header: true new: After: 146 New: 54",
464
+ "storage -> client | CONTENT Map header: true new: After: 0 New: 1",
465
+ "server -> client | KNOWN Group sessions: header/5",
466
+ "server -> client | KNOWN Map sessions: header/292",
467
+ "client -> server | CONTENT Map header: false new: After: 146 New: 54 | After: 0 New: 1 | After: 146 New: 54 expectContentUntil: header/603",
468
+ "client -> server | CONTENT Map header: false new: After: 0 New: 73",
469
+ "client -> server | CONTENT Map header: false new: After: 73 New: 73",
470
+ "client -> server | CONTENT Map header: false new: After: 0 New: 1 | After: 146 New: 54 | After: 0 New: 1",
471
+ "server -> client | KNOWN Map sessions: header/401",
472
+ "server -> client | KNOWN Map sessions: header/474",
473
+ "server -> client | KNOWN Map sessions: header/547",
474
+ "server -> client | KNOWN Map sessions: header/603",
475
+ ]
476
+ `);
477
+
478
+ // The sync should be completed successfully and the map on the new sync server should have the same known state as the original map
479
+ expect(largeMapOnNewSyncServer.knownState()).toEqual(
480
+ largeMap.core.knownState(),
481
+ );
482
+ });
483
+
484
+ test("storing stale data should not compromise the signatures", async () => {
485
+ const client = setupTestNode();
486
+
487
+ client.connectToSyncServer({
488
+ syncServer: jazzCloud.node,
489
+ });
490
+
491
+ const { storage } = await client.addAsyncStorage({
492
+ ourName: "client",
493
+ });
494
+
495
+ const group = client.node.createGroup();
496
+ group.addMember("everyone", "writer");
497
+
498
+ const largeMap = group.createMap();
499
+
500
+ fillCoMapWithLargeData(largeMap);
501
+
400
502
  await largeMap.core.waitForSync();
401
503
 
402
504
  const newContentChunks = largeMap.core.newContentSince(
@@ -438,8 +540,6 @@ describe("client syncs with a server with storage", () => {
438
540
  });
439
541
 
440
542
  test("large coValue streaming from cold server", async () => {
441
- setMaxRecommendedTxSize(1000);
442
-
443
543
  const server = setupTestNode({
444
544
  isSyncServer: true,
445
545
  });
@@ -462,17 +562,7 @@ describe("client syncs with a server with storage", () => {
462
562
 
463
563
  const largeMap = group.createMap();
464
564
 
465
- // Generate a large amount of data
466
- const dataSize = 1 * 10 * 1024;
467
- const chunkSize = 1024; // 1KB chunks
468
- const chunks = dataSize / chunkSize;
469
-
470
- const value = Buffer.alloc(chunkSize, `value$`).toString("base64");
471
-
472
- for (let i = 0; i < chunks; i++) {
473
- const key = `key${i}`;
474
- largeMap.set(key, value, "trusting");
475
- }
565
+ fillCoMapWithLargeData(largeMap);
476
566
 
477
567
  await largeMap.core.waitForSync();
478
568
 
@@ -510,17 +600,10 @@ describe("client syncs with a server with storage", () => {
510
600
  "client -> storage | LOAD Map sessions: empty",
511
601
  "storage -> client | CONTENT Group header: true new: After: 0 New: 5",
512
602
  "client -> server | LOAD Group sessions: header/5",
513
- "storage -> client | CONTENT Map header: true new: After: 0 New: 1 expectContentUntil: header/10",
514
- "client -> server | LOAD Map sessions: header/10",
515
- "storage -> client | CONTENT Map header: true new: After: 1 New: 1",
516
- "storage -> client | CONTENT Map header: true new: After: 2 New: 1",
517
- "storage -> client | CONTENT Map header: true new: After: 3 New: 1",
518
- "storage -> client | CONTENT Map header: true new: After: 4 New: 1",
519
- "storage -> client | CONTENT Map header: true new: After: 5 New: 1",
520
- "storage -> client | CONTENT Map header: true new: After: 6 New: 1",
521
- "storage -> client | CONTENT Map header: true new: After: 7 New: 1",
522
- "storage -> client | CONTENT Map header: true new: After: 8 New: 1",
523
- "storage -> client | CONTENT Map header: true new: After: 9 New: 1",
603
+ "storage -> client | CONTENT Map header: true new: After: 0 New: 73 expectContentUntil: header/200",
604
+ "client -> server | LOAD Map sessions: header/200",
605
+ "storage -> client | CONTENT Map header: true new: After: 73 New: 73",
606
+ "storage -> client | CONTENT Map header: true new: After: 146 New: 54",
524
607
  ]
525
608
  `);
526
609
  });
@@ -5,6 +5,7 @@ import { WasmCrypto } from "../crypto/WasmCrypto";
5
5
  import {
6
6
  SyncMessagesLog,
7
7
  TEST_NODE_CONFIG,
8
+ fillCoMapWithLargeData,
8
9
  loadCoValueOrFail,
9
10
  setupTestNode,
10
11
  waitFor,
@@ -163,7 +164,7 @@ describe("client to server upload", () => {
163
164
  }),
164
165
  ).toMatchInlineSnapshot(`
165
166
  [
166
- "client -> server | CONTENT Group header: true new: After: 0 New: 3 expectContentUntil: header/5",
167
+ "client -> server | CONTENT Group header: true new: After: 0 New: 3",
167
168
  "client -> server | CONTENT ParentGroup header: true new: After: 0 New: 5",
168
169
  "client -> server | CONTENT Group header: false new: After: 3 New: 2",
169
170
  "client -> server | CONTENT Map header: true new: After: 0 New: 1",
@@ -363,7 +364,7 @@ describe("client to server upload", () => {
363
364
  ).toMatchInlineSnapshot(`
364
365
  [
365
366
  "client -> server | CONTENT Group header: true new: After: 0 New: 3",
366
- "client -> server | CONTENT InitialMap header: true new: expectContentUntil: header/1",
367
+ "client -> server | CONTENT InitialMap header: true new: ",
367
368
  "client -> server | CONTENT ChildMap header: true new: After: 0 New: 1",
368
369
  "client -> server | CONTENT InitialMap header: false new: After: 0 New: 1",
369
370
  "server -> client | KNOWN Group sessions: header/3",
@@ -384,17 +385,7 @@ describe("client to server upload", () => {
384
385
 
385
386
  const largeMap = group.createMap();
386
387
 
387
- // Generate a large amount of data (about 100MB)
388
- const dataSize = 1 * 1024 * 1024;
389
- const chunkSize = 1024; // 1KB chunks
390
- const chunks = dataSize / chunkSize;
391
-
392
- const value = Buffer.alloc(chunkSize, `value$`).toString("base64");
393
-
394
- for (let i = 0; i < chunks; i++) {
395
- const key = `key${i}`;
396
- largeMap.set(key, value, "trusting");
397
- }
388
+ fillCoMapWithLargeData(largeMap);
398
389
 
399
390
  await largeMap.core.waitForSync();
400
391
 
@@ -406,37 +397,13 @@ describe("client to server upload", () => {
406
397
  ).toMatchInlineSnapshot(`
407
398
  [
408
399
  "client -> server | CONTENT Group header: true new: After: 0 New: 5",
409
- "client -> server | CONTENT Map header: true new: After: 0 New: 73 expectContentUntil: header/1024",
400
+ "client -> server | CONTENT Map header: true new: After: 0 New: 73 expectContentUntil: header/200",
410
401
  "client -> server | CONTENT Map header: false new: After: 73 New: 73",
411
- "client -> server | CONTENT Map header: false new: After: 146 New: 73",
412
- "client -> server | CONTENT Map header: false new: After: 219 New: 73",
413
- "client -> server | CONTENT Map header: false new: After: 292 New: 73",
414
- "client -> server | CONTENT Map header: false new: After: 365 New: 73",
415
- "client -> server | CONTENT Map header: false new: After: 438 New: 73",
416
- "client -> server | CONTENT Map header: false new: After: 511 New: 73",
417
- "client -> server | CONTENT Map header: false new: After: 584 New: 73",
418
- "client -> server | CONTENT Map header: false new: After: 657 New: 73",
419
- "client -> server | CONTENT Map header: false new: After: 730 New: 73",
420
- "client -> server | CONTENT Map header: false new: After: 803 New: 73",
421
- "client -> server | CONTENT Map header: false new: After: 876 New: 73",
422
- "client -> server | CONTENT Map header: false new: After: 949 New: 73",
423
- "client -> server | CONTENT Map header: false new: After: 1022 New: 2",
402
+ "client -> server | CONTENT Map header: false new: After: 146 New: 54",
424
403
  "server -> client | KNOWN Group sessions: header/5",
425
404
  "server -> client | KNOWN Map sessions: header/73",
426
405
  "server -> client | KNOWN Map sessions: header/146",
427
- "server -> client | KNOWN Map sessions: header/219",
428
- "server -> client | KNOWN Map sessions: header/292",
429
- "server -> client | KNOWN Map sessions: header/365",
430
- "server -> client | KNOWN Map sessions: header/438",
431
- "server -> client | KNOWN Map sessions: header/511",
432
- "server -> client | KNOWN Map sessions: header/584",
433
- "server -> client | KNOWN Map sessions: header/657",
434
- "server -> client | KNOWN Map sessions: header/730",
435
- "server -> client | KNOWN Map sessions: header/803",
436
- "server -> client | KNOWN Map sessions: header/876",
437
- "server -> client | KNOWN Map sessions: header/949",
438
- "server -> client | KNOWN Map sessions: header/1022",
439
- "server -> client | KNOWN Map sessions: header/1024",
406
+ "server -> client | KNOWN Map sessions: header/200",
440
407
  ]
441
408
  `);
442
409
  });
@@ -453,17 +420,7 @@ describe("client to server upload", () => {
453
420
 
454
421
  await largeMap.core.waitForSync();
455
422
 
456
- // Generate a large amount of data (about 100MB)
457
- const dataSize = 1 * 1024 * 1024;
458
- const chunkSize = 1024; // 1KB chunks
459
- const chunks = dataSize / chunkSize;
460
-
461
- const value = Buffer.alloc(chunkSize, `value$`).toString("base64");
462
-
463
- for (let i = 0; i < chunks; i++) {
464
- const key = `key${i}`;
465
- largeMap.set(key, value, "trusting");
466
- }
423
+ fillCoMapWithLargeData(largeMap);
467
424
 
468
425
  await largeMap.core.waitForSync();
469
426
 
@@ -476,38 +433,14 @@ describe("client to server upload", () => {
476
433
  [
477
434
  "client -> server | CONTENT Group header: true new: After: 0 New: 5",
478
435
  "client -> server | CONTENT Map header: true new: ",
479
- "client -> server | CONTENT Map header: false new: After: 0 New: 73 expectContentUntil: header/1024",
436
+ "client -> server | CONTENT Map header: false new: After: 0 New: 73 expectContentUntil: header/200",
480
437
  "client -> server | CONTENT Map header: false new: After: 73 New: 73",
481
- "client -> server | CONTENT Map header: false new: After: 146 New: 73",
482
- "client -> server | CONTENT Map header: false new: After: 219 New: 73",
483
- "client -> server | CONTENT Map header: false new: After: 292 New: 73",
484
- "client -> server | CONTENT Map header: false new: After: 365 New: 73",
485
- "client -> server | CONTENT Map header: false new: After: 438 New: 73",
486
- "client -> server | CONTENT Map header: false new: After: 511 New: 73",
487
- "client -> server | CONTENT Map header: false new: After: 584 New: 73",
488
- "client -> server | CONTENT Map header: false new: After: 657 New: 73",
489
- "client -> server | CONTENT Map header: false new: After: 730 New: 73",
490
- "client -> server | CONTENT Map header: false new: After: 803 New: 73",
491
- "client -> server | CONTENT Map header: false new: After: 876 New: 73",
492
- "client -> server | CONTENT Map header: false new: After: 949 New: 73",
493
- "client -> server | CONTENT Map header: false new: After: 1022 New: 2",
438
+ "client -> server | CONTENT Map header: false new: After: 146 New: 54",
494
439
  "server -> client | KNOWN Group sessions: header/5",
495
440
  "server -> client | KNOWN Map sessions: header/0",
496
441
  "server -> client | KNOWN Map sessions: header/73",
497
442
  "server -> client | KNOWN Map sessions: header/146",
498
- "server -> client | KNOWN Map sessions: header/219",
499
- "server -> client | KNOWN Map sessions: header/292",
500
- "server -> client | KNOWN Map sessions: header/365",
501
- "server -> client | KNOWN Map sessions: header/438",
502
- "server -> client | KNOWN Map sessions: header/511",
503
- "server -> client | KNOWN Map sessions: header/584",
504
- "server -> client | KNOWN Map sessions: header/657",
505
- "server -> client | KNOWN Map sessions: header/730",
506
- "server -> client | KNOWN Map sessions: header/803",
507
- "server -> client | KNOWN Map sessions: header/876",
508
- "server -> client | KNOWN Map sessions: header/949",
509
- "server -> client | KNOWN Map sessions: header/1022",
510
- "server -> client | KNOWN Map sessions: header/1024",
443
+ "server -> client | KNOWN Map sessions: header/200",
511
444
  ]
512
445
  `);
513
446
  });
@@ -15,6 +15,7 @@ import {
15
15
  type CoValueCore,
16
16
  type RawAccount,
17
17
  RawAccountID,
18
+ RawCoMap,
18
19
  type RawCoValue,
19
20
  StorageAPI,
20
21
  } from "../exports.js";
@@ -777,3 +778,18 @@ export function createUnloadedCoValue(
777
778
 
778
779
  return { coValue: state, id, header };
779
780
  }
781
+
782
+ export function fillCoMapWithLargeData(map: RawCoMap) {
783
+ const dataSize = 1 * 1024 * 200;
784
+ const chunkSize = 1024; // 1KB chunks
785
+ const chunks = dataSize / chunkSize;
786
+
787
+ const value = Buffer.alloc(chunkSize, `value$`).toString("base64");
788
+
789
+ for (let i = 0; i < chunks; i++) {
790
+ const key = `key${i}`;
791
+ map.set(key, value, "trusting");
792
+ }
793
+
794
+ return map;
795
+ }