@rocicorp/zero 0.25.0-canary.3 → 0.25.0-canary.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 (49) hide show
  1. package/out/{chunk-SRLXXPNB.js → chunk-3KJ5OEIB.js} +4 -4
  2. package/out/chunk-ASRS2LFV.js +35 -0
  3. package/out/chunk-ASRS2LFV.js.map +7 -0
  4. package/out/{chunk-RYFBHAD4.js → chunk-ECUMGQGC.js} +4 -17
  5. package/out/chunk-ECUMGQGC.js.map +7 -0
  6. package/out/{chunk-U2KJIWVC.js → chunk-EZM3XBAB.js} +2 -47
  7. package/out/chunk-EZM3XBAB.js.map +7 -0
  8. package/out/{chunk-IWL6EEA6.js → chunk-HE4M4K7Q.js} +585 -71
  9. package/out/chunk-HE4M4K7Q.js.map +7 -0
  10. package/out/{chunk-JKP7HDC6.js → chunk-TAUDS4QP.js} +48 -7
  11. package/out/chunk-TAUDS4QP.js.map +7 -0
  12. package/out/{chunk-5H7WNLPK.js → chunk-ZZXMKAAG.js} +2 -2
  13. package/out/expo-sqlite.js +4 -4
  14. package/out/{lazy-inspector-4CO3DXP5.js → lazy-inspector-XLKVABX2.js} +6 -6
  15. package/out/op-sqlite.js +3 -3
  16. package/out/react-native.js +4 -4
  17. package/out/react.js +4 -4
  18. package/out/replicache/src/kv/sqlite-store.d.ts +1 -7
  19. package/out/replicache/src/kv/sqlite-store.d.ts.map +1 -1
  20. package/out/replicache/src/sqlite.d.ts +1 -1
  21. package/out/replicache/src/sqlite.d.ts.map +1 -1
  22. package/out/solid.js +5 -5
  23. package/out/sqlite.js +3 -5
  24. package/out/zero/package.json +1 -1
  25. package/out/zero-cache/src/db/pg-to-lite.d.ts +10 -0
  26. package/out/zero-cache/src/db/pg-to-lite.d.ts.map +1 -1
  27. package/out/zero-cache/src/db/pg-to-lite.js +16 -2
  28. package/out/zero-cache/src/db/pg-to-lite.js.map +1 -1
  29. package/out/zero-cache/src/services/change-source/column-metadata.d.ts +10 -3
  30. package/out/zero-cache/src/services/change-source/column-metadata.d.ts.map +1 -1
  31. package/out/zero-cache/src/services/change-source/column-metadata.js +26 -13
  32. package/out/zero-cache/src/services/change-source/column-metadata.js.map +1 -1
  33. package/out/zero-cache/src/services/change-source/replica-schema.d.ts.map +1 -1
  34. package/out/zero-cache/src/services/change-source/replica-schema.js +13 -0
  35. package/out/zero-cache/src/services/change-source/replica-schema.js.map +1 -1
  36. package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
  37. package/out/zero-cache/src/services/replicator/change-processor.js +33 -0
  38. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  39. package/out/zero.js +6 -7
  40. package/package.json +1 -1
  41. package/out/chunk-HYS7YLNL.js +0 -575
  42. package/out/chunk-HYS7YLNL.js.map +0 -7
  43. package/out/chunk-IWL6EEA6.js.map +0 -7
  44. package/out/chunk-JKP7HDC6.js.map +0 -7
  45. package/out/chunk-RYFBHAD4.js.map +0 -7
  46. package/out/chunk-U2KJIWVC.js.map +0 -7
  47. /package/out/{chunk-SRLXXPNB.js.map → chunk-3KJ5OEIB.js.map} +0 -0
  48. /package/out/{chunk-5H7WNLPK.js.map → chunk-ZZXMKAAG.js.map} +0 -0
  49. /package/out/{lazy-inspector-4CO3DXP5.js.map → lazy-inspector-XLKVABX2.js.map} +0 -0
@@ -1,16 +1,9 @@
1
1
  import {
2
- IDBDatabasesStore,
3
- IDBStore,
4
- MemStore,
5
- dropIDBStoreWithMemFallback,
6
- dropMemStore,
7
- getBrowserGlobal,
8
- getBrowserGlobalMethod,
9
- localNavigator,
10
- mustGetBrowserGlobal,
11
- newIDBStoreWithMemFallback,
12
- promiseVoid
13
- } from "./chunk-HYS7YLNL.js";
2
+ maybeTransactionIsClosedRejection,
3
+ storeIsClosedRejection,
4
+ throwIfStoreClosed,
5
+ transactionIsClosedRejection
6
+ } from "./chunk-ASRS2LFV.js";
14
7
  import {
15
8
  BTreeRead,
16
9
  Chunk,
@@ -87,6 +80,7 @@ import {
87
80
  localMutations,
88
81
  localMutationsDD31,
89
82
  localMutationsGreaterThan,
83
+ makeClientID,
90
84
  mapAST,
91
85
  mapAllEntries,
92
86
  mapEntries,
@@ -124,26 +118,27 @@ import {
124
118
  toMutationResponseKey,
125
119
  toPrimaryKeyString,
126
120
  toStaticParam,
121
+ using,
127
122
  valita_exports,
123
+ withRead,
124
+ withWrite,
125
+ withWriteNoImplicitCommit,
128
126
  wrapIterable
129
- } from "./chunk-JKP7HDC6.js";
127
+ } from "./chunk-TAUDS4QP.js";
130
128
  import {
131
129
  assert,
132
130
  assertArray,
133
131
  assertBoolean,
132
+ assertNotNull,
134
133
  assertNumber,
135
134
  assertObject,
136
135
  assertString,
137
136
  deepFreeze,
137
+ deepFreezeAllowUndefined,
138
138
  hasOwn,
139
139
  isProd,
140
- makeClientID,
141
- unreachable,
142
- using,
143
- withRead,
144
- withWrite,
145
- withWriteNoImplicitCommit
146
- } from "./chunk-U2KJIWVC.js";
140
+ unreachable
141
+ } from "./chunk-EZM3XBAB.js";
147
142
  import {
148
143
  __export
149
144
  } from "./chunk-424PT5DM.js";
@@ -303,6 +298,262 @@ function assertPullerResultV1(v) {
303
298
  }
304
299
  }
305
300
 
301
+ // ../replicache/src/kv/idb-store.ts
302
+ import { resolver } from "@rocicorp/resolver";
303
+
304
+ // ../shared/src/browser-env.ts
305
+ var overrides = /* @__PURE__ */ new Map();
306
+ function getBrowserGlobal(name) {
307
+ if (overrides.has(name)) {
308
+ return overrides.get(name);
309
+ }
310
+ return globalThis[name];
311
+ }
312
+ function getBrowserGlobalMethod(name) {
313
+ return getBrowserGlobal(name)?.bind(globalThis);
314
+ }
315
+ function mustGetBrowserGlobal(name) {
316
+ const r = getBrowserGlobal(name);
317
+ if (r === void 0) {
318
+ throw new Error(
319
+ `Unsupported JavaScript environment: Could not find ${name}.`
320
+ );
321
+ }
322
+ return r;
323
+ }
324
+
325
+ // ../shared/src/resolved-promises.ts
326
+ var promiseTrue = Promise.resolve(true);
327
+ var promiseFalse = Promise.resolve(false);
328
+ var promiseUndefined = Promise.resolve(void 0);
329
+ var promiseVoid = Promise.resolve();
330
+ var promiseNever = new Promise(() => {
331
+ });
332
+
333
+ // ../replicache/src/kv/write-impl-base.ts
334
+ var deleteSentinel = Symbol();
335
+ var WriteImplBase = class {
336
+ _pending = /* @__PURE__ */ new Map();
337
+ #read;
338
+ constructor(read) {
339
+ this.#read = read;
340
+ }
341
+ has(key) {
342
+ if (this.#read.closed) {
343
+ return transactionIsClosedRejection();
344
+ }
345
+ switch (this._pending.get(key)) {
346
+ case void 0:
347
+ return this.#read.has(key);
348
+ case deleteSentinel:
349
+ return promiseFalse;
350
+ default:
351
+ return promiseTrue;
352
+ }
353
+ }
354
+ async get(key) {
355
+ if (this.#read.closed) {
356
+ return transactionIsClosedRejection();
357
+ }
358
+ const v = this._pending.get(key);
359
+ switch (v) {
360
+ case deleteSentinel:
361
+ return void 0;
362
+ case void 0: {
363
+ const v2 = await this.#read.get(key);
364
+ return deepFreezeAllowUndefined(v2);
365
+ }
366
+ default:
367
+ return v;
368
+ }
369
+ }
370
+ put(key, value) {
371
+ return maybeTransactionIsClosedRejection(this.#read) ?? (this._pending.set(key, deepFreeze(value)), promiseVoid);
372
+ }
373
+ del(key) {
374
+ return maybeTransactionIsClosedRejection(this.#read) ?? (this._pending.set(key, deleteSentinel), promiseVoid);
375
+ }
376
+ release() {
377
+ this.#read.release();
378
+ }
379
+ get closed() {
380
+ return this.#read.closed;
381
+ }
382
+ };
383
+
384
+ // ../replicache/src/kv/idb-store.ts
385
+ var RELAXED = { durability: "relaxed" };
386
+ var OBJECT_STORE = "chunks";
387
+ var IDBStore = class {
388
+ #db;
389
+ #closed = false;
390
+ #idbDeleted = false;
391
+ constructor(name) {
392
+ this.#db = openDatabase(name);
393
+ }
394
+ read() {
395
+ if (this.#closed) {
396
+ return storeIsClosedRejection();
397
+ }
398
+ return this.#withReopen(readImpl);
399
+ }
400
+ write() {
401
+ if (this.#closed) {
402
+ return storeIsClosedRejection();
403
+ }
404
+ return this.#withReopen(writeImpl);
405
+ }
406
+ async close() {
407
+ if (!this.#idbDeleted) {
408
+ const db = await this.#db;
409
+ db.close();
410
+ }
411
+ this.#closed = true;
412
+ }
413
+ get closed() {
414
+ return this.#closed;
415
+ }
416
+ async #withReopen(fn) {
417
+ const reopenExistingDB = async (name) => {
418
+ const { promise, resolve, reject } = resolver();
419
+ const req = indexedDB.open(name);
420
+ req.onupgradeneeded = () => {
421
+ const tx = req.transaction;
422
+ assertNotNull(tx);
423
+ tx.abort();
424
+ this.#idbDeleted = true;
425
+ reject(
426
+ new IDBNotFoundError(
427
+ `Expected IndexedDB not found: ${name}. This likely means that the user deleted IndexedDB instances while the app was running. This is non-fatal. The app will continue running in memory until reload.`
428
+ )
429
+ );
430
+ };
431
+ req.onsuccess = () => resolve(req.result);
432
+ req.onerror = () => reject(req.error);
433
+ const db2 = await promise;
434
+ db2.onversionchange = () => db2.close();
435
+ return db2;
436
+ };
437
+ const db = await this.#db;
438
+ try {
439
+ return fn(db);
440
+ } catch (e) {
441
+ if (!this.#closed && e instanceof DOMException) {
442
+ if (e.name === "InvalidStateError") {
443
+ this.#db = reopenExistingDB(db.name);
444
+ const reopened = await this.#db;
445
+ return fn(reopened);
446
+ } else if (e.name === "NotFoundError") {
447
+ this.#idbDeleted = true;
448
+ mustGetBrowserGlobal("indexedDB").deleteDatabase(db.name);
449
+ throw new IDBNotFoundError(
450
+ `Expected IndexedDB ${db.name} missing object store. Deleting db. This is non-fatal, the app will continue working in memory until it is reloaded.`
451
+ );
452
+ }
453
+ }
454
+ throw e;
455
+ }
456
+ }
457
+ };
458
+ var ReadImpl = class {
459
+ #tx;
460
+ #closed = false;
461
+ constructor(tx) {
462
+ this.#tx = tx;
463
+ }
464
+ has(key) {
465
+ if (this.#closed) {
466
+ return transactionIsClosedRejection();
467
+ }
468
+ return new Promise((resolve, reject) => {
469
+ const req = objectStore(this.#tx).count(key);
470
+ req.onsuccess = () => resolve(req.result > 0);
471
+ req.onerror = () => reject(req.error);
472
+ });
473
+ }
474
+ get(key) {
475
+ if (this.#closed) {
476
+ return transactionIsClosedRejection();
477
+ }
478
+ return new Promise((resolve, reject) => {
479
+ const req = objectStore(this.#tx).get(key);
480
+ req.onsuccess = () => resolve(deepFreezeAllowUndefined(req.result));
481
+ req.onerror = () => reject(req.error);
482
+ });
483
+ }
484
+ release() {
485
+ this.#closed = true;
486
+ }
487
+ get closed() {
488
+ return this.#closed;
489
+ }
490
+ };
491
+ var WriteImpl = class extends WriteImplBase {
492
+ #tx;
493
+ #closed = false;
494
+ constructor(tx) {
495
+ super(new ReadImpl(tx));
496
+ this.#tx = tx;
497
+ }
498
+ commit() {
499
+ if (this.#closed) {
500
+ return transactionIsClosedRejection();
501
+ }
502
+ if (this._pending.size === 0) {
503
+ return promiseVoid;
504
+ }
505
+ return new Promise((resolve, reject) => {
506
+ const tx = this.#tx;
507
+ const store = objectStore(tx);
508
+ for (const [key, val] of this._pending) {
509
+ if (val === deleteSentinel) {
510
+ store.delete(key);
511
+ } else {
512
+ store.put(val, key);
513
+ }
514
+ }
515
+ tx.oncomplete = () => resolve();
516
+ tx.onerror = () => reject(tx.error);
517
+ });
518
+ }
519
+ release() {
520
+ this.#closed = true;
521
+ super.release();
522
+ }
523
+ get closed() {
524
+ return this.#closed;
525
+ }
526
+ };
527
+ function writeImpl(db) {
528
+ const tx = db.transaction(OBJECT_STORE, "readwrite", RELAXED);
529
+ return new WriteImpl(tx);
530
+ }
531
+ function readImpl(db) {
532
+ const tx = db.transaction(OBJECT_STORE, "readonly");
533
+ return new ReadImpl(tx);
534
+ }
535
+ function objectStore(tx) {
536
+ return tx.objectStore(OBJECT_STORE);
537
+ }
538
+ function openDatabase(name) {
539
+ const idb = mustGetBrowserGlobal("indexedDB");
540
+ return new Promise((resolve, reject) => {
541
+ const req = idb.open(name);
542
+ req.onupgradeneeded = () => {
543
+ req.result.createObjectStore(OBJECT_STORE);
544
+ };
545
+ req.onsuccess = () => {
546
+ const db = req.result;
547
+ db.onversionchange = () => db.close();
548
+ resolve(db);
549
+ };
550
+ req.onerror = () => reject(req.error);
551
+ });
552
+ }
553
+ var IDBNotFoundError = class extends Error {
554
+ name = "IDBNotFoundError";
555
+ };
556
+
306
557
  // ../replicache/src/make-idb-name.ts
307
558
  function makeIDBName(name, schemaVersion) {
308
559
  return makeIDBNameInternal(name, schemaVersion, Latest);
@@ -318,9 +569,9 @@ var AbortError = class extends Error {
318
569
  };
319
570
 
320
571
  // ../shared/src/sleep.ts
321
- import { resolver } from "@rocicorp/resolver";
572
+ import { resolver as resolver2 } from "@rocicorp/resolver";
322
573
  var promiseVoid2 = Promise.resolve();
323
- var promiseNever = new Promise(() => void 0);
574
+ var promiseNever2 = new Promise(() => void 0);
324
575
  function sleep(ms, signal) {
325
576
  const newAbortError = () => new AbortError("Aborted");
326
577
  if (signal?.aborted) {
@@ -346,9 +597,9 @@ function sleep(ms, signal) {
346
597
  }
347
598
  function sleepWithAbort(ms, signal) {
348
599
  if (ms === 0) {
349
- return [promiseVoid2, promiseNever];
600
+ return [promiseVoid2, promiseNever2];
350
601
  }
351
- const { promise: abortedPromise, resolve: abortedResolve } = resolver();
602
+ const { promise: abortedPromise, resolve: abortedResolve } = resolver2();
352
603
  const sleepPromise = new Promise((resolve) => {
353
604
  const handleAbort = () => {
354
605
  clearTimeout(id);
@@ -534,10 +785,10 @@ var StoreImpl = class {
534
785
  this.#assertValidHash = assertValidHash;
535
786
  }
536
787
  async read() {
537
- return new ReadImpl(await this.#kv.read(), this.#assertValidHash);
788
+ return new ReadImpl2(await this.#kv.read(), this.#assertValidHash);
538
789
  }
539
790
  async write() {
540
- return new WriteImpl(
791
+ return new WriteImpl2(
541
792
  await this.#kv.write(),
542
793
  this.#chunkHasher,
543
794
  this.#assertValidHash
@@ -547,7 +798,7 @@ var StoreImpl = class {
547
798
  return this.#kv.close();
548
799
  }
549
800
  };
550
- var ReadImpl = class {
801
+ var ReadImpl2 = class {
551
802
  _tx;
552
803
  assertValidHash;
553
804
  constructor(kv, assertValidHash) {
@@ -590,7 +841,7 @@ var ReadImpl = class {
590
841
  return this._tx.closed;
591
842
  }
592
843
  };
593
- var WriteImpl = class extends ReadImpl {
844
+ var WriteImpl2 = class extends ReadImpl2 {
594
845
  #chunkHasher;
595
846
  #putChunks = /* @__PURE__ */ new Set();
596
847
  #changedHeads = /* @__PURE__ */ new Map();
@@ -786,6 +1037,175 @@ async function confirmDeletedClients(dagWrite, deletedClientIds, deletedClientGr
786
1037
  );
787
1038
  }
788
1039
 
1040
+ // ../shared/src/navigator.ts
1041
+ var localNavigator = typeof navigator !== "undefined" ? navigator : void 0;
1042
+
1043
+ // ../replicache/src/kv/mem-store.ts
1044
+ import { RWLock } from "@rocicorp/lock";
1045
+
1046
+ // ../replicache/src/kv/read-impl.ts
1047
+ var ReadImpl3 = class {
1048
+ #map;
1049
+ #release;
1050
+ #closed = false;
1051
+ constructor(map, release) {
1052
+ this.#map = map;
1053
+ this.#release = release;
1054
+ }
1055
+ release() {
1056
+ this.#release();
1057
+ this.#closed = true;
1058
+ }
1059
+ get closed() {
1060
+ return this.#closed;
1061
+ }
1062
+ has(key) {
1063
+ return maybeTransactionIsClosedRejection(this) ?? Promise.resolve(this.#map.has(key));
1064
+ }
1065
+ get(key) {
1066
+ return maybeTransactionIsClosedRejection(this) ?? Promise.resolve(this.#map.get(key));
1067
+ }
1068
+ };
1069
+
1070
+ // ../replicache/src/kv/write-impl.ts
1071
+ var WriteImpl3 = class extends WriteImplBase {
1072
+ #map;
1073
+ constructor(map, release) {
1074
+ super(new ReadImpl3(map, release));
1075
+ this.#map = map;
1076
+ }
1077
+ commit() {
1078
+ if (this.closed) {
1079
+ return transactionIsClosedRejection();
1080
+ }
1081
+ this._pending.forEach((value, key) => {
1082
+ if (value === deleteSentinel) {
1083
+ this.#map.delete(key);
1084
+ } else {
1085
+ this.#map.set(key, value);
1086
+ }
1087
+ });
1088
+ this._pending.clear();
1089
+ this.release();
1090
+ return promiseVoid;
1091
+ }
1092
+ };
1093
+
1094
+ // ../replicache/src/kv/mem-store.ts
1095
+ var stores = /* @__PURE__ */ new Map();
1096
+ function dropMemStore(name) {
1097
+ stores.delete(name);
1098
+ return promiseVoid;
1099
+ }
1100
+ var MemStore = class {
1101
+ #map;
1102
+ #rwLock;
1103
+ #closed = false;
1104
+ constructor(name) {
1105
+ const entry = stores.get(name);
1106
+ let lock;
1107
+ let map;
1108
+ if (entry) {
1109
+ ({ lock, map } = entry);
1110
+ } else {
1111
+ lock = new RWLock();
1112
+ map = /* @__PURE__ */ new Map();
1113
+ stores.set(name, { lock, map });
1114
+ }
1115
+ this.#rwLock = lock;
1116
+ this.#map = map;
1117
+ }
1118
+ async read() {
1119
+ throwIfStoreClosed(this);
1120
+ const release = await this.#rwLock.read();
1121
+ return new ReadImpl3(this.#map, release);
1122
+ }
1123
+ async write() {
1124
+ throwIfStoreClosed(this);
1125
+ const release = await this.#rwLock.write();
1126
+ return new WriteImpl3(this.#map, release);
1127
+ }
1128
+ close() {
1129
+ this.#closed = true;
1130
+ return promiseVoid;
1131
+ }
1132
+ get closed() {
1133
+ return this.#closed;
1134
+ }
1135
+ };
1136
+
1137
+ // ../replicache/src/kv/idb-store-with-mem-fallback.ts
1138
+ var IDBStoreWithMemFallback = class {
1139
+ #lc;
1140
+ #name;
1141
+ #store;
1142
+ constructor(lc, name) {
1143
+ this.#lc = lc;
1144
+ this.#name = name;
1145
+ this.#store = new IDBStore(name);
1146
+ }
1147
+ read() {
1148
+ return this.#withBrainTransplant((s) => s.read());
1149
+ }
1150
+ write() {
1151
+ return this.#withBrainTransplant((s) => s.write());
1152
+ }
1153
+ async #withBrainTransplant(f) {
1154
+ try {
1155
+ return await f(this.#store);
1156
+ } catch (e) {
1157
+ if (isFirefoxPrivateBrowsingError(e)) {
1158
+ if (this.#store instanceof IDBStore) {
1159
+ this.#lc.info?.(
1160
+ "Switching to MemStore because of Firefox private browsing error"
1161
+ );
1162
+ this.#store = new MemStore(this.#name);
1163
+ }
1164
+ return f(this.#store);
1165
+ }
1166
+ throw e;
1167
+ }
1168
+ }
1169
+ close() {
1170
+ return this.#store.close();
1171
+ }
1172
+ get closed() {
1173
+ return this.#store.closed;
1174
+ }
1175
+ };
1176
+ function isFirefoxPrivateBrowsingError(e) {
1177
+ return isFirefox() && e instanceof DOMException && e.name === "InvalidStateError" && e.message === "A mutation operation was attempted on a database that did not allow mutations.";
1178
+ }
1179
+ function isFirefox() {
1180
+ return localNavigator?.userAgent?.includes("Firefox") ?? false;
1181
+ }
1182
+ function newIDBStoreWithMemFallback(lc, name) {
1183
+ if (isFirefox()) {
1184
+ return new IDBStoreWithMemFallback(lc, name);
1185
+ }
1186
+ return new IDBStore(name);
1187
+ }
1188
+ function dropIDBStoreWithMemFallback(name) {
1189
+ if (!isFirefox()) {
1190
+ return dropIDBStore(name);
1191
+ }
1192
+ try {
1193
+ return dropIDBStore(name);
1194
+ } catch (e) {
1195
+ if (isFirefoxPrivateBrowsingError(e)) {
1196
+ return dropMemStore(name);
1197
+ }
1198
+ }
1199
+ return promiseVoid;
1200
+ }
1201
+ function dropIDBStore(name) {
1202
+ return new Promise((resolve, reject) => {
1203
+ const req = indexedDB.deleteDatabase(name);
1204
+ req.onsuccess = () => resolve();
1205
+ req.onerror = () => reject(req.error);
1206
+ });
1207
+ }
1208
+
789
1209
  // ../replicache/src/get-kv-store-provider.ts
790
1210
  function getKVStoreProvider(lc, kvStore) {
791
1211
  switch (kvStore) {
@@ -816,6 +1236,99 @@ function createLogContext(logLevel = "info", logSinks = [consoleLogSink], contex
816
1236
  return new LogContext(logLevel, context, logSink);
817
1237
  }
818
1238
 
1239
+ // ../replicache/src/persist/idb-databases-store-db-name.ts
1240
+ var IDB_DATABASES_VERSION = 0;
1241
+ var IDB_DATABASES_DB_NAME = "replicache-dbs-v" + IDB_DATABASES_VERSION;
1242
+ var testNamespace = "";
1243
+ function getIDBDatabasesDBName() {
1244
+ return testNamespace + IDB_DATABASES_DB_NAME;
1245
+ }
1246
+
1247
+ // ../replicache/src/persist/idb-databases-store.ts
1248
+ var DBS_KEY = "dbs";
1249
+ var PROFILE_ID_KEY = "profileId";
1250
+ function assertIndexedDBDatabaseRecord(value) {
1251
+ assertObject(value);
1252
+ for (const [name, db] of Object.entries(value)) {
1253
+ assertString(name);
1254
+ assertIndexedDBDatabase(db);
1255
+ assert(name === db.name);
1256
+ }
1257
+ }
1258
+ function assertIndexedDBDatabase(value) {
1259
+ assertObject(value);
1260
+ assertString(value.name);
1261
+ assertString(value.replicacheName);
1262
+ assertNumber(value.replicacheFormatVersion);
1263
+ assertString(value.schemaVersion);
1264
+ if (value.lastOpenedTimestampMS !== void 0) {
1265
+ assertNumber(value.lastOpenedTimestampMS);
1266
+ }
1267
+ }
1268
+ var IDBDatabasesStore = class {
1269
+ #kvStore;
1270
+ constructor(createKVStore) {
1271
+ this.#kvStore = createKVStore(getIDBDatabasesDBName());
1272
+ }
1273
+ putDatabase(db) {
1274
+ return this.#putDatabase({ ...db, lastOpenedTimestampMS: Date.now() });
1275
+ }
1276
+ putDatabaseForTesting(db) {
1277
+ return this.#putDatabase(db);
1278
+ }
1279
+ #putDatabase(db) {
1280
+ return withWrite(this.#kvStore, async (write) => {
1281
+ const oldDbRecord = await getDatabases(write);
1282
+ const dbRecord = {
1283
+ ...oldDbRecord,
1284
+ [db.name]: db
1285
+ };
1286
+ await write.put(DBS_KEY, dbRecord);
1287
+ return dbRecord;
1288
+ });
1289
+ }
1290
+ clearDatabases() {
1291
+ return withWrite(this.#kvStore, (write) => write.del(DBS_KEY));
1292
+ }
1293
+ deleteDatabases(names) {
1294
+ return withWrite(this.#kvStore, async (write) => {
1295
+ const oldDbRecord = await getDatabases(write);
1296
+ const dbRecord = {
1297
+ ...oldDbRecord
1298
+ };
1299
+ for (const name of names) {
1300
+ delete dbRecord[name];
1301
+ }
1302
+ await write.put(DBS_KEY, dbRecord);
1303
+ });
1304
+ }
1305
+ getDatabases() {
1306
+ return withRead(this.#kvStore, getDatabases);
1307
+ }
1308
+ close() {
1309
+ return this.#kvStore.close();
1310
+ }
1311
+ getProfileID() {
1312
+ return withWrite(this.#kvStore, async (write) => {
1313
+ let profileId = await write.get(PROFILE_ID_KEY);
1314
+ if (profileId === void 0) {
1315
+ profileId = `p${makeClientID()}`;
1316
+ await write.put(PROFILE_ID_KEY, profileId);
1317
+ }
1318
+ assertString(profileId);
1319
+ return profileId;
1320
+ });
1321
+ }
1322
+ };
1323
+ async function getDatabases(read) {
1324
+ let dbRecord = await read.get(DBS_KEY);
1325
+ if (!dbRecord) {
1326
+ dbRecord = deepFreeze({});
1327
+ }
1328
+ assertIndexedDBDatabaseRecord(dbRecord);
1329
+ return dbRecord;
1330
+ }
1331
+
819
1332
  // ../replicache/src/persist/collect-idb-databases.ts
820
1333
  var COLLECT_IDB_INTERVAL = 12 * 60 * 60 * 1e3;
821
1334
  var INITIAL_COLLECT_IDB_DELAY = 5 * 60 * 1e3;
@@ -1960,7 +2473,7 @@ var QueryParseError = class extends Error {
1960
2473
  };
1961
2474
 
1962
2475
  // ../zql/src/query/query-impl.ts
1963
- import { resolver as resolver2 } from "@rocicorp/resolver";
2476
+ import { resolver as resolver3 } from "@rocicorp/resolver";
1964
2477
 
1965
2478
  // ../zero-protocol/src/query-hash.ts
1966
2479
  var hashCache = /* @__PURE__ */ new WeakMap();
@@ -7117,7 +7630,7 @@ function materializeImpl(query, delegate, factory = arrayViewFactory, options) {
7117
7630
  const { ast, format, customQueryID } = qi;
7118
7631
  const queryHash = qi.hash();
7119
7632
  const queryID = customQueryID ? hashOfNameAndArgs(customQueryID.name, customQueryID.args) : queryHash;
7120
- const queryCompleteResolver = resolver2();
7633
+ const queryCompleteResolver = resolver3();
7121
7634
  let queryComplete = delegate.defaultQueryComplete;
7122
7635
  const updateTTL = customQueryID ? (newTTL) => delegate.updateCustomQuery(customQueryID, newTTL) : (newTTL) => delegate.updateServerQuery(ast, newTTL);
7123
7636
  const gotCallback = (got, error) => {
@@ -7197,7 +7710,7 @@ async function runImpl(query, delegate, options) {
7197
7710
  function preloadImpl(query, delegate, options) {
7198
7711
  const qi = delegate.withContext(query);
7199
7712
  const ttl = options?.ttl ?? DEFAULT_PRELOAD_TTL_MS;
7200
- const { resolve, promise: complete } = resolver2();
7713
+ const { resolve, promise: complete } = resolver3();
7201
7714
  const { customQueryID, ast } = qi;
7202
7715
  if (customQueryID) {
7203
7716
  const cleanup2 = delegate.addCustomQuery(ast, customQueryID, ttl, (got) => {
@@ -7584,15 +8097,15 @@ var SchemaVersionNotSupported2 = "SchemaVersionNotSupported";
7584
8097
 
7585
8098
  // ../zero-client/src/client/zero.ts
7586
8099
  import "@rocicorp/logger";
7587
- import { resolver as resolver10 } from "@rocicorp/resolver";
8100
+ import { resolver as resolver11 } from "@rocicorp/resolver";
7588
8101
 
7589
8102
  // ../replicache/src/replicache-impl.ts
7590
8103
  import { Lock } from "@rocicorp/lock";
7591
8104
  import { consoleLogSink as consoleLogSink2 } from "@rocicorp/logger";
7592
- import { resolver as resolver6 } from "@rocicorp/resolver";
8105
+ import { resolver as resolver7 } from "@rocicorp/resolver";
7593
8106
 
7594
8107
  // ../shared/src/document-visible.ts
7595
- import { resolver as resolver3 } from "@rocicorp/resolver";
8108
+ import { resolver as resolver4 } from "@rocicorp/resolver";
7596
8109
  function getDocumentVisibilityWatcher(doc, hiddenIntervalMS, signal) {
7597
8110
  return doc ? new DocumentVisibilityWatcherImpl(doc, hiddenIntervalMS, signal) : new DocumentVisibilityWatcherNoDoc();
7598
8111
  }
@@ -7646,7 +8159,7 @@ var DocumentVisibilityWatcherImpl = class {
7646
8159
  if (this.visibilityState === state) {
7647
8160
  return Promise.resolve();
7648
8161
  }
7649
- const { promise, resolve } = resolver3();
8162
+ const { promise, resolve } = resolver4();
7650
8163
  this.#promises.add({ resolve, state });
7651
8164
  return promise;
7652
8165
  }
@@ -7695,7 +8208,7 @@ var PushDelegate = class extends ConnectionLoopDelegateImpl {
7695
8208
  };
7696
8209
 
7697
8210
  // ../replicache/src/connection-loop.ts
7698
- import { resolver as resolver4 } from "@rocicorp/resolver";
8211
+ import { resolver as resolver5 } from "@rocicorp/resolver";
7699
8212
  var MIN_DELAY_MS = 30;
7700
8213
  var MAX_DELAY_MS = 6e4;
7701
8214
  var ConnectionLoop = class {
@@ -7727,17 +8240,17 @@ var ConnectionLoop = class {
7727
8240
  // Back to the pending!
7728
8241
  // Controls whether the next iteration of the loop will wait at the pending
7729
8242
  // state.
7730
- #pendingResolver = resolver4();
8243
+ #pendingResolver = resolver5();
7731
8244
  /**
7732
8245
  * This resolver is used to allow us to skip sleeps when we do send(true)
7733
8246
  */
7734
- #skipSleepsResolver = resolver4();
8247
+ #skipSleepsResolver = resolver5();
7735
8248
  /**
7736
8249
  * Resolver for the next send. Never rejects. Returns an error instead since
7737
8250
  * this resolver is used in cases where they might not be someone waiting,
7738
8251
  * and we don't want an unhandled promise rejection in that case.
7739
8252
  */
7740
- #sendResolver = resolver4();
8253
+ #sendResolver = resolver5();
7741
8254
  #delegate;
7742
8255
  #closed = false;
7743
8256
  #abortSignal = new AbortController();
@@ -7786,7 +8299,7 @@ var ConnectionLoop = class {
7786
8299
  }
7787
8300
  async run() {
7788
8301
  const sendRecords = [];
7789
- let recoverResolver = resolver4();
8302
+ let recoverResolver = resolver5();
7790
8303
  let lastSendTime;
7791
8304
  let counter = 0;
7792
8305
  const delegate = this.#delegate;
@@ -7810,7 +8323,7 @@ var ConnectionLoop = class {
7810
8323
  await sleepMaybeSkip(delegate.debounceDelay);
7811
8324
  if (this.#closed) break;
7812
8325
  debug?.("debounced");
7813
- this.#pendingResolver = resolver4();
8326
+ this.#pendingResolver = resolver5();
7814
8327
  if (counter >= delegate.maxConnections) {
7815
8328
  debug?.("Too many request in flight. Waiting until one finishes...");
7816
8329
  await this.#waitUntilAvailableConnection();
@@ -7849,7 +8362,7 @@ var ConnectionLoop = class {
7849
8362
  try {
7850
8363
  lastSendTime = start;
7851
8364
  debug?.("Sending request");
7852
- this.#skipSleepsResolver = resolver4();
8365
+ this.#skipSleepsResolver = resolver5();
7853
8366
  ok = await delegate.invokeSend();
7854
8367
  debug?.("Send returned", ok);
7855
8368
  } catch (e) {
@@ -7865,12 +8378,12 @@ var ConnectionLoop = class {
7865
8378
  sendRecords.push({ duration: Date.now() - start, ok });
7866
8379
  if (recovered(sendRecords)) {
7867
8380
  recoverResolver.resolve();
7868
- recoverResolver = resolver4();
8381
+ recoverResolver = resolver5();
7869
8382
  }
7870
8383
  counter--;
7871
8384
  this.#connectionAvailable();
7872
8385
  const sendResolver = this.#sendResolver;
7873
- this.#sendResolver = resolver4();
8386
+ this.#sendResolver = resolver5();
7874
8387
  if (error) {
7875
8388
  sendResolver.resolve({ error });
7876
8389
  } else {
@@ -7891,7 +8404,7 @@ var ConnectionLoop = class {
7891
8404
  }
7892
8405
  }
7893
8406
  #waitUntilAvailableConnection() {
7894
- const { promise, resolve } = resolver4();
8407
+ const { promise, resolve } = resolver5();
7895
8408
  this.#waitingConnectionResolve = resolve;
7896
8409
  return promise;
7897
8410
  }
@@ -7941,7 +8454,7 @@ function recovered(sendRecords) {
7941
8454
  }
7942
8455
 
7943
8456
  // ../replicache/src/dag/lazy-store.ts
7944
- import { RWLock } from "@rocicorp/lock";
8457
+ import { RWLock as RWLock2 } from "@rocicorp/lock";
7945
8458
  var LazyStore = class {
7946
8459
  /**
7947
8460
  * This lock is used to ensure correct isolation of Reads and Writes.
@@ -7964,7 +8477,7 @@ var LazyStore = class {
7964
8477
  * - write `_heads`
7965
8478
  * - write `_memOnlyChunks`
7966
8479
  */
7967
- #rwLock = new RWLock();
8480
+ #rwLock = new RWLock2();
7968
8481
  #heads = /* @__PURE__ */ new Map();
7969
8482
  #sourceStore;
7970
8483
  #chunkHasher;
@@ -10020,7 +10533,7 @@ function shouldAbortRefresh(memdagBaseSnapshot, perdagClientGroupBaseSnapshot, p
10020
10533
  }
10021
10534
 
10022
10535
  // ../replicache/src/process-scheduler.ts
10023
- import { resolver as resolver5 } from "@rocicorp/resolver";
10536
+ import { resolver as resolver6 } from "@rocicorp/resolver";
10024
10537
 
10025
10538
  // ../replicache/src/request-idle.ts
10026
10539
  function requestIdle(timeout) {
@@ -10084,7 +10597,7 @@ var ProcessScheduler = class {
10084
10597
  if (this.#scheduledResolver) {
10085
10598
  return this.#scheduledResolver.promise;
10086
10599
  }
10087
- this.#scheduledResolver = resolver5();
10600
+ this.#scheduledResolver = resolver6();
10088
10601
  void this.#scheduleInternal();
10089
10602
  return this.#scheduledResolver.promise;
10090
10603
  }
@@ -10740,7 +11253,7 @@ var ReplicacheImpl = class {
10740
11253
  newRandomHash,
10741
11254
  assertHash
10742
11255
  );
10743
- const readyResolver = resolver6();
11256
+ const readyResolver = resolver7();
10744
11257
  this.#ready = readyResolver.promise;
10745
11258
  const { minDelayMs = MIN_DELAY_MS, maxDelayMs = MAX_DELAY_MS } = requestOptions;
10746
11259
  this.#requestOptions = { maxDelayMs, minDelayMs };
@@ -10759,9 +11272,9 @@ var ReplicacheImpl = class {
10759
11272
  new PushDelegate(this, () => this.#invokePush())
10760
11273
  );
10761
11274
  this.mutate = this.#registerMutators(mutators);
10762
- const profileIDResolver = resolver6();
11275
+ const profileIDResolver = resolver7();
10763
11276
  this.#profileIDPromise = profileIDResolver.promise;
10764
- const clientGroupIDResolver = resolver6();
11277
+ const clientGroupIDResolver = resolver7();
10765
11278
  this.#clientGroupIDPromise = clientGroupIDResolver.promise;
10766
11279
  if (false) {
10767
11280
  this.#mutationRecovery = new MutationRecovery({
@@ -10945,7 +11458,7 @@ var ReplicacheImpl = class {
10945
11458
  */
10946
11459
  async close() {
10947
11460
  this.#closed = true;
10948
- const { promise, resolve } = resolver6();
11461
+ const { promise, resolve } = resolver7();
10949
11462
  closingInstances.set(this.name, promise);
10950
11463
  this.#closeAbortController.abort();
10951
11464
  getBrowserGlobal("document")?.removeEventListener(
@@ -12216,7 +12729,7 @@ function send(ws, data) {
12216
12729
  }
12217
12730
 
12218
12731
  // ../zero-client/src/client/active-clients-manager.ts
12219
- import { resolver as resolver7 } from "@rocicorp/resolver";
12732
+ import { resolver as resolver8 } from "@rocicorp/resolver";
12220
12733
  var keyPrefix = "zero-active";
12221
12734
  function toLockName(clientGroupID, clientID) {
12222
12735
  return `${keyPrefix}/${clientGroupID}/${clientID}`;
@@ -12246,7 +12759,7 @@ function ignoreAbortError(e) {
12246
12759
  var ActiveClientsManager = class _ActiveClientsManager {
12247
12760
  clientGroupID;
12248
12761
  clientID;
12249
- #resolver = resolver7();
12762
+ #resolver = resolver8();
12250
12763
  #lockManager;
12251
12764
  #activeClients = /* @__PURE__ */ new Set();
12252
12765
  /**
@@ -12412,7 +12925,7 @@ var MockClientLockManager = class {
12412
12925
  };
12413
12926
 
12414
12927
  // ../zero-client/src/client/connection-manager.ts
12415
- import { resolver as resolver8 } from "@rocicorp/resolver";
12928
+ import { resolver as resolver9 } from "@rocicorp/resolver";
12416
12929
  var DEFAULT_TIMEOUT_CHECK_INTERVAL_MS = 1e3;
12417
12930
  var TERMINAL_STATES = [
12418
12931
  connection_status_enum_exports.NeedsAuth,
@@ -12443,7 +12956,7 @@ var ConnectionManager = class _ConnectionManager extends Subscribable {
12443
12956
  /**
12444
12957
  * Resolver used to signal waiting callers when the state changes.
12445
12958
  */
12446
- #stateChangeResolver = resolver8();
12959
+ #stateChangeResolver = resolver9();
12447
12960
  constructor(options) {
12448
12961
  super();
12449
12962
  const now = Date.now();
@@ -12656,7 +13169,7 @@ var ConnectionManager = class _ConnectionManager extends Subscribable {
12656
13169
  };
12657
13170
  #resolveNextStateWaiters() {
12658
13171
  this.#stateChangeResolver.resolve(this.#state);
12659
- this.#stateChangeResolver = resolver8();
13172
+ this.#stateChangeResolver = resolver9();
12660
13173
  }
12661
13174
  #publishState() {
12662
13175
  this.notify(this.#state);
@@ -14830,7 +15343,7 @@ function makeMessage(message, context, logLevel) {
14830
15343
  }
14831
15344
 
14832
15345
  // ../zero-client/src/client/version.ts
14833
- var version2 = "0.25.0-canary.3";
15346
+ var version2 = "0.25.0-canary.4";
14834
15347
 
14835
15348
  // ../zero-client/src/client/log-options.ts
14836
15349
  var LevelFilterLogSink = class {
@@ -15146,7 +15659,7 @@ var State = class {
15146
15659
  };
15147
15660
 
15148
15661
  // ../zero-client/src/client/mutation-tracker.ts
15149
- import { resolver as resolver9 } from "@rocicorp/resolver";
15662
+ import { resolver as resolver10 } from "@rocicorp/resolver";
15150
15663
  var currentEphemeralID = 0;
15151
15664
  function nextEphemeralID() {
15152
15665
  return ++currentEphemeralID;
@@ -15187,7 +15700,7 @@ var MutationTracker = class {
15187
15700
  }
15188
15701
  trackMutation() {
15189
15702
  const id = nextEphemeralID();
15190
- const mutationResolver = resolver9();
15703
+ const mutationResolver = resolver10();
15191
15704
  this.#outstandingMutations.set(id, {
15192
15705
  resolver: mutationResolver
15193
15706
  });
@@ -16631,13 +17144,13 @@ var Zero = class _Zero {
16631
17144
  #pendingPullsByRequestID = /* @__PURE__ */ new Map();
16632
17145
  #lastMutationIDReceived = 0;
16633
17146
  #socket = void 0;
16634
- #socketResolver = resolver10();
17147
+ #socketResolver = resolver11();
16635
17148
  /**
16636
17149
  * Utility promise that resolves when the socket transitions to connected.
16637
17150
  * It rejects if we hit an error or timeout before the connected message.
16638
17151
  * Used by push/pull helpers to queue work until the connection is usable.
16639
17152
  */
16640
- #connectResolver = resolver10();
17153
+ #connectResolver = resolver11();
16641
17154
  #closeAbortController = new AbortController();
16642
17155
  #visibilityWatcher;
16643
17156
  #connectionManager;
@@ -17669,9 +18182,9 @@ ${error.errorBody.message}`, error);
17669
18182
  default:
17670
18183
  unreachable(connectionStatus);
17671
18184
  }
17672
- this.#socketResolver = resolver10();
18185
+ this.#socketResolver = resolver11();
17673
18186
  lc.debug?.("Creating new connect resolver");
17674
- this.#connectResolver = resolver10();
18187
+ this.#connectResolver = resolver11();
17675
18188
  this.#messageCount = 0;
17676
18189
  this.#connectStart = void 0;
17677
18190
  this.#connectedAt = 0;
@@ -17741,12 +18254,12 @@ ${error.errorBody.message}`, error);
17741
18254
  const body = pullResponseMessage[1];
17742
18255
  lc = lc.withContext("requestID", body.requestID);
17743
18256
  lc.debug?.("Handling pull response", body);
17744
- const resolver11 = this.#pendingPullsByRequestID.get(body.requestID);
17745
- if (!resolver11) {
18257
+ const resolver12 = this.#pendingPullsByRequestID.get(body.requestID);
18258
+ if (!resolver12) {
17746
18259
  lc.debug?.("No resolver found");
17747
18260
  return;
17748
18261
  }
17749
- resolver11.resolve(pullResponseMessage[1]);
18262
+ resolver12.resolve(pullResponseMessage[1]);
17750
18263
  }
17751
18264
  async #pusher(req, requestID) {
17752
18265
  assert(req.pushVersion === 1);
@@ -18015,7 +18528,7 @@ ${error.errorBody.message}`, error);
18015
18528
  }
18016
18529
  ];
18017
18530
  send(socket, pullRequestMessage);
18018
- const pullResponseResolver = resolver10();
18531
+ const pullResponseResolver = resolver11();
18019
18532
  this.#pendingPullsByRequestID.set(requestID, pullResponseResolver);
18020
18533
  try {
18021
18534
  const raceResult = await promiseRace({
@@ -18090,7 +18603,7 @@ ${error.errorBody.message}`, error);
18090
18603
  */
18091
18604
  async #ping(lc) {
18092
18605
  lc.debug?.("pinging");
18093
- const { promise, resolve } = resolver10();
18606
+ const { promise, resolve } = resolver11();
18094
18607
  this.#onPong = resolve;
18095
18608
  const pingMessage = ["ping", {}];
18096
18609
  const t0 = performance.now();
@@ -18299,6 +18812,7 @@ async function makeActiveClientsManager(clientGroupID, clientID, signal, onDelet
18299
18812
 
18300
18813
  export {
18301
18814
  getDefaultPuller,
18815
+ IDBNotFoundError,
18302
18816
  makeIDBName,
18303
18817
  dropDatabase,
18304
18818
  dropAllDatabases,
@@ -18337,4 +18851,4 @@ export {
18337
18851
  update_needed_reason_type_enum_exports,
18338
18852
  Zero
18339
18853
  };
18340
- //# sourceMappingURL=chunk-IWL6EEA6.js.map
18854
+ //# sourceMappingURL=chunk-HE4M4K7Q.js.map