cojson 0.16.3 → 0.16.4

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 (113) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +7 -0
  3. package/dist/coValue.d.ts +1 -1
  4. package/dist/coValueContentMessage.d.ts +10 -0
  5. package/dist/coValueContentMessage.d.ts.map +1 -0
  6. package/dist/coValueContentMessage.js +46 -0
  7. package/dist/coValueContentMessage.js.map +1 -0
  8. package/dist/coValueCore/coValueCore.d.ts.map +1 -1
  9. package/dist/coValueCore/coValueCore.js +5 -3
  10. package/dist/coValueCore/coValueCore.js.map +1 -1
  11. package/dist/coValueCore/verifiedState.d.ts +1 -0
  12. package/dist/coValueCore/verifiedState.d.ts.map +1 -1
  13. package/dist/coValueCore/verifiedState.js +14 -27
  14. package/dist/coValueCore/verifiedState.js.map +1 -1
  15. package/dist/coValues/group.d.ts.map +1 -1
  16. package/dist/coValues/group.js +16 -8
  17. package/dist/coValues/group.js.map +1 -1
  18. package/dist/localNode.d.ts +6 -1
  19. package/dist/localNode.d.ts.map +1 -1
  20. package/dist/localNode.js +7 -2
  21. package/dist/localNode.js.map +1 -1
  22. package/dist/queue/LocalTransactionsSyncQueue.d.ts +24 -0
  23. package/dist/queue/LocalTransactionsSyncQueue.d.ts.map +1 -0
  24. package/dist/queue/LocalTransactionsSyncQueue.js +55 -0
  25. package/dist/queue/LocalTransactionsSyncQueue.js.map +1 -0
  26. package/dist/queue/StoreQueue.d.ts +9 -6
  27. package/dist/queue/StoreQueue.d.ts.map +1 -1
  28. package/dist/queue/StoreQueue.js +10 -2
  29. package/dist/queue/StoreQueue.js.map +1 -1
  30. package/dist/storage/storageAsync.d.ts +11 -3
  31. package/dist/storage/storageAsync.d.ts.map +1 -1
  32. package/dist/storage/storageAsync.js +59 -46
  33. package/dist/storage/storageAsync.js.map +1 -1
  34. package/dist/storage/storageSync.d.ts +9 -3
  35. package/dist/storage/storageSync.d.ts.map +1 -1
  36. package/dist/storage/storageSync.js +48 -35
  37. package/dist/storage/storageSync.js.map +1 -1
  38. package/dist/storage/syncUtils.d.ts +2 -1
  39. package/dist/storage/syncUtils.d.ts.map +1 -1
  40. package/dist/storage/syncUtils.js +4 -0
  41. package/dist/storage/syncUtils.js.map +1 -1
  42. package/dist/storage/types.d.ts +3 -2
  43. package/dist/storage/types.d.ts.map +1 -1
  44. package/dist/sync.d.ts +6 -6
  45. package/dist/sync.d.ts.map +1 -1
  46. package/dist/sync.js +33 -56
  47. package/dist/sync.js.map +1 -1
  48. package/dist/tests/StorageApiAsync.test.d.ts +2 -0
  49. package/dist/tests/StorageApiAsync.test.d.ts.map +1 -0
  50. package/dist/tests/StorageApiAsync.test.js +574 -0
  51. package/dist/tests/StorageApiAsync.test.js.map +1 -0
  52. package/dist/tests/StorageApiSync.test.d.ts +2 -0
  53. package/dist/tests/StorageApiSync.test.d.ts.map +1 -0
  54. package/dist/tests/StorageApiSync.test.js +426 -0
  55. package/dist/tests/StorageApiSync.test.js.map +1 -0
  56. package/dist/tests/StoreQueue.test.js +9 -21
  57. package/dist/tests/StoreQueue.test.js.map +1 -1
  58. package/dist/tests/SyncStateManager.test.js +18 -8
  59. package/dist/tests/SyncStateManager.test.js.map +1 -1
  60. package/dist/tests/group.inheritance.test.js +79 -2
  61. package/dist/tests/group.inheritance.test.js.map +1 -1
  62. package/dist/tests/sync.auth.test.js +22 -10
  63. package/dist/tests/sync.auth.test.js.map +1 -1
  64. package/dist/tests/sync.load.test.js +25 -23
  65. package/dist/tests/sync.load.test.js.map +1 -1
  66. package/dist/tests/sync.mesh.test.js +12 -6
  67. package/dist/tests/sync.mesh.test.js.map +1 -1
  68. package/dist/tests/sync.peerReconciliation.test.js +6 -4
  69. package/dist/tests/sync.peerReconciliation.test.js.map +1 -1
  70. package/dist/tests/sync.storage.test.js +8 -14
  71. package/dist/tests/sync.storage.test.js.map +1 -1
  72. package/dist/tests/sync.storageAsync.test.js +31 -14
  73. package/dist/tests/sync.storageAsync.test.js.map +1 -1
  74. package/dist/tests/sync.test.js +5 -9
  75. package/dist/tests/sync.test.js.map +1 -1
  76. package/dist/tests/sync.upload.test.js +31 -1
  77. package/dist/tests/sync.upload.test.js.map +1 -1
  78. package/dist/tests/testStorage.d.ts +2 -3
  79. package/dist/tests/testStorage.d.ts.map +1 -1
  80. package/dist/tests/testStorage.js +16 -8
  81. package/dist/tests/testStorage.js.map +1 -1
  82. package/dist/tests/testUtils.d.ts +3 -0
  83. package/dist/tests/testUtils.d.ts.map +1 -1
  84. package/dist/tests/testUtils.js +17 -4
  85. package/dist/tests/testUtils.js.map +1 -1
  86. package/package.json +1 -1
  87. package/src/coValueContentMessage.ts +73 -0
  88. package/src/coValueCore/coValueCore.ts +14 -5
  89. package/src/coValueCore/verifiedState.ts +28 -35
  90. package/src/coValues/group.ts +20 -9
  91. package/src/localNode.ts +8 -3
  92. package/src/queue/LocalTransactionsSyncQueue.ts +96 -0
  93. package/src/queue/StoreQueue.ts +22 -12
  94. package/src/storage/storageAsync.ts +78 -56
  95. package/src/storage/storageSync.ts +66 -45
  96. package/src/storage/syncUtils.ts +9 -1
  97. package/src/storage/types.ts +6 -5
  98. package/src/sync.ts +47 -67
  99. package/src/tests/StorageApiAsync.test.ts +829 -0
  100. package/src/tests/StorageApiSync.test.ts +628 -0
  101. package/src/tests/StoreQueue.test.ts +10 -24
  102. package/src/tests/SyncStateManager.test.ts +22 -21
  103. package/src/tests/group.inheritance.test.ts +136 -1
  104. package/src/tests/sync.auth.test.ts +22 -10
  105. package/src/tests/sync.load.test.ts +27 -24
  106. package/src/tests/sync.mesh.test.ts +12 -6
  107. package/src/tests/sync.peerReconciliation.test.ts +6 -4
  108. package/src/tests/sync.storage.test.ts +8 -14
  109. package/src/tests/sync.storageAsync.test.ts +39 -14
  110. package/src/tests/sync.test.ts +6 -14
  111. package/src/tests/sync.upload.test.ts +38 -1
  112. package/src/tests/testStorage.ts +19 -13
  113. package/src/tests/testUtils.ts +24 -5
@@ -0,0 +1,574 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { unlinkSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { afterEach, describe, expect, onTestFinished, test, vi } from "vitest";
6
+ import { WasmCrypto } from "../crypto/WasmCrypto.js";
7
+ import { LocalNode, logger } from "../exports.js";
8
+ import { emptyKnownState, } from "../sync.js";
9
+ import { createAsyncStorage } from "./testStorage.js";
10
+ import { SyncMessagesLog, loadCoValueOrFail, randomAgentAndSessionID, waitFor, } from "./testUtils.js";
11
+ const crypto = await WasmCrypto.create();
12
+ /**
13
+ * Helper function that gets new content since a known state, throwing if:
14
+ * - The coValue is not verified
15
+ * - There is no new content
16
+ */
17
+ function getNewContentSince(coValue, knownState) {
18
+ if (!coValue.verified) {
19
+ throw new Error(`CoValue ${coValue.id} is not verified`);
20
+ }
21
+ const contentMessage = coValue.verified.newContentSince(knownState)?.[0];
22
+ if (!contentMessage) {
23
+ throw new Error(`No new content available for coValue ${coValue.id}`);
24
+ }
25
+ return contentMessage;
26
+ }
27
+ async function createFixturesNode(customDbPath) {
28
+ const [admin, session] = randomAgentAndSessionID();
29
+ const node = new LocalNode(admin.agentSecret, session, crypto);
30
+ // Create a unique database file for each test
31
+ const dbPath = customDbPath ?? join(tmpdir(), `test-${randomUUID()}.db`);
32
+ const storage = await createAsyncStorage({
33
+ filename: dbPath,
34
+ nodeName: "test",
35
+ storageName: "test-storage",
36
+ });
37
+ onTestFinished(() => {
38
+ try {
39
+ unlinkSync(dbPath);
40
+ }
41
+ catch { }
42
+ });
43
+ onTestFinished(async () => {
44
+ await node.gracefulShutdown();
45
+ });
46
+ node.setStorage(storage);
47
+ return {
48
+ fixturesNode: node,
49
+ dbPath,
50
+ };
51
+ }
52
+ async function createTestNode(dbPath) {
53
+ const [admin, session] = randomAgentAndSessionID();
54
+ const node = new LocalNode(admin.agentSecret, session, crypto);
55
+ const storage = await createAsyncStorage({
56
+ filename: dbPath,
57
+ nodeName: "test",
58
+ storageName: "test-storage",
59
+ });
60
+ onTestFinished(async () => {
61
+ node.gracefulShutdown();
62
+ await storage.close();
63
+ });
64
+ return {
65
+ node,
66
+ storage,
67
+ };
68
+ }
69
+ afterEach(() => {
70
+ SyncMessagesLog.clear();
71
+ });
72
+ describe("StorageApiAsync", () => {
73
+ describe("getKnownState", () => {
74
+ test("should return known state for existing coValue ID", async () => {
75
+ const { fixturesNode } = await createFixturesNode();
76
+ const { storage } = await createTestNode();
77
+ const id = fixturesNode.createGroup().id;
78
+ const knownState = storage.getKnownState(id);
79
+ expect(knownState).toEqual(emptyKnownState(id));
80
+ expect(storage.getKnownState(id)).toBe(knownState); // Should return same instance
81
+ });
82
+ test("should return different known states for different coValue IDs", async () => {
83
+ const { storage } = await createTestNode();
84
+ const id1 = "test-id-1";
85
+ const id2 = "test-id-2";
86
+ const knownState1 = storage.getKnownState(id1);
87
+ const knownState2 = storage.getKnownState(id2);
88
+ expect(knownState1).not.toBe(knownState2);
89
+ });
90
+ });
91
+ describe("load", () => {
92
+ test("should handle non-existent coValue gracefully", async () => {
93
+ const { storage } = await createTestNode();
94
+ const id = "non-existent-id";
95
+ const callback = vi.fn();
96
+ const done = vi.fn();
97
+ // Get initial known state
98
+ const initialKnownState = storage.getKnownState(id);
99
+ expect(initialKnownState).toEqual(emptyKnownState(id));
100
+ await storage.load(id, callback, done);
101
+ expect(done).toHaveBeenCalledWith(false);
102
+ expect(callback).not.toHaveBeenCalled();
103
+ // Verify that storage known state is NOT updated when load fails
104
+ const afterLoadKnownState = storage.getKnownState(id);
105
+ expect(afterLoadKnownState).toEqual(initialKnownState);
106
+ });
107
+ test("should load coValue with header only successfully", async () => {
108
+ const { fixturesNode, dbPath } = await createFixturesNode();
109
+ const { node, storage } = await createTestNode(dbPath);
110
+ const callback = vi.fn((content) => node.syncManager.handleNewContent(content, "storage"));
111
+ const done = vi.fn();
112
+ // Create a real group and get its content message
113
+ const group = fixturesNode.createGroup();
114
+ await group.core.waitForSync();
115
+ // Get initial known state
116
+ const initialKnownState = storage.getKnownState(group.id);
117
+ expect(initialKnownState).toEqual(emptyKnownState(group.id));
118
+ await storage.load(group.id, callback, done);
119
+ expect(callback).toHaveBeenCalledWith(expect.objectContaining({
120
+ id: group.id,
121
+ header: group.core.verified.header,
122
+ new: expect.any(Object),
123
+ }));
124
+ expect(done).toHaveBeenCalledWith(true);
125
+ // Verify that storage known state is updated after load
126
+ const updatedKnownState = storage.getKnownState(group.id);
127
+ expect(updatedKnownState).toEqual(group.core.verified.knownState());
128
+ const groupOnNode = await loadCoValueOrFail(node, group.id);
129
+ expect(groupOnNode.core.verified.header).toEqual(group.core.verified.header);
130
+ });
131
+ test("should load coValue with sessions and transactions successfully", async () => {
132
+ const { fixturesNode, dbPath } = await createFixturesNode();
133
+ const { node, storage } = await createTestNode(dbPath);
134
+ const callback = vi.fn((content) => node.syncManager.handleNewContent(content, "storage"));
135
+ const done = vi.fn();
136
+ // Create a real group and add a member to create transactions
137
+ const group = fixturesNode.createGroup();
138
+ group.addMember("everyone", "reader");
139
+ await group.core.waitForSync();
140
+ // Get initial known state
141
+ const initialKnownState = storage.getKnownState(group.id);
142
+ expect(initialKnownState).toEqual(emptyKnownState(group.id));
143
+ await storage.load(group.id, callback, done);
144
+ expect(callback).toHaveBeenCalledWith(expect.objectContaining({
145
+ id: group.id,
146
+ header: group.core.verified.header,
147
+ new: expect.objectContaining({
148
+ [fixturesNode.currentSessionID]: expect.any(Object),
149
+ }),
150
+ }));
151
+ expect(done).toHaveBeenCalledWith(true);
152
+ // Verify that storage known state is updated after load
153
+ const updatedKnownState = storage.getKnownState(group.id);
154
+ expect(updatedKnownState).toEqual(group.core.verified.knownState());
155
+ const groupOnNode = await loadCoValueOrFail(node, group.id);
156
+ expect(groupOnNode.get("everyone")).toEqual("reader");
157
+ });
158
+ });
159
+ describe("store", () => {
160
+ test("should store new coValue with header successfully", async () => {
161
+ const { fixturesNode } = await createFixturesNode();
162
+ const { node, storage } = await createTestNode();
163
+ // Create a real group and get its content message
164
+ const group = fixturesNode.createGroup();
165
+ const contentMessage = getNewContentSince(group.core, emptyKnownState(group.id));
166
+ const correctionCallback = vi.fn();
167
+ // Get initial known state
168
+ const initialKnownState = storage.getKnownState(group.id);
169
+ expect(initialKnownState).toEqual(emptyKnownState(group.id));
170
+ await storage.store(contentMessage, correctionCallback);
171
+ await storage.waitForSync(group.id, group.core);
172
+ // Verify that storage known state is updated after store
173
+ const updatedKnownState = storage.getKnownState(group.id);
174
+ expect(updatedKnownState).toEqual(group.core.verified.knownState());
175
+ node.setStorage(storage);
176
+ const groupOnNode = await loadCoValueOrFail(node, group.id);
177
+ expect(groupOnNode.core.verified.header).toEqual(group.core.verified.header);
178
+ });
179
+ test("should store coValue with transactions successfully", async () => {
180
+ const { fixturesNode } = await createFixturesNode();
181
+ const { node, storage } = await createTestNode();
182
+ // Create a real group and add a member to create transactions
183
+ const group = fixturesNode.createGroup();
184
+ const knownState = group.core.verified.knownState();
185
+ group.addMember("everyone", "reader");
186
+ const contentMessage = getNewContentSince(group.core, emptyKnownState(group.id));
187
+ const correctionCallback = vi.fn();
188
+ // Get initial known state
189
+ const initialKnownState = storage.getKnownState(group.id);
190
+ expect(initialKnownState).toEqual(emptyKnownState(group.id));
191
+ await storage.store(contentMessage, correctionCallback);
192
+ await storage.waitForSync(group.id, group.core);
193
+ // Verify that storage known state is updated after store
194
+ const updatedKnownState = storage.getKnownState(group.id);
195
+ expect(updatedKnownState).toEqual(group.core.verified.knownState());
196
+ node.setStorage(storage);
197
+ const groupOnNode = await loadCoValueOrFail(node, group.id);
198
+ expect(groupOnNode.get("everyone")).toEqual("reader");
199
+ });
200
+ test("should handle invalid assumption on header presence with correction", async () => {
201
+ const { fixturesNode } = await createFixturesNode();
202
+ const { node, storage } = await createTestNode();
203
+ const group = fixturesNode.createGroup();
204
+ const knownState = group.core.verified.knownState();
205
+ group.addMember("everyone", "reader");
206
+ const contentMessage = getNewContentSince(group.core, knownState);
207
+ const correctionCallback = vi.fn((known) => {
208
+ expect(known).toEqual(emptyKnownState(group.id));
209
+ return group.core.verified.newContentSince(known);
210
+ });
211
+ // Get initial known state
212
+ const initialKnownState = storage.getKnownState(group.id);
213
+ expect(initialKnownState).toEqual(emptyKnownState(group.id));
214
+ await storage.store(contentMessage, correctionCallback);
215
+ await storage.waitForSync(group.id, group.core);
216
+ expect(correctionCallback).toHaveBeenCalledTimes(1);
217
+ // Verify that storage known state is updated after store with correction
218
+ const updatedKnownState = storage.getKnownState(group.id);
219
+ expect(updatedKnownState).toEqual(group.core.verified.knownState());
220
+ node.setStorage(storage);
221
+ const groupOnNode = await loadCoValueOrFail(node, group.id);
222
+ expect(groupOnNode.get("everyone")).toEqual("reader");
223
+ });
224
+ test("should handle invalid assumption on new content with correction", async () => {
225
+ const { fixturesNode } = await createFixturesNode();
226
+ const { node, storage } = await createTestNode();
227
+ const group = fixturesNode.createGroup();
228
+ const initialContent = getNewContentSince(group.core, emptyKnownState(group.id));
229
+ const initialKnownState = group.core.knownState();
230
+ group.addMember("everyone", "reader");
231
+ const knownState = group.core.knownState();
232
+ group.addMember("everyone", "writer");
233
+ const contentMessage = getNewContentSince(group.core, knownState);
234
+ const correctionCallback = vi.fn((known) => {
235
+ expect(known).toEqual(initialKnownState);
236
+ return group.core.verified.newContentSince(known);
237
+ });
238
+ // Get initial storage known state
239
+ const initialStorageKnownState = storage.getKnownState(group.id);
240
+ expect(initialStorageKnownState).toEqual(emptyKnownState(group.id));
241
+ await storage.store(initialContent, correctionCallback);
242
+ await storage.store(contentMessage, correctionCallback);
243
+ await storage.waitForSync(group.id, group.core);
244
+ expect(correctionCallback).toHaveBeenCalledTimes(1);
245
+ // Verify that storage known state is updated after store with correction
246
+ const finalKnownState = storage.getKnownState(group.id);
247
+ expect(finalKnownState).toEqual(group.core.verified.knownState());
248
+ node.setStorage(storage);
249
+ const groupOnNode = await loadCoValueOrFail(node, group.id);
250
+ expect(groupOnNode.get("everyone")).toEqual("writer");
251
+ });
252
+ test("should log an error when the correction callback returns undefined", async () => {
253
+ const { fixturesNode } = await createFixturesNode();
254
+ const { storage } = await createTestNode();
255
+ const group = fixturesNode.createGroup();
256
+ const knownState = group.core.knownState();
257
+ group.addMember("everyone", "writer");
258
+ const contentMessage = getNewContentSince(group.core, knownState);
259
+ const correctionCallback = vi.fn((known) => {
260
+ return undefined;
261
+ });
262
+ // Get initial known state
263
+ const initialKnownState = storage.getKnownState(group.id);
264
+ expect(initialKnownState).toEqual(emptyKnownState(group.id));
265
+ const errorSpy = vi.spyOn(logger, "error").mockImplementation(() => { });
266
+ await storage.store(contentMessage, correctionCallback);
267
+ await waitFor(() => {
268
+ expect(correctionCallback).toHaveBeenCalledTimes(1);
269
+ });
270
+ // Verify that storage known state is NOT updated when store fails
271
+ const afterStoreKnownState = storage.getKnownState(group.id);
272
+ expect(afterStoreKnownState).toEqual(initialKnownState);
273
+ expect(errorSpy).toHaveBeenCalledWith("Correction callback returned undefined", {
274
+ knownState: expect.any(Object),
275
+ correction: null,
276
+ });
277
+ errorSpy.mockClear();
278
+ });
279
+ test("should log an error when the correction callback returns an invalid content message", async () => {
280
+ const { fixturesNode } = await createFixturesNode();
281
+ const { storage } = await createTestNode();
282
+ const group = fixturesNode.createGroup();
283
+ const knownState = group.core.knownState();
284
+ group.addMember("everyone", "writer");
285
+ const contentMessage = getNewContentSince(group.core, knownState);
286
+ const correctionCallback = vi.fn(() => {
287
+ return [contentMessage];
288
+ });
289
+ // Get initial known state
290
+ const initialKnownState = storage.getKnownState(group.id);
291
+ expect(initialKnownState).toEqual(emptyKnownState(group.id));
292
+ const errorSpy = vi.spyOn(logger, "error").mockImplementation(() => { });
293
+ await storage.store(contentMessage, correctionCallback);
294
+ await waitFor(() => {
295
+ expect(correctionCallback).toHaveBeenCalledTimes(1);
296
+ });
297
+ // Verify that storage known state is NOT updated when store fails
298
+ const afterStoreKnownState = storage.getKnownState(group.id);
299
+ expect(afterStoreKnownState).toEqual(initialKnownState);
300
+ expect(errorSpy).toHaveBeenCalledWith("Correction callback returned undefined", {
301
+ knownState: expect.any(Object),
302
+ correction: null,
303
+ });
304
+ expect(errorSpy).toHaveBeenCalledWith("Double correction requested", {
305
+ knownState: expect.any(Object),
306
+ msg: expect.any(Object),
307
+ });
308
+ errorSpy.mockClear();
309
+ });
310
+ test("should handle invalid assumption when pushing multiple transactions with correction", async () => {
311
+ const { node, storage } = await createTestNode();
312
+ const core = node.createCoValue({
313
+ type: "comap",
314
+ ruleset: { type: "unsafeAllowAll" },
315
+ meta: null,
316
+ ...crypto.createdNowUnique(),
317
+ });
318
+ core.makeTransaction([{ count: 1 }], "trusting");
319
+ await core.waitForSync();
320
+ // Add storage later
321
+ node.setStorage(storage);
322
+ core.makeTransaction([{ count: 2 }], "trusting");
323
+ core.makeTransaction([{ count: 3 }], "trusting");
324
+ await new Promise((resolve) => setTimeout(resolve, 10));
325
+ core.makeTransaction([{ count: 4 }], "trusting");
326
+ core.makeTransaction([{ count: 5 }], "trusting");
327
+ await core.waitForSync();
328
+ expect(storage.getKnownState(core.id)).toEqual(core.knownState());
329
+ expect(SyncMessagesLog.getMessages({
330
+ Core: core,
331
+ })).toMatchInlineSnapshot(`
332
+ [
333
+ "test -> test-storage | CONTENT Core header: false new: After: 1 New: 2",
334
+ "test-storage -> test | KNOWN CORRECTION Core sessions: empty",
335
+ "test -> test-storage | CONTENT Core header: true new: After: 0 New: 3",
336
+ "test -> test-storage | CONTENT Core header: false new: After: 3 New: 2",
337
+ ]
338
+ `);
339
+ });
340
+ test("should handle invalid assumption when pushing multiple transactions on different coValues with correction", async () => {
341
+ const { node, storage } = await createTestNode();
342
+ const core = node.createCoValue({
343
+ type: "comap",
344
+ ruleset: { type: "unsafeAllowAll" },
345
+ meta: null,
346
+ ...crypto.createdNowUnique(),
347
+ });
348
+ const core2 = node.createCoValue({
349
+ type: "comap",
350
+ ruleset: { type: "unsafeAllowAll" },
351
+ meta: null,
352
+ ...crypto.createdNowUnique(),
353
+ });
354
+ core.makeTransaction([{ count: 1 }], "trusting");
355
+ core2.makeTransaction([{ count: 1 }], "trusting");
356
+ await core.waitForSync();
357
+ // Add storage later
358
+ node.setStorage(storage);
359
+ core.makeTransaction([{ count: 2 }], "trusting");
360
+ core2.makeTransaction([{ count: 2 }], "trusting");
361
+ core.makeTransaction([{ count: 3 }], "trusting");
362
+ core2.makeTransaction([{ count: 3 }], "trusting");
363
+ await new Promise((resolve) => setTimeout(resolve, 10));
364
+ core.makeTransaction([{ count: 4 }], "trusting");
365
+ core2.makeTransaction([{ count: 4 }], "trusting");
366
+ core.makeTransaction([{ count: 5 }], "trusting");
367
+ core2.makeTransaction([{ count: 5 }], "trusting");
368
+ await core.waitForSync();
369
+ expect(storage.getKnownState(core.id)).toEqual(core.knownState());
370
+ expect(SyncMessagesLog.getMessages({
371
+ Core: core,
372
+ Core2: core2,
373
+ })).toMatchInlineSnapshot(`
374
+ [
375
+ "test -> test-storage | CONTENT Core header: false new: After: 1 New: 1",
376
+ "test -> test-storage | CONTENT Core2 header: false new: After: 1 New: 1",
377
+ "test -> test-storage | CONTENT Core header: false new: After: 2 New: 1",
378
+ "test -> test-storage | CONTENT Core2 header: false new: After: 2 New: 1",
379
+ "test-storage -> test | KNOWN CORRECTION Core sessions: empty",
380
+ "test -> test-storage | CONTENT Core header: true new: After: 0 New: 3",
381
+ "test-storage -> test | KNOWN CORRECTION Core2 sessions: empty",
382
+ "test -> test-storage | CONTENT Core2 header: true new: After: 0 New: 3",
383
+ "test -> test-storage | CONTENT Core header: false new: After: 3 New: 1",
384
+ "test -> test-storage | CONTENT Core2 header: false new: After: 3 New: 1",
385
+ "test -> test-storage | CONTENT Core header: false new: After: 4 New: 1",
386
+ "test -> test-storage | CONTENT Core2 header: false new: After: 4 New: 1",
387
+ ]
388
+ `);
389
+ });
390
+ test("should handle close while pushing multiple transactions on different coValues with an invalid assumption", async () => {
391
+ const { node, storage } = await createTestNode();
392
+ const core = node.createCoValue({
393
+ type: "comap",
394
+ ruleset: { type: "unsafeAllowAll" },
395
+ meta: null,
396
+ ...crypto.createdNowUnique(),
397
+ });
398
+ const core2 = node.createCoValue({
399
+ type: "comap",
400
+ ruleset: { type: "unsafeAllowAll" },
401
+ meta: null,
402
+ ...crypto.createdNowUnique(),
403
+ });
404
+ core.makeTransaction([{ count: 1 }], "trusting");
405
+ core2.makeTransaction([{ count: 1 }], "trusting");
406
+ await core.waitForSync();
407
+ // Add storage later
408
+ node.setStorage(storage);
409
+ core.makeTransaction([{ count: 2 }], "trusting");
410
+ core2.makeTransaction([{ count: 2 }], "trusting");
411
+ core.makeTransaction([{ count: 3 }], "trusting");
412
+ core2.makeTransaction([{ count: 3 }], "trusting");
413
+ await new Promise(queueMicrotask);
414
+ await storage.close();
415
+ const knownState = JSON.parse(JSON.stringify(storage.getKnownState(core.id)));
416
+ core.makeTransaction([{ count: 4 }], "trusting");
417
+ core2.makeTransaction([{ count: 4 }], "trusting");
418
+ core.makeTransaction([{ count: 5 }], "trusting");
419
+ core2.makeTransaction([{ count: 5 }], "trusting");
420
+ await new Promise((resolve) => setTimeout(resolve, 10));
421
+ expect(SyncMessagesLog.getMessages({
422
+ Core: core,
423
+ Core2: core2,
424
+ })).toMatchInlineSnapshot(`
425
+ [
426
+ "test -> test-storage | CONTENT Core header: false new: After: 1 New: 1",
427
+ "test -> test-storage | CONTENT Core2 header: false new: After: 1 New: 1",
428
+ "test -> test-storage | CONTENT Core header: false new: After: 2 New: 1",
429
+ "test -> test-storage | CONTENT Core2 header: false new: After: 2 New: 1",
430
+ "test-storage -> test | KNOWN CORRECTION Core sessions: empty",
431
+ "test -> test-storage | CONTENT Core header: true new: After: 0 New: 3",
432
+ "test -> test-storage | CONTENT Core header: false new: After: 3 New: 1",
433
+ "test -> test-storage | CONTENT Core2 header: false new: After: 3 New: 1",
434
+ "test -> test-storage | CONTENT Core header: false new: After: 4 New: 1",
435
+ "test -> test-storage | CONTENT Core2 header: false new: After: 4 New: 1",
436
+ ]
437
+ `);
438
+ expect(storage.getKnownState(core.id)).toEqual(knownState);
439
+ });
440
+ test("should handle multiple sessions correctly", async () => {
441
+ const { fixturesNode, dbPath } = await createFixturesNode();
442
+ const { fixturesNode: fixtureNode2 } = await createFixturesNode(dbPath);
443
+ const { node, storage } = await createTestNode();
444
+ const coValue = fixturesNode.createCoValue({
445
+ type: "comap",
446
+ ruleset: { type: "unsafeAllowAll" },
447
+ meta: null,
448
+ ...crypto.createdNowUnique(),
449
+ });
450
+ coValue.makeTransaction([
451
+ {
452
+ count: 1,
453
+ },
454
+ ], "trusting");
455
+ await coValue.waitForSync();
456
+ const mapOnNode2 = await loadCoValueOrFail(fixtureNode2, coValue.id);
457
+ coValue.makeTransaction([
458
+ {
459
+ count: 2,
460
+ },
461
+ ], "trusting");
462
+ const knownState = mapOnNode2.core.knownState();
463
+ const contentMessage = getNewContentSince(mapOnNode2.core, emptyKnownState(mapOnNode2.id));
464
+ const correctionCallback = vi.fn();
465
+ await storage.store(contentMessage, correctionCallback);
466
+ await storage.waitForSync(mapOnNode2.id, mapOnNode2.core);
467
+ node.setStorage(storage);
468
+ const finalMap = await loadCoValueOrFail(node, mapOnNode2.id);
469
+ expect(finalMap.core.knownState()).toEqual(knownState);
470
+ });
471
+ });
472
+ describe("dependencies", () => {
473
+ test("should push dependencies before the coValue", async () => {
474
+ const { fixturesNode, dbPath } = await createFixturesNode();
475
+ const { node, storage } = await createTestNode(dbPath);
476
+ // Create a group and a map owned by that group to create dependencies
477
+ const group = fixturesNode.createGroup();
478
+ group.addMember("everyone", "reader");
479
+ const map = group.createMap({ test: "value" });
480
+ await group.core.waitForSync();
481
+ await map.core.waitForSync();
482
+ const callback = vi.fn((content) => node.syncManager.handleNewContent(content, "storage"));
483
+ const done = vi.fn();
484
+ // Get initial known states
485
+ const initialGroupKnownState = storage.getKnownState(group.id);
486
+ const initialMapKnownState = storage.getKnownState(map.id);
487
+ expect(initialGroupKnownState).toEqual(emptyKnownState(group.id));
488
+ expect(initialMapKnownState).toEqual(emptyKnownState(map.id));
489
+ // Load the map, which should also load the group dependency first
490
+ await storage.load(map.id, callback, done);
491
+ expect(callback).toHaveBeenCalledTimes(2); // Group first, then map
492
+ expect(callback).toHaveBeenNthCalledWith(1, expect.objectContaining({
493
+ id: group.id,
494
+ }));
495
+ expect(callback).toHaveBeenNthCalledWith(2, expect.objectContaining({
496
+ id: map.id,
497
+ }));
498
+ expect(done).toHaveBeenCalledWith(true);
499
+ // Verify that storage known states are updated after load
500
+ const updatedGroupKnownState = storage.getKnownState(group.id);
501
+ const updatedMapKnownState = storage.getKnownState(map.id);
502
+ expect(updatedGroupKnownState).toEqual(group.core.verified.knownState());
503
+ expect(updatedMapKnownState).toEqual(map.core.verified.knownState());
504
+ node.setStorage(storage);
505
+ const mapOnNode = await loadCoValueOrFail(node, map.id);
506
+ expect(mapOnNode.get("test")).toEqual("value");
507
+ });
508
+ test("should handle dependencies that are already loaded correctly", async () => {
509
+ const { fixturesNode, dbPath } = await createFixturesNode();
510
+ const { node, storage } = await createTestNode(dbPath);
511
+ // Create a group and a map owned by that group
512
+ const group = fixturesNode.createGroup();
513
+ group.addMember("everyone", "reader");
514
+ const map = group.createMap({ test: "value" });
515
+ await group.core.waitForSync();
516
+ await map.core.waitForSync();
517
+ const callback = vi.fn((content) => node.syncManager.handleNewContent(content, "storage"));
518
+ const done = vi.fn();
519
+ // Get initial known states
520
+ const initialGroupKnownState = storage.getKnownState(group.id);
521
+ const initialMapKnownState = storage.getKnownState(map.id);
522
+ expect(initialGroupKnownState).toEqual(emptyKnownState(group.id));
523
+ expect(initialMapKnownState).toEqual(emptyKnownState(map.id));
524
+ // First load the group
525
+ await storage.load(group.id, callback, done);
526
+ callback.mockClear();
527
+ done.mockClear();
528
+ // Verify group known state is updated after first load
529
+ const afterGroupLoad = storage.getKnownState(group.id);
530
+ expect(afterGroupLoad).toEqual(group.core.verified.knownState());
531
+ // Then load the map - the group dependency should already be loaded
532
+ await storage.load(map.id, callback, done);
533
+ // Should only call callback once for the map since group is already loaded
534
+ expect(callback).toHaveBeenCalledTimes(1);
535
+ expect(callback).toHaveBeenCalledWith(expect.objectContaining({
536
+ id: map.id,
537
+ }));
538
+ expect(done).toHaveBeenCalledWith(true);
539
+ // Verify map known state is updated after second load
540
+ const finalMapKnownState = storage.getKnownState(map.id);
541
+ expect(finalMapKnownState).toEqual(map.core.verified.knownState());
542
+ node.setStorage(storage);
543
+ const mapOnNode = await loadCoValueOrFail(node, map.id);
544
+ expect(mapOnNode.get("test")).toEqual("value");
545
+ });
546
+ });
547
+ describe("waitForSync", () => {
548
+ test("should resolve when the coValue is already synced", async () => {
549
+ const { fixturesNode, dbPath } = await createFixturesNode();
550
+ const { node, storage } = await createTestNode(dbPath);
551
+ // Create a group and add a member
552
+ const group = fixturesNode.createGroup();
553
+ group.addMember("everyone", "reader");
554
+ await group.core.waitForSync();
555
+ // Store the group in storage
556
+ const contentMessage = getNewContentSince(group.core, emptyKnownState(group.id));
557
+ const correctionCallback = vi.fn();
558
+ await storage.store(contentMessage, correctionCallback);
559
+ node.setStorage(storage);
560
+ // Load the group on the new node
561
+ const groupOnNode = await loadCoValueOrFail(node, group.id);
562
+ // Wait for sync should resolve immediately since the coValue is already synced
563
+ await expect(storage.waitForSync(group.id, groupOnNode.core)).resolves.toBeUndefined();
564
+ expect(groupOnNode.get("everyone")).toEqual("reader");
565
+ });
566
+ });
567
+ describe("close", () => {
568
+ test("should close without throwing an error", async () => {
569
+ const { storage } = await createTestNode();
570
+ expect(() => storage.close()).not.toThrow();
571
+ });
572
+ });
573
+ });
574
+ //# sourceMappingURL=StorageApiAsync.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StorageApiAsync.test.js","sourceRoot":"","sources":["../../src/tests/StorageApiAsync.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=StorageApiSync.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StorageApiSync.test.d.ts","sourceRoot":"","sources":["../../src/tests/StorageApiSync.test.ts"],"names":[],"mappings":""}