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.
Files changed (120) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +18 -0
  3. package/dist/SyncStateManager.d.ts.map +1 -1
  4. package/dist/SyncStateManager.js +2 -2
  5. package/dist/SyncStateManager.js.map +1 -1
  6. package/dist/coValueCore/SessionMap.d.ts +1 -0
  7. package/dist/coValueCore/SessionMap.d.ts.map +1 -1
  8. package/dist/coValueCore/SessionMap.js +22 -12
  9. package/dist/coValueCore/SessionMap.js.map +1 -1
  10. package/dist/coValueCore/coValueCore.d.ts +14 -9
  11. package/dist/coValueCore/coValueCore.d.ts.map +1 -1
  12. package/dist/coValueCore/coValueCore.js +65 -51
  13. package/dist/coValueCore/coValueCore.js.map +1 -1
  14. package/dist/coValueCore/verifiedState.d.ts +5 -3
  15. package/dist/coValueCore/verifiedState.d.ts.map +1 -1
  16. package/dist/coValueCore/verifiedState.js +93 -76
  17. package/dist/coValueCore/verifiedState.js.map +1 -1
  18. package/dist/coValues/group.d.ts +1 -0
  19. package/dist/coValues/group.d.ts.map +1 -1
  20. package/dist/coValues/group.js +24 -4
  21. package/dist/coValues/group.js.map +1 -1
  22. package/dist/knownState.d.ts +9 -1
  23. package/dist/knownState.d.ts.map +1 -1
  24. package/dist/knownState.js +29 -3
  25. package/dist/knownState.js.map +1 -1
  26. package/dist/localNode.d.ts.map +1 -1
  27. package/dist/localNode.js +3 -3
  28. package/dist/localNode.js.map +1 -1
  29. package/dist/queue/LocalTransactionsSyncQueue.d.ts +10 -9
  30. package/dist/queue/LocalTransactionsSyncQueue.d.ts.map +1 -1
  31. package/dist/queue/LocalTransactionsSyncQueue.js +53 -32
  32. package/dist/queue/LocalTransactionsSyncQueue.js.map +1 -1
  33. package/dist/storage/knownState.js +2 -2
  34. package/dist/storage/knownState.js.map +1 -1
  35. package/dist/sync.d.ts +1 -2
  36. package/dist/sync.d.ts.map +1 -1
  37. package/dist/sync.js +8 -3
  38. package/dist/sync.js.map +1 -1
  39. package/dist/tests/PureJSCrypto.test.js +1 -1
  40. package/dist/tests/PureJSCrypto.test.js.map +1 -1
  41. package/dist/tests/StorageApiAsync.test.js +11 -11
  42. package/dist/tests/StorageApiAsync.test.js.map +1 -1
  43. package/dist/tests/StorageApiSync.test.js +3 -3
  44. package/dist/tests/StorageApiSync.test.js.map +1 -1
  45. package/dist/tests/WasmCrypto.test.js +1 -1
  46. package/dist/tests/WasmCrypto.test.js.map +1 -1
  47. package/dist/tests/coPlainText.test.js +13 -14
  48. package/dist/tests/coPlainText.test.js.map +1 -1
  49. package/dist/tests/coStream.test.js +12 -12
  50. package/dist/tests/coStream.test.js.map +1 -1
  51. package/dist/tests/coValueCore.isCompletelyDownloaded.test.d.ts +2 -0
  52. package/dist/tests/coValueCore.isCompletelyDownloaded.test.d.ts.map +1 -0
  53. package/dist/tests/coValueCore.isCompletelyDownloaded.test.js +422 -0
  54. package/dist/tests/coValueCore.isCompletelyDownloaded.test.js.map +1 -0
  55. package/dist/tests/coValueCore.isStreaming.test.d.ts +2 -0
  56. package/dist/tests/coValueCore.isStreaming.test.d.ts.map +1 -0
  57. package/dist/tests/coValueCore.isStreaming.test.js +232 -0
  58. package/dist/tests/coValueCore.isStreaming.test.js.map +1 -0
  59. package/dist/tests/coValueCore.newContentSince.test.d.ts +2 -0
  60. package/dist/tests/coValueCore.newContentSince.test.d.ts.map +1 -0
  61. package/dist/tests/coValueCore.newContentSince.test.js +808 -0
  62. package/dist/tests/coValueCore.newContentSince.test.js.map +1 -0
  63. package/dist/tests/coreWasm.test.js +2 -2
  64. package/dist/tests/coreWasm.test.js.map +1 -1
  65. package/dist/tests/group.childKeyRotation.test.d.ts +2 -0
  66. package/dist/tests/group.childKeyRotation.test.d.ts.map +1 -0
  67. package/dist/tests/group.childKeyRotation.test.js +261 -0
  68. package/dist/tests/group.childKeyRotation.test.js.map +1 -0
  69. package/dist/tests/group.removeMember.test.js +1 -114
  70. package/dist/tests/group.removeMember.test.js.map +1 -1
  71. package/dist/tests/knownState.test.js +83 -11
  72. package/dist/tests/knownState.test.js.map +1 -1
  73. package/dist/tests/sync.auth.test.js +6 -6
  74. package/dist/tests/sync.load.test.js +67 -4
  75. package/dist/tests/sync.load.test.js.map +1 -1
  76. package/dist/tests/sync.mesh.test.js +41 -40
  77. package/dist/tests/sync.mesh.test.js.map +1 -1
  78. package/dist/tests/sync.peerReconciliation.test.js +1 -1
  79. package/dist/tests/sync.storage.test.js +29 -28
  80. package/dist/tests/sync.storage.test.js.map +1 -1
  81. package/dist/tests/sync.storageAsync.test.js +26 -25
  82. package/dist/tests/sync.storageAsync.test.js.map +1 -1
  83. package/dist/tests/sync.upload.test.js +96 -40
  84. package/dist/tests/sync.upload.test.js.map +1 -1
  85. package/dist/tests/testUtils.d.ts +12 -8
  86. package/dist/tests/testUtils.d.ts.map +1 -1
  87. package/dist/tests/testUtils.js +39 -8
  88. package/dist/tests/testUtils.js.map +1 -1
  89. package/package.json +3 -3
  90. package/src/SyncStateManager.ts +5 -2
  91. package/src/coValueCore/SessionMap.ts +39 -12
  92. package/src/coValueCore/coValueCore.ts +81 -66
  93. package/src/coValueCore/verifiedState.ts +139 -109
  94. package/src/coValues/group.ts +27 -4
  95. package/src/knownState.ts +49 -5
  96. package/src/localNode.ts +7 -5
  97. package/src/queue/LocalTransactionsSyncQueue.ts +77 -68
  98. package/src/storage/knownState.ts +2 -2
  99. package/src/sync.ts +7 -3
  100. package/src/tests/PureJSCrypto.test.ts +1 -2
  101. package/src/tests/StorageApiAsync.test.ts +11 -11
  102. package/src/tests/StorageApiSync.test.ts +3 -3
  103. package/src/tests/WasmCrypto.test.ts +1 -2
  104. package/src/tests/coPlainText.test.ts +13 -14
  105. package/src/tests/coStream.test.ts +12 -12
  106. package/src/tests/coValueCore.isCompletelyDownloaded.test.ts +590 -0
  107. package/src/tests/coValueCore.isStreaming.test.ts +353 -0
  108. package/src/tests/coValueCore.newContentSince.test.ts +966 -0
  109. package/src/tests/coreWasm.test.ts +2 -2
  110. package/src/tests/group.childKeyRotation.test.ts +431 -0
  111. package/src/tests/group.removeMember.test.ts +1 -184
  112. package/src/tests/knownState.test.ts +108 -11
  113. package/src/tests/sync.auth.test.ts +6 -6
  114. package/src/tests/sync.load.test.ts +79 -4
  115. package/src/tests/sync.mesh.test.ts +41 -40
  116. package/src/tests/sync.peerReconciliation.test.ts +1 -1
  117. package/src/tests/sync.storage.test.ts +29 -28
  118. package/src/tests/sync.storageAsync.test.ts +26 -25
  119. package/src/tests/sync.upload.test.ts +106 -40
  120. package/src/tests/testUtils.ts +43 -9
@@ -214,7 +214,7 @@ describe("client with storage syncs with server", () => {
214
214
  ).toMatchInlineSnapshot(`
215
215
  [
216
216
  "client -> storage | CONTENT Group header: true new: After: 0 New: 3",
217
- "client -> storage | CONTENT InitialMap header: true new: ",
217
+ "client -> storage | CONTENT InitialMap header: true new: expectContentUntil: header/1",
218
218
  "client -> storage | CONTENT ChildMap header: true new: After: 0 New: 1",
219
219
  "client -> storage | CONTENT InitialMap header: false new: After: 0 New: 1",
220
220
  ]
@@ -304,28 +304,28 @@ describe("client syncs with a server with storage", () => {
304
304
  [
305
305
  "client -> storage | CONTENT Group header: true new: After: 0 New: 5",
306
306
  "client -> server | CONTENT Group header: true new: After: 0 New: 5",
307
- "client -> storage | CONTENT Map header: true new: After: 0 New: 20",
308
- "client -> server | CONTENT Map header: true new: After: 0 New: 20",
309
- "client -> storage | CONTENT Map header: false new: After: 20 New: 21",
310
- "client -> server | CONTENT Map header: false new: After: 20 New: 21",
311
- "client -> storage | CONTENT Map header: false new: After: 41 New: 21",
312
- "client -> server | CONTENT Map header: false new: After: 41 New: 21",
313
- "client -> storage | CONTENT Map header: false new: After: 62 New: 21",
314
- "client -> server | CONTENT Map header: false new: After: 62 New: 21",
315
- "client -> storage | CONTENT Map header: false new: After: 83 New: 17",
316
- "client -> server | CONTENT Map header: false new: After: 83 New: 17",
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",
317
317
  "server -> client | KNOWN Group sessions: header/5",
318
318
  "server -> storage | CONTENT Group header: true new: After: 0 New: 5",
319
- "server -> client | KNOWN Map sessions: header/20",
320
- "server -> storage | CONTENT Map header: true new: After: 0 New: 20",
321
- "server -> client | KNOWN Map sessions: header/41",
322
- "server -> storage | CONTENT Map header: false new: After: 20 New: 21",
323
- "server -> client | KNOWN Map sessions: header/62",
324
- "server -> storage | CONTENT Map header: false new: After: 41 New: 21",
325
- "server -> client | KNOWN Map sessions: header/83",
326
- "server -> storage | CONTENT Map header: false new: After: 62 New: 21",
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
327
  "server -> client | KNOWN Map sessions: header/100",
328
- "server -> storage | CONTENT Map header: false new: After: 83 New: 17",
328
+ "server -> storage | CONTENT Map header: false new: After: 84 New: 16",
329
329
  ]
330
330
  `);
331
331
 
@@ -357,11 +357,12 @@ describe("client syncs with a server with storage", () => {
357
357
  "client -> storage | LOAD Map sessions: empty",
358
358
  "storage -> client | CONTENT Group header: true new: After: 0 New: 5",
359
359
  "client -> server | LOAD Group sessions: header/5",
360
- "storage -> client | CONTENT Map header: true new: After: 0 New: 41 expectContentUntil: header/100",
360
+ "storage -> client | CONTENT Map header: true new: After: 0 New: 21 expectContentUntil: header/100",
361
361
  "client -> server | LOAD Map sessions: header/100",
362
- "storage -> client | CONTENT Map header: true new: After: 41 New: 21",
363
- "storage -> client | CONTENT Map header: true new: After: 62 New: 21",
364
- "storage -> client | CONTENT Map header: true new: After: 83 New: 17",
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",
365
366
  "server -> client | KNOWN Group sessions: header/5",
366
367
  "server -> client | KNOWN Map sessions: header/100",
367
368
  ]
@@ -398,7 +399,7 @@ describe("client syncs with a server with storage", () => {
398
399
 
399
400
  await largeMap.core.waitForSync();
400
401
 
401
- const newContentChunks = largeMap.core.verified.newContentSince(
402
+ const newContentChunks = largeMap.core.newContentSince(
402
403
  emptyKnownState(largeMap.id),
403
404
  );
404
405
 
@@ -163,7 +163,7 @@ describe("client to server upload", () => {
163
163
  }),
164
164
  ).toMatchInlineSnapshot(`
165
165
  [
166
- "client -> server | CONTENT Group header: true new: After: 0 New: 3",
166
+ "client -> server | CONTENT Group header: true new: After: 0 New: 3 expectContentUntil: header/5",
167
167
  "client -> server | CONTENT ParentGroup header: true new: After: 0 New: 5",
168
168
  "client -> server | CONTENT Group header: false new: After: 3 New: 2",
169
169
  "client -> server | CONTENT Map header: true new: After: 0 New: 1",
@@ -363,7 +363,7 @@ describe("client to server upload", () => {
363
363
  ).toMatchInlineSnapshot(`
364
364
  [
365
365
  "client -> server | CONTENT Group header: true new: After: 0 New: 3",
366
- "client -> server | CONTENT InitialMap header: true new: ",
366
+ "client -> server | CONTENT InitialMap header: true new: expectContentUntil: header/1",
367
367
  "client -> server | CONTENT ChildMap header: true new: After: 0 New: 1",
368
368
  "client -> server | CONTENT InitialMap header: false new: After: 0 New: 1",
369
369
  "server -> client | KNOWN Group sessions: header/3",
@@ -379,7 +379,7 @@ describe("client to server upload", () => {
379
379
  connected: true,
380
380
  });
381
381
 
382
- const group = jazzCloud.node.createGroup();
382
+ const group = client.node.createGroup();
383
383
  group.addMember("everyone", "writer");
384
384
 
385
385
  const largeMap = group.createMap();
@@ -396,7 +396,74 @@ describe("client to server upload", () => {
396
396
  largeMap.set(key, value, "trusting");
397
397
  }
398
398
 
399
- await loadCoValueOrFail(client.node, largeMap.id);
399
+ await largeMap.core.waitForSync();
400
+
401
+ expect(
402
+ SyncMessagesLog.getMessages({
403
+ Group: group.core,
404
+ Map: largeMap.core,
405
+ }),
406
+ ).toMatchInlineSnapshot(`
407
+ [
408
+ "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",
410
+ "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",
424
+ "server -> client | KNOWN Group sessions: header/5",
425
+ "server -> client | KNOWN Map sessions: header/73",
426
+ "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",
440
+ ]
441
+ `);
442
+ });
443
+
444
+ test("uploading a large update", async () => {
445
+ const client = setupTestNode({
446
+ connected: true,
447
+ });
448
+
449
+ const group = client.node.createGroup();
450
+ group.addMember("everyone", "writer");
451
+
452
+ const largeMap = group.createMap();
453
+
454
+ await largeMap.core.waitForSync();
455
+
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
+ }
400
467
 
401
468
  await largeMap.core.waitForSync();
402
469
 
@@ -407,41 +474,40 @@ describe("client to server upload", () => {
407
474
  }),
408
475
  ).toMatchInlineSnapshot(`
409
476
  [
410
- "client -> server | LOAD Map sessions: empty",
411
- "server -> client | CONTENT Group header: true new: After: 0 New: 5",
412
- "server -> client | CONTENT Map header: true new: expectContentUntil: header/1024",
413
- "server -> client | CONTENT Map header: false new: After: 0 New: 73",
414
- "server -> client | CONTENT Map header: false new: After: 73 New: 73",
415
- "server -> client | CONTENT Map header: false new: After: 146 New: 73",
416
- "server -> client | CONTENT Map header: false new: After: 219 New: 73",
417
- "server -> client | CONTENT Map header: false new: After: 292 New: 73",
418
- "server -> client | CONTENT Map header: false new: After: 365 New: 73",
419
- "server -> client | CONTENT Map header: false new: After: 438 New: 73",
420
- "server -> client | CONTENT Map header: false new: After: 511 New: 73",
421
- "server -> client | CONTENT Map header: false new: After: 584 New: 73",
422
- "server -> client | CONTENT Map header: false new: After: 657 New: 73",
423
- "server -> client | CONTENT Map header: false new: After: 730 New: 73",
424
- "server -> client | CONTENT Map header: false new: After: 803 New: 73",
425
- "server -> client | CONTENT Map header: false new: After: 876 New: 73",
426
- "server -> client | CONTENT Map header: false new: After: 949 New: 73",
427
- "server -> client | CONTENT Map header: false new: After: 1022 New: 2",
428
- "client -> server | KNOWN Group sessions: header/5",
429
- "client -> server | KNOWN Map sessions: header/0",
430
- "client -> server | KNOWN Map sessions: header/73",
431
- "client -> server | KNOWN Map sessions: header/146",
432
- "client -> server | KNOWN Map sessions: header/219",
433
- "client -> server | KNOWN Map sessions: header/292",
434
- "client -> server | KNOWN Map sessions: header/365",
435
- "client -> server | KNOWN Map sessions: header/438",
436
- "client -> server | KNOWN Map sessions: header/511",
437
- "client -> server | KNOWN Map sessions: header/584",
438
- "client -> server | KNOWN Map sessions: header/657",
439
- "client -> server | KNOWN Map sessions: header/730",
440
- "client -> server | KNOWN Map sessions: header/803",
441
- "client -> server | KNOWN Map sessions: header/876",
442
- "client -> server | KNOWN Map sessions: header/949",
443
- "client -> server | KNOWN Map sessions: header/1022",
444
- "client -> server | KNOWN Map sessions: header/1024",
477
+ "client -> server | CONTENT Group header: true new: After: 0 New: 5",
478
+ "client -> server | CONTENT Map header: true new: ",
479
+ "client -> server | CONTENT Map header: false new: After: 0 New: 73 expectContentUntil: header/1024",
480
+ "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",
494
+ "server -> client | KNOWN Group sessions: header/5",
495
+ "server -> client | KNOWN Map sessions: header/0",
496
+ "server -> client | KNOWN Map sessions: header/73",
497
+ "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",
445
511
  ]
446
512
  `);
447
513
  });
@@ -461,7 +527,7 @@ describe("client to server upload", () => {
461
527
  const map = coValue.getCurrentContent() as RawCoMap;
462
528
  map.set("hello", "world", "trusting");
463
529
 
464
- const content = map.core.verified.newContentSince(undefined)?.[0];
530
+ const content = map.core.newContentSince(undefined)?.[0];
465
531
  assert(content);
466
532
 
467
533
  // Simulate a mismatch between the header and the coValue id
@@ -14,6 +14,7 @@ import {
14
14
  type CoID,
15
15
  type CoValueCore,
16
16
  type RawAccount,
17
+ RawAccountID,
17
18
  type RawCoValue,
18
19
  StorageAPI,
19
20
  } from "../exports.js";
@@ -540,6 +541,13 @@ export function setupTestNode(
540
541
  isSyncServer: opts.isSyncServer,
541
542
  });
542
543
  },
544
+ disconnect: () => {
545
+ const allPeers = Object.values(node.syncManager.peers);
546
+ allPeers.forEach((peer) => {
547
+ peer.gracefulShutdown();
548
+ });
549
+ node.syncManager.peers = {};
550
+ },
543
551
  };
544
552
 
545
553
  return ctx;
@@ -550,14 +558,34 @@ export async function setupTestAccount(
550
558
  isSyncServer?: boolean;
551
559
  connected?: boolean;
552
560
  storage?: StorageAPI;
561
+ accountID?: RawAccountID;
562
+ accountSecret?: AgentSecret;
553
563
  } = {},
554
564
  ) {
555
- const ctx = await LocalNode.withNewlyCreatedAccount({
556
- peers: [],
557
- crypto: Crypto,
558
- creationProps: { name: "Client" },
559
- storage: opts.storage,
560
- });
565
+ const ctx =
566
+ opts.accountSecret && opts.accountID
567
+ ? {
568
+ node: await LocalNode.withLoadedAccount({
569
+ peers: [
570
+ getSyncServerConnectedPeer({
571
+ peerId: opts.accountID,
572
+ }).peer,
573
+ ],
574
+ crypto: Crypto,
575
+ storage: opts.storage,
576
+ accountID: opts.accountID,
577
+ accountSecret: opts.accountSecret,
578
+ sessionID: Crypto.newRandomSessionID(opts.accountID),
579
+ }),
580
+ accountID: opts.accountID,
581
+ accountSecret: opts.accountSecret,
582
+ }
583
+ : await LocalNode.withNewlyCreatedAccount({
584
+ peers: [],
585
+ crypto: Crypto,
586
+ creationProps: { name: "Client" },
587
+ storage: opts.storage,
588
+ });
561
589
 
562
590
  if (opts.isSyncServer) {
563
591
  syncServer.current = ctx.node;
@@ -570,7 +598,7 @@ export async function setupTestAccount(
570
598
  }) {
571
599
  const { peer, peerStateOnServer, peerOnServer } =
572
600
  getSyncServerConnectedPeer({
573
- peerId: ctx.node.getCurrentAgent().id,
601
+ peerId: ctx.node.currentSessionID,
574
602
  syncServerName: opts?.syncServerName,
575
603
  ourName: opts?.ourName,
576
604
  syncServer: opts?.syncServer,
@@ -627,6 +655,13 @@ export async function setupTestAccount(
627
655
  connectToSyncServer,
628
656
  addStorage,
629
657
  addAsyncStorage,
658
+ spawnNewSession: () => {
659
+ return setupTestAccount({
660
+ accountID: ctx.accountID,
661
+ accountSecret: ctx.accountSecret,
662
+ connected: true,
663
+ });
664
+ },
630
665
  disconnect: () => {
631
666
  const allPeers = ctx.node.syncManager.getPeers(ctx.accountID);
632
667
  allPeers.forEach((peer) => {
@@ -715,8 +750,7 @@ export function createAccountInNode(node: LocalNode) {
715
750
 
716
751
  const accountCoreEntry = node.getCoValue(accountOnTempNode.id);
717
752
 
718
- const content =
719
- accountOnTempNode.core.verified.newContentSince(undefined)?.[0]!;
753
+ const content = accountOnTempNode.core.newContentSince(undefined)?.[0]!;
720
754
 
721
755
  node.syncManager.handleNewContent(content, "import");
722
756