@fireproof/core 0.19.8-dev-alldocs-export → 0.19.8-dev-getid

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +444 -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 +1037 -1214
  10. package/index.global.js.map +1 -1
  11. package/index.js +65 -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,9 @@ var Database = class {
4552
3692
  });
4553
3693
  }
4554
3694
  async get(id) {
4555
- this.logger.Debug().Str("id", id).Msg("get-pre-ready");
3695
+ if (!id) throw this.logger.Error().Str("db", this.name).Msg(`Doc id is required`).AsError();
4556
3696
  await this.ready();
4557
- this.logger.Debug().Str("id", id).Msg("get-post-ready");
3697
+ this.logger.Debug().Str("id", id).Msg("get");
4558
3698
  const got = await this._crdt.get(id).catch((e) => {
4559
3699
  throw new NotFoundError(`Not found: ${id} - ${e.message}`);
4560
3700
  });
@@ -4563,9 +3703,8 @@ var Database = class {
4563
3703
  return { ...doc, _id: id };
4564
3704
  }
4565
3705
  async put(doc) {
4566
- this.logger.Debug().Str("id", doc._id).Msg("put-pre-ready");
4567
3706
  await this.ready();
4568
- this.logger.Debug().Str("id", doc._id).Msg("put-post-ready");
3707
+ this.logger.Debug().Str("id", doc._id).Msg("put");
4569
3708
  const { _id, ...value } = doc;
4570
3709
  const docId = _id || (0, import_uuidv73.uuidv7)();
4571
3710
  const result = await this._writeQueue.push({
@@ -4575,36 +3714,40 @@ var Database = class {
4575
3714
  _id: docId
4576
3715
  }
4577
3716
  });
4578
- return { id: docId, clock: result?.head };
3717
+ return { id: docId, clock: result?.head, name: this.name };
4579
3718
  }
4580
3719
  async del(id) {
4581
3720
  await this.ready();
3721
+ this.logger.Debug().Str("id", id).Msg("del");
4582
3722
  const result = await this._writeQueue.push({ id, del: true });
4583
- return { id, clock: result?.head };
3723
+ return { id, clock: result?.head, name: this.name };
4584
3724
  }
4585
3725
  async changes(since = [], opts = {}) {
4586
3726
  await this.ready();
3727
+ this.logger.Debug().Any("since", since).Any("opts", opts).Msg("changes");
4587
3728
  const { result, head } = await this._crdt.changes(since, opts);
4588
3729
  const rows = result.map(({ id: key, value, del, clock }) => ({
4589
3730
  key,
4590
3731
  value: del ? { _id: key, _deleted: true } : { _id: key, ...value },
4591
3732
  clock
4592
3733
  }));
4593
- return { rows, clock: head };
3734
+ return { rows, clock: head, name: this.name };
4594
3735
  }
4595
3736
  async allDocs(opts = {}) {
4596
3737
  await this.ready();
3738
+ this.logger.Debug().Msg("allDocs");
4597
3739
  const { result, head } = await this._crdt.allDocs();
4598
3740
  const rows = result.map(({ id: key, value, del }) => ({
4599
3741
  key,
4600
3742
  value: del ? { _id: key, _deleted: true } : { _id: key, ...value }
4601
3743
  }));
4602
- return { rows, clock: head };
3744
+ return { rows, clock: head, name: this.name };
4603
3745
  }
4604
3746
  async allDocuments() {
4605
3747
  return this.allDocs();
4606
3748
  }
4607
3749
  subscribe(listener, updates) {
3750
+ this.logger.Debug().Bool("updates", updates).Msg("subscribe");
4608
3751
  if (updates) {
4609
3752
  if (!this._listening) {
4610
3753
  this._listening = true;
@@ -4626,6 +3769,7 @@ var Database = class {
4626
3769
  // todo if we add this onto dbs in fireproof.ts then we can make index.ts a separate package
4627
3770
  async query(field, opts = {}) {
4628
3771
  await this.ready();
3772
+ this.logger.Debug().Any("field", field).Any("opts", opts).Msg("query");
4629
3773
  const _crdt = this._crdt;
4630
3774
  const idx = typeof field === "string" ? index({ _crdt }, field) : index({ _crdt }, makeName(field.toString()), field);
4631
3775
  return await idx.query(opts);
@@ -4701,6 +3845,6 @@ init_utils();
4701
3845
 
4702
3846
  // src/version.ts
4703
3847
  var PACKAGE_VERSION = Object.keys({
4704
- "0.0.0-dev": "xxxx"
3848
+ "0.19.8-dev-getid": "xxxx"
4705
3849
  })[0];
4706
3850
  //# sourceMappingURL=index.cjs.map