@fireproof/core 0.19.8-dev-alldocs → 0.19.8-dev-cra

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. package/{chunk-DG6XSV44.js → chunk-BNL4PVBF.js} +25 -81
  2. package/chunk-BNL4PVBF.js.map +1 -0
  3. package/{chunk-OWQAHX2V.js → chunk-JW2QT6BF.js} +24 -4
  4. package/chunk-JW2QT6BF.js.map +1 -0
  5. package/index.cjs +443 -1300
  6. package/index.cjs.map +1 -1
  7. package/index.d.cts +156 -167
  8. package/index.d.ts +156 -167
  9. package/index.global.js +1036 -1214
  10. package/index.global.js.map +1 -1
  11. package/index.js +64 -59
  12. package/index.js.map +1 -1
  13. package/metafile-cjs.json +1 -1
  14. package/metafile-esm.json +1 -1
  15. package/metafile-iife.json +1 -1
  16. package/node-sys-container-MIEX6ELJ.js +29 -0
  17. package/node-sys-container-MIEX6ELJ.js.map +1 -0
  18. package/package.json +3 -2
  19. package/{store-file-WD746RSY.js → store-file-VJ6BI4II.js} +6 -8
  20. package/{store-file-WD746RSY.js.map → store-file-VJ6BI4II.js.map} +1 -1
  21. package/{chunk-5UFCF36O.js → store-indexdb-WLRSICCB.js} +7 -17
  22. package/store-indexdb-WLRSICCB.js.map +1 -0
  23. package/tests/fireproof/config.test.ts +14 -70
  24. package/tests/fireproof/database.test.ts +4 -4
  25. package/tests/fireproof/fireproof.test.ts +5 -5
  26. package/tests/fireproof/hello.test.ts +2 -2
  27. package/chunk-5UFCF36O.js.map +0 -1
  28. package/chunk-DG6XSV44.js.map +0 -1
  29. package/chunk-OWQAHX2V.js.map +0 -1
  30. package/chunk-PRQHQG4I.js +0 -39
  31. package/chunk-PRQHQG4I.js.map +0 -1
  32. package/chunk-VZGT7ZYP.js +0 -22
  33. package/chunk-VZGT7ZYP.js.map +0 -1
  34. package/node-sys-container-TTGEC66A.js +0 -29
  35. package/node-sys-container-TTGEC66A.js.map +0 -1
  36. package/sqlite-data-store-MA55LVQE.js +0 -120
  37. package/sqlite-data-store-MA55LVQE.js.map +0 -1
  38. package/sqlite-meta-store-UNQKVYRM.js +0 -137
  39. package/sqlite-meta-store-UNQKVYRM.js.map +0 -1
  40. package/sqlite-wal-store-KVUOC4PO.js +0 -123
  41. package/sqlite-wal-store-KVUOC4PO.js.map +0 -1
  42. package/store-indexdb-NG45BU3Q.js +0 -20
  43. package/store-indexdb-NG45BU3Q.js.map +0 -1
  44. package/store-sql-QVFNIGND.js +0 -344
  45. package/store-sql-QVFNIGND.js.map +0 -1
package/index.cjs CHANGED
@@ -58,17 +58,13 @@ __export(node_sys_container_exports, {
58
58
  createNodeSysContainer: () => createNodeSysContainer
59
59
  });
60
60
  async function createNodeSysContainer() {
61
- const nodePath = "node:path";
62
- const nodeOS = "node:os";
63
- const nodeURL = "node:url";
64
- const nodeFS = "node:fs";
65
- const fs = (await import(nodeFS)).promises;
66
- const path = await import(nodePath);
67
61
  return {
68
62
  state: "node",
69
63
  ...path,
70
- ...await import(nodeOS),
71
- ...await import(nodeURL),
64
+ // ...(await import("node:os")),
65
+ // ...(await import("node:url")),
66
+ ...os,
67
+ ...url,
72
68
  ...fs,
73
69
  join,
74
70
  stat: fs.stat,
@@ -77,22 +73,46 @@ async function createNodeSysContainer() {
77
73
  writefile: fs.writeFile
78
74
  };
79
75
  }
76
+ var fs, path, os, url;
80
77
  var init_node_sys_container = __esm({
81
78
  "src/runtime/node-sys-container.ts"() {
82
79
  "use strict";
83
80
  init_sys_container();
81
+ fs = __toESM(require("fs/promises"), 1);
82
+ path = __toESM(require("path"), 1);
83
+ os = __toESM(require("os"), 1);
84
+ url = __toESM(require("url"), 1);
84
85
  }
85
86
  });
86
87
 
87
88
  // src/runtime/sys-container.ts
89
+ function isSet(value, ref = globalThis) {
90
+ const [head, ...tail] = value.split(".");
91
+ if (["object", "function"].includes(typeof ref) && ref && ["object", "function"].includes(typeof ref[head]) && ref[head]) {
92
+ if (tail.length <= 1) {
93
+ return true;
94
+ }
95
+ return isSet(tail.join("."), ref[head]);
96
+ }
97
+ return false;
98
+ }
99
+ function runtimeFn() {
100
+ const isNodeIsh = isSet("process.versions.node");
101
+ const isDeno = isSet("Deno");
102
+ return {
103
+ isNodeIsh,
104
+ isBrowser: !(isNodeIsh || isDeno),
105
+ isDeno,
106
+ isReactNative: false
107
+ };
108
+ }
88
109
  function join(...paths) {
89
110
  return paths.map((i) => i.replace(/\/+$/, "")).join("/");
90
111
  }
91
- var stdEnv, import_uuidv7, import_cement, onceStart, envImpl, sysContainer, SysContainer;
112
+ var import_uuidv7, import_cement, onceStart, envImpl, sysContainer, SysContainer;
92
113
  var init_sys_container = __esm({
93
114
  "src/runtime/sys-container.ts"() {
94
115
  "use strict";
95
- stdEnv = __toESM(require("std-env"), 1);
96
116
  import_uuidv7 = require("uuidv7");
97
117
  import_cement = require("@adviser/cement");
98
118
  init_types();
@@ -109,18 +129,18 @@ var init_sys_container = __esm({
109
129
  this.freight = {
110
130
  state: "seeded",
111
131
  join,
112
- dirname: (path) => path.split("/").slice(0, -1).join("/"),
132
+ dirname: (path2) => path2.split("/").slice(0, -1).join("/"),
113
133
  homedir: () => {
114
134
  throw new Error("SysContainer:homedir is not available in seeded state");
115
135
  },
116
136
  fileURLToPath: (strurl) => {
117
- let url;
137
+ let url2;
118
138
  if (typeof strurl === "string") {
119
- url = new URL(strurl);
139
+ url2 = new URL(strurl);
120
140
  } else {
121
- url = strurl;
141
+ url2 = strurl;
122
142
  }
123
- return url.pathname;
143
+ return url2.pathname;
124
144
  },
125
145
  // assert: (condition: unknown, message?: string | Error) => {
126
146
  // if (!condition) {
@@ -145,13 +165,14 @@ var init_sys_container = __esm({
145
165
  this.logSeeded("homedir");
146
166
  return throwFalsy(this.freight).homedir();
147
167
  };
168
+ this.runtime = runtimeFn;
148
169
  this.env = envImpl;
149
170
  }
150
171
  async start() {
151
172
  await onceStart.once(async () => {
152
173
  switch (this.freight.state) {
153
174
  case "seeded":
154
- if (stdEnv.isNode) {
175
+ if (this.runtime().isNodeIsh) {
155
176
  const { createNodeSysContainer: createNodeSysContainer2 } = await Promise.resolve().then(() => (init_node_sys_container(), node_sys_container_exports));
156
177
  this.freight = await createNodeSysContainer2();
157
178
  } else {
@@ -164,49 +185,49 @@ var init_sys_container = __esm({
164
185
  }
165
186
  });
166
187
  }
167
- async readdir(path, options) {
188
+ async readdir(path2, options) {
168
189
  this.logSeeded("readdir");
169
- return throwFalsy(this.freight).readdir(path, options) || [];
190
+ return throwFalsy(this.freight).readdir(path2, options) || [];
170
191
  }
171
- async readdirent(path, options) {
192
+ async readdirent(path2, options) {
172
193
  this.logSeeded("readdirent");
173
- return throwFalsy(this.freight).readdir(path, { ...options, withFileTypes: true }) || [];
194
+ return throwFalsy(this.freight).readdir(path2, { ...options, withFileTypes: true }) || [];
174
195
  }
175
- async readfile(path, options) {
196
+ async readfile(path2, options) {
176
197
  this.logSeeded("readfile");
177
- return throwFalsy(this.freight).readfile(path, options);
198
+ return throwFalsy(this.freight).readfile(path2, options);
178
199
  }
179
- async mkdir(path, options) {
200
+ async mkdir(path2, options) {
180
201
  this.logSeeded("mkdir");
181
- return throwFalsy(this.freight).mkdir(path, options);
202
+ return throwFalsy(this.freight).mkdir(path2, options);
182
203
  }
183
- async rm(path, options) {
204
+ async rm(path2, options) {
184
205
  this.logSeeded("rm");
185
- return throwFalsy(this.freight).rm(path, options);
206
+ return throwFalsy(this.freight).rm(path2, options);
186
207
  }
187
- async unlink(path) {
208
+ async unlink(path2) {
188
209
  this.logSeeded("unlink");
189
- return throwFalsy(this.freight).unlink(path);
210
+ return throwFalsy(this.freight).unlink(path2);
190
211
  }
191
- async writefile(path, data) {
212
+ async writefile(path2, data) {
192
213
  this.logSeeded("writefile");
193
- return throwFalsy(this.freight).writefile(path, data);
214
+ return throwFalsy(this.freight).writefile(path2, data);
194
215
  }
195
216
  async copyFile(source, destination) {
196
217
  this.logSeeded("copyFile");
197
218
  return throwFalsy(this.freight).copyFile(source, destination);
198
219
  }
199
- async stat(path) {
220
+ async stat(path2) {
200
221
  this.logSeeded("stat");
201
- return throwFalsy(this.freight).stat(path);
222
+ return throwFalsy(this.freight).stat(path2);
202
223
  }
203
- fileURLToPath(url) {
224
+ fileURLToPath(url2) {
204
225
  this.logSeeded("fileURLToPath");
205
- return throwFalsy(this.freight).fileURLToPath(url);
226
+ return throwFalsy(this.freight).fileURLToPath(url2);
206
227
  }
207
- dirname(path) {
228
+ dirname(path2) {
208
229
  this.logSeeded("dirname");
209
- return throwFalsy(this.freight).dirname(path);
230
+ return throwFalsy(this.freight).dirname(path2);
210
231
  }
211
232
  join(...args) {
212
233
  this.logSeeded("join");
@@ -226,63 +247,61 @@ var init_sys_container = __esm({
226
247
  // src/runtime/data-dir.ts
227
248
  function dataDir(name, base) {
228
249
  if (!base) {
229
- if (import_std_env.isNode || import_std_env.isDeno) {
250
+ if (SysContainer.runtime().isNodeIsh || SysContainer.runtime().isDeno) {
230
251
  base = SysContainer.env.get("FP_STORAGE_URL") || `file://${SysContainer.join(SysContainer.homedir(), ".fireproof")}`;
231
252
  } else {
232
253
  base = `indexdb://fp`;
233
254
  }
234
255
  }
235
- let url;
256
+ let url2;
236
257
  if (typeof base === "string") {
237
258
  try {
238
- url = new URL(base.toString());
259
+ url2 = new URL(base.toString());
239
260
  } catch (e) {
240
261
  try {
241
262
  base = `file://${base}`;
242
- url = new URL(base);
263
+ url2 = new URL(base);
243
264
  } catch (e2) {
244
265
  throw new Error(`invalid base url: ${base}`);
245
266
  }
246
267
  }
247
268
  } else {
248
- url = base;
269
+ url2 = base;
249
270
  }
250
- url.searchParams.set("name", name || "");
251
- return url.toString();
271
+ url2.searchParams.set("name", name || "");
272
+ return url2.toString();
252
273
  }
253
- var import_std_env;
254
274
  var init_data_dir = __esm({
255
275
  "src/runtime/data-dir.ts"() {
256
276
  "use strict";
257
277
  init_sys_container();
258
- import_std_env = require("std-env");
259
278
  }
260
279
  });
261
280
 
262
281
  // src/runtime/store-file-utils.ts
263
- async function getPath(url, logger) {
264
- const basePath = url.toString().replace(new RegExp(`^${url.protocol}//`), "").replace(/\?.*$/, "");
265
- const name = url.searchParams.get("name");
282
+ async function getPath(url2, logger) {
283
+ const basePath = url2.toString().replace(new RegExp(`^${url2.protocol}//`), "").replace(/\?.*$/, "");
284
+ const name = url2.searchParams.get("name");
266
285
  if (name) {
267
- const version = url.searchParams.get("version");
268
- if (!version) throw logger.Error().Str("url", url.toString()).Msg(`version not found`).AsError();
286
+ const version = url2.searchParams.get("version");
287
+ if (!version) throw logger.Error().Str("url", url2.toString()).Msg(`version not found`).AsError();
269
288
  return SysContainer.join(basePath, version, name);
270
289
  }
271
290
  return SysContainer.join(basePath);
272
291
  }
273
- function getFileName(url, key, logger) {
274
- switch (getStore(url, logger, (...a) => a.join("/"))) {
292
+ function getFileName(url2, key, logger) {
293
+ switch (getStore(url2, logger, (...a) => a.join("/"))) {
275
294
  case "data":
276
295
  return key + ".car";
277
296
  case "meta":
278
297
  return key + ".json";
279
298
  default:
280
- throw logger.Error().Str("url", url.toString()).Msg(`unsupported store type`).AsError();
299
+ throw logger.Error().Str("url", url2.toString()).Msg(`unsupported store type`).AsError();
281
300
  }
282
301
  }
283
- function ensureIndexName(url, name) {
284
- if (url.searchParams.has("index")) {
285
- name = (url.searchParams.get("index")?.replace(/[^a-zA-Z0-9]/g, "") || "idx") + "-" + name;
302
+ function ensureIndexName(url2, name) {
303
+ if (url2.searchParams.has("index")) {
304
+ name = (url2.searchParams.get("index")?.replace(/[^a-zA-Z0-9]/g, "") || "idx") + "-" + name;
286
305
  }
287
306
  return name;
288
307
  }
@@ -294,95 +313,6 @@ var init_store_file_utils = __esm({
294
313
  }
295
314
  });
296
315
 
297
- // src/runtime/store-sql/types.ts
298
- var DefaultSQLTableNames;
299
- var init_types2 = __esm({
300
- "src/runtime/store-sql/types.ts"() {
301
- "use strict";
302
- DefaultSQLTableNames = {
303
- data: "Datas",
304
- meta: "Metas",
305
- wal: "Wals"
306
- };
307
- }
308
- });
309
-
310
- // src/runtime/store-sql/ensurer.ts
311
- function sqlTableName(...names) {
312
- return names.map((name) => name.replace(/^[^a-zA-Z0-9]+/, "").replace(/[^a-zA-Z0-9]+/g, "_")).filter((i) => i.length).join("_");
313
- }
314
- function ensureTableNames(url, opts) {
315
- let isIndex = "";
316
- if (url.searchParams.has("index")) {
317
- isIndex = url.searchParams.get("index") || ".idx";
318
- }
319
- const ret = opts?.tableNames || DefaultSQLTableNames;
320
- if (isIndex.length) {
321
- return {
322
- data: sqlTableName(isIndex, ret.data),
323
- meta: sqlTableName(isIndex, ret.meta),
324
- wal: sqlTableName(isIndex, ret.wal)
325
- };
326
- }
327
- return {
328
- data: sqlTableName(ret.data),
329
- meta: sqlTableName(ret.meta),
330
- wal: sqlTableName(ret.wal)
331
- };
332
- }
333
- function ensureTextEncoder(opts) {
334
- return opts?.textEncoder || textEncoder;
335
- }
336
- function ensureTextDecoder(opts) {
337
- return opts?.textDecoder || textDecoder;
338
- }
339
- function url2sqlFlavor(url, logger) {
340
- const flavor = url.protocol.replace(/:.*$/, "");
341
- switch (flavor) {
342
- case "sqlite":
343
- case "mysql":
344
- case "postgres":
345
- return flavor;
346
- default:
347
- throw logger.Error().Str("flavor", flavor).Msg("unsupported protocol").AsError();
348
- }
349
- }
350
- function ensureSQLOpts(url, opts, componentName, ctx) {
351
- const logger = ensureLogger(opts, componentName, ctx);
352
- return {
353
- url,
354
- sqlFlavor: url2sqlFlavor(url, logger),
355
- tableNames: ensureTableNames(url, opts),
356
- logger,
357
- textEncoder: ensureTextEncoder(opts),
358
- textDecoder: ensureTextDecoder(opts)
359
- };
360
- }
361
- var textEncoder, textDecoder;
362
- var init_ensurer = __esm({
363
- "src/runtime/store-sql/ensurer.ts"() {
364
- "use strict";
365
- init_utils();
366
- init_types2();
367
- textEncoder = new TextEncoder();
368
- textDecoder = new TextDecoder();
369
- }
370
- });
371
-
372
- // src/runtime/store-sql/index.ts
373
- var store_sql_exports = {};
374
- __export(store_sql_exports, {
375
- DefaultSQLTableNames: () => DefaultSQLTableNames,
376
- ensureSQLOpts: () => ensureSQLOpts
377
- });
378
- var init_store_sql = __esm({
379
- "src/runtime/store-sql/index.ts"() {
380
- "use strict";
381
- init_types2();
382
- init_ensurer();
383
- }
384
- });
385
-
386
316
  // src/runtime/crypto.ts
387
317
  var crypto_exports = {};
388
318
  __export(crypto_exports, {
@@ -509,21 +439,11 @@ var init_store_indexdb_version = __esm({
509
439
  }
510
440
  });
511
441
 
512
- // src/runtime/store-sql/v0.19-sqlite/version.ts
513
- var SQLITE_VERSION;
514
- var init_version = __esm({
515
- "src/runtime/store-sql/v0.19-sqlite/version.ts"() {
516
- "use strict";
517
- SQLITE_VERSION = "v0.19-sqlite";
518
- }
519
- });
520
-
521
442
  // src/runtime/index.ts
522
443
  var runtime_exports = {};
523
444
  __export(runtime_exports, {
524
445
  FILESTORE_VERSION: () => FILESTORE_VERSION,
525
446
  INDEXDB_VERSION: () => INDEXDB_VERSION,
526
- SQLITE_VERSION: () => SQLITE_VERSION,
527
447
  SysContainer: () => SysContainer,
528
448
  crypto: () => crypto_exports,
529
449
  dataDir: () => dataDir,
@@ -531,8 +451,7 @@ __export(runtime_exports, {
531
451
  files: () => files_exports,
532
452
  getFileName: () => getFileName,
533
453
  getPath: () => getPath,
534
- join: () => join,
535
- sql: () => store_sql_exports
454
+ join: () => join
536
455
  });
537
456
  var init_runtime = __esm({
538
457
  "src/runtime/index.ts"() {
@@ -540,12 +459,10 @@ var init_runtime = __esm({
540
459
  init_sys_container();
541
460
  init_data_dir();
542
461
  init_store_file_utils();
543
- init_store_sql();
544
462
  init_crypto();
545
463
  init_files();
546
464
  init_store_file_version();
547
465
  init_store_indexdb_version();
548
- init_version();
549
466
  }
550
467
  });
551
468
 
@@ -608,25 +525,25 @@ function ensureLogger(optsOrLogger, componentName, ctx) {
608
525
  const out = cLogger.Logger();
609
526
  return out;
610
527
  }
611
- function getStore(url, logger, joiner) {
612
- let result = url.searchParams.get("store");
613
- if (!result) throw logger.Error().Str("url", url.toString()).Msg(`store not found`).AsError();
614
- if (url.searchParams.has("index")) {
615
- result = joiner(url.searchParams.get("index") || "idx", result);
528
+ function getStore(url2, logger, joiner) {
529
+ let result = url2.searchParams.get("store");
530
+ if (!result) throw logger.Error().Str("url", url2.toString()).Msg(`store not found`).AsError();
531
+ if (url2.searchParams.has("index")) {
532
+ result = joiner(url2.searchParams.get("index") || "idx", result);
616
533
  }
617
534
  return result;
618
535
  }
619
- function getKey(url, logger) {
620
- const result = url.searchParams.get("key");
621
- if (!result) throw logger.Error().Str("url", url.toString()).Msg(`key not found`).AsError();
536
+ function getKey(url2, logger) {
537
+ const result = url2.searchParams.get("key");
538
+ if (!result) throw logger.Error().Str("url", url2.toString()).Msg(`key not found`).AsError();
622
539
  return result;
623
540
  }
624
- function getName(url, logger) {
625
- let result = url.searchParams.get("name");
541
+ function getName(url2, logger) {
542
+ let result = url2.searchParams.get("name");
626
543
  if (!result) {
627
- result = SysContainer.dirname(url.pathname);
544
+ result = SysContainer.dirname(url2.pathname);
628
545
  if (result.length === 0) {
629
- throw logger.Error().Str("url", url.toString()).Msg(`name not found`).AsError();
546
+ throw logger.Error().Str("url", url2.toString()).Msg(`name not found`).AsError();
630
547
  }
631
548
  }
632
549
  return result;
@@ -672,209 +589,6 @@ var init_gateway = __esm({
672
589
  }
673
590
  });
674
591
 
675
- // src/runtime/store-indexdb.ts
676
- var store_indexdb_exports = {};
677
- __export(store_indexdb_exports, {
678
- IndexDBDataGateway: () => IndexDBDataGateway,
679
- IndexDBMetaGateway: () => IndexDBMetaGateway,
680
- IndexDBTestStore: () => IndexDBTestStore,
681
- IndexDBWalGateway: () => IndexDBWalGateway,
682
- getIndexDBName: () => getIndexDBName,
683
- guardVersion: () => guardVersion
684
- });
685
- function ensureVersion(url) {
686
- const ret = new URL(url.toString());
687
- ret.searchParams.set("version", url.searchParams.get("version") || INDEXDB_VERSION);
688
- return ret;
689
- }
690
- function guardVersion(url) {
691
- if (!url.searchParams.has("version")) {
692
- return import_cement4.Result.Err(`missing version: ${url.toString()}`);
693
- }
694
- return import_cement4.Result.Ok(url);
695
- }
696
- function sanitzeKey(key) {
697
- if (key.length === 1) {
698
- key = key[0];
699
- }
700
- return key;
701
- }
702
- async function connectIdb(url, logger) {
703
- const dbName = getIndexDBName(url, logger);
704
- const once2 = await onceIndexDB.get(dbName.fullDb).once(async () => {
705
- const db = await (0, import_idb.openDB)(dbName.fullDb, 1, {
706
- upgrade(db2) {
707
- ["version", "data", "wal", "meta", "idx.data", "idx.wal", "idx.meta"].map((store) => {
708
- db2.createObjectStore(store, {
709
- autoIncrement: false
710
- });
711
- });
712
- }
713
- });
714
- const found = await db.get("version", "version");
715
- const version = url.searchParams.get("version") || INDEXDB_VERSION;
716
- if (!found) {
717
- await db.put("version", { version }, "version");
718
- } else if (found.version !== version) {
719
- logger.Warn().Str("url", url.toString()).Str("version", version).Str("found", found.version).Msg("version mismatch");
720
- }
721
- return { db, dbName, version };
722
- });
723
- url.searchParams.set("version", once2.version);
724
- return once2.db;
725
- }
726
- function joinDBName(...names) {
727
- return names.map((i) => i.replace(/^[^a-zA-Z0-9]+/g, "").replace(/[^a-zA-Z0-9]+/g, "_")).filter((i) => i.length).join(".");
728
- }
729
- function getIndexDBName(iurl, logger) {
730
- const url = ensureVersion(iurl);
731
- const fullDb = url.pathname.replace(/^\/+/, "").replace(/\?.*$/, "");
732
- const dbName = url.searchParams.get("name");
733
- if (!dbName) throw logger.Error().Str("url", url.toString()).Msg(`name not found`).AsError();
734
- const result = joinDBName(fullDb, dbName);
735
- const objStore = getStore(url, logger, joinDBName);
736
- const connectionKey = [result, objStore].join(":");
737
- return {
738
- fullDb: result,
739
- objStore,
740
- connectionKey,
741
- dbName
742
- };
743
- }
744
- var import_idb, import_cement4, onceIndexDB, IndexDBGateway, IndexDBDataGateway, IndexDBWalGateway, IndexDBMetaGateway, txtEncoder, IndexDBTestStore;
745
- var init_store_indexdb = __esm({
746
- "src/runtime/store-indexdb.ts"() {
747
- "use strict";
748
- import_idb = require("idb");
749
- import_cement4 = require("@adviser/cement");
750
- init_store_indexdb_version();
751
- init_utils();
752
- init_gateway();
753
- init_sys_container();
754
- onceIndexDB = new import_cement4.KeyedResolvOnce();
755
- IndexDBGateway = class {
756
- constructor(logger) {
757
- this.db = {};
758
- this.logger = logger;
759
- }
760
- idb() {
761
- this.db;
762
- }
763
- async start(baseURL) {
764
- return exception2Result(async () => {
765
- this.logger.Debug().Url(baseURL).Msg("starting");
766
- await SysContainer.start();
767
- this.db = await connectIdb(baseURL, this.logger);
768
- this.logger.Debug().Url(baseURL).Msg("started");
769
- });
770
- }
771
- async close() {
772
- return import_cement4.Result.Ok(void 0);
773
- }
774
- async destroy(baseUrl) {
775
- return exception2Result(async () => {
776
- const type = getStore(baseUrl, this.logger, joinDBName);
777
- const idb = this.db;
778
- const trans = idb.transaction(type, "readwrite");
779
- const object_store = trans.objectStore(type);
780
- const toDelete = [];
781
- for (let cursor = await object_store.openCursor(); cursor; cursor = await cursor.continue()) {
782
- toDelete.push(cursor.primaryKey);
783
- }
784
- for (const key of toDelete) {
785
- await trans.db.delete(type, key);
786
- }
787
- await trans.done;
788
- });
789
- }
790
- async get(url) {
791
- return exceptionWrapper(async () => {
792
- const key = getKey(url, this.logger);
793
- const store = getStore(url, this.logger, joinDBName);
794
- this.logger.Debug().Url(url).Str("key", key).Str("store", store).Msg("getting");
795
- const tx = this.db.transaction([store], "readonly");
796
- const bytes = await tx.objectStore(store).get(sanitzeKey(key));
797
- await tx.done;
798
- if (!bytes) {
799
- return import_cement4.Result.Err(new NotFoundError(`missing ${key}`));
800
- }
801
- return import_cement4.Result.Ok(bytes);
802
- });
803
- }
804
- async put(url, value) {
805
- return exception2Result(async () => {
806
- const key = getKey(url, this.logger);
807
- const store = getStore(url, this.logger, joinDBName);
808
- this.logger.Debug().Url(url).Str("key", key).Str("store", store).Msg("putting");
809
- const tx = this.db.transaction([store], "readwrite");
810
- await tx.objectStore(store).put(value, sanitzeKey(key));
811
- await tx.done;
812
- });
813
- }
814
- async delete(url) {
815
- return exception2Result(async () => {
816
- const key = getKey(url, this.logger);
817
- const store = getStore(url, this.logger, joinDBName);
818
- this.logger.Debug().Url(url).Str("key", key).Str("store", store).Msg("deleting");
819
- const tx = this.db.transaction([store], "readwrite");
820
- await tx.objectStore(store).delete(sanitzeKey(key));
821
- await tx.done;
822
- return import_cement4.Result.Ok(void 0);
823
- });
824
- }
825
- };
826
- IndexDBDataGateway = class extends IndexDBGateway {
827
- constructor(logger) {
828
- super(ensureLogger(logger, "IndexDBDataGateway", {}));
829
- }
830
- buildUrl(baseUrl, key) {
831
- const url = new URL(baseUrl.toString());
832
- url.searchParams.set("key", key);
833
- return Promise.resolve(import_cement4.Result.Ok(url));
834
- }
835
- };
836
- IndexDBWalGateway = class extends IndexDBGateway {
837
- constructor(logger) {
838
- super(ensureLogger(logger, "IndexDBWalGateway", {}));
839
- }
840
- buildUrl(baseUrl, key) {
841
- const url = new URL(baseUrl.toString());
842
- url.searchParams.set("key", key);
843
- return Promise.resolve(import_cement4.Result.Ok(url));
844
- }
845
- };
846
- IndexDBMetaGateway = class extends IndexDBGateway {
847
- constructor(logger) {
848
- super(ensureLogger(logger, "IndexDBDataGateway", {}));
849
- this.branches = /* @__PURE__ */ new Set();
850
- }
851
- async buildUrl(baseUrl, key) {
852
- const url = new URL(baseUrl.toString());
853
- this.branches.add(key);
854
- url.searchParams.set("key", key);
855
- return import_cement4.Result.Ok(url);
856
- }
857
- };
858
- txtEncoder = new TextEncoder();
859
- IndexDBTestStore = class {
860
- constructor(logger) {
861
- this.logger = ensureLogger(logger, "IndexDBTestStore", {});
862
- }
863
- async get(url, key) {
864
- const db = await connectIdb(url, this.logger);
865
- const store = getStore(url, this.logger, joinDBName);
866
- this.logger.Debug().Str("key", key).Str("store", store).Msg("getting");
867
- let bytes = await db.get(store, sanitzeKey(key));
868
- this.logger.Debug().Str("key", key).Str("store", store).Int("len", bytes.length).Msg("got");
869
- if (typeof bytes === "string") {
870
- bytes = txtEncoder.encode(bytes);
871
- }
872
- return bytes;
873
- }
874
- };
875
- }
876
- });
877
-
878
592
  // src/runtime/store-file.ts
879
593
  var store_file_exports = {};
880
594
  __export(store_file_exports, {
@@ -883,18 +597,18 @@ __export(store_file_exports, {
883
597
  FileTestStore: () => FileTestStore,
884
598
  FileWALGateway: () => FileWALGateway
885
599
  });
886
- async function ensureVersionFile(path, logger) {
887
- let once2 = versionFiles.get(path);
888
- if (!once2) {
889
- once2 = new import_cement7.ResolveOnce();
890
- versionFiles.set(path, once2);
891
- }
892
- await once2.once(async () => {
893
- await SysContainer.mkdir(path, { recursive: true });
894
- const vFile = SysContainer.join(path, "version");
600
+ async function ensureVersionFile(path2, logger) {
601
+ let once = versionFiles.get(path2);
602
+ if (!once) {
603
+ once = new import_cement6.ResolveOnce();
604
+ versionFiles.set(path2, once);
605
+ }
606
+ await once.once(async () => {
607
+ await SysContainer.mkdir(path2, { recursive: true });
608
+ const vFile = SysContainer.join(path2, "version");
895
609
  const vFileStat = await SysContainer.stat(vFile).catch(() => void 0);
896
610
  if (!vFileStat) {
897
- await SysContainer.writefile(SysContainer.join(path, "version"), FILESTORE_VERSION);
611
+ await SysContainer.writefile(SysContainer.join(path2, "version"), FILESTORE_VERSION);
898
612
  return;
899
613
  } else if (!vFileStat.isFile()) {
900
614
  throw logger.Error().Str("file", vFile).Msg(`version file is a directory`).AsError();
@@ -904,7 +618,7 @@ async function ensureVersionFile(path, logger) {
904
618
  console.warn(`version mismatch:${vFile}: ${v.toString()}!=${FILESTORE_VERSION}`);
905
619
  }
906
620
  });
907
- return path;
621
+ return path2;
908
622
  }
909
623
  function toArrayBuffer(buffer) {
910
624
  const ab = new ArrayBuffer(buffer.length);
@@ -914,13 +628,13 @@ function toArrayBuffer(buffer) {
914
628
  }
915
629
  return view;
916
630
  }
917
- var import_cement7, versionFiles, FileGateway, FileWALGateway, FileMetaGateway, FileDataGateway, FileTestStore;
631
+ var import_cement6, versionFiles, FileGateway, FileWALGateway, FileMetaGateway, FileDataGateway, FileTestStore;
918
632
  var init_store_file = __esm({
919
633
  "src/runtime/store-file.ts"() {
920
634
  "use strict";
921
635
  init_sys_container();
922
636
  init_store_file_version();
923
- import_cement7 = require("@adviser/cement");
637
+ import_cement6 = require("@adviser/cement");
924
638
  init_utils();
925
639
  init_gateway();
926
640
  init_store_file_utils();
@@ -933,54 +647,54 @@ var init_store_file = __esm({
933
647
  return exception2Result(async () => {
934
648
  await SysContainer.start();
935
649
  baseURL.searchParams.set("version", baseURL.searchParams.get("version") || FILESTORE_VERSION);
936
- const url = await this.buildUrl(baseURL, "dummy");
937
- if (url.isErr()) return url;
938
- const dbdir = this.getFilePath(url.Ok());
650
+ const url2 = await this.buildUrl(baseURL, "dummy");
651
+ if (url2.isErr()) return url2;
652
+ const dbdir = this.getFilePath(url2.Ok());
939
653
  await SysContainer.mkdir(SysContainer.dirname(dbdir), { recursive: true });
940
654
  const dbroot = SysContainer.dirname(dbdir);
941
- this.logger.Debug().Str("url", url.Ok().toString()).Str("dbroot", SysContainer.dirname(dbroot)).Msg("start");
655
+ this.logger.Debug().Str("url", url2.Ok().toString()).Str("dbroot", SysContainer.dirname(dbroot)).Msg("start");
942
656
  await ensureVersionFile(dbroot, this.logger);
943
657
  });
944
658
  }
945
659
  async close() {
946
- return import_cement7.Result.Ok(void 0);
660
+ return import_cement6.Result.Ok(void 0);
947
661
  }
948
- getFilePath(url) {
949
- const path = url.toString().replace(/^file:\/\//, "").replace(/\?.*$/, "");
950
- this.logger.Debug().Str("url", url.toString()).Str("path", path).Msg("getFilePath");
951
- return path;
662
+ getFilePath(url2) {
663
+ const path2 = url2.toString().replace(/^file:\/\//, "").replace(/\?.*$/, "");
664
+ this.logger.Debug().Str("url", url2.toString()).Str("path", path2).Msg("getFilePath");
665
+ return path2;
952
666
  }
953
- async put(url, body) {
667
+ async put(url2, body) {
954
668
  return exception2Result(async () => {
955
- const file = this.getFilePath(url);
956
- this.logger.Debug().Str("url", url.toString()).Str("file", file).Msg("put");
669
+ const file = this.getFilePath(url2);
670
+ this.logger.Debug().Str("url", url2.toString()).Str("file", file).Msg("put");
957
671
  await SysContainer.writefile(file, body);
958
672
  });
959
673
  }
960
- async get(url) {
674
+ async get(url2) {
961
675
  return exceptionWrapper(async () => {
962
- const file = this.getFilePath(url);
676
+ const file = this.getFilePath(url2);
963
677
  try {
964
678
  const res = await SysContainer.readfile(file);
965
- this.logger.Debug().Url(url).Str("file", file).Msg("get");
966
- return import_cement7.Result.Ok(new Uint8Array(res));
679
+ this.logger.Debug().Url(url2).Str("file", file).Msg("get");
680
+ return import_cement6.Result.Ok(new Uint8Array(res));
967
681
  } catch (e) {
968
682
  if (isNotFoundError(e)) {
969
- return import_cement7.Result.Err(new NotFoundError(`file not found: ${file}`));
683
+ return import_cement6.Result.Err(new NotFoundError(`file not found: ${file}`));
970
684
  }
971
- return import_cement7.Result.Err(e);
685
+ return import_cement6.Result.Err(e);
972
686
  }
973
687
  });
974
688
  }
975
- async delete(url) {
689
+ async delete(url2) {
976
690
  return exception2Result(async () => {
977
- await SysContainer.unlink(this.getFilePath(url));
691
+ await SysContainer.unlink(this.getFilePath(url2));
978
692
  });
979
693
  }
980
694
  async destroyDir(baseURL) {
981
- const url = await this.buildUrl(baseURL, "x");
982
- if (url.isErr()) return url;
983
- const filepath = SysContainer.dirname(this.getFilePath(url.Ok()));
695
+ const url2 = await this.buildUrl(baseURL, "x");
696
+ if (url2.isErr()) return url2;
697
+ const filepath = SysContainer.dirname(this.getFilePath(url2.Ok()));
984
698
  let dir = [];
985
699
  try {
986
700
  dir = await SysContainer.readdir(filepath);
@@ -999,7 +713,7 @@ var init_store_file = __esm({
999
713
  }
1000
714
  }
1001
715
  }
1002
- return import_cement7.Result.Ok(void 0);
716
+ return import_cement6.Result.Ok(void 0);
1003
717
  }
1004
718
  };
1005
719
  FileWALGateway = class extends FileGateway {
@@ -1010,9 +724,9 @@ var init_store_file = __esm({
1010
724
  return this.destroyDir(baseURL);
1011
725
  }
1012
726
  async buildUrl(baseUrl, key) {
1013
- const url = new URL(baseUrl.toString());
1014
- url.pathname = SysContainer.join(await getPath(baseUrl, this.logger), ensureIndexName(baseUrl, "wal"), key + ".json");
1015
- return import_cement7.Result.Ok(url);
727
+ const url2 = new URL(baseUrl.toString());
728
+ url2.pathname = SysContainer.join(await getPath(baseUrl, this.logger), ensureIndexName(baseUrl, "wal"), key + ".json");
729
+ return import_cement6.Result.Ok(url2);
1016
730
  }
1017
731
  };
1018
732
  FileMetaGateway = class extends FileGateway {
@@ -1023,9 +737,9 @@ var init_store_file = __esm({
1023
737
  return this.destroyDir(baseURL);
1024
738
  }
1025
739
  async buildUrl(baseUrl, key) {
1026
- const url = new URL(baseUrl.toString());
1027
- url.pathname = SysContainer.join(await getPath(baseUrl, this.logger), ensureIndexName(baseUrl, "meta"), key + ".json");
1028
- return import_cement7.Result.Ok(url);
740
+ const url2 = new URL(baseUrl.toString());
741
+ url2.pathname = SysContainer.join(await getPath(baseUrl, this.logger), ensureIndexName(baseUrl, "meta"), key + ".json");
742
+ return import_cement6.Result.Ok(url2);
1029
743
  }
1030
744
  };
1031
745
  FileDataGateway = class extends FileGateway {
@@ -1037,21 +751,21 @@ var init_store_file = __esm({
1037
751
  return this.destroyDir(baseURL);
1038
752
  }
1039
753
  async buildUrl(baseUrl, key) {
1040
- const url = new URL(baseUrl.toString());
1041
- url.pathname = SysContainer.join(await getPath(baseUrl, this.logger), ensureIndexName(baseUrl, "data"), key + ".car");
1042
- return import_cement7.Result.Ok(url);
754
+ const url2 = new URL(baseUrl.toString());
755
+ url2.pathname = SysContainer.join(await getPath(baseUrl, this.logger), ensureIndexName(baseUrl, "data"), key + ".car");
756
+ return import_cement6.Result.Ok(url2);
1043
757
  }
1044
758
  };
1045
759
  FileTestStore = class {
1046
760
  constructor(logger) {
1047
761
  this.logger = ensureLogger(logger, "FileTestStore");
1048
762
  }
1049
- async get(url, key) {
1050
- const logger = ensureLogger(this.logger, "get", { url: url.toString(), key });
763
+ async get(url2, key) {
764
+ const logger = ensureLogger(this.logger, "get", { url: url2.toString(), key });
1051
765
  const dbFile = SysContainer.join(
1052
- await getPath(url, this.logger),
1053
- getStore(url, this.logger, SysContainer.join),
1054
- getFileName(url, key, this.logger)
766
+ await getPath(url2, this.logger),
767
+ getStore(url2, this.logger, SysContainer.join),
768
+ getFileName(url2, key, this.logger)
1055
769
  );
1056
770
  logger.Debug().Str("dbFile", dbFile).Msg("get");
1057
771
  const buffer = await SysContainer.readfile(dbFile);
@@ -1062,776 +776,197 @@ var init_store_file = __esm({
1062
776
  }
1063
777
  });
1064
778
 
1065
- // src/runtime/store-sql/sqlite-adapter-better-sqlite3.ts
1066
- var import_cement8, onceSQLiteConnections, SQLiteConnection;
1067
- var init_sqlite_adapter_better_sqlite3 = __esm({
1068
- "src/runtime/store-sql/sqlite-adapter-better-sqlite3.ts"() {
1069
- "use strict";
1070
- import_cement8 = require("@adviser/cement");
1071
- init_sys_container();
1072
- init_ensurer();
1073
- onceSQLiteConnections = new import_cement8.KeyedResolvOnce();
1074
- SQLiteConnection = class _SQLiteConnection {
1075
- static fromURL(url, opts = {}) {
1076
- return new _SQLiteConnection(url, opts);
1077
- }
1078
- get client() {
1079
- if (!this._client) {
1080
- throw this.logger.Error().Msg("client not connected").AsError();
1081
- }
1082
- return this._client;
1083
- }
1084
- constructor(url, opts) {
1085
- this.opts = ensureSQLOpts(url, opts, "SQLiteConnection", { url });
1086
- this.logger = this.opts.logger;
1087
- this.url = url;
1088
- this.logger.Debug().Msg("constructor");
1089
- }
1090
- async connect() {
1091
- let fName = this.url.toString().replace("sqlite://", "").replace(/\?.*$/, "");
1092
- if (!fName) {
1093
- throw this.logger.Error().Str("url", this.url.toString()).Msg("filename is empty").AsError();
1094
- }
1095
- const hasName = this.url.searchParams.get("name");
1096
- if (hasName) {
1097
- fName = SysContainer.join(fName, hasName);
1098
- if (!fName.endsWith(".sqlite")) {
1099
- fName += ".sqlite";
1100
- }
1101
- }
1102
- this._client = await onceSQLiteConnections.get(fName).once(async () => {
1103
- this.logger.Debug().Str("filename", fName).Msg("connect");
1104
- const Sqlite3Database = (await import("better-sqlite3")).default;
1105
- if (hasName) {
1106
- await SysContainer.mkdir(SysContainer.dirname(fName), { recursive: true });
1107
- }
1108
- const db = new Sqlite3Database(fName, {
1109
- // verbose: console.log,
1110
- nativeBinding: "./node_modules/better-sqlite3/build/Release/better_sqlite3.node"
1111
- });
1112
- if (!db) {
1113
- throw this.logger.Error().Msg("connect failed").AsError();
1114
- }
1115
- return db;
1116
- });
1117
- }
1118
- async close() {
1119
- this.logger.Debug().Msg("close");
1120
- await this.client.close();
1121
- }
1122
- };
1123
- }
779
+ // src/runtime/store-indexdb.ts
780
+ var store_indexdb_exports = {};
781
+ __export(store_indexdb_exports, {
782
+ IndexDBDataGateway: () => IndexDBDataGateway,
783
+ IndexDBMetaGateway: () => IndexDBMetaGateway,
784
+ IndexDBTestStore: () => IndexDBTestStore,
785
+ IndexDBWalGateway: () => IndexDBWalGateway,
786
+ getIndexDBName: () => getIndexDBName
1124
787
  });
1125
-
1126
- // src/runtime/store-sql/sql-connection-factory.ts
1127
- function SQLConnectionFactory(databaseURL, opts = {}) {
1128
- const logger = ensureLogger(opts, "SQLFactory");
1129
- switch (databaseURL.protocol) {
1130
- case "sqlite:":
1131
- logger.Debug().Str("databaseURL", databaseURL.toString()).Msg("connecting to sqlite");
1132
- return SQLiteConnection.fromURL(databaseURL, {
1133
- ...opts,
1134
- logger
1135
- });
1136
- default:
1137
- throw logger.Error().Msg("unsupported protocol " + databaseURL.protocol).AsError();
1138
- }
788
+ function ensureVersion(url2) {
789
+ const ret = new URL(url2.toString());
790
+ ret.searchParams.set("version", url2.searchParams.get("version") || INDEXDB_VERSION);
791
+ return ret;
1139
792
  }
1140
- var init_sql_connection_factory = __esm({
1141
- "src/runtime/store-sql/sql-connection-factory.ts"() {
1142
- "use strict";
1143
- init_utils();
1144
- init_sqlite_adapter_better_sqlite3();
793
+ function sanitzeKey(key) {
794
+ if (key.length === 1) {
795
+ key = key[0];
1145
796
  }
1146
- });
1147
-
1148
- // src/runtime/store-sql/v0.19-sqlite/sqlite-ensure-version.ts
1149
- async function ensureSQLiteVersion(url, dbConn) {
1150
- const version = await once.once(async () => {
1151
- const logger = ensureLogger(dbConn.opts, "ensureSQLiteVersion", {
1152
- version: SQLITE_VERSION,
1153
- url: dbConn.url.toString()
1154
- });
1155
- await dbConn.client.prepare(
1156
- `CREATE TABLE IF NOT EXISTS version (
1157
- version TEXT NOT NULL,
1158
- updated_at TEXT NOT NULL)`
1159
- ).run();
1160
- const rows = await dbConn.client.prepare(`select version from version`).all();
1161
- if (rows.length > 1) {
1162
- throw logger.Error().Msg(`more than one version row found`).AsError();
1163
- }
1164
- if (rows.length === 0) {
1165
- await dbConn.client.prepare(`insert into version (version, updated_at) values (?, ?)`).run(SQLITE_VERSION, (/* @__PURE__ */ new Date()).toISOString());
1166
- return SQLITE_VERSION;
1167
- }
1168
- if (rows[0].version !== SQLITE_VERSION) {
1169
- logger.Warn().Any("row", rows[0]).Msg(`version mismatch`);
1170
- }
1171
- return rows[0].version;
1172
- });
1173
- url.searchParams.set("version", version);
797
+ return key;
1174
798
  }
1175
- var import_cement9, once;
1176
- var init_sqlite_ensure_version = __esm({
1177
- "src/runtime/store-sql/v0.19-sqlite/sqlite-ensure-version.ts"() {
1178
- "use strict";
1179
- init_version();
1180
- import_cement9 = require("@adviser/cement");
1181
- init_utils();
1182
- once = new import_cement9.ResolveOnce();
1183
- }
1184
- });
1185
-
1186
- // src/runtime/store-sql/v0.19-sqlite/sqlite-wal-store.ts
1187
- var sqlite_wal_store_exports = {};
1188
- __export(sqlite_wal_store_exports, {
1189
- V0_18_0SQLiteWalStore: () => V0_18_0SQLiteWalStore,
1190
- WalSQLRecordBuilder: () => WalSQLRecordBuilder
1191
- });
1192
- var import_cement10, WalSQLRecordBuilder, V0_18_0SQLiteWalStore;
1193
- var init_sqlite_wal_store = __esm({
1194
- "src/runtime/store-sql/v0.19-sqlite/sqlite-wal-store.ts"() {
1195
- "use strict";
1196
- import_cement10 = require("@adviser/cement");
1197
- init_sqlite_ensure_version();
1198
- init_utils();
1199
- WalSQLRecordBuilder = class _WalSQLRecordBuilder {
1200
- #record;
1201
- constructor(record) {
1202
- this.#record = record;
1203
- }
1204
- static fromRecord(record) {
1205
- return new _WalSQLRecordBuilder(record);
1206
- }
1207
- build() {
1208
- return this.#record;
1209
- }
1210
- };
1211
- V0_18_0SQLiteWalStore = class {
1212
- constructor(dbConn) {
1213
- this.dbConn = dbConn;
1214
- this.textEncoder = dbConn.opts.textEncoder;
1215
- this.logger = ensureLogger(dbConn.opts, "SQLiteWalStore");
1216
- this.logger.Debug().Msg("constructor");
1217
- }
1218
- async start(url) {
1219
- this.logger.Debug().Msg("start");
1220
- await this.dbConn.connect();
1221
- await ensureSQLiteVersion(url, this.dbConn);
1222
- }
1223
- table(url) {
1224
- return getStore(url, this.logger, (...x) => x.join("_"));
1225
- }
1226
- #createTable = new import_cement10.KeyedResolvOnce();
1227
- async createTable(url) {
1228
- return this.#createTable.get(this.table(url)).once(async (table) => {
1229
- await this.dbConn.client.prepare(
1230
- `CREATE TABLE IF NOT EXISTS ${table} (
1231
- name TEXT not null,
1232
- branch TEXT not null,
1233
- state BLOB NOT NULL,
1234
- updated_at TEXT NOT NULL,
1235
- PRIMARY KEY (name, branch)
1236
- )`
1237
- ).run();
1238
- });
1239
- }
1240
- #insertStmt = new import_cement10.KeyedResolvOnce();
1241
- async insertStmt(url) {
1242
- return this.#insertStmt.get(this.table(url)).once(async (table) => {
1243
- await this.createTable(url);
1244
- return this.dbConn.client.prepare(`insert into ${table}
1245
- (name, branch, state, updated_at)
1246
- values (?, ?, ?, ?)
1247
- ON CONFLICT(name, branch) DO UPDATE SET state=?, updated_at=?
1248
- `);
1249
- });
1250
- }
1251
- #selectStmt = new import_cement10.KeyedResolvOnce();
1252
- async selectStmt(url) {
1253
- return this.#selectStmt.get(this.table(url)).once(async (table) => {
1254
- await this.createTable(url);
1255
- return this.dbConn.client.prepare(
1256
- `select name, branch, state, updated_at from ${table}
1257
- where name = ? and branch = ?`
1258
- );
1259
- });
1260
- }
1261
- #deleteStmt = new import_cement10.KeyedResolvOnce();
1262
- async deleteStmt(url) {
1263
- return this.#deleteStmt.get(this.table(url)).once(async (table) => {
1264
- await this.createTable(url);
1265
- return this.dbConn.client.prepare(`delete from ${table} where name = ? and branch = ?`);
1266
- });
1267
- }
1268
- async insert(url, ose) {
1269
- const wal = WalSQLRecordBuilder.fromRecord(ose).build();
1270
- const bufState = Buffer.from(this.textEncoder.encode(JSON.stringify(wal.state)));
1271
- return this.insertStmt(url).then(
1272
- (i) => i.run(ose.name, ose.branch, bufState, wal.updated_at.toISOString(), bufState, wal.updated_at.toISOString())
1273
- );
1274
- }
1275
- async select(url, key) {
1276
- const res = (await this.selectStmt(url).then((i) => i.all(key.name, key.branch))).map((irow) => {
1277
- const row = irow;
1278
- return {
1279
- name: row.name,
1280
- branch: row.branch,
1281
- state: Uint8Array.from(row.state),
1282
- updated_at: new Date(row.updated_at)
1283
- };
1284
- });
1285
- this.logger.Debug().Str("name", key.name).Str("branch", key.branch).Uint64("res", res.length).Msg("select");
1286
- return res;
1287
- }
1288
- async delete(url, key) {
1289
- this.logger.Debug().Str("name", key.name).Str("branch", key.branch).Msg("delete");
1290
- return this.deleteStmt(url).then((i) => i.run(key.name, key.branch));
1291
- }
1292
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
1293
- async close(url) {
1294
- this.logger.Debug().Msg("close");
1295
- return import_cement10.Result.Ok(void 0);
1296
- }
1297
- async destroy(url) {
1298
- return exception2Result(async () => {
1299
- this.logger.Debug().Msg("destroy");
1300
- await this.createTable(url);
1301
- await this.dbConn.client.prepare(`delete from ${this.table(url)}`).run();
1302
- });
1303
- }
1304
- };
1305
- }
1306
- });
1307
-
1308
- // src/runtime/store-sql/v0.19-sqlite/sqlite-data-store.ts
1309
- var sqlite_data_store_exports = {};
1310
- __export(sqlite_data_store_exports, {
1311
- DataSQLRecordBuilder: () => DataSQLRecordBuilder,
1312
- V0_18_0SQLiteDataStore: () => V0_18_0SQLiteDataStore
1313
- });
1314
- var import_cement11, DataSQLRecordBuilder, V0_18_0SQLiteDataStore;
1315
- var init_sqlite_data_store = __esm({
1316
- "src/runtime/store-sql/v0.19-sqlite/sqlite-data-store.ts"() {
1317
- "use strict";
1318
- import_cement11 = require("@adviser/cement");
1319
- init_sqlite_ensure_version();
1320
- init_utils();
1321
- DataSQLRecordBuilder = class _DataSQLRecordBuilder {
1322
- constructor(dataRecord) {
1323
- this.dataRecord = dataRecord;
1324
- }
1325
- static fromUploadParams(data, params) {
1326
- return new _DataSQLRecordBuilder({
1327
- name: params.name,
1328
- car: params.car,
1329
- data,
1330
- updated_at: /* @__PURE__ */ new Date()
1331
- });
1332
- }
1333
- build() {
1334
- return this.dataRecord;
1335
- }
1336
- };
1337
- V0_18_0SQLiteDataStore = class {
1338
- constructor(dbConn) {
1339
- this.dbConn = dbConn;
1340
- this.logger = ensureLogger(dbConn.opts, "SQLiteDataStore");
1341
- this.logger.Debug().Msg("constructor");
1342
- }
1343
- table(url) {
1344
- return getStore(url, this.logger, (...x) => x.join("_"));
1345
- }
1346
- #createTable = new import_cement11.KeyedResolvOnce();
1347
- async createTable(url) {
1348
- return this.#createTable.get(this.table(url)).once(async (table) => {
1349
- await this.dbConn.client.prepare(
1350
- `CREATE TABLE IF NOT EXISTS ${table} (
1351
- name TEXT NOT NULL,
1352
- car TEXT PRIMARY KEY,
1353
- data BLOB NOT NULL,
1354
- updated_at TEXT NOT NULL)`
1355
- ).run();
1356
- });
1357
- }
1358
- #insertStmt = new import_cement11.KeyedResolvOnce();
1359
- async insertStmt(url) {
1360
- return this.#insertStmt.get(this.table(url)).once(async (table) => {
1361
- await this.createTable(url);
1362
- return this.dbConn.client.prepare(`
1363
- insert into ${table}
1364
- (name, car, data, updated_at) values (?, ?, ?, ?)
1365
- ON CONFLICT(car) DO UPDATE SET updated_at=?`);
1366
- });
1367
- }
1368
- #selectStmt = new import_cement11.KeyedResolvOnce();
1369
- async selectStmt(url) {
1370
- return this.#selectStmt.get(this.table(url)).once(async (table) => {
1371
- await this.createTable(url);
1372
- return this.dbConn.client.prepare(`select name, car, data, updated_at from ${table} where car = ?`);
1373
- });
1374
- }
1375
- #deleteStmt = new import_cement11.KeyedResolvOnce();
1376
- async deleteStmt(url) {
1377
- return this.#deleteStmt.get(this.table(url)).once(async (table) => {
1378
- await this.createTable(url);
1379
- return this.dbConn.client.prepare(`delete from ${table} where car = ?`);
1380
- });
1381
- }
1382
- async start(url) {
1383
- this.logger.Debug().Msg("start-connect");
1384
- await this.dbConn.connect();
1385
- this.logger.Debug().Msg("start-connected");
1386
- await ensureSQLiteVersion(url, this.dbConn);
1387
- this.logger.Debug().Msg("start-set-version");
1388
- }
1389
- async insert(url, ose) {
1390
- this.logger.Debug().Str("name", ose.name).Str("car", ose.car).Uint64("data-len", ose.data.length).Msg("insert");
1391
- const updated_at = ose.updated_at.toISOString();
1392
- return this.insertStmt(url).then((i) => i.run(ose.name, ose.car, Buffer.from(ose.data), updated_at, updated_at));
1393
- }
1394
- async select(url, car) {
1395
- this.logger.Debug().Str("car", car).Msg("select");
1396
- return (await this.selectStmt(url).then((i) => i.all(car))).map((irow) => {
1397
- const row = irow;
1398
- return {
1399
- name: row.name,
1400
- car: row.car,
1401
- data: Uint8Array.from(row.data),
1402
- updated_at: new Date(row.updated_at)
1403
- };
1404
- });
1405
- }
1406
- async delete(url, car) {
1407
- this.logger.Debug().Str("car", car).Msg("delete");
1408
- const ret = await this.deleteStmt(url).then((i) => i.run(car));
1409
- return ret;
1410
- }
1411
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
1412
- async close(url) {
1413
- this.logger.Debug().Msg("close");
1414
- return import_cement11.Result.Ok(void 0);
1415
- }
1416
- async destroy(url) {
1417
- return exception2Result(async () => {
1418
- this.logger.Debug().Msg("destroy");
1419
- await this.createTable(url);
1420
- await this.dbConn.client.prepare(`delete from ${this.table(url)}`).run();
1421
- });
1422
- }
1423
- };
1424
- }
1425
- });
1426
-
1427
- // src/runtime/store-sql/v0.19-sqlite/sqlite-meta-store.ts
1428
- var sqlite_meta_store_exports = {};
1429
- __export(sqlite_meta_store_exports, {
1430
- MetaSQLRecordBuilder: () => MetaSQLRecordBuilder,
1431
- V0_18_0SQLiteMetaStore: () => V0_18_0SQLiteMetaStore
1432
- });
1433
- var import_cement12, MetaSQLRecordBuilder, V0_18_0SQLiteMetaStore;
1434
- var init_sqlite_meta_store = __esm({
1435
- "src/runtime/store-sql/v0.19-sqlite/sqlite-meta-store.ts"() {
1436
- "use strict";
1437
- import_cement12 = require("@adviser/cement");
1438
- init_sqlite_ensure_version();
1439
- init_utils();
1440
- MetaSQLRecordBuilder = class _MetaSQLRecordBuilder {
1441
- constructor(record, textEncoder3) {
1442
- this.record = record;
1443
- this.textEncoder = textEncoder3;
1444
- }
1445
- static fromUploadMetaFnParams(data, params, textEncoder3) {
1446
- return new _MetaSQLRecordBuilder(
1447
- {
1448
- name: params.name,
1449
- branch: params.branch,
1450
- meta: data,
1451
- updated_at: /* @__PURE__ */ new Date()
1452
- },
1453
- textEncoder3
1454
- );
1455
- }
1456
- static fromBytes(str, name, branch, textEncoder3) {
1457
- return new _MetaSQLRecordBuilder(
1458
- {
1459
- name,
1460
- branch,
1461
- meta: textEncoder3.encode(str),
1462
- updated_at: /* @__PURE__ */ new Date()
1463
- },
1464
- textEncoder3
1465
- );
1466
- }
1467
- build() {
1468
- return this.record;
1469
- }
1470
- };
1471
- V0_18_0SQLiteMetaStore = class {
1472
- constructor(dbConn) {
1473
- this.dbConn = dbConn;
1474
- this.logger = ensureLogger(dbConn.opts, "SQLiteMetaStore");
1475
- this.logger.Debug().Msg("constructor");
1476
- }
1477
- async start(url) {
1478
- this.logger.Debug().Url(url).Msg("starting");
1479
- await this.dbConn.connect();
1480
- await ensureSQLiteVersion(url, this.dbConn);
1481
- this.logger.Debug().Url(url).Msg("started");
1482
- }
1483
- table(url) {
1484
- return getStore(url, this.logger, (...x) => x.join("_"));
1485
- }
1486
- #createTable = new import_cement12.KeyedResolvOnce();
1487
- async createTable(url) {
1488
- return this.#createTable.get(this.table(url)).once(async (table) => {
1489
- await this.dbConn.client.prepare(
1490
- `CREATE TABLE IF NOT EXISTS ${table} (
1491
- name TEXT not null,
1492
- branch TEXT not null,
1493
- meta BLOB NOT NULL,
1494
- updated_at TEXT NOT NULL,
1495
- PRIMARY KEY (name, branch)
1496
- )`
1497
- ).run();
1498
- });
1499
- }
1500
- #insertStmt = new import_cement12.KeyedResolvOnce();
1501
- async insertStmt(url) {
1502
- return this.#insertStmt.get(this.table(url)).once(async (table) => {
1503
- await this.createTable(url);
1504
- return this.dbConn.client.prepare(`insert into ${table}
1505
- (name, branch, meta, updated_at)
1506
- values (?, ?, ?, ?)
1507
- ON CONFLICT(name, branch) DO UPDATE SET meta=?, updated_at=?
1508
- `);
1509
- });
1510
- }
1511
- #selectStmt = new import_cement12.KeyedResolvOnce();
1512
- async selectStmt(url) {
1513
- return this.#selectStmt.get(this.table(url)).once(async (table) => {
1514
- await this.createTable(url);
1515
- return this.dbConn.client.prepare(`select name, branch, meta, updated_at from ${table} where name = ? and branch = ?`);
1516
- });
1517
- }
1518
- #deleteStmt = new import_cement12.KeyedResolvOnce();
1519
- async deleteStmt(url) {
1520
- return this.#deleteStmt.get(this.table(url)).once(async (table) => {
1521
- await this.createTable(url);
1522
- return this.dbConn.client.prepare(`delete from ${table} where name = ? and branch = ?`);
1523
- });
1524
- }
1525
- async insert(url, ose) {
1526
- this.logger.Debug().Str("name", ose.name).Str("branch", ose.branch).Uint64("data-len", ose.meta.length).Msg("insert");
1527
- const bufMeta = Buffer.from(ose.meta);
1528
- return this.insertStmt(url).then(
1529
- (i) => i.run(ose.name, ose.branch, bufMeta, ose.updated_at.toISOString(), bufMeta, ose.updated_at.toISOString())
1530
- );
1531
- }
1532
- async select(url, key) {
1533
- this.logger.Debug().Str("name", key.name).Str("branch", key.branch).Msg("select");
1534
- return (await this.selectStmt(url).then((i) => i.all(key.name, key.branch))).map((irow) => {
1535
- const row = irow;
1536
- return {
1537
- name: row.name,
1538
- branch: row.branch,
1539
- meta: Uint8Array.from(row.meta),
1540
- updated_at: new Date(row.updated_at)
1541
- };
1542
- });
1543
- }
1544
- async delete(url, key) {
1545
- this.logger.Debug().Str("name", key.name).Str("branch", key.branch).Msg("delete");
1546
- return this.deleteStmt(url).then((i) => i.run(key.name, key.branch));
1547
- }
1548
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
1549
- async close(url) {
1550
- this.logger.Debug().Msg("close");
1551
- return import_cement12.Result.Ok(void 0);
1552
- }
1553
- async destroy(url) {
1554
- return exception2Result(async () => {
1555
- this.logger.Debug().Msg("destroy");
1556
- await this.dbConn.client.prepare(`delete from ${this.table(url)}`).run();
799
+ async function connectIdb(url2, logger) {
800
+ const dbName = getIndexDBName(url2, logger);
801
+ const once = await onceIndexDB.get(dbName.fullDb).once(async () => {
802
+ const db = await (0, import_idb.openDB)(dbName.fullDb, 1, {
803
+ upgrade(db2) {
804
+ ["version", "data", "wal", "meta", "idx.data", "idx.wal", "idx.meta"].map((store) => {
805
+ db2.createObjectStore(store, {
806
+ autoIncrement: false
807
+ });
1557
808
  });
1558
809
  }
1559
- };
1560
- }
1561
- });
1562
-
1563
- // src/runtime/store-sql/store-version-factory.ts
1564
- async function WalStoreFactory(db) {
1565
- switch (db.opts.sqlFlavor) {
1566
- case "sqlite": {
1567
- const { V0_18_0SQLiteWalStore: V0_18_0SQLiteWalStore2 } = await Promise.resolve().then(() => (init_sqlite_wal_store(), sqlite_wal_store_exports));
1568
- const store = new V0_18_0SQLiteWalStore2(db);
1569
- return store;
810
+ });
811
+ const found = await db.get("version", "version");
812
+ const version = url2.searchParams.get("version") || INDEXDB_VERSION;
813
+ if (!found) {
814
+ await db.put("version", { version }, "version");
815
+ } else if (found.version !== version) {
816
+ logger.Warn().Str("url", url2.toString()).Str("version", version).Str("found", found.version).Msg("version mismatch");
1570
817
  }
1571
- default:
1572
- throw ensureLogger(db.opts, "WalStoreFactory").Error().Msg("unsupported db connection").AsError();
1573
- }
818
+ return { db, dbName, version };
819
+ });
820
+ url2.searchParams.set("version", once.version);
821
+ return once.db;
1574
822
  }
1575
- async function DataStoreFactory(db) {
1576
- switch (db.opts.sqlFlavor) {
1577
- case "sqlite": {
1578
- const { V0_18_0SQLiteDataStore: V0_18_0SQLiteDataStore2 } = await Promise.resolve().then(() => (init_sqlite_data_store(), sqlite_data_store_exports));
1579
- const store = new V0_18_0SQLiteDataStore2(db);
1580
- return store;
1581
- }
1582
- default:
1583
- throw ensureLogger(db.opts, "DataStoreFactory").Error().Msg("unsupported db connection").AsError();
1584
- }
823
+ function joinDBName(...names) {
824
+ return names.map((i) => i.replace(/^[^a-zA-Z0-9]+/g, "").replace(/[^a-zA-Z0-9]+/g, "_")).filter((i) => i.length).join(".");
1585
825
  }
1586
- async function MetaStoreFactory(db) {
1587
- switch (db.opts.sqlFlavor) {
1588
- case "sqlite": {
1589
- const { V0_18_0SQLiteMetaStore: V0_18_0SQLiteMetaStore2 } = await Promise.resolve().then(() => (init_sqlite_meta_store(), sqlite_meta_store_exports));
1590
- const store = new V0_18_0SQLiteMetaStore2(db);
1591
- return store;
1592
- }
1593
- default:
1594
- throw ensureLogger(db.opts, "MetaStoreFactory").Error().Msg("unsupported db connection").AsError();
1595
- }
826
+ function getIndexDBName(iurl, logger) {
827
+ const url2 = ensureVersion(iurl);
828
+ const fullDb = url2.pathname.replace(/^\/+/, "").replace(/\?.*$/, "");
829
+ const dbName = url2.searchParams.get("name");
830
+ if (!dbName) throw logger.Error().Str("url", url2.toString()).Msg(`name not found`).AsError();
831
+ const result = joinDBName(fullDb, dbName);
832
+ const objStore = getStore(url2, logger, joinDBName);
833
+ const connectionKey = [result, objStore].join(":");
834
+ return {
835
+ fullDb: result,
836
+ objStore,
837
+ connectionKey,
838
+ dbName
839
+ };
1596
840
  }
1597
- var init_store_version_factory = __esm({
1598
- "src/runtime/store-sql/store-version-factory.ts"() {
1599
- "use strict";
1600
- init_utils();
1601
- init_version();
1602
- }
1603
- });
1604
-
1605
- // src/runtime/store-sql/store-sql.ts
1606
- var store_sql_exports2 = {};
1607
- __export(store_sql_exports2, {
1608
- SQLDataGateway: () => SQLDataGateway,
1609
- SQLMetaGateway: () => SQLMetaGateway,
1610
- SQLTestStore: () => SQLTestStore,
1611
- SQLWalGateway: () => SQLWalGateway
1612
- });
1613
- var import_cement13, SQLWalGateway, SQLMetaGateway, SQLDataGateway, SQLTestStore;
1614
- var init_store_sql2 = __esm({
1615
- "src/runtime/store-sql/store-sql.ts"() {
841
+ var import_idb, import_cement7, onceIndexDB, IndexDBGateway, IndexDBDataGateway, IndexDBWalGateway, IndexDBMetaGateway, txtEncoder, IndexDBTestStore;
842
+ var init_store_indexdb = __esm({
843
+ "src/runtime/store-indexdb.ts"() {
1616
844
  "use strict";
1617
- import_cement13 = require("@adviser/cement");
1618
- init_sql_connection_factory();
1619
- init_store_version_factory();
845
+ import_idb = require("idb");
846
+ import_cement7 = require("@adviser/cement");
847
+ init_store_indexdb_version();
1620
848
  init_utils();
1621
849
  init_gateway();
1622
- SQLWalGateway = class {
850
+ init_sys_container();
851
+ onceIndexDB = new import_cement7.KeyedResolvOnce();
852
+ IndexDBGateway = class {
1623
853
  constructor(logger) {
1624
- this.walSQLStore = {};
1625
- this.logger = ensureLogger(logger, "SQLWalGateway");
854
+ this.db = {};
855
+ this.logger = logger;
1626
856
  }
1627
- buildUrl(baseUrl, key) {
1628
- const url = new URL(baseUrl.toString());
1629
- url.searchParams.set("key", key);
1630
- return Promise.resolve(import_cement13.Result.Ok(url));
857
+ idb() {
858
+ this.db;
1631
859
  }
1632
- async start(baseUrl) {
860
+ async start(baseURL) {
1633
861
  return exception2Result(async () => {
1634
- this.logger.Debug().Url(baseUrl).Msg("start");
1635
- const conn = SQLConnectionFactory(baseUrl);
1636
- const ws = await WalStoreFactory(conn);
1637
- await ws.start(baseUrl);
1638
- this.walSQLStore = ws;
862
+ this.logger.Debug().Url(baseURL).Msg("starting");
863
+ await SysContainer.start();
864
+ this.db = await connectIdb(baseURL, this.logger);
865
+ this.logger.Debug().Url(baseURL).Msg("started");
1639
866
  });
1640
867
  }
1641
- close(baseUrl) {
1642
- return this.walSQLStore.close(baseUrl);
1643
- }
1644
- destroy(baseUrl) {
1645
- return this.walSQLStore.destroy(baseUrl);
868
+ async close() {
869
+ return import_cement7.Result.Ok(void 0);
1646
870
  }
1647
- async put(url, body) {
871
+ async destroy(baseUrl) {
1648
872
  return exception2Result(async () => {
1649
- const branch = getKey(url, this.logger);
1650
- const name = getName(url, this.logger);
1651
- await this.walSQLStore.insert(url, {
1652
- state: body,
1653
- updated_at: /* @__PURE__ */ new Date(),
1654
- name,
1655
- branch
1656
- });
873
+ const type = getStore(baseUrl, this.logger, joinDBName);
874
+ const idb = this.db;
875
+ const trans = idb.transaction(type, "readwrite");
876
+ const object_store = trans.objectStore(type);
877
+ const toDelete = [];
878
+ for (let cursor = await object_store.openCursor(); cursor; cursor = await cursor.continue()) {
879
+ toDelete.push(cursor.primaryKey);
880
+ }
881
+ for (const key of toDelete) {
882
+ await trans.db.delete(type, key);
883
+ }
884
+ await trans.done;
1657
885
  });
1658
886
  }
1659
- async get(url) {
887
+ async get(url2) {
1660
888
  return exceptionWrapper(async () => {
1661
- const branch = getKey(url, this.logger);
1662
- const name = getName(url, this.logger);
1663
- const record = await this.walSQLStore.select(url, { name, branch });
1664
- if (record.length === 0) {
1665
- return import_cement13.Result.Err(new NotFoundError(`not found ${name} ${branch}`));
889
+ const key = getKey(url2, this.logger);
890
+ const store = getStore(url2, this.logger, joinDBName);
891
+ this.logger.Debug().Url(url2).Str("key", key).Str("store", store).Msg("getting");
892
+ const tx = this.db.transaction([store], "readonly");
893
+ const bytes = await tx.objectStore(store).get(sanitzeKey(key));
894
+ await tx.done;
895
+ if (!bytes) {
896
+ return import_cement7.Result.Err(new NotFoundError(`missing ${key}`));
1666
897
  }
1667
- return import_cement13.Result.Ok(record[0].state);
1668
- });
1669
- }
1670
- async delete(url) {
1671
- return exception2Result(async () => {
1672
- const branch = getKey(url, this.logger);
1673
- const name = getName(url, this.logger);
1674
- await this.walSQLStore.delete(url, { name, branch });
898
+ return import_cement7.Result.Ok(bytes);
1675
899
  });
1676
900
  }
1677
- };
1678
- SQLMetaGateway = class {
1679
- constructor(logger) {
1680
- this.metaSQLStore = {};
1681
- this.logger = ensureLogger(logger, "SQLMetaGateway");
1682
- }
1683
- buildUrl(baseUrl, key) {
1684
- const url = new URL(baseUrl.toString());
1685
- url.searchParams.set("key", key);
1686
- return Promise.resolve(import_cement13.Result.Ok(url));
1687
- }
1688
- async start(baseUrl) {
901
+ async put(url2, value) {
1689
902
  return exception2Result(async () => {
1690
- this.logger.Debug().Url(baseUrl).Msg("start");
1691
- const conn = SQLConnectionFactory(baseUrl);
1692
- const ws = await MetaStoreFactory(conn);
1693
- await ws.start(baseUrl);
1694
- this.metaSQLStore = ws;
1695
- this.logger.Debug().Url(baseUrl).Msg("started");
1696
- });
1697
- }
1698
- close(baseUrl) {
1699
- return this.metaSQLStore.close(baseUrl);
1700
- }
1701
- destroy(baseUrl) {
1702
- return this.metaSQLStore.destroy(baseUrl);
1703
- }
1704
- async put(url, body) {
1705
- return exception2Result(async () => {
1706
- const branch = getKey(url, this.logger);
1707
- const name = getName(url, this.logger);
1708
- await this.metaSQLStore.insert(url, {
1709
- meta: body,
1710
- updated_at: /* @__PURE__ */ new Date(),
1711
- name,
1712
- branch
1713
- });
1714
- });
1715
- }
1716
- async get(url) {
1717
- return exceptionWrapper(async () => {
1718
- const branch = getKey(url, this.logger);
1719
- const name = getName(url, this.logger);
1720
- const record = await this.metaSQLStore.select(url, {
1721
- name,
1722
- branch
1723
- });
1724
- if (record.length === 0) {
1725
- return import_cement13.Result.Err(new NotFoundError(`not found ${name} ${branch}`));
1726
- }
1727
- return import_cement13.Result.Ok(record[0].meta);
903
+ const key = getKey(url2, this.logger);
904
+ const store = getStore(url2, this.logger, joinDBName);
905
+ this.logger.Debug().Url(url2).Str("key", key).Str("store", store).Msg("putting");
906
+ const tx = this.db.transaction([store], "readwrite");
907
+ await tx.objectStore(store).put(value, sanitzeKey(key));
908
+ await tx.done;
1728
909
  });
1729
910
  }
1730
- async delete(url) {
911
+ async delete(url2) {
1731
912
  return exception2Result(async () => {
1732
- const branch = getKey(url, this.logger);
1733
- const name = getName(url, this.logger);
1734
- await this.metaSQLStore.delete(url, {
1735
- name,
1736
- branch
1737
- });
913
+ const key = getKey(url2, this.logger);
914
+ const store = getStore(url2, this.logger, joinDBName);
915
+ this.logger.Debug().Url(url2).Str("key", key).Str("store", store).Msg("deleting");
916
+ const tx = this.db.transaction([store], "readwrite");
917
+ await tx.objectStore(store).delete(sanitzeKey(key));
918
+ await tx.done;
919
+ return import_cement7.Result.Ok(void 0);
1738
920
  });
1739
921
  }
1740
922
  };
1741
- SQLDataGateway = class {
923
+ IndexDBDataGateway = class extends IndexDBGateway {
1742
924
  constructor(logger) {
1743
- this.dataSQLStore = {};
1744
- this.logger = ensureLogger(logger, "SQLDataGateway");
925
+ super(ensureLogger(logger, "IndexDBDataGateway", {}));
1745
926
  }
1746
927
  buildUrl(baseUrl, key) {
1747
- const url = new URL(baseUrl.toString());
1748
- url.searchParams.set("key", key);
1749
- return Promise.resolve(import_cement13.Result.Ok(url));
1750
- }
1751
- async start(baseUrl) {
1752
- return exception2Result(async () => {
1753
- this.logger.Debug().Url(baseUrl).Msg("pre-sql-connection");
1754
- const conn = SQLConnectionFactory(baseUrl);
1755
- this.logger.Debug().Url(baseUrl).Msg("post-sql-connection");
1756
- const ws = await DataStoreFactory(conn);
1757
- this.logger.Debug().Url(baseUrl).Msg("post-data-store-factory");
1758
- await ws.start(baseUrl);
1759
- this.dataSQLStore = ws;
1760
- this.logger.Debug().Url(baseUrl).Msg("started");
1761
- });
928
+ const url2 = new URL(baseUrl.toString());
929
+ url2.searchParams.set("key", key);
930
+ return Promise.resolve(import_cement7.Result.Ok(url2));
1762
931
  }
1763
- close(baseUrl) {
1764
- return this.dataSQLStore.close(baseUrl);
1765
- }
1766
- destroy(baseUrl) {
1767
- return this.dataSQLStore.destroy(baseUrl);
932
+ };
933
+ IndexDBWalGateway = class extends IndexDBGateway {
934
+ constructor(logger) {
935
+ super(ensureLogger(logger, "IndexDBWalGateway", {}));
1768
936
  }
1769
- async put(url, body) {
1770
- return exception2Result(async () => {
1771
- const cid = getKey(url, this.logger);
1772
- const name = getName(url, this.logger);
1773
- await this.dataSQLStore.insert(url, {
1774
- data: body,
1775
- updated_at: /* @__PURE__ */ new Date(),
1776
- name,
1777
- car: cid
1778
- });
1779
- });
937
+ buildUrl(baseUrl, key) {
938
+ const url2 = new URL(baseUrl.toString());
939
+ url2.searchParams.set("key", key);
940
+ return Promise.resolve(import_cement7.Result.Ok(url2));
1780
941
  }
1781
- async get(url) {
1782
- return exceptionWrapper(async () => {
1783
- const branch = getKey(url, this.logger);
1784
- const record = await this.dataSQLStore.select(url, branch);
1785
- if (record.length === 0) {
1786
- return import_cement13.Result.Err(new NotFoundError(`not found ${branch}`));
1787
- }
1788
- return import_cement13.Result.Ok(record[0].data);
1789
- });
942
+ };
943
+ IndexDBMetaGateway = class extends IndexDBGateway {
944
+ constructor(logger) {
945
+ super(ensureLogger(logger, "IndexDBDataGateway", {}));
946
+ this.branches = /* @__PURE__ */ new Set();
1790
947
  }
1791
- async delete(url) {
1792
- return exception2Result(async () => {
1793
- const branch = getKey(url, this.logger);
1794
- await this.dataSQLStore.delete(url, branch);
1795
- return import_cement13.Result.Ok(void 0);
1796
- });
948
+ async buildUrl(baseUrl, key) {
949
+ const url2 = new URL(baseUrl.toString());
950
+ this.branches.add(key);
951
+ url2.searchParams.set("key", key);
952
+ return import_cement7.Result.Ok(url2);
1797
953
  }
1798
954
  };
1799
- SQLTestStore = class {
1800
- constructor(ilogger) {
1801
- const logger = ensureLogger(ilogger, "SQLTestStore");
1802
- this.logger = logger;
955
+ txtEncoder = new TextEncoder();
956
+ IndexDBTestStore = class {
957
+ constructor(logger) {
958
+ this.logger = ensureLogger(logger, "IndexDBTestStore", {});
1803
959
  }
1804
- async get(url, key) {
1805
- const conn = SQLConnectionFactory(url);
1806
- const name = getName(url, this.logger);
1807
- switch (url.searchParams.get("store")) {
1808
- case "wal": {
1809
- const sqlStore = await WalStoreFactory(conn);
1810
- await sqlStore.start(url);
1811
- const records = await sqlStore.select(url, {
1812
- name,
1813
- branch: key
1814
- });
1815
- return records[0].state;
1816
- }
1817
- case "meta": {
1818
- const sqlStore = await MetaStoreFactory(conn);
1819
- await sqlStore.start(url);
1820
- const records = await sqlStore.select(url, {
1821
- name,
1822
- branch: key
1823
- });
1824
- return records[0].meta;
1825
- }
1826
- case "data": {
1827
- const sqlStore = await DataStoreFactory(conn);
1828
- await sqlStore.start(url);
1829
- const records = await sqlStore.select(url, key);
1830
- return records[0].data;
1831
- }
1832
- default:
1833
- throw this.logger.Error().Str("key", key).Msg(`Method not implemented`);
960
+ async get(url2, key) {
961
+ const db = await connectIdb(url2, this.logger);
962
+ const store = getStore(url2, this.logger, joinDBName);
963
+ this.logger.Debug().Str("key", key).Str("store", store).Msg("getting");
964
+ let bytes = await db.get(store, sanitzeKey(key));
965
+ this.logger.Debug().Str("key", key).Str("store", store).Int("len", bytes.length).Msg("got");
966
+ if (typeof bytes === "string") {
967
+ bytes = txtEncoder.encode(bytes);
1834
968
  }
969
+ return bytes;
1835
970
  }
1836
971
  };
1837
972
  }
@@ -1844,6 +979,7 @@ __export(src_exports, {
1844
979
  Database: () => Database,
1845
980
  Index: () => Index,
1846
981
  PACKAGE_VERSION: () => PACKAGE_VERSION,
982
+ Result: () => import_cement2.Result,
1847
983
  blockstore: () => blockstore_exports,
1848
984
  bs: () => blockstore_exports,
1849
985
  ensureLogger: () => ensureLogger,
@@ -1864,7 +1000,7 @@ module.exports = __toCommonJS(src_exports);
1864
1000
 
1865
1001
  // src/database.ts
1866
1002
  var import_uuidv73 = require("uuidv7");
1867
- var import_cement17 = require("@adviser/cement");
1003
+ var import_cement11 = require("@adviser/cement");
1868
1004
 
1869
1005
  // src/write-queue.ts
1870
1006
  function writeQueue(worker, payload = Infinity, unbounded = false) {
@@ -1907,7 +1043,7 @@ function writeQueue(worker, payload = Infinity, unbounded = false) {
1907
1043
  }
1908
1044
 
1909
1045
  // src/crdt.ts
1910
- var import_cement16 = require("@adviser/cement");
1046
+ var import_cement10 = require("@adviser/cement");
1911
1047
 
1912
1048
  // src/crdt-helpers.ts
1913
1049
  var import_block6 = require("multiformats/block");
@@ -2115,23 +1251,22 @@ var ConnectREST = class extends ConnectionBase {
2115
1251
  };
2116
1252
 
2117
1253
  // src/blockstore/store-factory.ts
2118
- var import_cement14 = require("@adviser/cement");
1254
+ var import_cement8 = require("@adviser/cement");
2119
1255
  init_data_dir();
2120
1256
  init_files();
2121
1257
 
2122
1258
  // src/blockstore/store.ts
2123
1259
  var import_p_limit2 = __toESM(require("p-limit"), 1);
2124
1260
  var import_dag_json = require("@ipld/dag-json");
2125
- var import_cement6 = require("@adviser/cement");
1261
+ var import_cement5 = require("@adviser/cement");
2126
1262
  init_types();
2127
1263
  init_gateway();
2128
1264
  init_utils();
2129
- init_store_indexdb();
2130
1265
 
2131
1266
  // src/blockstore/loader.ts
2132
1267
  var import_p_limit = __toESM(require("p-limit"), 1);
2133
1268
  var import_car = require("@ipld/car");
2134
- var import_cement5 = require("@adviser/cement");
1269
+ var import_cement4 = require("@adviser/cement");
2135
1270
 
2136
1271
  // src/blockstore/types.ts
2137
1272
  function toCIDBlock(block) {
@@ -2187,7 +1322,7 @@ var import_multiformats2 = require("multiformats");
2187
1322
  var import_block3 = require("multiformats/block");
2188
1323
  var dagcbor = __toESM(require("@ipld/dag-cbor"), 1);
2189
1324
  var import_block4 = require("@web3-storage/pail/block");
2190
- var import_utils8 = require("prolly-trees/utils");
1325
+ var import_utils6 = require("prolly-trees/utils");
2191
1326
  var import_cache = require("prolly-trees/cache");
2192
1327
  var import_cid_set = require("prolly-trees/cid-set");
2193
1328
 
@@ -2375,7 +1510,7 @@ function makeEncDec(logger, crypto2, randomBytes2) {
2375
1510
  };
2376
1511
  return { encrypt, decrypt };
2377
1512
  }
2378
- var chunker = (0, import_utils8.bf)(30);
1513
+ var chunker = (0, import_utils6.bf)(30);
2379
1514
  function hexStringToUint8Array(hexString) {
2380
1515
  const length = hexString.length;
2381
1516
  const uint8Array = new Uint8Array(length / 2);
@@ -2699,7 +1834,7 @@ var Loader = class {
2699
1834
  this.getBlockCache = /* @__PURE__ */ new Map();
2700
1835
  this.seenMeta = /* @__PURE__ */ new Set();
2701
1836
  this.writeLimit = (0, import_p_limit.default)(1);
2702
- this.onceReady = new import_cement5.ResolveOnce();
1837
+ this.onceReady = new import_cement4.ResolveOnce();
2703
1838
  this.name = name;
2704
1839
  this.ebOpts = defaultedBlockstoreRuntime(
2705
1840
  {
@@ -3093,12 +2228,18 @@ var Loader = class {
3093
2228
  };
3094
2229
 
3095
2230
  // src/blockstore/store.ts
2231
+ function guardVersion(url2) {
2232
+ if (!url2.searchParams.has("version")) {
2233
+ return import_cement5.Result.Err(`missing version: ${url2.toString()}`);
2234
+ }
2235
+ return import_cement5.Result.Ok(url2);
2236
+ }
3096
2237
  var VersionedStore = class {
3097
- constructor(name, url, logger) {
2238
+ constructor(name, url2, logger) {
3098
2239
  this._onStarted = [];
3099
2240
  this._onClosed = [];
3100
2241
  this.name = name;
3101
- this.url = url;
2242
+ this.url = url2;
3102
2243
  this.logger = logger;
3103
2244
  }
3104
2245
  onStarted(fn) {
@@ -3108,11 +2249,11 @@ var VersionedStore = class {
3108
2249
  this._onClosed.push(fn);
3109
2250
  }
3110
2251
  };
3111
- var textEncoder2 = new TextEncoder();
3112
- var textDecoder2 = new TextDecoder();
2252
+ var textEncoder = new TextEncoder();
2253
+ var textDecoder = new TextDecoder();
3113
2254
  var MetaStore = class extends VersionedStore {
3114
- constructor(name, url, logger, gateway) {
3115
- super(name, url, ensureLogger(logger, "MetaStore", {}));
2255
+ constructor(name, url2, logger, gateway) {
2256
+ super(name, url2, ensureLogger(logger, "MetaStore", {}));
3116
2257
  this.tag = "header-base";
3117
2258
  this.gateway = gateway;
3118
2259
  }
@@ -3136,19 +2277,19 @@ var MetaStore = class extends VersionedStore {
3136
2277
  }
3137
2278
  async load(branch) {
3138
2279
  this.logger.Debug().Str("branch", branch || "").Msg("loading");
3139
- const url = await this.gateway.buildUrl(this.url, branch || "main");
3140
- if (url.isErr()) {
3141
- throw this.logger.Error().Err(url.Err()).Str("branch", branch || "").Str("url", this.url.toString()).Msg("got error from gateway.buildUrl").AsError();
2280
+ const url2 = await this.gateway.buildUrl(this.url, branch || "main");
2281
+ if (url2.isErr()) {
2282
+ throw this.logger.Error().Result("buidUrl", url2).Str("branch", branch || "").Url(this.url).Msg("got error from gateway.buildUrl").AsError();
3142
2283
  }
3143
- const bytes = await this.gateway.get(url.Ok());
2284
+ const bytes = await this.gateway.get(url2.Ok());
3144
2285
  if (bytes.isErr()) {
3145
2286
  if (isNotFoundError(bytes)) {
3146
2287
  return void 0;
3147
2288
  }
3148
- throw this.logger.Error().Err(bytes.Err()).Msg("gateway get").AsError();
2289
+ throw this.logger.Error().Url(url2.Ok()).Result("bytes:", bytes).Msg("gateway get").AsError();
3149
2290
  }
3150
2291
  try {
3151
- return [this.parseHeader(textDecoder2.decode(bytes.Ok()))];
2292
+ return [this.parseHeader(textDecoder.decode(bytes.Ok()))];
3152
2293
  } catch (e) {
3153
2294
  throw this.logger.Error().Err(e).Msg("parseHeader").AsError();
3154
2295
  }
@@ -3156,11 +2297,11 @@ var MetaStore = class extends VersionedStore {
3156
2297
  async save(meta, branch = "main") {
3157
2298
  this.logger.Debug().Str("branch", branch).Any("meta", meta).Msg("saving meta");
3158
2299
  const bytes = this.makeHeader(meta);
3159
- const url = await this.gateway.buildUrl(this.url, branch);
3160
- if (url.isErr()) {
3161
- throw this.logger.Error().Err(url.Err()).Str("branch", branch).Url(this.url).Msg("got error from gateway.buildUrl").AsError();
2300
+ const url2 = await this.gateway.buildUrl(this.url, branch);
2301
+ if (url2.isErr()) {
2302
+ throw this.logger.Error().Err(url2.Err()).Str("branch", branch).Url(this.url).Msg("got error from gateway.buildUrl").AsError();
3162
2303
  }
3163
- const res = await this.gateway.put(url.Ok(), textEncoder2.encode(bytes));
2304
+ const res = await this.gateway.put(url2.Ok(), textEncoder.encode(bytes));
3164
2305
  if (res.isErr()) {
3165
2306
  throw this.logger.Error().Err(res.Err()).Msg("got error from gateway.put").AsError();
3166
2307
  }
@@ -3169,19 +2310,19 @@ var MetaStore = class extends VersionedStore {
3169
2310
  async close() {
3170
2311
  await this.gateway.close(this.url);
3171
2312
  this._onClosed.forEach((fn) => fn());
3172
- return import_cement6.Result.Ok(void 0);
2313
+ return import_cement5.Result.Ok(void 0);
3173
2314
  }
3174
2315
  async destroy() {
3175
2316
  return this.gateway.destroy(this.url);
3176
2317
  }
3177
2318
  };
3178
2319
  var DataStore = class extends VersionedStore {
3179
- constructor(name, url, logger, gateway) {
2320
+ constructor(name, url2, logger, gateway) {
3180
2321
  super(
3181
2322
  name,
3182
- url,
2323
+ url2,
3183
2324
  ensureLogger(logger, "DataStore", {
3184
- url: () => url.toString()
2325
+ url: () => url2.toString()
3185
2326
  })
3186
2327
  );
3187
2328
  this.tag = "car-base";
@@ -3191,13 +2332,13 @@ var DataStore = class extends VersionedStore {
3191
2332
  this.logger.Debug().Msg("starting-gateway");
3192
2333
  const res = await this.gateway.start(this.url);
3193
2334
  if (res.isErr()) {
3194
- this.logger.Error().Err(res.Err()).Msg("started-gateway");
2335
+ this.logger.Error().Result("gw-start", res).Msg("started-gateway");
3195
2336
  return res;
3196
2337
  }
3197
2338
  this._onStarted.forEach((fn) => fn());
3198
2339
  const version = guardVersion(this.url);
3199
2340
  if (version.isErr()) {
3200
- this.logger.Error().Err(res.Err()).Msg("guardVersion");
2341
+ this.logger.Error().Result("version", version).Msg("guardVersion");
3201
2342
  await this.close();
3202
2343
  return version;
3203
2344
  }
@@ -3206,11 +2347,11 @@ var DataStore = class extends VersionedStore {
3206
2347
  }
3207
2348
  async load(cid) {
3208
2349
  this.logger.Debug().Any("cid", cid).Msg("loading");
3209
- const url = await this.gateway.buildUrl(this.url, cid.toString());
3210
- if (url.isErr()) {
3211
- throw this.logger.Error().Err(url.Err()).Str("cid", cid.toString()).Msg("got error from gateway.buildUrl").AsError();
2350
+ const url2 = await this.gateway.buildUrl(this.url, cid.toString());
2351
+ if (url2.isErr()) {
2352
+ throw this.logger.Error().Err(url2.Err()).Str("cid", cid.toString()).Msg("got error from gateway.buildUrl").AsError();
3212
2353
  }
3213
- const res = await this.gateway.get(url.Ok());
2354
+ const res = await this.gateway.get(url2.Ok());
3214
2355
  if (res.isErr()) {
3215
2356
  throw res.Err();
3216
2357
  }
@@ -3219,37 +2360,37 @@ var DataStore = class extends VersionedStore {
3219
2360
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
3220
2361
  async save(car, opts) {
3221
2362
  this.logger.Debug().Any("cid", car.cid.toString()).Msg("saving");
3222
- const url = await this.gateway.buildUrl(this.url, car.cid.toString());
3223
- if (url.isErr()) {
3224
- throw this.logger.Error().Err(url.Err()).Ref("cid", car.cid).Msg("got error from gateway.buildUrl").AsError();
2363
+ const url2 = await this.gateway.buildUrl(this.url, car.cid.toString());
2364
+ if (url2.isErr()) {
2365
+ throw this.logger.Error().Err(url2.Err()).Ref("cid", car.cid).Msg("got error from gateway.buildUrl").AsError();
3225
2366
  }
3226
- const res = await this.gateway.put(url.Ok(), car.bytes);
2367
+ const res = await this.gateway.put(url2.Ok(), car.bytes);
3227
2368
  if (res.isErr()) {
3228
2369
  throw this.logger.Error().Err(res.Err()).Msg("got error from gateway.put").AsError();
3229
2370
  }
3230
2371
  return res.Ok();
3231
2372
  }
3232
2373
  async remove(cid) {
3233
- const url = await this.gateway.buildUrl(this.url, cid.toString());
3234
- if (url.isErr()) {
3235
- return url;
2374
+ const url2 = await this.gateway.buildUrl(this.url, cid.toString());
2375
+ if (url2.isErr()) {
2376
+ return url2;
3236
2377
  }
3237
- return this.gateway.delete(url.Ok());
2378
+ return this.gateway.delete(url2.Ok());
3238
2379
  }
3239
2380
  async close() {
3240
2381
  await this.gateway.close(this.url);
3241
2382
  this._onClosed.forEach((fn) => fn());
3242
- return import_cement6.Result.Ok(void 0);
2383
+ return import_cement5.Result.Ok(void 0);
3243
2384
  }
3244
2385
  destroy() {
3245
2386
  return this.gateway.destroy(this.url);
3246
2387
  }
3247
2388
  };
3248
2389
  var RemoteWAL = class extends VersionedStore {
3249
- constructor(loader, url, logger, gateway) {
3250
- super(loader.name, url, ensureLogger(logger, "RemoteWAL"));
2390
+ constructor(loader, url2, logger, gateway) {
2391
+ super(loader.name, url2, ensureLogger(logger, "RemoteWAL"));
3251
2392
  this.tag = "rwal-base";
3252
- this._ready = new import_cement6.ResolveOnce();
2393
+ this._ready = new import_cement5.ResolveOnce();
3253
2394
  this.walState = { operations: [], noLoaderOps: [], fileOperations: [] };
3254
2395
  this.processing = void 0;
3255
2396
  this.processQueue = new CommitQueue();
@@ -3400,7 +2541,7 @@ var RemoteWAL = class extends VersionedStore {
3400
2541
  throw this.logger.Error().Err(bytes.Err()).Msg("error get").AsError();
3401
2542
  }
3402
2543
  try {
3403
- return bytes && (0, import_dag_json.parse)(textDecoder2.decode(bytes.Ok()));
2544
+ return bytes && (0, import_dag_json.parse)(textDecoder.decode(bytes.Ok()));
3404
2545
  } catch (e) {
3405
2546
  throw this.logger.Error().Err(e).Msg("error parse").AsError();
3406
2547
  }
@@ -3416,7 +2557,7 @@ var RemoteWAL = class extends VersionedStore {
3416
2557
  } catch (e) {
3417
2558
  throw this.logger.Error().Err(e).Any("state", state).Msg("error format").AsError();
3418
2559
  }
3419
- const res = await this.gateway.put(filepath.Ok(), textEncoder2.encode(encoded));
2560
+ const res = await this.gateway.put(filepath.Ok(), textEncoder.encode(encoded));
3420
2561
  if (res.isErr()) {
3421
2562
  throw this.logger.Error().Err(res.Err()).Str("filePath", filepath.Ok().toString()).Msg("error saving").AsError();
3422
2563
  }
@@ -3424,7 +2565,7 @@ var RemoteWAL = class extends VersionedStore {
3424
2565
  async close() {
3425
2566
  await this.gateway.close(this.url);
3426
2567
  this._onClosed.forEach((fn) => fn());
3427
- return import_cement6.Result.Ok(void 0);
2568
+ return import_cement5.Result.Ok(void 0);
3428
2569
  }
3429
2570
  destroy() {
3430
2571
  return this.gateway.destroy(this.url);
@@ -3433,29 +2574,29 @@ var RemoteWAL = class extends VersionedStore {
3433
2574
 
3434
2575
  // src/blockstore/store-factory.ts
3435
2576
  init_utils();
3436
- function ensureIsIndex(url, isIndex) {
2577
+ function ensureIsIndex(url2, isIndex) {
3437
2578
  if (isIndex) {
3438
- url.searchParams.set("index", isIndex);
3439
- return url;
2579
+ url2.searchParams.set("index", isIndex);
2580
+ return url2;
3440
2581
  } else {
3441
- url.searchParams.delete("index");
3442
- return url;
2582
+ url2.searchParams.delete("index");
2583
+ return url2;
3443
2584
  }
3444
2585
  }
3445
2586
  function toURL(pathOrUrl, isIndex) {
3446
2587
  if (pathOrUrl instanceof URL) return ensureIsIndex(pathOrUrl, isIndex);
3447
2588
  try {
3448
- const url = new URL(pathOrUrl);
3449
- return ensureIsIndex(url, isIndex);
2589
+ const url2 = new URL(pathOrUrl);
2590
+ return ensureIsIndex(url2, isIndex);
3450
2591
  } catch (e) {
3451
- const url = new URL(`file://${pathOrUrl}`);
3452
- return ensureIsIndex(url, isIndex);
2592
+ const url2 = new URL(`file://${pathOrUrl}`);
2593
+ return ensureIsIndex(url2, isIndex);
3453
2594
  }
3454
2595
  }
3455
2596
  var storeFactory = /* @__PURE__ */ new Map();
3456
- function ensureName(name, url) {
3457
- if (!url.searchParams.has("name")) {
3458
- url.searchParams.set("name", name);
2597
+ function ensureName(name, url2) {
2598
+ if (!url2.searchParams.has("name")) {
2599
+ url2.searchParams.set("name", name);
3459
2600
  }
3460
2601
  }
3461
2602
  function buildURL(optURL, loader) {
@@ -3468,95 +2609,113 @@ function buildURL(optURL, loader) {
3468
2609
  return toURL(optURL || obuUrl || dataDir(loader.name, storeOpts.stores?.base), storeOpts.isIndex);
3469
2610
  }
3470
2611
  function registerStoreProtocol(item) {
3471
- if (storeFactory.has(item.protocol)) {
3472
- throw new Error(`protocol ${item.protocol} already registered`);
2612
+ let protocol = item.protocol;
2613
+ if (!protocol.endsWith(":")) {
2614
+ protocol += ":";
2615
+ }
2616
+ if (storeFactory.has(protocol)) {
2617
+ if (!item.overrideBaseURL && storeFactory.get(protocol) !== item) {
2618
+ const logger = ensureLogger({}, "registerStoreProtocol", { protocol });
2619
+ logger.Warn().Msg(`protocol ${protocol} already registered`);
2620
+ return () => {
2621
+ };
2622
+ }
3473
2623
  }
3474
2624
  if (item.overrideBaseURL) {
3475
2625
  Array.from(storeFactory.values()).forEach((items) => {
3476
2626
  items.overrideBaseURL = void 0;
3477
2627
  });
3478
2628
  }
3479
- storeFactory.set(item.protocol, item);
2629
+ storeFactory.set(protocol, item);
3480
2630
  return () => {
3481
- storeFactory.delete(item.protocol);
2631
+ storeFactory.delete(protocol);
3482
2632
  };
3483
2633
  }
3484
- function runStoreFactory(url, logger, run) {
3485
- const item = storeFactory.get(url.protocol);
2634
+ function runStoreFactory(url2, logger, run) {
2635
+ const item = storeFactory.get(url2.protocol);
3486
2636
  if (!item) {
3487
- throw logger.Error().Url(url).Str("protocol", url.protocol).Any("keys", Array(storeFactory.keys())).Msg(`unsupported protocol`).AsError();
2637
+ throw logger.Error().Url(url2).Str("protocol", url2.protocol).Any("keys", Array(storeFactory.keys())).Msg(`unsupported protocol`).AsError();
3488
2638
  }
3489
- logger.Debug().Str("protocol", url.protocol).Msg("run");
2639
+ logger.Debug().Str("protocol", url2.protocol).Msg("run");
3490
2640
  return run(item);
3491
2641
  }
3492
- var onceLoadDataGateway = new import_cement14.KeyedResolvOnce();
3493
- function loadDataGateway(url, logger) {
3494
- return onceLoadDataGateway.get(url.protocol).once(async () => {
3495
- return runStoreFactory(url, logger, async (item) => item.data(logger));
2642
+ var onceLoadDataGateway = new import_cement8.KeyedResolvOnce();
2643
+ function loadDataGateway(url2, logger) {
2644
+ return onceLoadDataGateway.get(url2.protocol).once(async () => {
2645
+ return runStoreFactory(url2, logger, async (item) => item.data(logger));
3496
2646
  });
3497
2647
  }
3498
- var onceDataStoreFactory = new import_cement14.KeyedResolvOnce();
2648
+ var onceDataStoreFactory = new import_cement8.KeyedResolvOnce();
3499
2649
  async function dataStoreFactory(loader) {
3500
- const url = buildURL(loader.ebOpts.store.stores?.data, loader);
3501
- ensureName(loader.name, url);
3502
- const logger = ensureLogger(loader.logger, "dataStoreFactory", { url: url.toString() });
3503
- url.searchParams.set("store", "data");
3504
- return onceDataStoreFactory.get(url.toString()).once(async () => {
3505
- const gateway = await loadDataGateway(url, logger);
3506
- const store = new DataStore(loader.name, url, loader.logger, gateway);
3507
- await store.start();
2650
+ const url2 = buildURL(loader.ebOpts.store.stores?.data, loader);
2651
+ ensureName(loader.name, url2);
2652
+ const logger = ensureLogger(loader.logger, "dataStoreFactory", { url: url2.toString() });
2653
+ url2.searchParams.set("store", "data");
2654
+ return onceDataStoreFactory.get(url2.toString()).once(async () => {
2655
+ const gateway = await loadDataGateway(url2, logger);
2656
+ const store = new DataStore(loader.name, url2, loader.logger, gateway);
2657
+ const ret = await store.start();
2658
+ if (ret.isErr()) {
2659
+ throw logger.Error().Result("start", ret).Msg("start failed").AsError();
2660
+ }
3508
2661
  logger.Debug().Str("prepared", store.url.toString()).Msg("produced");
3509
2662
  return store;
3510
2663
  });
3511
2664
  }
3512
- var onceLoadMetaGateway = new import_cement14.KeyedResolvOnce();
3513
- function loadMetaGateway(url, logger) {
3514
- return onceLoadMetaGateway.get(url.protocol).once(async () => {
3515
- return runStoreFactory(url, logger, async (item) => item.meta(logger));
2665
+ var onceLoadMetaGateway = new import_cement8.KeyedResolvOnce();
2666
+ function loadMetaGateway(url2, logger) {
2667
+ return onceLoadMetaGateway.get(url2.protocol).once(async () => {
2668
+ return runStoreFactory(url2, logger, async (item) => item.meta(logger));
3516
2669
  });
3517
2670
  }
3518
- var onceMetaStoreFactory = new import_cement14.KeyedResolvOnce();
2671
+ var onceMetaStoreFactory = new import_cement8.KeyedResolvOnce();
3519
2672
  async function metaStoreFactory(loader) {
3520
- const url = buildURL(loader.ebOpts.store.stores?.meta, loader);
3521
- ensureName(loader.name, url);
3522
- const logger = ensureLogger(loader.logger, "metaStoreFactory", { url: () => url.toString() });
3523
- url.searchParams.set("store", "meta");
3524
- return onceMetaStoreFactory.get(url.toString()).once(async () => {
3525
- logger.Debug().Str("protocol", url.protocol).Msg("pre-protocol switch");
3526
- const gateway = await loadMetaGateway(url, logger);
3527
- const store = new MetaStore(loader.name, url, loader.logger, gateway);
3528
- await store.start();
2673
+ const url2 = buildURL(loader.ebOpts.store.stores?.meta, loader);
2674
+ ensureName(loader.name, url2);
2675
+ const logger = ensureLogger(loader.logger, "metaStoreFactory", { url: () => url2.toString() });
2676
+ url2.searchParams.set("store", "meta");
2677
+ return onceMetaStoreFactory.get(url2.toString()).once(async () => {
2678
+ logger.Debug().Str("protocol", url2.protocol).Msg("pre-protocol switch");
2679
+ const gateway = await loadMetaGateway(url2, logger);
2680
+ const store = new MetaStore(loader.name, url2, loader.logger, gateway);
2681
+ const ret = await store.start();
2682
+ if (ret.isErr()) {
2683
+ throw logger.Error().Result("start", ret).Msg("start failed").AsError();
2684
+ }
3529
2685
  return store;
3530
2686
  });
3531
2687
  }
3532
- var onceWalGateway = new import_cement14.KeyedResolvOnce();
3533
- function loadWalGateway(url, logger) {
3534
- return onceWalGateway.get(url.protocol).once(async () => {
3535
- return runStoreFactory(url, logger, async (item) => item.wal(logger));
2688
+ var onceWalGateway = new import_cement8.KeyedResolvOnce();
2689
+ function loadWalGateway(url2, logger) {
2690
+ return onceWalGateway.get(url2.protocol).once(async () => {
2691
+ return runStoreFactory(url2, logger, async (item) => item.wal(logger));
3536
2692
  });
3537
2693
  }
3538
- var onceRemoteWalFactory = new import_cement14.KeyedResolvOnce();
2694
+ var onceRemoteWalFactory = new import_cement8.KeyedResolvOnce();
3539
2695
  async function remoteWalFactory(loader) {
3540
- const url = buildURL(loader.ebOpts.store.stores?.meta, loader);
3541
- ensureName(loader.name, url);
3542
- const logger = ensureLogger(loader.logger, "remoteWalFactory", { url: url.toString() });
3543
- url.searchParams.set("store", "wal");
3544
- return onceRemoteWalFactory.get(url.toString()).once(async () => {
3545
- const gateway = await loadWalGateway(url, logger);
3546
- logger.Debug().Str("prepared", url.toString()).Msg("produced");
3547
- const store = new RemoteWAL(loader, url, loader.logger, gateway);
3548
- await store.start();
2696
+ const url2 = buildURL(loader.ebOpts.store.stores?.meta, loader);
2697
+ ensureName(loader.name, url2);
2698
+ const logger = ensureLogger(loader.logger, "remoteWalFactory", { url: url2.toString() });
2699
+ url2.searchParams.set("store", "wal");
2700
+ return onceRemoteWalFactory.get(url2.toString()).once(async () => {
2701
+ const gateway = await loadWalGateway(url2, logger);
2702
+ logger.Debug().Str("prepared", url2.toString()).Msg("produced");
2703
+ const store = new RemoteWAL(loader, url2, loader.logger, gateway);
2704
+ const ret = await store.start();
2705
+ if (ret.isErr()) {
2706
+ throw logger.Error().Result("start", ret).Msg("start failed").AsError();
2707
+ }
3549
2708
  return store;
3550
2709
  });
3551
2710
  }
3552
- async function testStoreFactory(url, ilogger) {
2711
+ async function testStoreFactory(url2, ilogger) {
3553
2712
  const logger = ensureLogger(
3554
2713
  {
3555
2714
  logger: ilogger
3556
2715
  },
3557
2716
  "testStoreFactory"
3558
2717
  );
3559
- return runStoreFactory(url, logger, async (item) => item.test(logger));
2718
+ return runStoreFactory(url2, logger, async (item) => item.test(logger));
3560
2719
  }
3561
2720
  function toStoreRuntime(opts, ilogger) {
3562
2721
  const logger = ensureLogger(ilogger, "toStoreRuntime", {});
@@ -3615,25 +2774,6 @@ registerStoreProtocol({
3615
2774
  return new IndexDBTestStore2(logger);
3616
2775
  }
3617
2776
  });
3618
- registerStoreProtocol({
3619
- protocol: "sqlite:",
3620
- data: async (logger) => {
3621
- const { SQLDataGateway: SQLDataGateway2 } = await Promise.resolve().then(() => (init_store_sql2(), store_sql_exports2));
3622
- return new SQLDataGateway2(logger);
3623
- },
3624
- meta: async (logger) => {
3625
- const { SQLMetaGateway: SQLMetaGateway2 } = await Promise.resolve().then(() => (init_store_sql2(), store_sql_exports2));
3626
- return new SQLMetaGateway2(logger);
3627
- },
3628
- wal: async (logger) => {
3629
- const { SQLWalGateway: SQLWalGateway2 } = await Promise.resolve().then(() => (init_store_sql2(), store_sql_exports2));
3630
- return new SQLWalGateway2(logger);
3631
- },
3632
- test: async (logger) => {
3633
- const { SQLTestStore: SQLTestStore2 } = await Promise.resolve().then(() => (init_store_sql2(), store_sql_exports2));
3634
- return new SQLTestStore2(logger);
3635
- }
3636
- });
3637
2777
 
3638
2778
  // src/blockstore/index.ts
3639
2779
  init_gateway();
@@ -3901,7 +3041,7 @@ var import_sha24 = require("multiformats/hashes/sha2");
3901
3041
  var codec3 = __toESM(require("@ipld/dag-cbor"), 1);
3902
3042
  var import_charwise = __toESM(require("charwise"), 1);
3903
3043
  var DbIndex = __toESM(require("prolly-trees/db-index"), 1);
3904
- var import_utils20 = require("prolly-trees/utils");
3044
+ var import_utils12 = require("prolly-trees/utils");
3905
3045
  var import_cache2 = require("prolly-trees/cache");
3906
3046
  var IndexTree = class {
3907
3047
  };
@@ -3909,17 +3049,17 @@ function refCompare(aRef, bRef) {
3909
3049
  if (Number.isNaN(aRef)) return -1;
3910
3050
  if (Number.isNaN(bRef)) throw new Error("ref may not be Infinity or NaN");
3911
3051
  if (aRef === Infinity) return 1;
3912
- return (0, import_utils20.simpleCompare)(aRef, bRef);
3052
+ return (0, import_utils12.simpleCompare)(aRef, bRef);
3913
3053
  }
3914
3054
  function compare(a, b) {
3915
3055
  const [aKey, aRef] = a;
3916
3056
  const [bKey, bRef] = b;
3917
- const comp = (0, import_utils20.simpleCompare)(aKey, bKey);
3057
+ const comp = (0, import_utils12.simpleCompare)(aKey, bKey);
3918
3058
  if (comp !== 0) return comp;
3919
3059
  return refCompare(aRef, bRef);
3920
3060
  }
3921
- var byKeyOpts = { cache: import_cache2.nocache, chunker: (0, import_utils20.bf)(30), codec: codec3, hasher: import_sha24.sha256, compare };
3922
- var byIdOpts = { cache: import_cache2.nocache, chunker: (0, import_utils20.bf)(30), codec: codec3, hasher: import_sha24.sha256, compare: import_utils20.simpleCompare };
3061
+ var byKeyOpts = { cache: import_cache2.nocache, chunker: (0, import_utils12.bf)(30), codec: codec3, hasher: import_sha24.sha256, compare };
3062
+ var byIdOpts = { cache: import_cache2.nocache, chunker: (0, import_utils12.bf)(30), codec: codec3, hasher: import_sha24.sha256, compare: import_utils12.simpleCompare };
3923
3063
  function indexEntriesForChanges(changes, mapFn) {
3924
3064
  const indexEntries = [];
3925
3065
  changes.forEach(({ id: key, value, del }) => {
@@ -4227,7 +3367,7 @@ var Index = class {
4227
3367
  // src/crdt-clock.ts
4228
3368
  var import_clock3 = require("@web3-storage/pail/clock");
4229
3369
  var import_crdt2 = require("@web3-storage/pail/crdt");
4230
- var import_cement15 = require("@adviser/cement");
3370
+ var import_cement9 = require("@adviser/cement");
4231
3371
  init_types();
4232
3372
 
4233
3373
  // src/apply-head-queue.ts
@@ -4286,7 +3426,7 @@ var CRDTClock = class {
4286
3426
  this.zoomers = /* @__PURE__ */ new Set();
4287
3427
  this.watchers = /* @__PURE__ */ new Set();
4288
3428
  this.emptyWatchers = /* @__PURE__ */ new Set();
4289
- this._ready = new import_cement15.ResolveOnce();
3429
+ this._ready = new import_cement9.ResolveOnce();
4290
3430
  this.blockstore = blockstore;
4291
3431
  this.logger = ensureLogger(blockstore.logger, "CRDTClock");
4292
3432
  this.applyHeadQueue = applyHeadQueue(this.int_applyHead.bind(this), this.logger);
@@ -4397,7 +3537,7 @@ async function advanceBlocks(logger, newHead, tblocks, head) {
4397
3537
  init_utils();
4398
3538
  var CRDT = class {
4399
3539
  constructor(name, opts = {}) {
4400
- this.onceReady = new import_cement16.ResolveOnce();
3540
+ this.onceReady = new import_cement10.ResolveOnce();
4401
3541
  this.indexers = /* @__PURE__ */ new Map();
4402
3542
  this.name = name;
4403
3543
  this.logger = ensureLogger(opts, "CRDT");
@@ -4518,7 +3658,7 @@ var Database = class {
4518
3658
  this._listening = false;
4519
3659
  this._listeners = /* @__PURE__ */ new Set();
4520
3660
  this._noupdate_listeners = /* @__PURE__ */ new Set();
4521
- this._ready = new import_cement17.ResolveOnce();
3661
+ this._ready = new import_cement11.ResolveOnce();
4522
3662
  this.name = name;
4523
3663
  this.opts = opts || this.opts;
4524
3664
  this.logger = ensureLogger(this.opts, "Database");
@@ -4552,9 +3692,8 @@ var Database = class {
4552
3692
  });
4553
3693
  }
4554
3694
  async get(id) {
4555
- this.logger.Debug().Str("id", id).Msg("get-pre-ready");
4556
3695
  await this.ready();
4557
- this.logger.Debug().Str("id", id).Msg("get-post-ready");
3696
+ this.logger.Debug().Str("id", id).Msg("get");
4558
3697
  const got = await this._crdt.get(id).catch((e) => {
4559
3698
  throw new NotFoundError(`Not found: ${id} - ${e.message}`);
4560
3699
  });
@@ -4563,9 +3702,8 @@ var Database = class {
4563
3702
  return { ...doc, _id: id };
4564
3703
  }
4565
3704
  async put(doc) {
4566
- this.logger.Debug().Str("id", doc._id).Msg("put-pre-ready");
4567
3705
  await this.ready();
4568
- this.logger.Debug().Str("id", doc._id).Msg("put-post-ready");
3706
+ this.logger.Debug().Str("id", doc._id).Msg("put");
4569
3707
  const { _id, ...value } = doc;
4570
3708
  const docId = _id || (0, import_uuidv73.uuidv7)();
4571
3709
  const result = await this._writeQueue.push({
@@ -4575,36 +3713,40 @@ var Database = class {
4575
3713
  _id: docId
4576
3714
  }
4577
3715
  });
4578
- return { id: docId, clock: result?.head };
3716
+ return { id: docId, clock: result?.head, name: this.name };
4579
3717
  }
4580
3718
  async del(id) {
4581
3719
  await this.ready();
3720
+ this.logger.Debug().Str("id", id).Msg("del");
4582
3721
  const result = await this._writeQueue.push({ id, del: true });
4583
- return { id, clock: result?.head };
3722
+ return { id, clock: result?.head, name: this.name };
4584
3723
  }
4585
3724
  async changes(since = [], opts = {}) {
4586
3725
  await this.ready();
3726
+ this.logger.Debug().Any("since", since).Any("opts", opts).Msg("changes");
4587
3727
  const { result, head } = await this._crdt.changes(since, opts);
4588
3728
  const rows = result.map(({ id: key, value, del, clock }) => ({
4589
3729
  key,
4590
3730
  value: del ? { _id: key, _deleted: true } : { _id: key, ...value },
4591
3731
  clock
4592
3732
  }));
4593
- return { rows, clock: head };
3733
+ return { rows, clock: head, name: this.name };
4594
3734
  }
4595
3735
  async allDocs(opts = {}) {
4596
3736
  await this.ready();
3737
+ this.logger.Debug().Msg("allDocs");
4597
3738
  const { result, head } = await this._crdt.allDocs();
4598
3739
  const rows = result.map(({ id: key, value, del }) => ({
4599
3740
  key,
4600
3741
  value: del ? { _id: key, _deleted: true } : { _id: key, ...value }
4601
3742
  }));
4602
- return { rows, clock: head };
3743
+ return { rows, clock: head, name: this.name };
4603
3744
  }
4604
3745
  async allDocuments() {
4605
3746
  return this.allDocs();
4606
3747
  }
4607
3748
  subscribe(listener, updates) {
3749
+ this.logger.Debug().Bool("updates", updates).Msg("subscribe");
4608
3750
  if (updates) {
4609
3751
  if (!this._listening) {
4610
3752
  this._listening = true;
@@ -4626,6 +3768,7 @@ var Database = class {
4626
3768
  // todo if we add this onto dbs in fireproof.ts then we can make index.ts a separate package
4627
3769
  async query(field, opts = {}) {
4628
3770
  await this.ready();
3771
+ this.logger.Debug().Any("field", field).Any("opts", opts).Msg("query");
4629
3772
  const _crdt = this._crdt;
4630
3773
  const idx = typeof field === "string" ? index({ _crdt }, field) : index({ _crdt }, makeName(field.toString()), field);
4631
3774
  return await idx.query(opts);
@@ -4701,6 +3844,6 @@ init_utils();
4701
3844
 
4702
3845
  // src/version.ts
4703
3846
  var PACKAGE_VERSION = Object.keys({
4704
- "0.0.0-dev": "xxxx"
3847
+ "0.19.8-dev-cra": "xxxx"
4705
3848
  })[0];
4706
3849
  //# sourceMappingURL=index.cjs.map