cojson 0.19.19 → 0.19.21

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 (140) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/coValueCore/coValueCore.d.ts +9 -0
  3. package/dist/coValueCore/coValueCore.d.ts.map +1 -1
  4. package/dist/coValueCore/coValueCore.js +21 -0
  5. package/dist/coValueCore/coValueCore.js.map +1 -1
  6. package/dist/coValues/account.d.ts.map +1 -1
  7. package/dist/coValues/account.js +10 -10
  8. package/dist/coValues/account.js.map +1 -1
  9. package/dist/config.d.ts +6 -0
  10. package/dist/config.d.ts.map +1 -1
  11. package/dist/config.js +10 -0
  12. package/dist/config.js.map +1 -1
  13. package/dist/exports.d.ts +7 -1
  14. package/dist/exports.d.ts.map +1 -1
  15. package/dist/exports.js +4 -1
  16. package/dist/exports.js.map +1 -1
  17. package/dist/ids.d.ts +1 -1
  18. package/dist/ids.d.ts.map +1 -1
  19. package/dist/ids.js.map +1 -1
  20. package/dist/knownState.d.ts +5 -0
  21. package/dist/knownState.d.ts.map +1 -1
  22. package/dist/knownState.js +15 -0
  23. package/dist/knownState.js.map +1 -1
  24. package/dist/localNode.d.ts.map +1 -1
  25. package/dist/localNode.js +8 -2
  26. package/dist/localNode.js.map +1 -1
  27. package/dist/queue/IncomingMessagesQueue.d.ts +6 -7
  28. package/dist/queue/IncomingMessagesQueue.d.ts.map +1 -1
  29. package/dist/queue/IncomingMessagesQueue.js +7 -30
  30. package/dist/queue/IncomingMessagesQueue.js.map +1 -1
  31. package/dist/queue/LinkedList.d.ts +1 -1
  32. package/dist/queue/LinkedList.d.ts.map +1 -1
  33. package/dist/queue/LinkedList.js.map +1 -1
  34. package/dist/queue/StorageStreamingQueue.d.ts +43 -0
  35. package/dist/queue/StorageStreamingQueue.d.ts.map +1 -0
  36. package/dist/queue/StorageStreamingQueue.js +70 -0
  37. package/dist/queue/StorageStreamingQueue.js.map +1 -0
  38. package/dist/storage/knownState.d.ts +5 -0
  39. package/dist/storage/knownState.d.ts.map +1 -1
  40. package/dist/storage/knownState.js +11 -0
  41. package/dist/storage/knownState.js.map +1 -1
  42. package/dist/storage/sqlite/client.d.ts +2 -0
  43. package/dist/storage/sqlite/client.d.ts.map +1 -1
  44. package/dist/storage/sqlite/client.js +18 -0
  45. package/dist/storage/sqlite/client.js.map +1 -1
  46. package/dist/storage/sqliteAsync/client.d.ts +2 -0
  47. package/dist/storage/sqliteAsync/client.d.ts.map +1 -1
  48. package/dist/storage/sqliteAsync/client.js +20 -0
  49. package/dist/storage/sqliteAsync/client.js.map +1 -1
  50. package/dist/storage/storageAsync.d.ts +2 -0
  51. package/dist/storage/storageAsync.d.ts.map +1 -1
  52. package/dist/storage/storageAsync.js +40 -0
  53. package/dist/storage/storageAsync.js.map +1 -1
  54. package/dist/storage/storageSync.d.ts +9 -2
  55. package/dist/storage/storageSync.d.ts.map +1 -1
  56. package/dist/storage/storageSync.js +71 -44
  57. package/dist/storage/storageSync.js.map +1 -1
  58. package/dist/storage/types.d.ts +20 -0
  59. package/dist/storage/types.d.ts.map +1 -1
  60. package/dist/sync.d.ts +34 -0
  61. package/dist/sync.d.ts.map +1 -1
  62. package/dist/sync.js +185 -46
  63. package/dist/sync.js.map +1 -1
  64. package/dist/tests/IncomingMessagesQueue.test.js +4 -150
  65. package/dist/tests/IncomingMessagesQueue.test.js.map +1 -1
  66. package/dist/tests/StorageApiAsync.test.js +91 -0
  67. package/dist/tests/StorageApiAsync.test.js.map +1 -1
  68. package/dist/tests/StorageApiSync.test.js +91 -0
  69. package/dist/tests/StorageApiSync.test.js.map +1 -1
  70. package/dist/tests/StorageStreamingQueue.test.d.ts +2 -0
  71. package/dist/tests/StorageStreamingQueue.test.d.ts.map +1 -0
  72. package/dist/tests/StorageStreamingQueue.test.js +213 -0
  73. package/dist/tests/StorageStreamingQueue.test.js.map +1 -0
  74. package/dist/tests/SyncManager.processQueues.test.d.ts +2 -0
  75. package/dist/tests/SyncManager.processQueues.test.d.ts.map +1 -0
  76. package/dist/tests/SyncManager.processQueues.test.js +208 -0
  77. package/dist/tests/SyncManager.processQueues.test.js.map +1 -0
  78. package/dist/tests/coValueCore.loadFromStorage.test.js +1 -0
  79. package/dist/tests/coValueCore.loadFromStorage.test.js.map +1 -1
  80. package/dist/tests/knownState.lazyLoading.test.d.ts +2 -0
  81. package/dist/tests/knownState.lazyLoading.test.d.ts.map +1 -0
  82. package/dist/tests/knownState.lazyLoading.test.js +166 -0
  83. package/dist/tests/knownState.lazyLoading.test.js.map +1 -0
  84. package/dist/tests/messagesTestUtils.d.ts +5 -2
  85. package/dist/tests/messagesTestUtils.d.ts.map +1 -1
  86. package/dist/tests/messagesTestUtils.js +4 -0
  87. package/dist/tests/messagesTestUtils.js.map +1 -1
  88. package/dist/tests/setup.d.ts +2 -0
  89. package/dist/tests/setup.d.ts.map +1 -0
  90. package/dist/tests/setup.js +4 -0
  91. package/dist/tests/setup.js.map +1 -0
  92. package/dist/tests/sync.garbageCollection.test.js.map +1 -1
  93. package/dist/tests/sync.load.test.js +388 -0
  94. package/dist/tests/sync.load.test.js.map +1 -1
  95. package/dist/tests/sync.mesh.test.js +23 -23
  96. package/dist/tests/sync.storage.test.js +176 -20
  97. package/dist/tests/sync.storage.test.js.map +1 -1
  98. package/dist/tests/sync.test.js +1 -1
  99. package/dist/tests/sync.test.js.map +1 -1
  100. package/dist/tests/testStorage.js +36 -0
  101. package/dist/tests/testStorage.js.map +1 -1
  102. package/dist/tests/testUtils.d.ts +16 -4
  103. package/dist/tests/testUtils.d.ts.map +1 -1
  104. package/dist/tests/testUtils.js +2 -2
  105. package/dist/tests/testUtils.js.map +1 -1
  106. package/package.json +4 -4
  107. package/src/coValueCore/coValueCore.ts +26 -0
  108. package/src/coValues/account.ts +12 -14
  109. package/src/config.ts +13 -0
  110. package/src/exports.ts +6 -0
  111. package/src/ids.ts +1 -1
  112. package/src/knownState.ts +24 -0
  113. package/src/localNode.ts +9 -2
  114. package/src/queue/IncomingMessagesQueue.ts +7 -39
  115. package/src/queue/LinkedList.ts +1 -1
  116. package/src/queue/StorageStreamingQueue.ts +96 -0
  117. package/src/storage/knownState.ts +12 -0
  118. package/src/storage/sqlite/client.ts +31 -0
  119. package/src/storage/sqliteAsync/client.ts +35 -0
  120. package/src/storage/storageAsync.ts +51 -0
  121. package/src/storage/storageSync.ts +121 -55
  122. package/src/storage/types.ts +29 -0
  123. package/src/sync.ts +210 -47
  124. package/src/tests/IncomingMessagesQueue.test.ts +4 -206
  125. package/src/tests/StorageApiAsync.test.ts +136 -0
  126. package/src/tests/StorageApiSync.test.ts +132 -0
  127. package/src/tests/StorageStreamingQueue.test.ts +276 -0
  128. package/src/tests/SyncManager.processQueues.test.ts +287 -0
  129. package/src/tests/coValueCore.loadFromStorage.test.ts +3 -0
  130. package/src/tests/knownState.lazyLoading.test.ts +217 -0
  131. package/src/tests/messagesTestUtils.ts +10 -3
  132. package/src/tests/setup.ts +4 -0
  133. package/src/tests/sync.garbageCollection.test.ts +1 -3
  134. package/src/tests/sync.load.test.ts +483 -1
  135. package/src/tests/sync.mesh.test.ts +23 -23
  136. package/src/tests/sync.storage.test.ts +224 -32
  137. package/src/tests/sync.test.ts +1 -9
  138. package/src/tests/testStorage.ts +38 -0
  139. package/src/tests/testUtils.ts +16 -4
  140. package/vitest.config.ts +1 -0
@@ -8,7 +8,7 @@ import {
8
8
  vi,
9
9
  } from "vitest";
10
10
 
11
- import { emptyKnownState } from "../exports";
11
+ import { cojsonInternals, emptyKnownState } from "../exports";
12
12
  import {
13
13
  SyncMessagesLog,
14
14
  TEST_NODE_CONFIG,
@@ -24,6 +24,10 @@ import { stableStringify } from "../jsonStringify";
24
24
  // We want to simulate a real world communication that happens asynchronously
25
25
  TEST_NODE_CONFIG.withAsyncPeers = true;
26
26
 
27
+ beforeEach(() => {
28
+ cojsonInternals.setIncomingMessagesTimeBudget(10_000);
29
+ });
30
+
27
31
  describe("client with storage syncs with server", () => {
28
32
  let jazzCloud: ReturnType<typeof setupTestNode>;
29
33
 
@@ -356,13 +360,6 @@ describe("client syncs with a server with storage", () => {
356
360
 
357
361
  await largeMap.core.waitForSync();
358
362
 
359
- // Test streaming counter during initial sync
360
- // The streaming counter should be 0 after the sync is complete
361
- const streamingCounterAfterSync = await metricReader.getMetricValue(
362
- "jazz.storage.streaming",
363
- );
364
- expect(streamingCounterAfterSync).toBe(0);
365
-
366
363
  expect(
367
364
  SyncMessagesLog.getMessages({
368
365
  Group: group.core,
@@ -403,31 +400,11 @@ describe("client syncs with a server with storage", () => {
403
400
  storage,
404
401
  });
405
402
 
406
- // Test streaming counter before loading the large coValue
407
- const streamingCounterBeforeLoad = await metricReader.getMetricValue(
408
- "jazz.storage.streaming",
409
- );
410
- expect(streamingCounterBeforeLoad).toBe(0);
411
-
412
403
  const promise = loadCoValueOrFail(client.node, largeMap.id);
413
404
 
414
- // Test streaming counter during loading (should be 1 during streaming)
415
- const streamingCounterDuringLoad = await metricReader.getMetricValue(
416
- "jazz.storage.streaming",
417
- );
418
- expect(streamingCounterDuringLoad).toBe(1);
419
-
420
405
  const mapOnClient2 = await promise;
421
406
  await mapOnClient2.core.waitForFullStreaming();
422
407
 
423
- // Test streaming counter after loading is complete (should be 0)
424
- await waitFor(async () => {
425
- const streamingCounterAfterLoad = await metricReader.getMetricValue(
426
- "jazz.storage.streaming",
427
- );
428
- expect(streamingCounterAfterLoad).toBe(0);
429
- });
430
-
431
408
  expect(
432
409
  SyncMessagesLog.getMessages({
433
410
  Group: group.core,
@@ -440,8 +417,6 @@ describe("client syncs with a server with storage", () => {
440
417
  "client -> server | LOAD Group sessions: header/5",
441
418
  "storage -> client | CONTENT Map header: true new: After: 0 New: 73 expectContentUntil: header/200",
442
419
  "client -> server | LOAD Map sessions: header/200",
443
- "server -> client | KNOWN Group sessions: header/5",
444
- "server -> client | KNOWN Map sessions: header/200",
445
420
  "storage -> client | CONTENT Map header: true new: After: 73 New: 73",
446
421
  "storage -> client | CONTENT Map header: true new: After: 146 New: 54",
447
422
  ]
@@ -830,16 +805,233 @@ describe("client syncs with a server with storage", () => {
830
805
  "server -> bob | CONTENT Map header: true new: After: 0 New: 1",
831
806
  "storage -> syncServer | CONTENT ParentGroup header: true new: After: 76 New: 73",
832
807
  "server -> bob | CONTENT ParentGroup header: false new: After: 76 New: 73 expectContentUntil: header/205",
808
+ "storage -> syncServer | CONTENT ParentGroup header: true new: After: 149 New: 56",
809
+ "server -> bob | CONTENT ParentGroup header: false new: After: 149 New: 56",
833
810
  "bob -> server | KNOWN ParentGroup sessions: header/76",
834
811
  "bob -> server | KNOWN Group sessions: header/5",
835
812
  "bob -> server | KNOWN Map sessions: header/1",
836
813
  "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
814
  "bob -> server | KNOWN ParentGroup sessions: header/205",
840
815
  ]
841
816
  `);
842
817
 
843
818
  expect(mapOnBob.get("hello")).toEqual("world");
844
819
  });
820
+
821
+ describe("storage content streaming queue", () => {
822
+ test("multiple CoValues can stream concurrently", async () => {
823
+ cojsonInternals.setIncomingMessagesTimeBudget(0); // Should force the queue processing to be async
824
+
825
+ const client = setupTestNode();
826
+ client.connectToSyncServer();
827
+ const { storage } = client.addStorage();
828
+
829
+ const group = jazzCloud.node.createGroup();
830
+ const map1 = group.createMap();
831
+ const map2 = group.createMap();
832
+ const map3 = group.createMap();
833
+
834
+ fillCoMapWithLargeData(map1);
835
+ fillCoMapWithLargeData(map2);
836
+ fillCoMapWithLargeData(map3);
837
+
838
+ // Load all and sync to storage
839
+ await Promise.all([
840
+ loadCoValueOrFail(client.node, map1.id),
841
+ loadCoValueOrFail(client.node, map2.id),
842
+ loadCoValueOrFail(client.node, map3.id),
843
+ ]);
844
+ await Promise.all([
845
+ map1.core.waitForSync(),
846
+ map2.core.waitForSync(),
847
+ map3.core.waitForSync(),
848
+ ]);
849
+
850
+ // Restart to load from storage
851
+ client.restart();
852
+ client.addStorage({ storage });
853
+
854
+ // Load all maps concurrently from storage
855
+ const [loadedMap1, loadedMap2, loadedMap3] = await Promise.all([
856
+ loadCoValueOrFail(client.node, map1.id),
857
+ loadCoValueOrFail(client.node, map2.id),
858
+ loadCoValueOrFail(client.node, map3.id),
859
+ ]);
860
+
861
+ // Wait for all to complete streaming
862
+ await Promise.all([
863
+ loadedMap1.core.waitForAsync((value) => value.isCompletelyDownloaded()),
864
+ loadedMap2.core.waitForAsync((value) => value.isCompletelyDownloaded()),
865
+ loadedMap3.core.waitForAsync((value) => value.isCompletelyDownloaded()),
866
+ ]);
867
+
868
+ // All content should be loaded
869
+ expect(loadedMap1.core.isCompletelyDownloaded()).toBe(true);
870
+ expect(loadedMap2.core.isCompletelyDownloaded()).toBe(true);
871
+ expect(loadedMap3.core.isCompletelyDownloaded()).toBe(true);
872
+
873
+ // Queue should be empty
874
+ expect(storage.streamingQueue?.isEmpty()).toBe(true);
875
+ });
876
+
877
+ test("large content streaming interleaved with incoming messages", async () => {
878
+ cojsonInternals.setIncomingMessagesTimeBudget(0); // Should force the queue processing to be async
879
+
880
+ const client = setupTestNode();
881
+ client.connectToSyncServer();
882
+ const { storage } = client.addStorage();
883
+
884
+ // Create a large map on the server and sync to client storage
885
+ const group = jazzCloud.node.createGroup();
886
+ const largeMap = group.createMap();
887
+ fillCoMapWithLargeData(largeMap);
888
+
889
+ await loadCoValueOrFail(client.node, largeMap.id);
890
+ await largeMap.core.waitForSync();
891
+
892
+ SyncMessagesLog.clear();
893
+
894
+ // Restart client with storage
895
+ client.restart();
896
+ client.connectToSyncServer();
897
+ client.addStorage({ storage });
898
+
899
+ // Create a new small map on the server (will come as incoming message)
900
+ const smallMap = group.createMap();
901
+ smallMap.set("hello", "world", "trusting");
902
+
903
+ // Load both simultaneously - large from storage, small from server
904
+ const [loadedLargeMap, loadedSmallMap] = await Promise.all([
905
+ loadCoValueOrFail(client.node, largeMap.id),
906
+ loadCoValueOrFail(client.node, smallMap.id),
907
+ ]);
908
+
909
+ // Wait for complete download
910
+ await Promise.all([
911
+ loadedLargeMap.core.waitForAsync((value) =>
912
+ value.isCompletelyDownloaded(),
913
+ ),
914
+ loadedSmallMap.core.waitForAsync((value) =>
915
+ value.isCompletelyDownloaded(),
916
+ ),
917
+ ]);
918
+
919
+ // Both should be loaded correctly
920
+ expect(loadedLargeMap.core.isCompletelyDownloaded()).toBe(true);
921
+ expect(loadedSmallMap.get("hello")).toEqual("world");
922
+ });
923
+
924
+ test("large parent group streaming from storage", async () => {
925
+ cojsonInternals.setIncomingMessagesTimeBudget(0);
926
+
927
+ const syncServer = setupTestNode({
928
+ isSyncServer: true,
929
+ });
930
+ const { storage } = syncServer.addStorage({
931
+ ourName: "syncServer",
932
+ });
933
+
934
+ const alice = setupTestNode();
935
+ alice.connectToSyncServer({
936
+ syncServer: syncServer.node,
937
+ });
938
+
939
+ const parentGroup = alice.node.createGroup();
940
+ const group = alice.node.createGroup();
941
+ group.extend(parentGroup);
942
+
943
+ const map = group.createMap();
944
+
945
+ fillCoMapWithLargeData(parentGroup);
946
+
947
+ parentGroup.addMember("everyone", "reader");
948
+
949
+ map.set("hello", "world");
950
+
951
+ await map.core.waitForSync();
952
+ await parentGroup.core.waitForSync();
953
+
954
+ expect(
955
+ SyncMessagesLog.getMessages({
956
+ Group: group.core,
957
+ ParentGroup: parentGroup.core,
958
+ Map: map.core,
959
+ }),
960
+ ).toMatchInlineSnapshot(`
961
+ [
962
+ "client -> server | CONTENT ParentGroup header: true new: After: 0 New: 3",
963
+ "client -> server | CONTENT Group header: true new: After: 0 New: 5",
964
+ "client -> server | CONTENT Map header: true new: ",
965
+ "client -> server | CONTENT ParentGroup header: false new: After: 3 New: 73 expectContentUntil: header/205",
966
+ "client -> server | CONTENT ParentGroup header: false new: After: 76 New: 73",
967
+ "client -> server | CONTENT ParentGroup header: false new: After: 149 New: 56",
968
+ "client -> server | CONTENT Map header: false new: After: 0 New: 1",
969
+ "server -> client | KNOWN ParentGroup sessions: header/3",
970
+ "syncServer -> storage | CONTENT ParentGroup header: true new: After: 0 New: 3",
971
+ "server -> client | KNOWN Group sessions: header/5",
972
+ "syncServer -> storage | CONTENT Group header: true new: After: 0 New: 5",
973
+ "server -> client | KNOWN Map sessions: header/0",
974
+ "syncServer -> storage | CONTENT Map header: true new: ",
975
+ "server -> client | KNOWN ParentGroup sessions: header/76",
976
+ "syncServer -> storage | CONTENT ParentGroup header: false new: After: 3 New: 73",
977
+ "server -> client | KNOWN ParentGroup sessions: header/149",
978
+ "syncServer -> storage | CONTENT ParentGroup header: false new: After: 76 New: 73",
979
+ "server -> client | KNOWN ParentGroup sessions: header/205",
980
+ "syncServer -> storage | CONTENT ParentGroup header: false new: After: 149 New: 56",
981
+ "server -> client | KNOWN Map sessions: header/1",
982
+ "syncServer -> storage | CONTENT Map header: false new: After: 0 New: 1",
983
+ ]
984
+ `);
985
+
986
+ SyncMessagesLog.clear();
987
+
988
+ syncServer.restart();
989
+ syncServer.addStorage({
990
+ ourName: "syncServer",
991
+ storage,
992
+ });
993
+
994
+ const bob = setupTestNode();
995
+ bob.connectToSyncServer({
996
+ syncServer: syncServer.node,
997
+ ourName: "bob",
998
+ });
999
+
1000
+ let mapOnBob = await loadCoValueOrFail(bob.node, map.id);
1001
+
1002
+ await mapOnBob.core.waitForAsync((value) =>
1003
+ value.isCompletelyDownloaded(),
1004
+ );
1005
+
1006
+ expect(
1007
+ SyncMessagesLog.getMessages({
1008
+ ParentGroup: parentGroup.core,
1009
+ Group: group.core,
1010
+ Map: map.core,
1011
+ }),
1012
+ ).toMatchInlineSnapshot(`
1013
+ [
1014
+ "bob -> server | LOAD Map sessions: empty",
1015
+ "syncServer -> storage | LOAD Map sessions: empty",
1016
+ "storage -> syncServer | CONTENT ParentGroup header: true new: After: 0 New: 76 expectContentUntil: header/205",
1017
+ "storage -> syncServer | CONTENT Group header: true new: After: 0 New: 5",
1018
+ "storage -> syncServer | CONTENT Map header: true new: After: 0 New: 1",
1019
+ "server -> bob | CONTENT ParentGroup header: true new: After: 0 New: 76 expectContentUntil: header/205",
1020
+ "server -> bob | CONTENT Group header: true new: After: 0 New: 5",
1021
+ "server -> bob | CONTENT Map header: true new: After: 0 New: 1",
1022
+ "storage -> syncServer | CONTENT ParentGroup header: true new: After: 76 New: 73",
1023
+ "server -> bob | CONTENT ParentGroup header: false new: After: 76 New: 73 expectContentUntil: header/205",
1024
+ "bob -> server | KNOWN ParentGroup sessions: header/76",
1025
+ "storage -> syncServer | CONTENT ParentGroup header: true new: After: 149 New: 56",
1026
+ "server -> bob | CONTENT ParentGroup header: false new: After: 149 New: 56",
1027
+ "bob -> server | KNOWN Group sessions: header/5",
1028
+ "bob -> server | KNOWN Map sessions: header/1",
1029
+ "bob -> server | KNOWN ParentGroup sessions: header/149",
1030
+ "bob -> server | KNOWN ParentGroup sessions: header/205",
1031
+ ]
1032
+ `);
1033
+
1034
+ expect(mapOnBob.get("hello")).toEqual("world");
1035
+ });
1036
+ });
845
1037
  });
@@ -1,12 +1,4 @@
1
- import {
2
- assert,
3
- afterEach,
4
- beforeEach,
5
- describe,
6
- expect,
7
- test,
8
- vi,
9
- } from "vitest";
1
+ import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
10
2
  import { expectMap } from "../coValue.js";
11
3
  import { RawCoMap } from "../coValues/coMap.js";
12
4
  import { WasmCrypto } from "../crypto/WasmCrypto.js";
@@ -150,6 +150,44 @@ function trackStorageMessages(
150
150
  ) {
151
151
  const originalStore = storage.store;
152
152
  const originalLoad = storage.load;
153
+ const originalLoadKnownState = storage.loadKnownState;
154
+
155
+ storage.loadKnownState = function (id, callback) {
156
+ SyncMessagesLog.add({
157
+ from: nodeName,
158
+ to: storageName,
159
+ msg: {
160
+ action: "lazyLoad",
161
+ id: id as RawCoID,
162
+ },
163
+ });
164
+
165
+ return originalLoadKnownState.call(storage, id, (knownState) => {
166
+ if (knownState) {
167
+ SyncMessagesLog.add({
168
+ from: storageName,
169
+ to: nodeName,
170
+ msg: {
171
+ action: "lazyLoadResult",
172
+ ...knownState,
173
+ },
174
+ });
175
+ } else {
176
+ SyncMessagesLog.add({
177
+ from: storageName,
178
+ to: nodeName,
179
+ msg: {
180
+ action: "lazyLoadResult",
181
+ id: id as RawCoID,
182
+ header: false,
183
+ sessions: {},
184
+ },
185
+ });
186
+ }
187
+
188
+ return callback(knownState);
189
+ });
190
+ };
153
191
 
154
192
  storage.store = function (data, correctionCallback) {
155
193
  SyncMessagesLog.add({
@@ -19,7 +19,7 @@ import {
19
19
  type RawCoValue,
20
20
  StorageAPI,
21
21
  } from "../exports.js";
22
- import type { SessionID } from "../ids.js";
22
+ import type { RawCoID, SessionID } from "../ids.js";
23
23
  import { LocalNode } from "../localNode.js";
24
24
  import { connectedPeers } from "../streamUtils.js";
25
25
  import type { Peer, SyncMessage, SyncWhen } from "../sync.js";
@@ -652,8 +652,8 @@ export async function setupTestAccount(
652
652
  connectToSyncServer();
653
653
  }
654
654
 
655
- onTestFinished(() => {
656
- ctx.node.gracefulShutdown();
655
+ onTestFinished(async () => {
656
+ await ctx.node.gracefulShutdown();
657
657
  });
658
658
 
659
659
  return {
@@ -679,10 +679,22 @@ export async function setupTestAccount(
679
679
  };
680
680
  }
681
681
 
682
+ export type LazyLoadMessage = {
683
+ action: "lazyLoad";
684
+ id: RawCoID;
685
+ };
686
+
687
+ export type LazyLoadResultMessage = {
688
+ action: "lazyLoadResult";
689
+ id: RawCoID;
690
+ header: boolean;
691
+ sessions: { [sessionID: string]: number };
692
+ };
693
+
682
694
  export type SyncTestMessage = {
683
695
  from: string;
684
696
  to: string;
685
- msg: SyncMessage;
697
+ msg: SyncMessage | LazyLoadMessage | LazyLoadResultMessage;
686
698
  };
687
699
 
688
700
  export function connectedPeersWithMessagesTracking(opts: {
package/vitest.config.ts CHANGED
@@ -4,5 +4,6 @@ export default defineProject({
4
4
  test: {
5
5
  name: "cojson",
6
6
  include: ["src/**/*.test.ts"],
7
+ setupFiles: ["./src/tests/setup.ts"],
7
8
  },
8
9
  });