cojson-storage-indexeddb 0.19.18 → 0.19.20

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.
@@ -1,20 +1,25 @@
1
- import { LocalNode, StorageApiAsync } from "cojson";
1
+ import { LocalNode, StorageApiAsync, cojsonInternals } from "cojson";
2
2
  import { WasmCrypto } from "cojson/crypto/WasmCrypto";
3
- import { afterEach, beforeEach, expect, test, vi } from "vitest";
4
- import { getIndexedDBStorage } from "../index.js";
3
+ import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
4
+ import { getIndexedDBStorage, internal_setDatabaseName } from "../index.js";
5
5
  import { toSimplifiedMessages } from "./messagesTestUtils.js";
6
- import { trackMessages, waitFor } from "./testUtils.js";
6
+ import { clearObjectStore, connectToSyncServer, createTestNode, trackMessages, waitFor, } from "./testUtils.js";
7
7
  const Crypto = await WasmCrypto.create();
8
8
  let syncMessages;
9
+ const DATABASE_NAME = "jazz-storage";
10
+ internal_setDatabaseName(DATABASE_NAME);
9
11
  beforeEach(() => {
10
12
  syncMessages = trackMessages();
13
+ cojsonInternals.setSyncStateTrackingBatchDelay(0);
14
+ cojsonInternals.setCoValueLoadingRetryDelay(10);
11
15
  });
12
- afterEach(() => {
16
+ afterEach(async () => {
13
17
  syncMessages.restore();
18
+ cojsonInternals.setSyncStateTrackingBatchDelay(1000);
19
+ await clearObjectStore(DATABASE_NAME, "unsyncedCoValues");
14
20
  });
15
21
  test("should sync and load data from storage", async () => {
16
- const agentSecret = Crypto.newRandomAgentSecret();
17
- const node1 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
22
+ const node1 = createTestNode();
18
23
  node1.setStorage(await getIndexedDBStorage());
19
24
  const group = node1.createGroup();
20
25
  const map = group.createMap();
@@ -31,7 +36,7 @@ test("should sync and load data from storage", async () => {
31
36
  `);
32
37
  node1.gracefulShutdown();
33
38
  syncMessages.clear();
34
- const node2 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
39
+ const node2 = createTestNode({ secret: node1.agentSecret });
35
40
  node2.setStorage(await getIndexedDBStorage());
36
41
  const map2 = await node2.load(map.id);
37
42
  if (map2 === "unavailable") {
@@ -50,8 +55,7 @@ test("should sync and load data from storage", async () => {
50
55
  `);
51
56
  });
52
57
  test("should send an empty content message if there is no content", async () => {
53
- const agentSecret = Crypto.newRandomAgentSecret();
54
- const node1 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
58
+ const node1 = createTestNode();
55
59
  node1.setStorage(await getIndexedDBStorage());
56
60
  const group = node1.createGroup();
57
61
  const map = group.createMap();
@@ -67,7 +71,7 @@ test("should send an empty content message if there is no content", async () =>
67
71
  `);
68
72
  syncMessages.clear();
69
73
  node1.gracefulShutdown();
70
- const node2 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
74
+ const node2 = createTestNode({ secret: node1.agentSecret });
71
75
  node2.setStorage(await getIndexedDBStorage());
72
76
  const map2 = await node2.load(map.id);
73
77
  if (map2 === "unavailable") {
@@ -85,8 +89,7 @@ test("should send an empty content message if there is no content", async () =>
85
89
  `);
86
90
  });
87
91
  test("should load dependencies correctly (group inheritance)", async () => {
88
- const agentSecret = Crypto.newRandomAgentSecret();
89
- const node1 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
92
+ const node1 = createTestNode();
90
93
  node1.setStorage(await getIndexedDBStorage());
91
94
  const group = node1.createGroup();
92
95
  const parentGroup = node1.createGroup();
@@ -108,7 +111,7 @@ test("should load dependencies correctly (group inheritance)", async () => {
108
111
  `);
109
112
  syncMessages.clear();
110
113
  node1.gracefulShutdown();
111
- const node2 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
114
+ const node2 = createTestNode({ secret: node1.agentSecret });
112
115
  node2.setStorage(await getIndexedDBStorage());
113
116
  await node2.load(map.id);
114
117
  expect(node2.expectCoValueLoaded(map.id)).toBeTruthy();
@@ -128,8 +131,7 @@ test("should load dependencies correctly (group inheritance)", async () => {
128
131
  `);
129
132
  });
130
133
  test("should not send the same dependency value twice", async () => {
131
- const agentSecret = Crypto.newRandomAgentSecret();
132
- const node1 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
134
+ const node1 = createTestNode();
133
135
  node1.setStorage(await getIndexedDBStorage());
134
136
  const group = node1.createGroup();
135
137
  const parentGroup = node1.createGroup();
@@ -142,7 +144,7 @@ test("should not send the same dependency value twice", async () => {
142
144
  await mapFromParent.core.waitForSync();
143
145
  syncMessages.clear();
144
146
  node1.gracefulShutdown();
145
- const node2 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
147
+ const node2 = createTestNode({ secret: node1.agentSecret });
146
148
  node2.setStorage(await getIndexedDBStorage());
147
149
  await node2.load(map.id);
148
150
  await node2.load(mapFromParent.id);
@@ -167,8 +169,7 @@ test("should not send the same dependency value twice", async () => {
167
169
  `);
168
170
  });
169
171
  test("should recover from data loss", async () => {
170
- const agentSecret = Crypto.newRandomAgentSecret();
171
- const node1 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
172
+ const node1 = createTestNode();
172
173
  const storage = await getIndexedDBStorage();
173
174
  node1.setStorage(storage);
174
175
  const group = node1.createGroup();
@@ -200,7 +201,7 @@ test("should recover from data loss", async () => {
200
201
  `);
201
202
  syncMessages.clear();
202
203
  node1.gracefulShutdown();
203
- const node2 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
204
+ const node2 = createTestNode({ secret: node1.agentSecret });
204
205
  node2.setStorage(await getIndexedDBStorage());
205
206
  const map2 = await node2.load(map.id);
206
207
  if (map2 === "unavailable") {
@@ -224,15 +225,14 @@ test("should recover from data loss", async () => {
224
225
  `);
225
226
  });
226
227
  test("should sync multiple sessions in a single content message", async () => {
227
- const agentSecret = Crypto.newRandomAgentSecret();
228
- const node1 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
228
+ const node1 = createTestNode();
229
229
  node1.setStorage(await getIndexedDBStorage());
230
230
  const group = node1.createGroup();
231
231
  const map = group.createMap();
232
232
  map.set("hello", "world");
233
233
  await map.core.waitForSync();
234
234
  node1.gracefulShutdown();
235
- const node2 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
235
+ const node2 = createTestNode({ secret: node1.agentSecret });
236
236
  node2.setStorage(await getIndexedDBStorage());
237
237
  const map2 = await node2.load(map.id);
238
238
  if (map2 === "unavailable") {
@@ -242,7 +242,7 @@ test("should sync multiple sessions in a single content message", async () => {
242
242
  map2.set("hello", "world2");
243
243
  await map2.core.waitForSync();
244
244
  node2.gracefulShutdown();
245
- const node3 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
245
+ const node3 = createTestNode({ secret: node1.agentSecret });
246
246
  syncMessages.clear();
247
247
  node3.setStorage(await getIndexedDBStorage());
248
248
  const map3 = await node3.load(map.id);
@@ -262,8 +262,7 @@ test("should sync multiple sessions in a single content message", async () => {
262
262
  `);
263
263
  });
264
264
  test("large coValue upload streaming", async () => {
265
- const agentSecret = Crypto.newRandomAgentSecret();
266
- const node1 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
265
+ const node1 = createTestNode();
267
266
  node1.setStorage(await getIndexedDBStorage());
268
267
  const group = node1.createGroup();
269
268
  const largeMap = group.createMap();
@@ -280,7 +279,7 @@ test("large coValue upload streaming", async () => {
280
279
  await largeMap.core.waitForSync();
281
280
  const knownState = largeMap.core.knownState();
282
281
  node1.gracefulShutdown();
283
- const node2 = new LocalNode(agentSecret, Crypto.newRandomSessionID(Crypto.getAgentID(agentSecret)), Crypto);
282
+ const node2 = createTestNode({ secret: node1.agentSecret });
284
283
  syncMessages.clear();
285
284
  node2.setStorage(await getIndexedDBStorage());
286
285
  const largeMapOnNode2 = await node2.load(largeMap.id);
@@ -355,4 +354,79 @@ test("should sync and load accounts from storage", async () => {
355
354
  `);
356
355
  expect(node2.getCoValue(accountID).isAvailable()).toBeTruthy();
357
356
  });
357
+ describe("sync state persistence", () => {
358
+ test("unsynced coValues are asynchronously persisted to storage", async () => {
359
+ // Client is not connected to a sync server, so sync will not be completed
360
+ const client = createTestNode();
361
+ client.setStorage(await getIndexedDBStorage());
362
+ const group = client.createGroup();
363
+ const map = group.createMap();
364
+ map.set("key", "value");
365
+ // Wait for the unsynced coValues to be persisted to storage
366
+ await new Promise((resolve) => setTimeout(resolve, 500));
367
+ const unsyncedCoValueIDs = await new Promise((resolve) => client.storage?.getUnsyncedCoValueIDs(resolve));
368
+ expect(unsyncedCoValueIDs).toHaveLength(2);
369
+ expect(unsyncedCoValueIDs).toContain(map.id);
370
+ expect(unsyncedCoValueIDs).toContain(group.id);
371
+ await client.gracefulShutdown();
372
+ });
373
+ test("synced coValues are removed from storage", async () => {
374
+ const syncServer = createTestNode();
375
+ const client = createTestNode();
376
+ client.setStorage(await getIndexedDBStorage());
377
+ connectToSyncServer(client, syncServer);
378
+ const group = client.createGroup();
379
+ const map = group.createMap();
380
+ map.set("key", "value");
381
+ // Wait enough time for the coValue to be synced
382
+ await new Promise((resolve) => setTimeout(resolve, 500));
383
+ const unsyncedCoValueIDs = await new Promise((resolve) => client.storage?.getUnsyncedCoValueIDs(resolve));
384
+ expect(unsyncedCoValueIDs).toHaveLength(0);
385
+ expect(client.syncManager.unsyncedTracker.has(map.id)).toBe(false);
386
+ await client.gracefulShutdown();
387
+ await syncServer.gracefulShutdown();
388
+ });
389
+ test("unsynced coValues are persisted to storage when the node is shutdown", async () => {
390
+ const client = createTestNode();
391
+ client.setStorage(await getIndexedDBStorage());
392
+ const group = client.createGroup();
393
+ const map = group.createMap();
394
+ map.set("key", "value");
395
+ // Wait for local transaction to trigger sync
396
+ await new Promise((resolve) => queueMicrotask(resolve));
397
+ await client.gracefulShutdown();
398
+ const unsyncedCoValueIDs = await new Promise((resolve) => client.storage?.getUnsyncedCoValueIDs(resolve));
399
+ expect(unsyncedCoValueIDs).toHaveLength(2);
400
+ expect(unsyncedCoValueIDs).toContain(map.id);
401
+ expect(unsyncedCoValueIDs).toContain(group.id);
402
+ });
403
+ });
404
+ describe("sync resumption", () => {
405
+ test("unsynced coValues are resumed when the node is restarted", async () => {
406
+ // Client is not connected to a sync server, so sync will not be completed
407
+ const node1 = createTestNode();
408
+ const storage = await getIndexedDBStorage();
409
+ node1.setStorage(storage);
410
+ const getUnsyncedCoValueIDsFromStorage = async () => new Promise((resolve) => node1.storage?.getUnsyncedCoValueIDs(resolve));
411
+ const group = node1.createGroup();
412
+ const map = group.createMap();
413
+ map.set("key", "value");
414
+ // Wait for the unsynced coValues to be persisted to storage
415
+ await new Promise((resolve) => setTimeout(resolve, 100));
416
+ const unsyncedTracker = node1.syncManager.unsyncedTracker;
417
+ expect(unsyncedTracker.has(map.id)).toBe(true);
418
+ expect(await getUnsyncedCoValueIDsFromStorage()).toHaveLength(2);
419
+ node1.gracefulShutdown();
420
+ // Create second node with the same storage
421
+ const node2 = createTestNode();
422
+ node2.setStorage(storage);
423
+ // Connect to sync server
424
+ const syncServer = createTestNode();
425
+ connectToSyncServer(node2, syncServer);
426
+ await node2.syncManager.waitForAllCoValuesSync();
427
+ // Wait for sync to resume & complete
428
+ await waitFor(async () => (await getUnsyncedCoValueIDsFromStorage()).length === 0);
429
+ await node2.gracefulShutdown();
430
+ });
431
+ });
358
432
  //# sourceMappingURL=storage.indexeddb.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage.indexeddb.test.js","sourceRoot":"","sources":["../../src/tests/storage.indexeddb.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAExD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;AACzC,IAAI,YAA8C,CAAC;AAEnD,UAAU,CAAC,GAAG,EAAE;IACd,YAAY,GAAG,aAAa,EAAE,CAAC;AACjC,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,YAAY,CAAC,OAAO,EAAE,CAAC;AACzB,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;IACxD,MAAM,WAAW,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC;IAElD,MAAM,KAAK,GAAG,IAAI,SAAS,CACzB,WAAW,EACX,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EACzD,MAAM,CACP,CAAC;IACF,KAAK,CAAC,UAAU,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC;IAE9C,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IAE9B,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE1B,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAE7B,MAAM,CACJ,oBAAoB,CAClB;QACE,GAAG,EAAE,GAAG,CAAC,IAAI;QACb,KAAK,EAAE,KAAK,CAAC,IAAI;KAClB,EACD,YAAY,CAAC,QAAQ,CACtB,CACF,CAAC,qBAAqB,CAAC;;;;;GAKvB,CAAC,CAAC;IAEH,KAAK,CAAC,gBAAgB,EAAE,CAAC;IACzB,YAAY,CAAC,KAAK,EAAE,CAAC;IAErB,MAAM,KAAK,GAAG,IAAI,SAAS,CACzB,WAAW,EACX,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EACzD,MAAM,CACP,CAAC;IAEF,KAAK,CAAC,UAAU,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC;IAE9C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACtC,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAExC,MAAM,CACJ,oBAAoB,CAClB;QACE,GAAG,EAAE,GAAG,CAAC,IAAI;QACb,KAAK,EAAE,KAAK,CAAC,IAAI;KAClB,EACD,YAAY,CAAC,QAAQ,CACtB,CACF,CAAC,qBAAqB,CAAC;;;;;;GAMvB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;IAC7E,MAAM,WAAW,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC;IAElD,MAAM,KAAK,GAAG,IAAI,SAAS,CACzB,WAAW,EACX,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EACzD,MAAM,CACP,CAAC;IAEF,KAAK,CAAC,UAAU,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC;IAE9C,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IAE9B,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAE7B,MAAM,CACJ,oBAAoB,CAClB;QACE,GAAG,EAAE,GAAG,CAAC,IAAI;QACb,KAAK,EAAE,KAAK,CAAC,IAAI;KAClB,EACD,YAAY,CAAC,QAAQ,CACtB,CACF,CAAC,qBAAqB,CAAC;;;;;GAKvB,CAAC,CAAC;IAEH,YAAY,CAAC,KAAK,EAAE,CAAC;IACrB,KAAK,CAAC,gBAAgB,EAAE,CAAC;IAEzB,MAAM,KAAK,GAAG,IAAI,SAAS,CACzB,WAAW,EACX,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EACzD,MAAM,CACP,CAAC;IAEF,KAAK,CAAC,UAAU,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC;IAE9C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACtC,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,CACJ,oBAAoB,CAClB;QACE,GAAG,EAAE,GAAG,CAAC,IAAI;QACb,KAAK,EAAE,KAAK,CAAC,IAAI;KAClB,EACD,YAAY,CAAC,QAAQ,CACtB,CACF,CAAC,qBAAqB,CAAC;;;;;;GAMvB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;IACxE,MAAM,WAAW,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC;IAElD,MAAM,KAAK,GAAG,IAAI,SAAS,CACzB,WAAW,EACX,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EACzD,MAAM,CACP,CAAC;IAEF,KAAK,CAAC,UAAU,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAExC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAE1B,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IAE9B,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE1B,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAE7B,MAAM,CACJ,oBAAoB,CAClB;QACE,GAAG,EAAE,GAAG,CAAC,IAAI;QACb,KAAK,EAAE,KAAK,CAAC,IAAI;QACjB,WAAW,EAAE,WAAW,CAAC,IAAI;KAC9B,EACD,YAAY,CAAC,QAAQ,CACtB,CACF,CAAC,qBAAqB,CAAC;;;;;;;GAOvB,CAAC,CAAC;IAEH,YAAY,CAAC,KAAK,EAAE,CAAC;IACrB,KAAK,CAAC,gBAAgB,EAAE,CAAC;IAEzB,MAAM,KAAK,GAAG,IAAI,SAAS,CACzB,WAAW,EACX,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EACzD,MAAM,CACP,CAAC;IAEF,KAAK,CAAC,UAAU,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC;IAE9C,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEzB,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IACvD,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IACzD,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IAE/D,MAAM,CACJ,oBAAoB,CAClB;QACE,GAAG,EAAE,GAAG,CAAC,IAAI;QACb,KAAK,EAAE,KAAK,CAAC,IAAI;QACjB,WAAW,EAAE,WAAW,CAAC,IAAI;KAC9B,EACD,YAAY,CAAC,QAAQ,CACtB,CACF,CAAC,qBAAqB,CAAC;;;;;;;GAOvB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;IACjE,MAAM,WAAW,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC;IAElD,MAAM,KAAK,GAAG,IAAI,SAAS,CACzB,WAAW,EACX,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EACzD,MAAM,CACP,CAAC;IAEF,KAAK,CAAC,UAAU,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC;IAE9C,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAExC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAE1B,MAAM,aAAa,GAAG,WAAW,CAAC,SAAS,EAAE,CAAC;IAC9C,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IAE9B,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1B,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEpC,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAC7B,MAAM,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAEvC,YAAY,CAAC,KAAK,EAAE,CAAC;IACrB,KAAK,CAAC,gBAAgB,EAAE,CAAC;IAEzB,MAAM,KAAK,GAAG,IAAI,SAAS,CACzB,WAAW,EACX,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EACzD,MAAM,CACP,CAAC;IAEF,KAAK,CAAC,UAAU,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC;IAE9C,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACzB,MAAM,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAEnC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IACvD,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IACjE,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IACzD,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IAE/D,MAAM,CACJ,oBAAoB,CAClB;QACE,GAAG,EAAE,GAAG,CAAC,IAAI;QACb,KAAK,EAAE,KAAK,CAAC,IAAI;QACjB,WAAW,EAAE,WAAW,CAAC,IAAI;QAC7B,aAAa,EAAE,aAAa,CAAC,IAAI;KAClC,EACD,YAAY,CAAC,QAAQ,CACtB,CACF,CAAC,qBAAqB,CAAC;;;;;;;;;GASvB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;IAC/C,MAAM,WAAW,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC;IAElD,MAAM,KAAK,GAAG,IAAI,SAAS,CACzB,WAAW,EACX,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EACzD,MAAM,CACP,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAC5C,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAE1B,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAElC,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IAE9B,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAEhB,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAE7B,MAAM,IAAI,GAAG,EAAE;SACZ,KAAK,CAAC,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC;SACzC,kBAAkB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAExD,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAChB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAEhB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAEzD,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjD,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAEjD,IAAI,CAAC,SAAS,EAAE,CAAC;IAEjB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAEhB,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAE7B,MAAM,CACJ,oBAAoB,CAClB;QACE,GAAG,EAAE,GAAG,CAAC,IAAI;QACb,KAAK,EAAE,KAAK,CAAC,IAAI;KAClB,EACD,YAAY,CAAC,QAAQ,CACtB,CACF,CAAC,qBAAqB,CAAC;;;;;;;;GAQvB,CAAC,CAAC;IAEH,YAAY,CAAC,KAAK,EAAE,CAAC;IACrB,KAAK,CAAC,gBAAgB,EAAE,CAAC;IAEzB,MAAM,KAAK,GAAG,IAAI,SAAS,CACzB,WAAW,EACX,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EACzD,MAAM,CACP,CAAC;IAEF,KAAK,CAAC,UAAU,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC;IAE9C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEtC,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC;QAC5B,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,CAAC;KACP,CAAC,CAAC;IAEH,MAAM,CACJ,oBAAoB,CAClB;QACE,GAAG,EAAE,GAAG,CAAC,IAAI;QACb,KAAK,EAAE,KAAK,CAAC,IAAI;KAClB,EACD,YAAY,CAAC,QAAQ,CACtB,CACF,CAAC,qBAAqB,CAAC;;;;;;GAMvB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;IAC3E,MAAM,WAAW,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC;IAElD,MAAM,KAAK,GAAG,IAAI,SAAS,CACzB,WAAW,EACX,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EACzD,MAAM,CACP,CAAC;IAEF,KAAK,CAAC,UAAU,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC;IAE9C,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAElC,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IAE9B,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE1B,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAE7B,KAAK,CAAC,gBAAgB,EAAE,CAAC;IAEzB,MAAM,KAAK,GAAG,IAAI,SAAS,CACzB,WAAW,EACX,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EACzD,MAAM,CACP,CAAC;IAEF,KAAK,CAAC,UAAU,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC;IAE9C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACtC,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAExC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE5B,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAE9B,KAAK,CAAC,gBAAgB,EAAE,CAAC;IAEzB,MAAM,KAAK,GAAG,IAAI,SAAS,CACzB,WAAW,EACX,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EACzD,MAAM,CACP,CAAC;IAEF,YAAY,CAAC,KAAK,EAAE,CAAC;IAErB,KAAK,CAAC,UAAU,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC;IAE9C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACtC,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEzC,MAAM,CACJ,oBAAoB,CAClB;QACE,GAAG,EAAE,GAAG,CAAC,IAAI;QACb,KAAK,EAAE,KAAK,CAAC,IAAI;KAClB,EACD,YAAY,CAAC,QAAQ,CACtB,CACF,CAAC,qBAAqB,CAAC;;;;;;GAMvB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;IAChD,MAAM,WAAW,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC;IAElD,MAAM,KAAK,GAAG,IAAI,SAAS,CACzB,WAAW,EACX,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EACzD,MAAM,CACP,CAAC;IAEF,KAAK,CAAC,UAAU,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC;IAE9C,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IAEnC,gDAAgD;IAChD,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,aAAa;IACrC,MAAM,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IAEpC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC;QACtB,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IACvC,CAAC;IAED,uCAAuC;IACvC,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAElC,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;IAE9C,KAAK,CAAC,gBAAgB,EAAE,CAAC;IAEzB,MAAM,KAAK,GAAG,IAAI,SAAS,CACzB,WAAW,EACX,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EACzD,MAAM,CACP,CAAC;IAEF,YAAY,CAAC,KAAK,EAAE,CAAC;IAErB,KAAK,CAAC,UAAU,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC;IAE9C,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEtD,IAAI,eAAe,KAAK,aAAa,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,OAAO,CAAC,GAAG,EAAE;QACjB,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAE9D,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,MAAM,CACJ,oBAAoB,CAClB;QACE,GAAG,EAAE,QAAQ,CAAC,IAAI;QAClB,KAAK,EAAE,KAAK,CAAC,IAAI;KAClB,EACD,YAAY,CAAC,QAAQ,CACtB,CACF,CAAC,qBAAqB,CAAC;;;;;;;;GAQvB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;IAC5D,MAAM,WAAW,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC;IAElD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,SAAS,CAAC,uBAAuB,CAAC;QACzE,MAAM,EAAE,MAAM;QACd,kBAAkB,EAAE,WAAW;QAC/B,OAAO,EAAE,MAAM,mBAAmB,EAAE;QACpC,aAAa,EAAE;YACb,IAAI,EAAE,MAAM;SACb;KACF,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC;IAEnC,MAAM,CACJ,oBAAoB,CAClB;QACE,OAAO,EAAE,QAAQ;QACjB,OAAO,EAAE,OAAO,CAAC,IAAI;QACrB,YAAY,EAAE,YAAY,CAAC,IAAI;KAChC,EACD,YAAY,CAAC,QAAQ,CACtB,CACF,CAAC,qBAAqB,CAAC;;;;;;;GAOvB,CAAC,CAAC;IAEH,KAAK,CAAC,gBAAgB,EAAE,CAAC;IACzB,YAAY,CAAC,OAAO,EAAE,CAAC;IACvB,YAAY,GAAG,aAAa,EAAE,CAAC;IAE/B,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,iBAAiB,CAAC;QAC9C,MAAM,EAAE,MAAM;QACd,aAAa,EAAE,WAAW;QAC1B,SAAS;QACT,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,MAAM,mBAAmB,EAAE;QACpC,SAAS,EAAE,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;KACrE,CAAC,CAAC;IAEH,MAAM,CACJ,oBAAoB,CAClB;QACE,OAAO,EAAE,QAAQ;QACjB,OAAO,EAAE,OAAO,CAAC,IAAI;QACrB,YAAY,EAAE,YAAY,CAAC,IAAI;KAChC,EACD,YAAY,CAAC,QAAQ,CACtB,CACF,CAAC,qBAAqB,CAAC;;;;;;;;GAQvB,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;AACjE,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"storage.indexeddb.test.js","sourceRoot":"","sources":["../../src/tests/storage.indexeddb.test.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- import type { SyncMessage } from "cojson";
1
+ import type { AgentSecret, SessionID, SyncMessage } from "cojson";
2
+ import { ControlledAgent, LocalNode } from "cojson";
2
3
  export declare function trackMessages(): {
3
4
  messages: {
4
5
  from: "client" | "server" | "storage";
@@ -8,4 +9,10 @@ export declare function trackMessages(): {
8
9
  clear: () => void;
9
10
  };
10
11
  export declare function waitFor(callback: () => boolean | undefined | Promise<boolean | undefined>): Promise<void>;
12
+ export declare function clearObjectStore(dbName: string, storeName: string): Promise<void>;
13
+ export declare function getAgentAndSessionID(secret?: AgentSecret): [ControlledAgent, SessionID];
14
+ export declare function createTestNode(opts?: {
15
+ secret?: AgentSecret;
16
+ }): LocalNode;
17
+ export declare function connectToSyncServer(client: LocalNode, syncServer: LocalNode): void;
11
18
  //# sourceMappingURL=testUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../src/tests/testUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,WAAW,EAAE,MAAM,QAAQ,CAAC;AAInD,wBAAgB,aAAa;;cAEnB,QAAQ,GAAG,QAAQ,GAAG,SAAS;aAChC,WAAW;;;;EA+EnB;AAED,wBAAgB,OAAO,CACrB,QAAQ,EAAE,MAAM,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,iBA2BnE"}
1
+ {"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../src/tests/testUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAW,SAAS,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC3E,OAAO,EAEL,eAAe,EACf,SAAS,EAEV,MAAM,QAAQ,CAAC;AAIhB,wBAAgB,aAAa;;cAEnB,QAAQ,GAAG,QAAQ,GAAG,SAAS;aAChC,WAAW;;;;EA+EnB;AAED,wBAAgB,OAAO,CACrB,QAAQ,EAAE,MAAM,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,iBA2BnE;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAsCf;AAID,wBAAgB,oBAAoB,CAClC,MAAM,GAAE,WAA2C,GAClD,CAAC,eAAe,EAAE,SAAS,CAAC,CAG9B;AAED,wBAAgB,cAAc,CAAC,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,aAG7D;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,SAAS,GACpB,IAAI,CAaN"}
@@ -1,4 +1,5 @@
1
- import { StorageApiAsync } from "cojson";
1
+ import { cojsonInternals, ControlledAgent, LocalNode, StorageApiAsync, } from "cojson";
2
+ import { WasmCrypto } from "cojson/crypto/WasmCrypto";
2
3
  import { onTestFinished } from "vitest";
3
4
  export function trackMessages() {
4
5
  const messages = [];
@@ -89,4 +90,52 @@ export function waitFor(callback) {
89
90
  }, 100);
90
91
  });
91
92
  }
93
+ export async function clearObjectStore(dbName, storeName) {
94
+ return new Promise((resolve, reject) => {
95
+ const openReq = indexedDB.open(dbName);
96
+ openReq.onerror = () => reject(openReq.error);
97
+ openReq.onsuccess = () => {
98
+ const db = openReq.result;
99
+ if (!db.objectStoreNames.contains(storeName)) {
100
+ db.close();
101
+ resolve();
102
+ return;
103
+ }
104
+ const tx = db.transaction(storeName, "readwrite");
105
+ const store = tx.objectStore(storeName);
106
+ const clearReq = store.clear();
107
+ clearReq.onerror = () => reject(clearReq.error);
108
+ tx.oncomplete = () => {
109
+ db.close();
110
+ resolve();
111
+ };
112
+ tx.onerror = () => {
113
+ db.close();
114
+ reject(tx.error);
115
+ };
116
+ tx.onabort = () => {
117
+ db.close();
118
+ reject(tx.error || new Error("Transaction aborted"));
119
+ };
120
+ };
121
+ });
122
+ }
123
+ const Crypto = await WasmCrypto.create();
124
+ export function getAgentAndSessionID(secret = Crypto.newRandomAgentSecret()) {
125
+ const sessionID = Crypto.newRandomSessionID(Crypto.getAgentID(secret));
126
+ return [new ControlledAgent(secret, Crypto), sessionID];
127
+ }
128
+ export function createTestNode(opts) {
129
+ const [admin, session] = getAgentAndSessionID(opts?.secret);
130
+ return new LocalNode(admin.agentSecret, session, Crypto);
131
+ }
132
+ export function connectToSyncServer(client, syncServer) {
133
+ const [clientPeer, serverPeer] = cojsonInternals.connectedPeers(client.currentSessionID, syncServer.currentSessionID, {
134
+ peer1role: "client",
135
+ peer2role: "server",
136
+ persistent: true,
137
+ });
138
+ client.syncManager.addPeer(serverPeer);
139
+ syncServer.syncManager.addPeer(clientPeer);
140
+ }
92
141
  //# sourceMappingURL=testUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"testUtils.js","sourceRoot":"","sources":["../../src/tests/testUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"testUtils.js","sourceRoot":"","sources":["../../src/tests/testUtils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "cojson-storage-indexeddb",
3
- "version": "0.19.18",
3
+ "version": "0.19.20",
4
4
  "main": "dist/index.js",
5
5
  "type": "module",
6
6
  "types": "dist/index.d.ts",
7
7
  "license": "MIT",
8
8
  "dependencies": {
9
- "cojson": "0.19.18"
9
+ "cojson": "0.19.20"
10
10
  },
11
11
  "devDependencies": {
12
12
  "typescript": "5.6.2",
@@ -2,13 +2,22 @@ export type StoreName =
2
2
  | "coValues"
3
3
  | "sessions"
4
4
  | "transactions"
5
- | "signatureAfter";
6
-
7
- // A access unit for the IndexedDB Jazz database
8
- // It's a wrapper around the IDBTransaction object that helps on batching multiple operations
9
- // in a single transaction.
5
+ | "signatureAfter"
6
+ | "unsyncedCoValues";
7
+
8
+ const DEFAULT_TX_STORES: StoreName[] = [
9
+ "coValues",
10
+ "sessions",
11
+ "transactions",
12
+ "signatureAfter",
13
+ ];
14
+
15
+ /**
16
+ * An access unit for the IndexedDB Jazz database.
17
+ * It's a wrapper around the IDBTransaction object that helps on batching multiple operations
18
+ * in a single transaction.
19
+ */
10
20
  export class CoJsonIDBTransaction {
11
- db: IDBDatabase;
12
21
  declare tx: IDBTransaction;
13
22
 
14
23
  pendingRequests: ((txEntry: this) => void)[] = [];
@@ -20,17 +29,16 @@ export class CoJsonIDBTransaction {
20
29
  failed = false;
21
30
  done = false;
22
31
 
23
- constructor(db: IDBDatabase) {
24
- this.db = db;
25
-
32
+ constructor(
33
+ public db: IDBDatabase,
34
+ // The object stores this transaction will operate on
35
+ private storeNames: StoreName[] = DEFAULT_TX_STORES,
36
+ ) {
26
37
  this.refresh();
27
38
  }
28
39
 
29
40
  refresh() {
30
- this.tx = this.db.transaction(
31
- ["coValues", "sessions", "transactions", "signatureAfter"],
32
- "readwrite",
33
- );
41
+ this.tx = this.db.transaction(this.storeNames, "readwrite");
34
42
 
35
43
  this.tx.oncomplete = () => {
36
44
  this.done = true;
@@ -44,12 +52,6 @@ export class CoJsonIDBTransaction {
44
52
  this.tx.abort();
45
53
  }
46
54
 
47
- startedAt = performance.now();
48
- isReusable() {
49
- const delta = performance.now() - this.startedAt;
50
- return !this.done && !this.failed && delta <= 100;
51
- }
52
-
53
55
  getObjectStore(name: StoreName) {
54
56
  try {
55
57
  return this.tx.objectStore(name);
package/src/idbClient.ts CHANGED
@@ -17,12 +17,13 @@ import {
17
17
  CoJsonIDBTransaction,
18
18
  putIndexedDbStore,
19
19
  queryIndexedDbStore,
20
+ StoreName,
20
21
  } from "./CoJsonIDBTransaction.js";
21
22
 
22
23
  export class IDBTransaction implements DBTransactionInterfaceAsync {
23
24
  constructor(private tx: CoJsonIDBTransaction) {}
24
25
 
25
- run<T>(
26
+ private async run<T>(
26
27
  handler: (txEntry: CoJsonIDBTransaction) => IDBRequest<T>,
27
28
  ): Promise<T> {
28
29
  return this.tx.handleRequest<T>(handler);
@@ -91,6 +92,55 @@ export class IDBTransaction implements DBTransactionInterfaceAsync {
91
92
  }),
92
93
  );
93
94
  }
95
+
96
+ /**
97
+ * Get an unsynced CoValue record by coValueId and peerId.
98
+ */
99
+ async getUnsyncedCoValueRecord(
100
+ coValueId: RawCoID,
101
+ peerId: string,
102
+ ): Promise<
103
+ { rowID: number; coValueId: RawCoID; peerId: string } | undefined
104
+ > {
105
+ return this.run((tx) =>
106
+ tx
107
+ .getObjectStore("unsyncedCoValues")
108
+ .index("uniqueUnsyncedCoValues")
109
+ .get([coValueId, peerId]),
110
+ );
111
+ }
112
+
113
+ /**
114
+ * Get all unsynced CoValue records for a given coValueId.
115
+ */
116
+ async getAllUnsyncedCoValueRecords(
117
+ coValueId: RawCoID,
118
+ ): Promise<{ rowID: number; coValueId: RawCoID; peerId: string }[]> {
119
+ return this.run((tx) =>
120
+ tx
121
+ .getObjectStore("unsyncedCoValues")
122
+ .index("byCoValueId")
123
+ .getAll(coValueId),
124
+ );
125
+ }
126
+
127
+ /**
128
+ * Delete an unsynced CoValue record by rowID.
129
+ */
130
+ async deleteUnsyncedCoValueRecord(rowID: number): Promise<void> {
131
+ await this.run((tx) => tx.getObjectStore("unsyncedCoValues").delete(rowID));
132
+ }
133
+
134
+ /**
135
+ * Insert or update an unsynced CoValue record.
136
+ */
137
+ async putUnsyncedCoValueRecord(record: {
138
+ rowID?: number;
139
+ coValueId: RawCoID;
140
+ peerId: string;
141
+ }): Promise<void> {
142
+ await this.run((tx) => tx.getObjectStore("unsyncedCoValues").put(record));
143
+ }
94
144
  }
95
145
 
96
146
  export class IDBClient implements DBClientInterfaceAsync {
@@ -161,8 +211,9 @@ export class IDBClient implements DBClientInterfaceAsync {
161
211
 
162
212
  async transaction(
163
213
  operationsCallback: (tx: DBTransactionInterfaceAsync) => Promise<unknown>,
214
+ storeNames?: StoreName[],
164
215
  ) {
165
- const tx = new CoJsonIDBTransaction(this.db);
216
+ const tx = new CoJsonIDBTransaction(this.db, storeNames);
166
217
 
167
218
  try {
168
219
  await operationsCallback(new IDBTransaction(tx));
@@ -171,4 +222,73 @@ export class IDBClient implements DBClientInterfaceAsync {
171
222
  tx.rollback();
172
223
  }
173
224
  }
225
+
226
+ async trackCoValuesSyncState(
227
+ updates: { id: RawCoID; peerId: string; synced: boolean }[],
228
+ ): Promise<void> {
229
+ if (updates.length === 0) {
230
+ return;
231
+ }
232
+
233
+ await this.transaction(
234
+ async (tx) => {
235
+ const idbTx = tx as IDBTransaction;
236
+ await Promise.all(
237
+ updates.map(async (update) => {
238
+ const record = await idbTx.getUnsyncedCoValueRecord(
239
+ update.id,
240
+ update.peerId,
241
+ );
242
+ if (update.synced) {
243
+ // Delete
244
+ if (record) {
245
+ await idbTx.deleteUnsyncedCoValueRecord(record.rowID);
246
+ }
247
+ } else {
248
+ // Insert or update
249
+ await idbTx.putUnsyncedCoValueRecord(
250
+ record
251
+ ? {
252
+ rowID: record.rowID,
253
+ coValueId: update.id,
254
+ peerId: update.peerId,
255
+ }
256
+ : {
257
+ coValueId: update.id,
258
+ peerId: update.peerId,
259
+ },
260
+ );
261
+ }
262
+ }),
263
+ );
264
+ },
265
+ ["unsyncedCoValues"],
266
+ );
267
+ }
268
+
269
+ async getUnsyncedCoValueIDs(): Promise<RawCoID[]> {
270
+ const records = await queryIndexedDbStore<
271
+ { rowID: number; coValueId: RawCoID; peerId: string }[]
272
+ >(this.db, "unsyncedCoValues", (store) => store.getAll());
273
+ const uniqueIds = new Set<RawCoID>();
274
+ for (const record of records) {
275
+ uniqueIds.add(record.coValueId);
276
+ }
277
+ return Array.from(uniqueIds);
278
+ }
279
+
280
+ async stopTrackingSyncState(id: RawCoID): Promise<void> {
281
+ await this.transaction(
282
+ async (tx) => {
283
+ const idbTx = tx as IDBTransaction;
284
+ const records = await idbTx.getAllUnsyncedCoValueRecords(id);
285
+ await Promise.all(
286
+ records.map((record) =>
287
+ idbTx.deleteUnsyncedCoValueRecord(record.rowID),
288
+ ),
289
+ );
290
+ },
291
+ ["unsyncedCoValues"],
292
+ );
293
+ }
174
294
  }