@fireproof/core 0.19.121-dev → 0.19.121

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 (62) hide show
  1. package/deno.json +2 -2
  2. package/index.cjs +624 -1026
  3. package/index.cjs.map +1 -1
  4. package/index.d.cts +26 -60
  5. package/index.d.ts +26 -60
  6. package/index.js +394 -97
  7. package/index.js.map +1 -1
  8. package/metafile-cjs.json +1 -1
  9. package/metafile-esm.json +1 -1
  10. package/node/index.cjs +374 -0
  11. package/node/index.cjs.map +1 -0
  12. package/node/index.d.cts +43 -0
  13. package/node/index.d.ts +43 -0
  14. package/node/index.js +279 -0
  15. package/node/index.js.map +1 -0
  16. package/node/{mem-filesystem.js → mem-filesystem-LPPT7QV5.js} +1 -1
  17. package/node/metafile-cjs.json +1 -1
  18. package/node/metafile-esm.json +1 -1
  19. package/package.json +16 -14
  20. package/tests/blockstore/keyed-crypto.test.ts +4 -2
  21. package/tests/fireproof/config.test.ts +133 -142
  22. package/web/{gateway-impl.cjs → index.cjs} +58 -9
  23. package/web/index.cjs.map +1 -0
  24. package/web/index.d.cts +44 -0
  25. package/web/index.d.ts +44 -0
  26. package/web/{gateway-impl.js → index.js} +52 -5
  27. package/web/index.js.map +1 -0
  28. package/web/metafile-cjs.json +1 -1
  29. package/web/metafile-esm.json +1 -1
  30. package/chunk-7EWIAXTM.js +0 -7
  31. package/chunk-7EWIAXTM.js.map +0 -1
  32. package/chunk-F4FC6B2T.js +0 -63
  33. package/chunk-F4FC6B2T.js.map +0 -1
  34. package/chunk-PZ5AY32C.js +0 -10
  35. package/chunk-PZ5AY32C.js.map +0 -1
  36. package/chunk-RXC4JGJT.js +0 -301
  37. package/chunk-RXC4JGJT.js.map +0 -1
  38. package/gateway-C62S56GY.js +0 -66
  39. package/gateway-C62S56GY.js.map +0 -1
  40. package/gateway-VVS4QWDA.js +0 -145
  41. package/gateway-VVS4QWDA.js.map +0 -1
  42. package/key-bag-file-PWZ3QE7B.js +0 -55
  43. package/key-bag-file-PWZ3QE7B.js.map +0 -1
  44. package/key-bag-indexdb-SYG3YD4D.js +0 -51
  45. package/key-bag-indexdb-SYG3YD4D.js.map +0 -1
  46. package/node/mem-filesystem.cjs +0 -72
  47. package/node/mem-filesystem.cjs.map +0 -1
  48. package/node/mem-filesystem.d.cts +0 -25
  49. package/node/mem-filesystem.d.ts +0 -25
  50. package/node/node-filesystem.cjs +0 -86
  51. package/node/node-filesystem.cjs.map +0 -1
  52. package/node/node-filesystem.d.cts +0 -35
  53. package/node/node-filesystem.d.ts +0 -35
  54. package/node/node-filesystem.js +0 -44
  55. package/node/node-filesystem.js.map +0 -1
  56. package/utils-ZVVGAXFE.js +0 -13
  57. package/utils-ZVVGAXFE.js.map +0 -1
  58. package/web/gateway-impl.cjs.map +0 -1
  59. package/web/gateway-impl.d.cts +0 -31
  60. package/web/gateway-impl.d.ts +0 -31
  61. package/web/gateway-impl.js.map +0 -1
  62. /package/node/{mem-filesystem.js.map → mem-filesystem-LPPT7QV5.js.map} +0 -0
package/index.cjs CHANGED
@@ -5,9 +5,6 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __esm = (fn, res) => function __init() {
9
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
10
- };
11
8
  var __export = (target, all) => {
12
9
  for (var name in all)
13
10
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -30,977 +27,561 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
30
27
  ));
31
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
32
29
 
33
- // src/utils.ts
34
- function globalLogger() {
35
- return _globalLogger.once(() => new import_cement.LoggerImpl());
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ CRDT: () => CRDT,
34
+ Database: () => Database,
35
+ Index: () => Index,
36
+ NotFoundError: () => NotFoundError,
37
+ PACKAGE_VERSION: () => PACKAGE_VERSION,
38
+ Result: () => import_cement.Result,
39
+ UInt8ArrayEqual: () => UInt8ArrayEqual,
40
+ blockstore: () => blockstore_exports,
41
+ bs: () => blockstore_exports,
42
+ dataDir: () => dataDir,
43
+ ensureLogger: () => ensureLogger,
44
+ ensureSuperLog: () => ensureSuperLog,
45
+ ensureSuperThis: () => ensureSuperThis,
46
+ exceptionWrapper: () => exceptionWrapper,
47
+ falsyToUndef: () => falsyToUndef,
48
+ fireproof: () => fireproof,
49
+ getKey: () => getKey,
50
+ getName: () => getName,
51
+ getStore: () => getStore,
52
+ index: () => index,
53
+ isFalsy: () => isFalsy,
54
+ isNotFoundError: () => isNotFoundError,
55
+ onSuperThis: () => onSuperThis,
56
+ rt: () => runtime_exports,
57
+ runtime: () => runtime_exports,
58
+ throwFalsy: () => throwFalsy
59
+ });
60
+ module.exports = __toCommonJS(index_exports);
61
+
62
+ // src/database.ts
63
+ var import_cement12 = require("@adviser/cement");
64
+
65
+ // src/write-queue.ts
66
+ function writeQueue(worker, payload = Infinity, unbounded = false) {
67
+ const queue = [];
68
+ let isProcessing = false;
69
+ async function process() {
70
+ if (isProcessing || queue.length === 0) return;
71
+ isProcessing = true;
72
+ const tasksToProcess = queue.splice(0, payload);
73
+ const updates = tasksToProcess.map((item) => item.task);
74
+ if (unbounded) {
75
+ const promises = updates.map(async (update, index2) => {
76
+ try {
77
+ const result = await worker([update]);
78
+ tasksToProcess[index2].resolve(result);
79
+ } catch (error) {
80
+ tasksToProcess[index2].reject(error);
81
+ }
82
+ });
83
+ await Promise.all(promises);
84
+ } else {
85
+ try {
86
+ const result = await worker(updates);
87
+ tasksToProcess.forEach((task) => task.resolve(result));
88
+ } catch (error) {
89
+ tasksToProcess.forEach((task) => task.reject(error));
90
+ }
91
+ }
92
+ isProcessing = false;
93
+ void process();
94
+ }
95
+ return {
96
+ push(task) {
97
+ return new Promise((resolve, reject) => {
98
+ queue.push({ task, resolve, reject });
99
+ void process();
100
+ });
101
+ }
102
+ };
36
103
  }
37
- function presetEnv() {
38
- const penv = new Map([
39
- // ["FP_DEBUG", "xxx"],
40
- // ["FP_ENV", "development"],
41
- ...Array.from(
42
- Object.entries(
43
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
44
- globalThis[Symbol.for("FP_PRESET_ENV")] || {}
45
- )
46
- )
47
- // .map(([k, v]) => [k, v as string])
48
- ]);
49
- return penv;
104
+
105
+ // src/crdt.ts
106
+ var import_cement11 = require("@adviser/cement");
107
+
108
+ // src/runtime/wait-pr-multiformats/block.ts
109
+ var block_exports = {};
110
+ __export(block_exports, {
111
+ Block: () => Block,
112
+ create: () => create,
113
+ createUnsafe: () => createUnsafe,
114
+ decode: () => decode,
115
+ encode: () => encode
116
+ });
117
+ var import_multiformats = require("multiformats");
118
+ var import_block = require("multiformats/block");
119
+ var Block = import_block.Block;
120
+ async function decode({
121
+ bytes,
122
+ codec: codec3,
123
+ hasher: hasher7
124
+ }) {
125
+ if (bytes == null) throw new Error('Missing required argument "bytes"');
126
+ if (codec3 == null || hasher7 == null) throw new Error("Missing required argument: codec or hasher");
127
+ const value = await Promise.resolve(codec3.decode(bytes));
128
+ const hash = await hasher7.digest(bytes);
129
+ const cid = import_multiformats.CID.create(1, codec3.code, hash);
130
+ return new import_block.Block({ value, bytes, cid });
50
131
  }
51
- function onSuperThis(fn) {
52
- const key = `onSuperThis-${Math.random().toString(36).slice(2)}`;
53
- _onSuperThis.set(key, fn);
54
- return () => {
55
- _onSuperThis.delete(key);
56
- };
132
+ async function encode({
133
+ value,
134
+ codec: codec3,
135
+ hasher: hasher7
136
+ }) {
137
+ if (typeof value === "undefined") throw new Error('Missing required argument "value"');
138
+ if (codec3 == null || hasher7 == null) throw new Error("Missing required argument: codec or hasher");
139
+ const bytes = await Promise.resolve(codec3.encode(value));
140
+ const hash = await hasher7.digest(bytes);
141
+ const cid = import_multiformats.CID.create(1, codec3.code, hash);
142
+ return new import_block.Block({ value, bytes, cid });
57
143
  }
58
- function ensureSuperThis(osthis) {
59
- const env = (0, import_cement.envFactory)({
60
- symbol: osthis?.env?.symbol || "FP_ENV",
61
- presetEnv: osthis?.env?.presetEnv || presetEnv()
62
- });
63
- const ret = new SuperThisImpl({
64
- logger: osthis?.logger || globalLogger(),
65
- env,
66
- crypto: osthis?.crypto || (0, import_cement.toCryptoRuntime)(),
67
- ctx: osthis?.ctx || {},
68
- pathOps,
69
- txt: osthis?.txt || txtOps
144
+ async function create({
145
+ bytes,
146
+ cid,
147
+ hasher: hasher7,
148
+ codec: codec3
149
+ }) {
150
+ if (bytes == null) throw new Error('Missing required argument "bytes"');
151
+ if (hasher7 == null) throw new Error('Missing required argument "hasher"');
152
+ const value = await Promise.resolve(codec3.decode(bytes));
153
+ const hash = await hasher7.digest(bytes);
154
+ if (!import_multiformats.bytes.equals(cid.multihash.bytes, hash.bytes)) {
155
+ throw new Error("CID hash does not match bytes");
156
+ }
157
+ return createUnsafe({
158
+ bytes,
159
+ cid,
160
+ value,
161
+ codec: codec3
70
162
  });
71
- _onSuperThis.forEach((fn) => fn(ret));
72
- return ret;
73
163
  }
74
- function ensureSuperLog(sthis, componentName, ctx) {
75
- return sthis.clone({
76
- logger: ensureLogger(sthis, componentName, ctx)
164
+ async function createUnsafe({
165
+ bytes,
166
+ cid,
167
+ value: maybeValue,
168
+ codec: codec3
169
+ }) {
170
+ const value = await Promise.resolve(maybeValue !== void 0 ? maybeValue : codec3?.decode(bytes));
171
+ if (value === void 0) throw new Error('Missing required argument, must either provide "value" or "codec"');
172
+ return new Block({
173
+ cid,
174
+ bytes,
175
+ value
77
176
  });
78
177
  }
79
- function ensureLogger(sthis, componentName, ctx) {
80
- let logger;
81
- if ((0, import_cement.IsLogger)(sthis)) {
82
- logger = sthis;
83
- } else if (sthis && (0, import_cement.IsLogger)(sthis.logger)) {
84
- logger = sthis.logger;
85
- } else {
86
- logger = globalLogger();
87
- }
88
- const cLogger = logger.With().Module(componentName);
89
- const debug = [];
90
- let exposeStack = false;
91
- if (ctx) {
92
- if ("debug" in ctx) {
93
- if (typeof ctx.debug === "string" && ctx.debug.length > 0) {
94
- debug.push(ctx.debug);
95
- } else {
96
- debug.push(componentName);
97
- }
98
- delete ctx.debug;
99
- }
100
- if ("exposeStack" in ctx) {
101
- exposeStack = true;
102
- delete ctx.exposeStack;
103
- }
104
- if ("this" in ctx) {
105
- cLogger.Str("this", sthis.nextId(4).str);
106
- delete ctx.this;
107
- }
108
- for (const [key, value] of Object.entries(ctx)) {
109
- switch (typeof value) {
110
- case "string":
111
- cLogger.Str(key, value);
112
- break;
113
- case "number":
114
- cLogger.Uint64(key, value);
115
- break;
116
- default:
117
- if (value instanceof Date) {
118
- cLogger.Str(key, value.toISOString());
119
- } else if ((0, import_cement.isURL)(value)) {
120
- cLogger.Str(key, value.toString());
121
- } else if (typeof value === "function") {
122
- cLogger.Ref(key, value);
123
- } else {
124
- cLogger.Any(key, value);
125
- }
126
- break;
127
- }
128
- }
129
- }
130
- registerFP_DEBUG.once(async () => {
131
- sthis.env.onSet(
132
- (key, value) => {
133
- switch (key) {
134
- case "FP_FORMAT": {
135
- switch (value) {
136
- case "jsonice":
137
- logger.SetFormatter(new import_cement.JSONFormatter(logger.TxtEnDe(), 2));
138
- break;
139
- case "yaml":
140
- logger.SetFormatter(new import_cement.YAMLFormatter(logger.TxtEnDe(), 2));
141
- break;
142
- case "json":
143
- default:
144
- logger.SetFormatter(new import_cement.JSONFormatter(logger.TxtEnDe()));
145
- break;
146
- }
147
- break;
148
- }
149
- case "FP_DEBUG":
150
- logger.SetDebug(value || []);
151
- break;
152
- case "FP_STACK":
153
- logger.SetExposeStack(!!value);
154
- break;
155
- }
156
- },
157
- "FP_FORMAT",
158
- "FP_DEBUG",
159
- "FP_STACK"
160
- );
161
- }).finally(() => {
162
- });
163
- if (debug.length > 0) {
164
- logger.SetDebug(debug);
165
- }
166
- if (exposeStack) {
167
- logger.SetExposeStack(true);
168
- }
169
- const out = cLogger.Logger();
170
- return out;
178
+
179
+ // src/crdt-helpers.ts
180
+ var import_link = require("multiformats/link");
181
+ var import_sha25 = require("multiformats/hashes/sha2");
182
+ var codec = __toESM(require("@fireproof/vendor/@ipld/dag-cbor"), 1);
183
+ var import_crdt = require("@fireproof/vendor/@web3-storage/pail/crdt");
184
+ var import_clock2 = require("@fireproof/vendor/@web3-storage/pail/clock");
185
+ var Batch = __toESM(require("@fireproof/vendor/@web3-storage/pail/crdt/batch"), 1);
186
+
187
+ // src/blockstore/index.ts
188
+ var blockstore_exports = {};
189
+ __export(blockstore_exports, {
190
+ BaseBlockstore: () => BaseBlockstore,
191
+ CarTransaction: () => CarTransaction,
192
+ CompactionFetcher: () => CompactionFetcher,
193
+ ConnectionBase: () => ConnectionBase,
194
+ EncryptedBlockstore: () => EncryptedBlockstore,
195
+ FragmentGateway: () => FragmentGateway,
196
+ Loader: () => Loader,
197
+ addCryptoKeyToGatewayMetaPayload: () => addCryptoKeyToGatewayMetaPayload,
198
+ ensureStart: () => ensureStart,
199
+ getGatewayFromURL: () => getGatewayFromURL,
200
+ parseCarFile: () => parseCarFile,
201
+ registerStoreProtocol: () => registerStoreProtocol,
202
+ setCryptoKeyFromGatewayMetaPayload: () => setCryptoKeyFromGatewayMetaPayload,
203
+ testStoreFactory: () => testStoreFactory,
204
+ toCIDBlock: () => toCIDBlock,
205
+ toStoreRuntime: () => toStoreRuntime
206
+ });
207
+
208
+ // src/blockstore/types.ts
209
+ function toCIDBlock(block) {
210
+ return block;
171
211
  }
172
- function getStore(url, sthis, joiner) {
173
- const store = url.getParam("store");
174
- switch (store) {
175
- case "data":
176
- case "wal":
177
- case "meta":
178
- break;
179
- default:
180
- throw sthis.logger.Error().Url(url).Msg(`store not found`).AsError();
181
- }
182
- let name = store;
183
- if (url.hasParam("index")) {
184
- name = joiner(url.getParam("index") || "idx", name);
185
- }
186
- return { store, name };
212
+
213
+ // src/blockstore/store-factory.ts
214
+ var import_cement9 = require("@adviser/cement");
215
+
216
+ // src/runtime/files.ts
217
+ var files_exports = {};
218
+ __export(files_exports, {
219
+ decodeFile: () => decodeFile,
220
+ encodeFile: () => encodeFile
221
+ });
222
+ var UnixFS = __toESM(require("@ipld/unixfs"), 1);
223
+ var raw = __toESM(require("multiformats/codecs/raw"), 1);
224
+ var import_fixed = require("@ipld/unixfs/file/chunker/fixed");
225
+ var import_balanced = require("@ipld/unixfs/file/layout/balanced");
226
+ var import_ipfs_unixfs_exporter = require("@fireproof/vendor/ipfs-unixfs-exporter");
227
+ var queuingStrategy = UnixFS.withCapacity();
228
+ var settings = UnixFS.configure({
229
+ fileChunkEncoder: raw,
230
+ smallFileEncoder: raw,
231
+ chunker: (0, import_fixed.withMaxChunkSize)(1024 * 1024),
232
+ fileLayout: (0, import_balanced.withWidth)(1024)
233
+ });
234
+ async function collect(collectable) {
235
+ const chunks = [];
236
+ await collectable.pipeTo(
237
+ new WritableStream({
238
+ write(chunk) {
239
+ chunks.push(chunk);
240
+ }
241
+ })
242
+ );
243
+ return chunks;
187
244
  }
188
- function getKey(url, logger) {
189
- const result = url.getParam("key");
190
- if (!result) throw logger.Error().Str("url", url.toString()).Msg(`key not found`).AsError();
191
- return result;
245
+ async function encodeFile(blob) {
246
+ const readable = createFileEncoderStream(blob);
247
+ const blocks = await collect(readable);
248
+ return { cid: blocks.at(-1).cid, blocks };
192
249
  }
193
- function getName(sthis, url) {
194
- let result = url.getParam("name");
195
- if (!result) {
196
- result = sthis.pathOps.dirname(url.pathname);
197
- if (result.length === 0) {
198
- throw sthis.logger.Error().Str("url", url.toString()).Msg(`name not found`).AsError();
199
- }
250
+ async function decodeFile(blocks, cid, meta) {
251
+ const entry = await (0, import_ipfs_unixfs_exporter.exporter)(cid.toString(), blocks, { length: meta.size });
252
+ const chunks = [];
253
+ for await (const chunk of entry.content()) {
254
+ chunks.push(chunk);
200
255
  }
201
- return result;
256
+ return new File(chunks, entry.name, { type: meta.type, lastModified: 0 });
202
257
  }
203
- async function exceptionWrapper(fn) {
204
- return fn().catch((e) => import_cement.Result.Err(e));
258
+ function createFileEncoderStream(blob) {
259
+ const { readable, writable } = new TransformStream({}, queuingStrategy);
260
+ const unixfsWriter = UnixFS.createWriter({ writable, settings });
261
+ const fileBuilder = new UnixFSFileBuilder("", blob);
262
+ void (async () => {
263
+ await fileBuilder.finalize(unixfsWriter);
264
+ await unixfsWriter.close();
265
+ })();
266
+ return readable;
205
267
  }
206
- function isNotFoundError(e) {
207
- if (import_cement.Result.Is(e)) {
208
- if (e.isOk()) return false;
209
- e = e.Err();
268
+ var UnixFSFileBuilder = class {
269
+ #file;
270
+ constructor(name, file) {
271
+ this.name = name;
272
+ this.#file = file;
210
273
  }
211
- if (e.code === "ENOENT") return true;
212
- return false;
213
- }
214
- function dataDir(sthis, name, base) {
215
- if (!base) {
216
- if (!(0, import_cement.runtimeFn)().isBrowser) {
217
- const home = sthis.env.get("HOME") || "./";
218
- base = sthis.env.get("FP_STORAGE_URL") || `file://${sthis.pathOps.join(home, ".fireproof")}`;
219
- } else {
220
- base = sthis.env.get("FP_STORAGE_URL") || `indexdb://fp`;
221
- }
274
+ async finalize(writer) {
275
+ const unixfsFileWriter = UnixFS.createFileWriter(writer);
276
+ await this.#file.stream().pipeTo(
277
+ new WritableStream({
278
+ async write(chunk) {
279
+ await unixfsFileWriter.write(chunk);
280
+ }
281
+ })
282
+ );
283
+ return await unixfsFileWriter.close();
222
284
  }
223
- return import_cement.URI.from(base.toString()).build().setParam("name", name || "").URI();
285
+ };
286
+
287
+ // src/blockstore/store.ts
288
+ var import_dag_json2 = require("@fireproof/vendor/@ipld/dag-json");
289
+ var import_cement8 = require("@adviser/cement");
290
+
291
+ // src/types.ts
292
+ function isFalsy(value) {
293
+ return value === false && value === null && value === void 0;
224
294
  }
225
- function UInt8ArrayEqual(a, b) {
226
- if (a.length !== b.length) {
227
- return false;
295
+ function throwFalsy(value) {
296
+ if (isFalsy(value)) {
297
+ throw new Error("value is Falsy");
228
298
  }
229
- for (let i = 0; i < a.length; i++) {
230
- if (a[i] !== b[i]) {
231
- return false;
232
- }
299
+ return value;
300
+ }
301
+ function falsyToUndef(value) {
302
+ if (isFalsy(value)) {
303
+ return void 0;
233
304
  }
234
- return true;
305
+ return value;
235
306
  }
236
- var import_cement, import_base58, _globalLogger, registerFP_DEBUG, SuperThisImpl, pathOpsImpl, pathOps, txtOps, _onSuperThis, NotFoundError;
237
- var init_utils = __esm({
238
- "src/utils.ts"() {
239
- "use strict";
240
- import_cement = require("@adviser/cement");
241
- import_base58 = require("multiformats/bases/base58");
242
- _globalLogger = new import_cement.ResolveOnce();
243
- registerFP_DEBUG = new import_cement.ResolveOnce();
244
- SuperThisImpl = class _SuperThisImpl {
245
- constructor(opts) {
246
- this.logger = opts.logger;
247
- this.env = opts.env;
248
- this.crypto = opts.crypto;
249
- this.pathOps = opts.pathOps;
250
- this.txt = opts.txt;
251
- this.ctx = { ...opts.ctx };
252
- }
253
- nextId(bytes = 6) {
254
- const bin = this.crypto.randomBytes(bytes);
255
- return {
256
- str: import_base58.base58btc.encode(bin),
257
- bin
258
- };
259
- }
260
- timeOrderedNextId(now) {
261
- now = typeof now === "number" ? now : (/* @__PURE__ */ new Date()).getTime();
262
- const t = (281474976710656 + now).toString(16).replace(/^1/, "");
263
- const bin = this.crypto.randomBytes(10);
264
- bin[1] = bin[1] & 240 | (bin[1] | 8 && 11);
265
- const hex = Array.from(bin).map((i) => i.toString(16).padStart(2, "0")).join("");
266
- return {
267
- str: `${t.slice(0, 8)}-${t.slice(8)}-7${hex.slice(0, 3)}-${hex.slice(3, 7)}-${hex.slice(7, 19)}`
268
- };
269
- }
270
- start() {
271
- return Promise.resolve();
272
- }
273
- clone(override) {
274
- return new _SuperThisImpl({
275
- logger: override.logger || this.logger,
276
- env: (0, import_cement.envFactory)(override.env) || this.env,
277
- crypto: override.crypto || this.crypto,
278
- pathOps: override.pathOps || this.pathOps,
279
- txt: override.txt || this.txt,
280
- ctx: { ...this.ctx, ...override.ctx }
281
- });
282
- }
283
- };
284
- pathOpsImpl = class {
285
- join(...paths) {
286
- return paths.map((i) => i.replace(/\/+$/, "")).join("/");
287
- }
288
- dirname(path) {
289
- return path.split("/").slice(0, -1).join("/");
290
- }
291
- // homedir() {
292
- // throw new Error("SysContainer:homedir is not available in seeded state");
293
- // }
294
- };
295
- pathOps = new pathOpsImpl();
296
- txtOps = {
297
- // eslint-disable-next-line no-restricted-globals
298
- encode: (input) => new TextEncoder().encode(input),
299
- // eslint-disable-next-line no-restricted-globals
300
- decode: (input) => new TextDecoder().decode(input)
301
- };
302
- _onSuperThis = /* @__PURE__ */ new Map();
303
- NotFoundError = class extends Error {
304
- constructor() {
305
- super(...arguments);
306
- this.code = "ENOENT";
307
- }
307
+
308
+ // src/utils.ts
309
+ var import_cement = require("@adviser/cement");
310
+ var import_base58 = require("multiformats/bases/base58");
311
+ var _globalLogger = new import_cement.ResolveOnce();
312
+ function globalLogger() {
313
+ return _globalLogger.once(() => new import_cement.LoggerImpl());
314
+ }
315
+ var registerFP_DEBUG = new import_cement.ResolveOnce();
316
+ var SuperThisImpl = class _SuperThisImpl {
317
+ constructor(opts) {
318
+ this.logger = opts.logger;
319
+ this.env = opts.env;
320
+ this.crypto = opts.crypto;
321
+ this.pathOps = opts.pathOps;
322
+ this.txt = opts.txt;
323
+ this.ctx = { ...opts.ctx };
324
+ }
325
+ nextId(bytes = 6) {
326
+ const bin = this.crypto.randomBytes(bytes);
327
+ return {
328
+ str: import_base58.base58btc.encode(bin),
329
+ bin
308
330
  };
309
331
  }
310
- });
311
-
312
- // src/runtime/gateways/file/get-file-system-static.ts
313
- async function getFileSystem(url) {
314
- const name = url.getParam("fs", "node");
315
- let fs;
316
- switch (name) {
317
- case "mem":
318
- fs = await externalLoaders.get(name).once(async () => {
319
- const { MemFileSystem } = await import("@fireproof/core/mem");
320
- return new MemFileSystem();
321
- });
322
- break;
323
- // case 'deno': {
324
- // const { DenoFileSystem } = await import("./deno-filesystem.js");
325
- // fs = new DenoFileSystem();
326
- // break;
327
- // }
328
- default:
329
- fs = await externalLoaders.get(name).once(async () => {
330
- const { NodeFileSystem } = await import("@fireproof/core/node");
331
- return new NodeFileSystem();
332
- });
332
+ timeOrderedNextId(now) {
333
+ now = typeof now === "number" ? now : (/* @__PURE__ */ new Date()).getTime();
334
+ const t = (281474976710656 + now).toString(16).replace(/^1/, "");
335
+ const bin = this.crypto.randomBytes(10);
336
+ bin[1] = bin[1] & 240 | (bin[1] | 8 && 11);
337
+ const hex = Array.from(bin).map((i) => i.toString(16).padStart(2, "0")).join("");
338
+ return {
339
+ str: `${t.slice(0, 8)}-${t.slice(8)}-7${hex.slice(0, 3)}-${hex.slice(3, 7)}-${hex.slice(7, 19)}`
340
+ };
333
341
  }
334
- return fs.start();
335
- }
336
- var import_cement4, externalLoaders;
337
- var init_get_file_system_static = __esm({
338
- "src/runtime/gateways/file/get-file-system-static.ts"() {
339
- "use strict";
340
- import_cement4 = require("@adviser/cement");
341
- externalLoaders = new import_cement4.KeyedResolvOnce();
342
+ start() {
343
+ return Promise.resolve();
342
344
  }
343
- });
344
-
345
- // src/runtime/gateways/file/utils.ts
346
- var utils_exports = {};
347
- __export(utils_exports, {
348
- getFileName: () => getFileName,
349
- getFileSystem: () => getFileSystem,
350
- getPath: () => getPath
351
- });
352
- function getPath(url, sthis) {
353
- const basePath = url.pathname;
354
- const name = url.getParam("name");
355
- if (name) {
356
- const version = url.getParam("version");
357
- if (!version) throw sthis.logger.Error().Url(url).Msg(`version not found`).AsError();
358
- return sthis.pathOps.join(basePath, version, name);
345
+ clone(override) {
346
+ return new _SuperThisImpl({
347
+ logger: override.logger || this.logger,
348
+ env: (0, import_cement.envFactory)(override.env) || this.env,
349
+ crypto: override.crypto || this.crypto,
350
+ pathOps: override.pathOps || this.pathOps,
351
+ txt: override.txt || this.txt,
352
+ ctx: { ...this.ctx, ...override.ctx }
353
+ });
359
354
  }
360
- return sthis.pathOps.join(basePath);
355
+ };
356
+ function presetEnv() {
357
+ const penv = new Map([
358
+ // ["FP_DEBUG", "xxx"],
359
+ // ["FP_ENV", "development"],
360
+ ...Array.from(
361
+ Object.entries(
362
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
363
+ globalThis[Symbol.for("FP_PRESET_ENV")] || {}
364
+ )
365
+ )
366
+ // .map(([k, v]) => [k, v as string])
367
+ ]);
368
+ return penv;
361
369
  }
362
- function getFileName(url, sthis) {
363
- const key = url.getParam("key");
364
- if (!key) throw sthis.logger.Error().Url(url).Msg(`key not found`).AsError();
365
- const res = getStore(url, sthis, (...a) => a.join("-"));
366
- switch (res.store) {
367
- case "data":
368
- return sthis.pathOps.join(res.name, key + ".car");
369
- case "wal":
370
- case "meta":
371
- return sthis.pathOps.join(res.name, key + ".json");
372
- default:
373
- throw sthis.logger.Error().Url(url).Msg(`unsupported store type`).AsError();
370
+ var pathOpsImpl = class {
371
+ join(...paths) {
372
+ return paths.map((i) => i.replace(/\/+$/, "")).join("/");
374
373
  }
375
- }
376
- var init_utils2 = __esm({
377
- "src/runtime/gateways/file/utils.ts"() {
378
- "use strict";
379
- init_utils();
380
- init_get_file_system_static();
374
+ dirname(path) {
375
+ return path.split("/").slice(0, -1).join("/");
381
376
  }
382
- });
383
-
384
- // src/runtime/key-bag-file.ts
385
- var key_bag_file_exports = {};
386
- __export(key_bag_file_exports, {
387
- KeyBagProviderFile: () => KeyBagProviderFile
388
- });
389
- var KeyBagProviderFile;
390
- var init_key_bag_file = __esm({
391
- "src/runtime/key-bag-file.ts"() {
392
- "use strict";
393
- init_utils();
394
- KeyBagProviderFile = class {
395
- async _prepare(id) {
396
- await this.sthis.start();
397
- let sysFS;
398
- switch (this.url.protocol) {
399
- case "file:": {
400
- const { getFileSystem: getFileSystem2 } = await Promise.resolve().then(() => (init_utils2(), utils_exports));
401
- sysFS = await getFileSystem2(this.url);
402
- break;
403
- }
404
- default:
405
- throw this.logger.Error().Url(this.url).Msg("unsupported protocol").AsError();
406
- }
407
- const dirName = this.url.pathname;
408
- await sysFS.mkdir(dirName, { recursive: true });
409
- return {
410
- dirName,
411
- sysFS,
412
- fName: this.sthis.pathOps.join(dirName, `${id.replace(/[^a-zA-Z0-9]/g, "_")}.json`)
413
- };
414
- }
415
- constructor(url, sthis) {
416
- this.url = url;
417
- this.sthis = sthis;
418
- this.logger = sthis.logger;
419
- }
420
- async get(id) {
421
- const ctx = await this._prepare(id);
422
- try {
423
- const p = await ctx.sysFS.readfile(ctx.fName);
424
- const ki = JSON.parse(this.sthis.txt.decode(p));
425
- return ki;
426
- } catch (e) {
427
- if (isNotFoundError(e)) {
428
- return void 0;
429
- }
430
- throw this.logger.Error().Err(e).Str("file", ctx.dirName).Msg("read bag failed").AsError();
431
- }
432
- }
433
- async set(id, item) {
434
- const ctx = await this._prepare(id);
435
- const p = this.sthis.txt.encode(JSON.stringify(item, null, 2));
436
- await ctx.sysFS.writefile(ctx.fName, p);
437
- }
438
- };
439
- }
440
- });
441
-
442
- // src/runtime/key-bag-indexdb.ts
443
- var key_bag_indexdb_exports = {};
444
- __export(key_bag_indexdb_exports, {
445
- KeyBagProviderIndexDB: () => KeyBagProviderIndexDB
446
- });
447
- var import_idb, import_cement5, KeyBagProviderIndexDB;
448
- var init_key_bag_indexdb = __esm({
449
- "src/runtime/key-bag-indexdb.ts"() {
450
- "use strict";
451
- import_idb = require("idb");
452
- init_utils2();
453
- import_cement5 = require("@adviser/cement");
454
- KeyBagProviderIndexDB = class {
455
- constructor(url, sthis) {
456
- this._db = new import_cement5.ResolveOnce();
457
- this.sthis = sthis;
458
- this.logger = sthis.logger;
459
- this.url = url;
460
- this.dbName = getPath(this.url, this.sthis);
461
- }
462
- async _prepare() {
463
- return this._db.once(async () => {
464
- return await (0, import_idb.openDB)(this.dbName, 1, {
465
- upgrade(db) {
466
- ["bag"].map((store) => {
467
- db.createObjectStore(store, {
468
- autoIncrement: false
469
- });
470
- });
471
- }
472
- });
473
- });
474
- }
475
- async get(id) {
476
- const db = await this._prepare();
477
- const tx = db.transaction(["bag"], "readonly");
478
- const keyItem = await tx.objectStore("bag").get(id);
479
- await tx.done;
480
- if (!keyItem) {
481
- return void 0;
482
- }
483
- return keyItem;
484
- }
485
- async set(id, item) {
486
- const db = await this._prepare();
487
- const tx = db.transaction(["bag"], "readwrite");
488
- await tx.objectStore("bag").put(item, id);
489
- await tx.done;
490
- }
491
- };
492
- }
493
- });
494
-
495
- // src/runtime/gateways/file/version.ts
496
- var FILESTORE_VERSION;
497
- var init_version = __esm({
498
- "src/runtime/gateways/file/version.ts"() {
499
- "use strict";
500
- FILESTORE_VERSION = "v0.19-file";
501
- }
502
- });
503
-
504
- // src/runtime/gateways/file/gateway.ts
505
- var gateway_exports = {};
506
- __export(gateway_exports, {
507
- FileGateway: () => FileGateway,
508
- FileTestStore: () => FileTestStore
509
- });
510
- var import_cement11, versionFiles, FileGateway, FileTestStore;
511
- var init_gateway = __esm({
512
- "src/runtime/gateways/file/gateway.ts"() {
513
- "use strict";
514
- init_version();
515
- import_cement11 = require("@adviser/cement");
516
- init_utils();
517
- init_utils2();
518
- init_get_file_system_static();
519
- versionFiles = new import_cement11.KeyedResolvOnce();
520
- FileGateway = class {
521
- get fs() {
522
- if (!this._fs) throw this.logger.Error().Msg("fs not initialized").AsError();
523
- return this._fs;
524
- }
525
- constructor(sthis) {
526
- this.sthis = sthis;
527
- this.logger = sthis.logger;
528
- }
529
- async getVersionFromFile(path, logger) {
530
- return versionFiles.get(path).once(async () => {
531
- await this.fs.mkdir(path, { recursive: true });
532
- const vFile = this.sthis.pathOps.join(path, "version");
533
- const vFileStat = await this.fs.stat(vFile).catch(() => void 0);
534
- if (!vFileStat) {
535
- await this.fs.writefile(this.sthis.pathOps.join(path, "version"), FILESTORE_VERSION);
536
- return FILESTORE_VERSION;
537
- } else if (!vFileStat.isFile()) {
538
- throw logger.Error().Str("file", vFile).Msg(`version file is a directory`).AsError();
539
- }
540
- const v = await this.fs.readfile(vFile);
541
- const vStr = this.sthis.txt.decode(v);
542
- if (vStr !== FILESTORE_VERSION) {
543
- logger.Warn().Str("file", vFile).Str("from", vStr).Str("expected", FILESTORE_VERSION).Msg(`version mismatch`);
544
- }
545
- return vStr;
546
- });
547
- }
548
- start(baseURL) {
549
- return (0, import_cement11.exception2Result)(async () => {
550
- this._fs = await getFileSystem(baseURL);
551
- await this.fs.start();
552
- const url = baseURL.build();
553
- url.defParam("version", FILESTORE_VERSION);
554
- const dbUrl = await this.buildUrl(url.URI(), "dummy");
555
- const dbdirFile = this.getFilePath(dbUrl.Ok());
556
- await this.fs.mkdir(this.sthis.pathOps.dirname(dbdirFile), { recursive: true });
557
- const dbroot = this.sthis.pathOps.dirname(dbdirFile);
558
- this.logger.Debug().Url(url.URI()).Str("dbroot", dbroot).Msg("start");
559
- url.setParam("version", await this.getVersionFromFile(dbroot, this.logger));
560
- return url.URI();
561
- });
562
- }
563
- async buildUrl(baseUrl, key) {
564
- return import_cement11.Result.Ok(baseUrl.build().setParam("key", key).URI());
565
- }
566
- async close() {
567
- return import_cement11.Result.Ok(void 0);
568
- }
569
- // abstract buildUrl(baseUrl: URL, key: string): Promise<Result<URL>>;
570
- getFilePath(url) {
571
- const key = url.getParam("key");
572
- if (!key) throw this.logger.Error().Url(url).Msg(`key not found`).AsError();
573
- return this.sthis.pathOps.join(getPath(url, this.sthis), getFileName(url, this.sthis));
574
- }
575
- async put(url, body) {
576
- return (0, import_cement11.exception2Result)(async () => {
577
- const file = await this.getFilePath(url);
578
- this.logger.Debug().Str("url", url.toString()).Str("file", file).Msg("put");
579
- await this.fs.writefile(file, body);
580
- });
581
- }
582
- async get(url) {
583
- return exceptionWrapper(async () => {
584
- const file = this.getFilePath(url);
585
- try {
586
- const res = await this.fs.readfile(file);
587
- this.logger.Debug().Url(url.asURL()).Str("file", file).Msg("get");
588
- return import_cement11.Result.Ok(new Uint8Array(res));
589
- } catch (e) {
590
- if (isNotFoundError(e)) {
591
- return import_cement11.Result.Err(new NotFoundError(`file not found: ${file}`));
592
- }
593
- return import_cement11.Result.Err(e);
594
- }
595
- });
596
- }
597
- async delete(url) {
598
- return (0, import_cement11.exception2Result)(async () => {
599
- await this.fs.unlink(this.getFilePath(url));
600
- });
601
- }
602
- async destroy(baseURL) {
603
- const url = await this.buildUrl(baseURL, "x");
604
- if (url.isErr()) return url;
605
- const filepath = this.sthis.pathOps.dirname(this.getFilePath(url.Ok()));
606
- let files = [];
607
- try {
608
- files = await this.fs.readdir(filepath);
609
- } catch (e) {
610
- if (!isNotFoundError(e)) {
611
- throw this.logger.Error().Err(e).Str("dir", filepath).Msg("destroy:readdir").AsError();
612
- }
613
- }
614
- for (const file of files) {
615
- const pathed = this.sthis.pathOps.join(filepath, file);
616
- try {
617
- await this.fs.unlink(pathed);
618
- } catch (e) {
619
- if (!isNotFoundError(e)) {
620
- throw this.logger.Error().Err(e).Str("file", pathed).Msg("destroy:unlink").AsError();
621
- }
622
- }
623
- }
624
- return import_cement11.Result.Ok(void 0);
625
- }
626
- };
627
- FileTestStore = class {
628
- constructor(sthis) {
629
- this.logger = ensureLogger(sthis, "FileTestStore");
630
- this.sthis = sthis;
631
- }
632
- async get(iurl, key) {
633
- const url = iurl.build().setParam("key", key).URI();
634
- const dbFile = this.sthis.pathOps.join(getPath(url, this.sthis), getFileName(url, this.sthis));
635
- this.logger.Debug().Url(url).Str("dbFile", dbFile).Msg("get");
636
- const buffer = await (await getFileSystem(url)).readfile(dbFile);
637
- this.logger.Debug().Url(url).Str("dbFile", dbFile).Len(buffer).Msg("got");
638
- return buffer;
639
- }
640
- };
641
- }
642
- });
643
-
644
- // src/runtime/gateways/indexdb/gateway-import-static.ts
645
- function gatewayImport() {
646
- return import("@fireproof/core/web");
377
+ // homedir() {
378
+ // throw new Error("SysContainer:homedir is not available in seeded state");
379
+ // }
380
+ };
381
+ var pathOps = new pathOpsImpl();
382
+ var txtOps = {
383
+ // eslint-disable-next-line no-restricted-globals
384
+ encode: (input) => new TextEncoder().encode(input),
385
+ // eslint-disable-next-line no-restricted-globals
386
+ decode: (input) => new TextDecoder().decode(input)
387
+ };
388
+ var _onSuperThis = /* @__PURE__ */ new Map();
389
+ function onSuperThis(fn) {
390
+ const key = `onSuperThis-${Math.random().toString(36).slice(2)}`;
391
+ _onSuperThis.set(key, fn);
392
+ return () => {
393
+ _onSuperThis.delete(key);
394
+ };
647
395
  }
648
- var init_gateway_import_static = __esm({
649
- "src/runtime/gateways/indexdb/gateway-import-static.ts"() {
650
- "use strict";
651
- }
652
- });
653
-
654
- // src/runtime/gateways/indexdb/gateway.ts
655
- var gateway_exports2 = {};
656
- __export(gateway_exports2, {
657
- IndexDBGateway: () => IndexDBGateway,
658
- IndexDBTestStore: () => IndexDBTestStore
659
- });
660
- var import_cement12, loadExternal, IndexDBGateway, IndexDBTestStore;
661
- var init_gateway2 = __esm({
662
- "src/runtime/gateways/indexdb/gateway.ts"() {
663
- "use strict";
664
- import_cement12 = require("@adviser/cement");
665
- init_gateway_import_static();
666
- loadExternal = new import_cement12.ResolveOnce();
667
- IndexDBGateway = class {
668
- constructor(sthis) {
669
- this.sthis = sthis;
670
- }
671
- getGateway() {
672
- return loadExternal.once(() => {
673
- return gatewayImport().then(({ IndexDBGatewayImpl }) => new IndexDBGatewayImpl(this.sthis));
674
- });
675
- }
676
- buildUrl(baseUrl, key) {
677
- return this.getGateway().then((gw) => gw.buildUrl(baseUrl, key));
678
- }
679
- start(baseUrl) {
680
- return this.getGateway().then((gw) => gw.start(baseUrl));
681
- }
682
- close(baseUrl) {
683
- return this.getGateway().then((gw) => gw.close(baseUrl));
684
- }
685
- destroy(baseUrl) {
686
- return this.getGateway().then((gw) => gw.destroy(baseUrl));
687
- }
688
- put(url, body) {
689
- return this.getGateway().then((gw) => gw.put(url, body));
690
- }
691
- get(url) {
692
- return this.getGateway().then((gw) => gw.get(url));
693
- }
694
- delete(url) {
695
- return this.getGateway().then((gw) => gw.delete(url));
696
- }
697
- // subscribe?(url: URI, callback: (meta: Uint8Array) => void): Promise<UnsubscribeResult> {
698
- // // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
699
- // return this.getGateway().then(gw => gw.subscribe!(url, callback));
700
- // }
701
- };
702
- IndexDBTestStore = class {
703
- constructor(sthis) {
704
- this.loadExternal = new import_cement12.ResolveOnce();
705
- this.sthis = sthis;
706
- }
707
- getGateway() {
708
- return this.loadExternal.once(() => {
709
- return gatewayImport().then(({ IndexDBTestStore: IndexDBTestStore2 }) => new IndexDBTestStore2(this.sthis));
710
- });
711
- }
712
- get(url, key) {
713
- return this.getGateway().then((gw) => gw.get(url, key));
714
- }
715
- };
396
+ function ensureSuperThis(osthis) {
397
+ const env = (0, import_cement.envFactory)({
398
+ symbol: osthis?.env?.symbol || "FP_ENV",
399
+ presetEnv: osthis?.env?.presetEnv || presetEnv()
400
+ });
401
+ const ret = new SuperThisImpl({
402
+ logger: osthis?.logger || globalLogger(),
403
+ env,
404
+ crypto: osthis?.crypto || (0, import_cement.toCryptoRuntime)(),
405
+ ctx: osthis?.ctx || {},
406
+ pathOps,
407
+ txt: osthis?.txt || txtOps
408
+ });
409
+ _onSuperThis.forEach((fn) => fn(ret));
410
+ return ret;
411
+ }
412
+ function ensureSuperLog(sthis, componentName, ctx) {
413
+ return sthis.clone({
414
+ logger: ensureLogger(sthis, componentName, ctx)
415
+ });
416
+ }
417
+ function ensureLogger(sthis, componentName, ctx) {
418
+ let logger;
419
+ if ((0, import_cement.IsLogger)(sthis)) {
420
+ logger = sthis;
421
+ } else if (sthis && (0, import_cement.IsLogger)(sthis.logger)) {
422
+ logger = sthis.logger;
423
+ } else {
424
+ logger = globalLogger();
716
425
  }
717
- });
718
-
719
- // src/index.ts
720
- var index_exports = {};
721
- __export(index_exports, {
722
- CRDT: () => CRDT,
723
- Database: () => Database,
724
- Index: () => Index,
725
- NotFoundError: () => NotFoundError,
726
- PACKAGE_VERSION: () => PACKAGE_VERSION,
727
- Result: () => import_cement.Result,
728
- UInt8ArrayEqual: () => UInt8ArrayEqual,
729
- blockstore: () => blockstore_exports,
730
- bs: () => blockstore_exports,
731
- dataDir: () => dataDir,
732
- ensureLogger: () => ensureLogger,
733
- ensureSuperLog: () => ensureSuperLog,
734
- ensureSuperThis: () => ensureSuperThis,
735
- exceptionWrapper: () => exceptionWrapper,
736
- falsyToUndef: () => falsyToUndef,
737
- fireproof: () => fireproof,
738
- getKey: () => getKey,
739
- getName: () => getName,
740
- getStore: () => getStore,
741
- index: () => index,
742
- isFalsy: () => isFalsy,
743
- isNotFoundError: () => isNotFoundError,
744
- onSuperThis: () => onSuperThis,
745
- rt: () => runtime_exports,
746
- runtime: () => runtime_exports,
747
- throwFalsy: () => throwFalsy
748
- });
749
- module.exports = __toCommonJS(index_exports);
750
-
751
- // src/database.ts
752
- var import_cement16 = require("@adviser/cement");
753
-
754
- // src/write-queue.ts
755
- function writeQueue(worker, payload = Infinity, unbounded = false) {
756
- const queue = [];
757
- let isProcessing = false;
758
- async function process() {
759
- if (isProcessing || queue.length === 0) return;
760
- isProcessing = true;
761
- const tasksToProcess = queue.splice(0, payload);
762
- const updates = tasksToProcess.map((item) => item.task);
763
- if (unbounded) {
764
- const promises = updates.map(async (update, index2) => {
765
- try {
766
- const result = await worker([update]);
767
- tasksToProcess[index2].resolve(result);
768
- } catch (error) {
769
- tasksToProcess[index2].reject(error);
770
- }
771
- });
772
- await Promise.all(promises);
773
- } else {
774
- try {
775
- const result = await worker(updates);
776
- tasksToProcess.forEach((task) => task.resolve(result));
777
- } catch (error) {
778
- tasksToProcess.forEach((task) => task.reject(error));
426
+ const cLogger = logger.With().Module(componentName);
427
+ const debug = [];
428
+ let exposeStack = false;
429
+ if (ctx) {
430
+ if ("debug" in ctx) {
431
+ if (typeof ctx.debug === "string" && ctx.debug.length > 0) {
432
+ debug.push(ctx.debug);
433
+ } else {
434
+ debug.push(componentName);
779
435
  }
436
+ delete ctx.debug;
780
437
  }
781
- isProcessing = false;
782
- void process();
783
- }
784
- return {
785
- push(task) {
786
- return new Promise((resolve, reject) => {
787
- queue.push({ task, resolve, reject });
788
- void process();
789
- });
438
+ if ("exposeStack" in ctx) {
439
+ exposeStack = true;
440
+ delete ctx.exposeStack;
441
+ }
442
+ if ("this" in ctx) {
443
+ cLogger.Str("this", sthis.nextId(4).str);
444
+ delete ctx.this;
445
+ }
446
+ for (const [key, value] of Object.entries(ctx)) {
447
+ switch (typeof value) {
448
+ case "string":
449
+ cLogger.Str(key, value);
450
+ break;
451
+ case "number":
452
+ cLogger.Uint64(key, value);
453
+ break;
454
+ default:
455
+ if (value instanceof Date) {
456
+ cLogger.Str(key, value.toISOString());
457
+ } else if ((0, import_cement.isURL)(value)) {
458
+ cLogger.Str(key, value.toString());
459
+ } else if (typeof value === "function") {
460
+ cLogger.Ref(key, value);
461
+ } else {
462
+ cLogger.Any(key, value);
463
+ }
464
+ break;
465
+ }
790
466
  }
791
- };
792
- }
793
-
794
- // src/crdt.ts
795
- var import_cement15 = require("@adviser/cement");
796
-
797
- // src/runtime/wait-pr-multiformats/block.ts
798
- var block_exports = {};
799
- __export(block_exports, {
800
- Block: () => Block,
801
- create: () => create,
802
- createUnsafe: () => createUnsafe,
803
- decode: () => decode,
804
- encode: () => encode
805
- });
806
- var import_multiformats = require("multiformats");
807
- var import_block = require("multiformats/block");
808
- var Block = import_block.Block;
809
- async function decode({
810
- bytes,
811
- codec: codec3,
812
- hasher: hasher7
813
- }) {
814
- if (bytes == null) throw new Error('Missing required argument "bytes"');
815
- if (codec3 == null || hasher7 == null) throw new Error("Missing required argument: codec or hasher");
816
- const value = await Promise.resolve(codec3.decode(bytes));
817
- const hash = await hasher7.digest(bytes);
818
- const cid = import_multiformats.CID.create(1, codec3.code, hash);
819
- return new import_block.Block({ value, bytes, cid });
820
- }
821
- async function encode({
822
- value,
823
- codec: codec3,
824
- hasher: hasher7
825
- }) {
826
- if (typeof value === "undefined") throw new Error('Missing required argument "value"');
827
- if (codec3 == null || hasher7 == null) throw new Error("Missing required argument: codec or hasher");
828
- const bytes = await Promise.resolve(codec3.encode(value));
829
- const hash = await hasher7.digest(bytes);
830
- const cid = import_multiformats.CID.create(1, codec3.code, hash);
831
- return new import_block.Block({ value, bytes, cid });
832
- }
833
- async function create({
834
- bytes,
835
- cid,
836
- hasher: hasher7,
837
- codec: codec3
838
- }) {
839
- if (bytes == null) throw new Error('Missing required argument "bytes"');
840
- if (hasher7 == null) throw new Error('Missing required argument "hasher"');
841
- const value = await Promise.resolve(codec3.decode(bytes));
842
- const hash = await hasher7.digest(bytes);
843
- if (!import_multiformats.bytes.equals(cid.multihash.bytes, hash.bytes)) {
844
- throw new Error("CID hash does not match bytes");
845
467
  }
846
- return createUnsafe({
847
- bytes,
848
- cid,
849
- value,
850
- codec: codec3
851
- });
852
- }
853
- async function createUnsafe({
854
- bytes,
855
- cid,
856
- value: maybeValue,
857
- codec: codec3
858
- }) {
859
- const value = await Promise.resolve(maybeValue !== void 0 ? maybeValue : codec3?.decode(bytes));
860
- if (value === void 0) throw new Error('Missing required argument, must either provide "value" or "codec"');
861
- return new Block({
862
- cid,
863
- bytes,
864
- value
468
+ registerFP_DEBUG.once(async () => {
469
+ sthis.env.onSet(
470
+ (key, value) => {
471
+ switch (key) {
472
+ case "FP_FORMAT": {
473
+ switch (value) {
474
+ case "jsonice":
475
+ logger.SetFormatter(new import_cement.JSONFormatter(logger.TxtEnDe(), 2));
476
+ break;
477
+ case "yaml":
478
+ logger.SetFormatter(new import_cement.YAMLFormatter(logger.TxtEnDe(), 2));
479
+ break;
480
+ case "json":
481
+ default:
482
+ logger.SetFormatter(new import_cement.JSONFormatter(logger.TxtEnDe()));
483
+ break;
484
+ }
485
+ break;
486
+ }
487
+ case "FP_DEBUG":
488
+ logger.SetDebug(value || []);
489
+ break;
490
+ case "FP_STACK":
491
+ logger.SetExposeStack(!!value);
492
+ break;
493
+ }
494
+ },
495
+ "FP_FORMAT",
496
+ "FP_DEBUG",
497
+ "FP_STACK"
498
+ );
499
+ }).finally(() => {
865
500
  });
501
+ if (debug.length > 0) {
502
+ logger.SetDebug(debug);
503
+ }
504
+ if (exposeStack) {
505
+ logger.SetExposeStack(true);
506
+ }
507
+ const out = cLogger.Logger();
508
+ return out;
866
509
  }
867
-
868
- // src/crdt-helpers.ts
869
- var import_link = require("multiformats/link");
870
- var import_sha25 = require("multiformats/hashes/sha2");
871
- var codec = __toESM(require("@fireproof/vendor/@ipld/dag-cbor"), 1);
872
- var import_crdt = require("@fireproof/vendor/@web3-storage/pail/crdt");
873
- var import_clock2 = require("@fireproof/vendor/@web3-storage/pail/clock");
874
- var Batch = __toESM(require("@fireproof/vendor/@web3-storage/pail/crdt/batch"), 1);
875
-
876
- // src/blockstore/index.ts
877
- var blockstore_exports = {};
878
- __export(blockstore_exports, {
879
- BaseBlockstore: () => BaseBlockstore,
880
- CarTransaction: () => CarTransaction,
881
- CompactionFetcher: () => CompactionFetcher,
882
- ConnectionBase: () => ConnectionBase,
883
- EncryptedBlockstore: () => EncryptedBlockstore,
884
- FragmentGateway: () => FragmentGateway,
885
- Loader: () => Loader,
886
- addCryptoKeyToGatewayMetaPayload: () => addCryptoKeyToGatewayMetaPayload,
887
- ensureStart: () => ensureStart,
888
- getGatewayFromURL: () => getGatewayFromURL,
889
- parseCarFile: () => parseCarFile,
890
- registerStoreProtocol: () => registerStoreProtocol,
891
- setCryptoKeyFromGatewayMetaPayload: () => setCryptoKeyFromGatewayMetaPayload,
892
- testStoreFactory: () => testStoreFactory,
893
- toCIDBlock: () => toCIDBlock,
894
- toStoreRuntime: () => toStoreRuntime
895
- });
896
-
897
- // src/blockstore/types.ts
898
- function toCIDBlock(block) {
899
- return block;
900
- }
901
-
902
- // src/blockstore/store-factory.ts
903
- var import_cement13 = require("@adviser/cement");
904
-
905
- // src/runtime/files.ts
906
- var files_exports = {};
907
- __export(files_exports, {
908
- decodeFile: () => decodeFile,
909
- encodeFile: () => encodeFile
910
- });
911
- var UnixFS = __toESM(require("@ipld/unixfs"), 1);
912
- var raw = __toESM(require("multiformats/codecs/raw"), 1);
913
- var import_fixed = require("@ipld/unixfs/file/chunker/fixed");
914
- var import_balanced = require("@ipld/unixfs/file/layout/balanced");
915
- var import_ipfs_unixfs_exporter = require("@fireproof/vendor/ipfs-unixfs-exporter");
916
- var queuingStrategy = UnixFS.withCapacity();
917
- var settings = UnixFS.configure({
918
- fileChunkEncoder: raw,
919
- smallFileEncoder: raw,
920
- chunker: (0, import_fixed.withMaxChunkSize)(1024 * 1024),
921
- fileLayout: (0, import_balanced.withWidth)(1024)
922
- });
923
- async function collect(collectable) {
924
- const chunks = [];
925
- await collectable.pipeTo(
926
- new WritableStream({
927
- write(chunk) {
928
- chunks.push(chunk);
929
- }
930
- })
931
- );
932
- return chunks;
510
+ function getStore(url, sthis, joiner) {
511
+ const store = url.getParam("store");
512
+ switch (store) {
513
+ case "data":
514
+ case "wal":
515
+ case "meta":
516
+ break;
517
+ default:
518
+ throw sthis.logger.Error().Url(url).Msg(`store not found`).AsError();
519
+ }
520
+ let name = store;
521
+ if (url.hasParam("index")) {
522
+ name = joiner(url.getParam("index") || "idx", name);
523
+ }
524
+ return { store, name };
933
525
  }
934
- async function encodeFile(blob) {
935
- const readable = createFileEncoderStream(blob);
936
- const blocks = await collect(readable);
937
- return { cid: blocks.at(-1).cid, blocks };
526
+ function getKey(url, logger) {
527
+ const result = url.getParam("key");
528
+ if (!result) throw logger.Error().Str("url", url.toString()).Msg(`key not found`).AsError();
529
+ return result;
938
530
  }
939
- async function decodeFile(blocks, cid, meta) {
940
- const entry = await (0, import_ipfs_unixfs_exporter.exporter)(cid.toString(), blocks, { length: meta.size });
941
- const chunks = [];
942
- for await (const chunk of entry.content()) {
943
- chunks.push(chunk);
531
+ function getName(sthis, url) {
532
+ let result = url.getParam("name");
533
+ if (!result) {
534
+ result = sthis.pathOps.dirname(url.pathname);
535
+ if (result.length === 0) {
536
+ throw sthis.logger.Error().Str("url", url.toString()).Msg(`name not found`).AsError();
537
+ }
944
538
  }
945
- return new File(chunks, entry.name, { type: meta.type, lastModified: 0 });
539
+ return result;
946
540
  }
947
- function createFileEncoderStream(blob) {
948
- const { readable, writable } = new TransformStream({}, queuingStrategy);
949
- const unixfsWriter = UnixFS.createWriter({ writable, settings });
950
- const fileBuilder = new UnixFSFileBuilder("", blob);
951
- void (async () => {
952
- await fileBuilder.finalize(unixfsWriter);
953
- await unixfsWriter.close();
954
- })();
955
- return readable;
541
+ async function exceptionWrapper(fn) {
542
+ return fn().catch((e) => import_cement.Result.Err(e));
956
543
  }
957
- var UnixFSFileBuilder = class {
958
- #file;
959
- constructor(name, file) {
960
- this.name = name;
961
- this.#file = file;
962
- }
963
- async finalize(writer) {
964
- const unixfsFileWriter = UnixFS.createFileWriter(writer);
965
- await this.#file.stream().pipeTo(
966
- new WritableStream({
967
- async write(chunk) {
968
- await unixfsFileWriter.write(chunk);
969
- }
970
- })
971
- );
972
- return await unixfsFileWriter.close();
544
+ var NotFoundError = class extends Error {
545
+ constructor() {
546
+ super(...arguments);
547
+ this.code = "ENOENT";
973
548
  }
974
549
  };
975
-
976
- // src/blockstore/store.ts
977
- var import_dag_json2 = require("@fireproof/vendor/@ipld/dag-json");
978
- var import_cement10 = require("@adviser/cement");
979
-
980
- // src/types.ts
981
- function isFalsy(value) {
982
- return value === false && value === null && value === void 0;
550
+ function isNotFoundError(e) {
551
+ if (import_cement.Result.Is(e)) {
552
+ if (e.isOk()) return false;
553
+ e = e.Err();
554
+ }
555
+ if (e.code === "ENOENT") return true;
556
+ return false;
983
557
  }
984
- function throwFalsy(value) {
985
- if (isFalsy(value)) {
986
- throw new Error("value is Falsy");
558
+ function dataDir(sthis, name, base) {
559
+ if (!base) {
560
+ if (!(0, import_cement.runtimeFn)().isBrowser) {
561
+ const home = sthis.env.get("HOME") || "./";
562
+ base = sthis.env.get("FP_STORAGE_URL") || `file://${sthis.pathOps.join(home, ".fireproof")}`;
563
+ } else {
564
+ base = sthis.env.get("FP_STORAGE_URL") || `indexdb://fp`;
565
+ }
987
566
  }
988
- return value;
567
+ return import_cement.URI.from(base.toString()).build().setParam("name", name || "").URI();
989
568
  }
990
- function falsyToUndef(value) {
991
- if (isFalsy(value)) {
992
- return void 0;
569
+ function UInt8ArrayEqual(a, b) {
570
+ if (a.length !== b.length) {
571
+ return false;
993
572
  }
994
- return value;
573
+ for (let i = 0; i < a.length; i++) {
574
+ if (a[i] !== b[i]) {
575
+ return false;
576
+ }
577
+ }
578
+ return true;
995
579
  }
996
580
 
997
- // src/blockstore/store.ts
998
- init_utils();
999
-
1000
581
  // src/blockstore/loader.ts
1001
582
  var import_p_limit = __toESM(require("p-limit"), 1);
1002
583
  var import_reader = require("@fireproof/vendor/@ipld/car/reader");
1003
- var import_cement7 = require("@adviser/cement");
584
+ var import_cement5 = require("@adviser/cement");
1004
585
 
1005
586
  // src/blockstore/loader-helpers.ts
1006
587
  var import_sha2 = require("multiformats/hashes/sha2");
@@ -1020,7 +601,6 @@ async function parseCarFile(reader, logger) {
1020
601
  // src/blockstore/transaction.ts
1021
602
  var import_block3 = require("@fireproof/vendor/@web3-storage/pail/block");
1022
603
  var import_cement2 = require("@adviser/cement");
1023
- init_utils();
1024
604
  var CarTransaction = class extends import_block3.MemoryBlockstore {
1025
605
  constructor(parent, opts = { add: true, noLoader: false }) {
1026
606
  super();
@@ -1289,14 +869,13 @@ __export(key_bag_exports, {
1289
869
  getKeyBag: () => getKeyBag,
1290
870
  registerKeyBagProviderFactory: () => registerKeyBagProviderFactory
1291
871
  });
1292
- var import_cement6 = require("@adviser/cement");
1293
- init_utils();
872
+ var import_cement4 = require("@adviser/cement");
1294
873
  var import_base582 = require("multiformats/bases/base58");
1295
874
  var KeyBag = class {
1296
875
  constructor(rt) {
1297
876
  this.rt = rt;
1298
- this._warnOnce = new import_cement6.ResolveOnce();
1299
- this._seq = new import_cement6.ResolveSeq();
877
+ this._warnOnce = new import_cement4.ResolveOnce();
878
+ this._seq = new import_cement4.ResolveSeq();
1300
879
  this.logger = ensureLogger(rt.sthis, "KeyBag");
1301
880
  this.logger.Debug().Msg("KeyBag created");
1302
881
  }
@@ -1320,7 +899,7 @@ var KeyBag = class {
1320
899
  async ensureKeyFromUrl(url, keyFactory) {
1321
900
  const storeKey = url.getParam("storekey");
1322
901
  if (storeKey === "insecure") {
1323
- return import_cement6.Result.Ok(url);
902
+ return import_cement4.Result.Ok(url);
1324
903
  }
1325
904
  if (!storeKey) {
1326
905
  const keyName = `@${keyFactory()}@`;
@@ -1329,7 +908,7 @@ var KeyBag = class {
1329
908
  return ret;
1330
909
  }
1331
910
  const urb = url.build().setParam("storekey", keyName);
1332
- return import_cement6.Result.Ok(urb.URI());
911
+ return import_cement4.Result.Ok(urb.URI());
1333
912
  }
1334
913
  if (storeKey.startsWith("@") && storeKey.endsWith("@")) {
1335
914
  const ret = await this.getNamedKey(storeKey);
@@ -1337,13 +916,13 @@ var KeyBag = class {
1337
916
  return ret;
1338
917
  }
1339
918
  }
1340
- return import_cement6.Result.Ok(url);
919
+ return import_cement4.Result.Ok(url);
1341
920
  }
1342
921
  async toKeyWithFingerPrint(keyStr) {
1343
922
  const material = import_base582.base58btc.decode(keyStr);
1344
923
  const key = await this.subtleKey(keyStr);
1345
924
  const fpr = await this.rt.crypto.digestSHA256(material);
1346
- return import_cement6.Result.Ok({
925
+ return import_cement4.Result.Ok({
1347
926
  key,
1348
927
  fingerPrint: import_base582.base58btc.encode(new Uint8Array(fpr))
1349
928
  });
@@ -1368,7 +947,7 @@ var KeyBag = class {
1368
947
  return ret;
1369
948
  }
1370
949
  const named = ret.Ok();
1371
- return import_cement6.Result.Ok({
950
+ return import_cement4.Result.Ok({
1372
951
  ...named,
1373
952
  extract: async () => {
1374
953
  const ext = new Uint8Array(await this.rt.crypto.exportKey("raw", named.key));
@@ -1391,7 +970,7 @@ var KeyBag = class {
1391
970
  }
1392
971
  if (failIfNotFound) {
1393
972
  this.logger.Debug().Str("id", id).Str("name", name).Msg("failIfNotFound getNamedKey");
1394
- return import_cement6.Result.Err(new Error(`Key not found: ${name}`));
973
+ return import_cement4.Result.Err(new Error(`Key not found: ${name}`));
1395
974
  }
1396
975
  const ret = await this._setNamedKey(name, import_base582.base58btc.encode(this.rt.crypto.randomBytes(this.rt.keyLength)));
1397
976
  this.logger.Debug().Str("id", id).Str("name", name).Result("fpr", ret).Msg("createKey getNamedKey-post");
@@ -1404,15 +983,15 @@ var keyBagProviderFactories = new Map(
1404
983
  {
1405
984
  protocol: "file:",
1406
985
  factory: async (url, sthis) => {
1407
- const { KeyBagProviderFile: KeyBagProviderFile2 } = await Promise.resolve().then(() => (init_key_bag_file(), key_bag_file_exports));
1408
- return new KeyBagProviderFile2(url, sthis);
986
+ const { KeyBagProviderImpl } = await import("@fireproof/core/node");
987
+ return new KeyBagProviderImpl(url, sthis);
1409
988
  }
1410
989
  },
1411
990
  {
1412
991
  protocol: "indexdb:",
1413
992
  factory: async (url, sthis) => {
1414
- const { KeyBagProviderIndexDB: KeyBagProviderIndexDB2 } = await Promise.resolve().then(() => (init_key_bag_indexdb(), key_bag_indexdb_exports));
1415
- return new KeyBagProviderIndexDB2(url, sthis);
993
+ const { KeyBagProviderImpl } = await import("@fireproof/core/web");
994
+ return new KeyBagProviderImpl(url, sthis);
1416
995
  }
1417
996
  }
1418
997
  ].map((i) => [i.protocol, i])
@@ -1427,15 +1006,15 @@ function registerKeyBagProviderFactory(item) {
1427
1006
  function defaultKeyBagUrl(sthis) {
1428
1007
  let bagFnameOrUrl = sthis.env.get("FP_KEYBAG_URL");
1429
1008
  let url;
1430
- if ((0, import_cement6.runtimeFn)().isBrowser) {
1431
- url = import_cement6.URI.from(bagFnameOrUrl || "indexdb://fp-keybag");
1009
+ if ((0, import_cement4.runtimeFn)().isBrowser) {
1010
+ url = import_cement4.URI.from(bagFnameOrUrl || "indexdb://fp-keybag");
1432
1011
  } else {
1433
1012
  if (!bagFnameOrUrl) {
1434
1013
  const home = sthis.env.get("HOME");
1435
1014
  bagFnameOrUrl = `${home}/.fireproof/keybag`;
1436
- url = import_cement6.URI.from(`file://${bagFnameOrUrl}`);
1015
+ url = import_cement4.URI.from(`file://${bagFnameOrUrl}`);
1437
1016
  } else {
1438
- url = import_cement6.URI.from(bagFnameOrUrl);
1017
+ url = import_cement4.URI.from(bagFnameOrUrl);
1439
1018
  }
1440
1019
  }
1441
1020
  const logger = ensureLogger(sthis, "defaultKeyBagUrl");
@@ -1449,7 +1028,7 @@ function defaultKeyBagOpts(sthis, kbo) {
1449
1028
  const logger = ensureLogger(sthis, "KeyBag");
1450
1029
  let url;
1451
1030
  if (kbo.url) {
1452
- url = import_cement6.URI.from(kbo.url);
1031
+ url = import_cement4.URI.from(kbo.url);
1453
1032
  logger.Debug().Url(url).Msg("from opts");
1454
1033
  } else {
1455
1034
  url = defaultKeyBagUrl(sthis);
@@ -1464,7 +1043,7 @@ function defaultKeyBagOpts(sthis, kbo) {
1464
1043
  }
1465
1044
  return {
1466
1045
  url,
1467
- crypto: kbo.crypto || (0, import_cement6.toCryptoRuntime)({}),
1046
+ crypto: kbo.crypto || (0, import_cement4.toCryptoRuntime)({}),
1468
1047
  sthis,
1469
1048
  logger,
1470
1049
  keyLength: kbo.keyLength || 16,
@@ -1474,7 +1053,7 @@ function defaultKeyBagOpts(sthis, kbo) {
1474
1053
  }
1475
1054
  };
1476
1055
  }
1477
- var _keyBags = new import_cement6.KeyedResolvOnce();
1056
+ var _keyBags = new import_cement4.KeyedResolvOnce();
1478
1057
  async function getKeyBag(sthis, kbo = {}) {
1479
1058
  await sthis.start();
1480
1059
  const rt = defaultKeyBagOpts(sthis, kbo);
@@ -1587,7 +1166,6 @@ async function prepareCarFiles(encoder, threshold, rootBlock, t) {
1587
1166
  var import_sha23 = require("multiformats/hashes/sha2");
1588
1167
 
1589
1168
  // src/blockstore/task-manager.ts
1590
- init_utils();
1591
1169
  var TaskManager = class {
1592
1170
  constructor(sthis, callback) {
1593
1171
  // we need to remove the events after some time
@@ -1659,7 +1237,7 @@ var Loader = class {
1659
1237
  this.getBlockCache = /* @__PURE__ */ new Map();
1660
1238
  this.seenMeta = /* @__PURE__ */ new Set();
1661
1239
  this.writeLimit = (0, import_p_limit.default)(1);
1662
- this.onceReady = new import_cement7.ResolveOnce();
1240
+ this.onceReady = new import_cement5.ResolveOnce();
1663
1241
  this.name = name;
1664
1242
  this.sthis = sthis;
1665
1243
  this.ebOpts = defaultedBlockstoreRuntime(
@@ -1984,7 +1562,6 @@ __export(keyed_crypto_exports, {
1984
1562
  BlockIvKeyIdCodec: () => BlockIvKeyIdCodec,
1985
1563
  keyedCryptoFactory: () => keyedCryptoFactory
1986
1564
  });
1987
- init_utils();
1988
1565
  var import_base583 = require("multiformats/bases/base58");
1989
1566
  var import_sha24 = require("multiformats/hashes/sha2");
1990
1567
  var CBOR = __toESM(require("@fireproof/vendor/cborg"), 1);
@@ -2152,10 +1729,9 @@ async function keyedCryptoFactory(url, kb, sthis) {
2152
1729
  }
2153
1730
 
2154
1731
  // src/blockstore/fragment-gateway.ts
2155
- var import_cement8 = require("@adviser/cement");
1732
+ var import_cement6 = require("@adviser/cement");
2156
1733
  var import_base584 = require("multiformats/bases/base58");
2157
1734
  var import_cborg = require("@fireproof/vendor/cborg");
2158
- init_utils();
2159
1735
  function getFragSize(url) {
2160
1736
  const fragSize = url.getParam("fragSize");
2161
1737
  let ret = 0;
@@ -2176,7 +1752,7 @@ async function getFrags(url, innerGW, headerSize, logger) {
2176
1752
  }
2177
1753
  const data = res.unwrap();
2178
1754
  return [
2179
- import_cement8.Result.Ok({
1755
+ import_cement6.Result.Ok({
2180
1756
  fid: new Uint8Array(0),
2181
1757
  ofs: 0,
2182
1758
  len: data.length,
@@ -2190,7 +1766,7 @@ async function getFrags(url, innerGW, headerSize, logger) {
2190
1766
  }
2191
1767
  const firstFragment = (0, import_cborg.decode)(firstRaw.unwrap());
2192
1768
  const blockSize = firstFragment.data.length;
2193
- const ops = [Promise.resolve(import_cement8.Result.Ok(firstFragment))];
1769
+ const ops = [Promise.resolve(import_cement6.Result.Ok(firstFragment))];
2194
1770
  const fidStr = import_base584.base58btc.encode(firstFragment.fid);
2195
1771
  const fragUrl = url.build().setParam("fid", fidStr).setParam("len", firstFragment.len.toString()).setParam("headerSize", headerSize.toString());
2196
1772
  for (let ofs = blockSize; ofs < firstFragment.len; ofs += blockSize) {
@@ -2202,12 +1778,12 @@ async function getFrags(url, innerGW, headerSize, logger) {
2202
1778
  }
2203
1779
  const fragment = (0, import_cborg.decode)(raw2.unwrap());
2204
1780
  if (import_base584.base58btc.encode(fragment.fid) !== fidStr) {
2205
- return import_cement8.Result.Err(logger.Error().Msg("Fragment fid mismatch").AsError());
1781
+ return import_cement6.Result.Err(logger.Error().Msg("Fragment fid mismatch").AsError());
2206
1782
  }
2207
1783
  if (fragment.ofs !== ofs2) {
2208
- return import_cement8.Result.Err(logger.Error().Uint64("ofs", ofs2).Msg("Fragment ofs mismatch").AsError());
1784
+ return import_cement6.Result.Err(logger.Error().Uint64("ofs", ofs2).Msg("Fragment ofs mismatch").AsError());
2209
1785
  }
2210
- return import_cement8.Result.Ok(fragment);
1786
+ return import_cement6.Result.Ok(fragment);
2211
1787
  })(fragUrl.setParam("ofs", ofs.toString()).URI(), ofs)
2212
1788
  );
2213
1789
  }
@@ -2269,40 +1845,40 @@ var FragmentGateway = class {
2269
1845
  }
2270
1846
  async put(url, body) {
2271
1847
  await Promise.all(this.slicer(url, body));
2272
- return import_cement8.Result.Ok(void 0);
1848
+ return import_cement6.Result.Ok(void 0);
2273
1849
  }
2274
1850
  async get(url) {
2275
1851
  const rfrags = await getFrags(url, this.innerGW, this.headerSize, this.logger);
2276
1852
  let buffer = void 0;
2277
1853
  for (const rfrag of rfrags) {
2278
1854
  if (rfrag.isErr()) {
2279
- return import_cement8.Result.Err(rfrag.Err());
1855
+ return import_cement6.Result.Err(rfrag.Err());
2280
1856
  }
2281
1857
  const frag = rfrag.Ok();
2282
1858
  buffer = buffer || new Uint8Array(frag.len);
2283
1859
  buffer.set(frag.data, frag.ofs);
2284
1860
  }
2285
- return import_cement8.Result.Ok(buffer || new Uint8Array(0));
1861
+ return import_cement6.Result.Ok(buffer || new Uint8Array(0));
2286
1862
  }
2287
1863
  async subscribe(url, callback) {
2288
1864
  if (this.innerGW.subscribe) {
2289
1865
  return this.innerGW.subscribe(url, callback);
2290
1866
  } else {
2291
- return import_cement8.Result.Err(this.logger.Error().Url(url).Msg("subscribe not supported").AsError());
1867
+ return import_cement6.Result.Err(this.logger.Error().Url(url).Msg("subscribe not supported").AsError());
2292
1868
  }
2293
1869
  }
2294
1870
  async delete(url) {
2295
1871
  const rfrags = await getFrags(url, this.innerGW, this.headerSize, this.logger);
2296
1872
  for (const rfrag of rfrags) {
2297
1873
  if (rfrag.isErr()) {
2298
- return import_cement8.Result.Err(rfrag.Err());
1874
+ return import_cement6.Result.Err(rfrag.Err());
2299
1875
  }
2300
1876
  const frag = rfrag.Ok();
2301
1877
  const fidStr = import_base584.base58btc.encode(frag.fid);
2302
1878
  const fragUrl = url.build().setParam("fid", fidStr).setParam("len", frag.len.toString()).setParam("headerSize", this.headerSize.toString()).URI();
2303
1879
  await this.innerGW.delete(fragUrl);
2304
1880
  }
2305
- return import_cement8.Result.Ok(void 0);
1881
+ return import_cement6.Result.Ok(void 0);
2306
1882
  }
2307
1883
  };
2308
1884
 
@@ -2311,8 +1887,7 @@ var import_dag_json = require("@fireproof/vendor/@ipld/dag-json");
2311
1887
  var import_clock = require("@fireproof/vendor/@web3-storage/pail/clock");
2312
1888
  var import_multiformats2 = require("multiformats");
2313
1889
  var import_base64 = require("multiformats/bases/base64");
2314
- var import_cement9 = require("@adviser/cement");
2315
- init_utils();
1890
+ var import_cement7 = require("@adviser/cement");
2316
1891
  async function decodeGatewayMetaBytesToDbMeta(sthis, byteHeads) {
2317
1892
  const crdtEntries = JSON.parse(sthis.txt.decode(byteHeads));
2318
1893
  if (!Array.isArray(crdtEntries)) {
@@ -2358,13 +1933,13 @@ async function setCryptoKeyFromGatewayMetaPayload(uri, sthis, data) {
2358
1933
  }
2359
1934
  }
2360
1935
  sthis.logger.Debug().Str("dbMeta.key", dbMeta.key).Str("uri", uri.toString()).Msg("Set crypto key from gateway meta payload");
2361
- return import_cement9.Result.Ok(dbMeta);
1936
+ return import_cement7.Result.Ok(dbMeta);
2362
1937
  }
2363
1938
  sthis.logger.Debug().Any("data", data).Msg("No crypto in gateway meta payload");
2364
- return import_cement9.Result.Ok(void 0);
1939
+ return import_cement7.Result.Ok(void 0);
2365
1940
  } catch (error) {
2366
1941
  sthis.logger.Debug().Err(error).Msg("Failed to set crypto key from gateway meta payload");
2367
- return import_cement9.Result.Err(error);
1942
+ return import_cement7.Result.Err(error);
2368
1943
  }
2369
1944
  }
2370
1945
  async function addCryptoKeyToGatewayMetaPayload(uri, sthis, body) {
@@ -2385,10 +1960,10 @@ async function addCryptoKeyToGatewayMetaPayload(uri, sthis, body) {
2385
1960
  const events = await Promise.all([dbMeta].map((dbMeta2) => createDbMetaEventBlock(sthis, dbMeta2, parentLinks)));
2386
1961
  const encoded = await encodeEventsWithParents(sthis, events, parentLinks);
2387
1962
  sthis.logger.Debug().Str("uri", uri.toString()).Msg("Added crypto key to gateway meta payload");
2388
- return import_cement9.Result.Ok(encoded);
1963
+ return import_cement7.Result.Ok(encoded);
2389
1964
  } catch (error) {
2390
1965
  sthis.logger.Error().Err(error).Msg("Failed to add crypto key to gateway meta payload");
2391
- return import_cement9.Result.Err(error);
1966
+ return import_cement7.Result.Err(error);
2392
1967
  }
2393
1968
  }
2394
1969
  function getStoreKeyName(url) {
@@ -2426,9 +2001,9 @@ var import_p_retry = __toESM(require("p-retry"), 1);
2426
2001
  var import_p_map = __toESM(require("p-map"), 1);
2427
2002
  function guardVersion(url) {
2428
2003
  if (!url.hasParam("version")) {
2429
- return import_cement10.Result.Err(`missing version: ${url.toString()}`);
2004
+ return import_cement8.Result.Err(`missing version: ${url.toString()}`);
2430
2005
  }
2431
- return import_cement10.Result.Ok(url);
2006
+ return import_cement8.Result.Ok(url);
2432
2007
  }
2433
2008
  var BaseStoreImpl = class {
2434
2009
  constructor(name, url, opts, sthis, logger) {
@@ -2488,7 +2063,7 @@ var BaseStoreImpl = class {
2488
2063
  }
2489
2064
  if (this.ready) {
2490
2065
  const fn = this.ready.bind(this);
2491
- const ready = await (0, import_cement10.exception2Result)(fn);
2066
+ const ready = await (0, import_cement8.exception2Result)(fn);
2492
2067
  if (ready.isErr()) {
2493
2068
  await this.close();
2494
2069
  return ready;
@@ -2570,7 +2145,7 @@ var MetaStoreImpl = class extends BaseStoreImpl {
2570
2145
  async close() {
2571
2146
  await this.gateway.close(this.url());
2572
2147
  this._onClosed.forEach((fn) => fn());
2573
- return import_cement10.Result.Ok(void 0);
2148
+ return import_cement8.Result.Ok(void 0);
2574
2149
  }
2575
2150
  async destroy() {
2576
2151
  return this.gateway.destroy(this.url());
@@ -2617,7 +2192,7 @@ var DataStoreImpl = class extends BaseStoreImpl {
2617
2192
  async close() {
2618
2193
  await this.gateway.close(this.url());
2619
2194
  this._onClosed.forEach((fn) => fn());
2620
- return import_cement10.Result.Ok(void 0);
2195
+ return import_cement8.Result.Ok(void 0);
2621
2196
  }
2622
2197
  destroy() {
2623
2198
  return this.gateway.destroy(this.url());
@@ -2627,7 +2202,7 @@ var WALStoreImpl = class extends BaseStoreImpl {
2627
2202
  constructor(loader, url, opts) {
2628
2203
  super(loader.name, url, { ...opts }, loader.sthis, ensureLogger(loader.sthis, "WALStoreImpl"));
2629
2204
  this.storeType = "wal";
2630
- this._ready = new import_cement10.ResolveOnce();
2205
+ this._ready = new import_cement8.ResolveOnce();
2631
2206
  this.walState = { operations: [], noLoaderOps: [], fileOperations: [] };
2632
2207
  this.processing = void 0;
2633
2208
  this.processQueue = new CommitQueue();
@@ -2798,7 +2373,7 @@ var WALStoreImpl = class extends BaseStoreImpl {
2798
2373
  async close() {
2799
2374
  await this.gateway.close(this.url());
2800
2375
  this._onClosed.forEach((fn) => fn());
2801
- return import_cement10.Result.Ok(void 0);
2376
+ return import_cement8.Result.Ok(void 0);
2802
2377
  }
2803
2378
  destroy() {
2804
2379
  return this.gateway.destroy(this.url());
@@ -2806,7 +2381,6 @@ var WALStoreImpl = class extends BaseStoreImpl {
2806
2381
  };
2807
2382
 
2808
2383
  // src/blockstore/store-factory.ts
2809
- init_utils();
2810
2384
  function ensureIsIndex(url, isIndex) {
2811
2385
  if (isIndex) {
2812
2386
  return url.build().setParam("index", isIndex).URI();
@@ -2825,15 +2399,15 @@ function buildURL(optURL, loader) {
2825
2399
  const obuItem = Array.from(storeFactory.values()).find((items) => items.overrideBaseURL);
2826
2400
  let obuUrl;
2827
2401
  if (obuItem && obuItem.overrideBaseURL) {
2828
- obuUrl = import_cement13.URI.from(obuItem.overrideBaseURL);
2402
+ obuUrl = import_cement9.URI.from(obuItem.overrideBaseURL);
2829
2403
  }
2830
2404
  const ret = ensureIsIndex(
2831
- import_cement13.URI.from(optURL || obuUrl || dataDir(loader.sthis, loader.name, storeOpts.stores?.base)),
2405
+ import_cement9.URI.from(optURL || obuUrl || dataDir(loader.sthis, loader.name, storeOpts.stores?.base)),
2832
2406
  storeOpts.isIndex
2833
2407
  );
2834
2408
  return ret;
2835
2409
  }
2836
- var onceGateway = new import_cement13.KeyedResolvOnce();
2410
+ var onceGateway = new import_cement9.KeyedResolvOnce();
2837
2411
  async function getGatewayFromURL(url, sthis) {
2838
2412
  return onceGateway.get(url.toString()).once(async () => {
2839
2413
  const item = storeFactory.get(url.protocol);
@@ -2875,7 +2449,7 @@ function registerStoreProtocol(item) {
2875
2449
  storeFactory.delete(protocol);
2876
2450
  };
2877
2451
  }
2878
- var onceDataStoreFactory = new import_cement13.KeyedResolvOnce();
2452
+ var onceDataStoreFactory = new import_cement9.KeyedResolvOnce();
2879
2453
  async function dataStoreFactory(loader) {
2880
2454
  const url = ensureName(loader.name, buildURL(loader.ebOpts.store.stores?.data, loader)).build().setParam("store", "data").URI();
2881
2455
  const sthis = ensureSuperLog(loader.sthis, "dataStoreFactory", { url: url.toString() });
@@ -2893,7 +2467,7 @@ async function dataStoreFactory(loader) {
2893
2467
  return store;
2894
2468
  });
2895
2469
  }
2896
- var onceMetaStoreFactory = new import_cement13.KeyedResolvOnce();
2470
+ var onceMetaStoreFactory = new import_cement9.KeyedResolvOnce();
2897
2471
  async function metaStoreFactory(loader) {
2898
2472
  const url = ensureName(loader.name, buildURL(loader.ebOpts.store.stores?.meta, loader)).build().setParam("store", "meta").URI();
2899
2473
  const sthis = ensureSuperLog(loader.sthis, "metaStoreFactory", { url: () => url.toString() });
@@ -2912,7 +2486,7 @@ async function metaStoreFactory(loader) {
2912
2486
  return store;
2913
2487
  });
2914
2488
  }
2915
- var onceRemoteWalFactory = new import_cement13.KeyedResolvOnce();
2489
+ var onceRemoteWalFactory = new import_cement9.KeyedResolvOnce();
2916
2490
  async function remoteWalFactory(loader) {
2917
2491
  const url = ensureName(loader.name, buildURL(loader.ebOpts.store.stores?.wal, loader)).build().setParam("store", "wal").URI();
2918
2492
  const sthis = ensureSuperLog(loader.sthis, "remoteWalFactory", { url: url.toString() });
@@ -2966,28 +2540,32 @@ function toStoreRuntime(opts, sthis) {
2966
2540
  decodeFile: opts.decodeFile || decodeFile
2967
2541
  };
2968
2542
  }
2969
- registerStoreProtocol({
2970
- protocol: "file:",
2971
- gateway: async (sthis) => {
2972
- const { FileGateway: FileGateway2 } = await Promise.resolve().then(() => (init_gateway(), gateway_exports));
2973
- return new FileGateway2(sthis);
2974
- },
2975
- test: async (sthis) => {
2976
- const { FileTestStore: FileTestStore2 } = await Promise.resolve().then(() => (init_gateway(), gateway_exports));
2977
- return new FileTestStore2(sthis);
2978
- }
2979
- });
2980
- registerStoreProtocol({
2981
- protocol: "indexdb:",
2982
- gateway: async (sthis) => {
2983
- const { IndexDBGateway: IndexDBGateway2 } = await Promise.resolve().then(() => (init_gateway2(), gateway_exports2));
2984
- return new IndexDBGateway2(sthis);
2985
- },
2986
- test: async (sthis) => {
2987
- const { IndexDBTestStore: IndexDBTestStore2 } = await Promise.resolve().then(() => (init_gateway2(), gateway_exports2));
2988
- return new IndexDBTestStore2(sthis);
2989
- }
2990
- });
2543
+ if ((0, import_cement9.runtimeFn)().isNodeIsh || (0, import_cement9.runtimeFn)().isDeno) {
2544
+ registerStoreProtocol({
2545
+ protocol: "file:",
2546
+ gateway: async (sthis) => {
2547
+ const { GatewayImpl } = await import("@fireproof/core/node");
2548
+ return new GatewayImpl(sthis);
2549
+ },
2550
+ test: async (sthis) => {
2551
+ const { GatewayTestImpl } = await import("@fireproof/core/node");
2552
+ return new GatewayTestImpl(sthis);
2553
+ }
2554
+ });
2555
+ }
2556
+ if ((0, import_cement9.runtimeFn)().isBrowser) {
2557
+ registerStoreProtocol({
2558
+ protocol: "indexdb:",
2559
+ gateway: async (sthis) => {
2560
+ const { GatewayImpl } = await import("@fireproof/core/web");
2561
+ return new GatewayImpl(sthis);
2562
+ },
2563
+ test: async (sthis) => {
2564
+ const { GatewayTestImpl } = await import("@fireproof/core/web");
2565
+ return new GatewayTestImpl(sthis);
2566
+ }
2567
+ });
2568
+ }
2991
2569
 
2992
2570
  // src/blockstore/store-remote.ts
2993
2571
  async function RemoteDataStore(sthis, name, url, opts) {
@@ -3362,7 +2940,7 @@ var import_sha26 = require("multiformats/hashes/sha2");
3362
2940
  var codec2 = __toESM(require("@fireproof/vendor/@ipld/dag-cbor"), 1);
3363
2941
  var import_charwise = __toESM(require("charwise"), 1);
3364
2942
  var DbIndex = __toESM(require("prolly-trees/db-index"), 1);
3365
- var import_utils14 = require("prolly-trees/utils");
2943
+ var import_utils9 = require("prolly-trees/utils");
3366
2944
  var import_cache = require("prolly-trees/cache");
3367
2945
  var IndexTree = class {
3368
2946
  };
@@ -3370,17 +2948,17 @@ function refCompare(aRef, bRef) {
3370
2948
  if (Number.isNaN(aRef)) return -1;
3371
2949
  if (Number.isNaN(bRef)) throw new Error("ref may not be Infinity or NaN");
3372
2950
  if (aRef === Infinity) return 1;
3373
- return (0, import_utils14.simpleCompare)(aRef, bRef);
2951
+ return (0, import_utils9.simpleCompare)(aRef, bRef);
3374
2952
  }
3375
2953
  function compare(a, b) {
3376
2954
  const [aKey, aRef] = a;
3377
2955
  const [bKey, bRef] = b;
3378
- const comp = (0, import_utils14.simpleCompare)(aKey, bKey);
2956
+ const comp = (0, import_utils9.simpleCompare)(aKey, bKey);
3379
2957
  if (comp !== 0) return comp;
3380
2958
  return refCompare(aRef, bRef);
3381
2959
  }
3382
- var byKeyOpts = { cache: import_cache.nocache, chunker: (0, import_utils14.bf)(30), codec: codec2, hasher: import_sha26.sha256, compare };
3383
- var byIdOpts = { cache: import_cache.nocache, chunker: (0, import_utils14.bf)(30), codec: codec2, hasher: import_sha26.sha256, compare: import_utils14.simpleCompare };
2960
+ var byKeyOpts = { cache: import_cache.nocache, chunker: (0, import_utils9.bf)(30), codec: codec2, hasher: import_sha26.sha256, compare };
2961
+ var byIdOpts = { cache: import_cache.nocache, chunker: (0, import_utils9.bf)(30), codec: codec2, hasher: import_sha26.sha256, compare: import_utils9.simpleCompare };
3384
2962
  function indexEntriesForChanges(changes, mapFn) {
3385
2963
  const indexEntries = [];
3386
2964
  changes.forEach(({ id: key, value, del }) => {
@@ -3479,7 +3057,6 @@ function encodeKey(key) {
3479
3057
  }
3480
3058
 
3481
3059
  // src/indexer.ts
3482
- init_utils();
3483
3060
  function index(sthis, { _crdt }, name, mapFn, meta) {
3484
3061
  if (mapFn && meta) throw _crdt.logger.Error().Msg("cannot provide both mapFn and meta").AsError();
3485
3062
  if (mapFn && mapFn.constructor.name !== "Function") throw _crdt.logger.Error().Msg("mapFn must be a function").AsError();
@@ -3688,7 +3265,7 @@ var Index = class {
3688
3265
  // src/crdt-clock.ts
3689
3266
  var import_clock3 = require("@fireproof/vendor/@web3-storage/pail/clock");
3690
3267
  var import_crdt2 = require("@fireproof/vendor/@web3-storage/pail/crdt");
3691
- var import_cement14 = require("@adviser/cement");
3268
+ var import_cement10 = require("@adviser/cement");
3692
3269
 
3693
3270
  // src/apply-head-queue.ts
3694
3271
  function applyHeadQueue(worker, logger) {
@@ -3736,7 +3313,6 @@ function applyHeadQueue(worker, logger) {
3736
3313
  }
3737
3314
 
3738
3315
  // src/crdt-clock.ts
3739
- init_utils();
3740
3316
  var CRDTClock = class {
3741
3317
  constructor(blockstore) {
3742
3318
  // todo: track local and remote clocks independently, merge on read
@@ -3746,7 +3322,7 @@ var CRDTClock = class {
3746
3322
  this.zoomers = /* @__PURE__ */ new Set();
3747
3323
  this.watchers = /* @__PURE__ */ new Set();
3748
3324
  this.emptyWatchers = /* @__PURE__ */ new Set();
3749
- this._ready = new import_cement14.ResolveOnce();
3325
+ this._ready = new import_cement10.ResolveOnce();
3750
3326
  this.blockstore = blockstore;
3751
3327
  this.logger = ensureLogger(blockstore.sthis, "CRDTClock");
3752
3328
  this.applyHeadQueue = applyHeadQueue(this.int_applyHead.bind(this), this.logger);
@@ -3856,11 +3432,10 @@ async function advanceBlocks(logger, newHead, tblocks, head) {
3856
3432
  }
3857
3433
 
3858
3434
  // src/crdt.ts
3859
- init_utils();
3860
3435
  var CRDT = class {
3861
3436
  constructor(sthis, name, opts = {}) {
3862
3437
  this.indexers = /* @__PURE__ */ new Map();
3863
- this.onceReady = new import_cement15.ResolveOnce();
3438
+ this.onceReady = new import_cement11.ResolveOnce();
3864
3439
  this.sthis = sthis;
3865
3440
  this.name = name;
3866
3441
  this.logger = ensureLogger(sthis, "CRDT");
@@ -3974,14 +3549,13 @@ var CRDT = class {
3974
3549
  };
3975
3550
 
3976
3551
  // src/database.ts
3977
- init_utils();
3978
3552
  var Database = class {
3979
3553
  constructor(name, opts) {
3980
3554
  this.opts = {};
3981
3555
  this._listening = false;
3982
3556
  this._listeners = /* @__PURE__ */ new Set();
3983
3557
  this._noupdate_listeners = /* @__PURE__ */ new Set();
3984
- this._ready = new import_cement16.ResolveOnce();
3558
+ this._ready = new import_cement12.ResolveOnce();
3985
3559
  this.name = name;
3986
3560
  this.opts = opts || this.opts;
3987
3561
  this.sthis = ensureSuperThis(this.opts);
@@ -4188,14 +3762,39 @@ __export(runtime_exports, {
4188
3762
  INDEXDB_VERSION: () => INDEXDB_VERSION,
4189
3763
  files: () => files_exports,
4190
3764
  getFileName: () => getFileName,
4191
- getFileSystem: () => getFileSystem,
4192
3765
  getPath: () => getPath,
4193
3766
  kb: () => key_bag_exports,
4194
3767
  kc: () => keyed_crypto_exports,
4195
3768
  mf: () => wait_pr_multiformats_exports,
4196
- runtimeFn: () => import_cement17.runtimeFn
3769
+ runtimeFn: () => import_cement13.runtimeFn
4197
3770
  });
4198
- init_utils2();
3771
+
3772
+ // src/runtime/gateways/file/node/utils.ts
3773
+ var import_core = require("@fireproof/core");
3774
+ function getPath(url, sthis) {
3775
+ const basePath = url.pathname;
3776
+ const name = url.getParam("name");
3777
+ if (name) {
3778
+ const version = url.getParam("version");
3779
+ if (!version) throw sthis.logger.Error().Url(url).Msg(`version not found`).AsError();
3780
+ return sthis.pathOps.join(basePath, version, name);
3781
+ }
3782
+ return sthis.pathOps.join(basePath);
3783
+ }
3784
+ function getFileName(url, sthis) {
3785
+ const key = url.getParam("key");
3786
+ if (!key) throw sthis.logger.Error().Url(url).Msg(`key not found`).AsError();
3787
+ const res = (0, import_core.getStore)(url, sthis, (...a) => a.join("-"));
3788
+ switch (res.store) {
3789
+ case "data":
3790
+ return sthis.pathOps.join(res.name, key + ".car");
3791
+ case "wal":
3792
+ case "meta":
3793
+ return sthis.pathOps.join(res.name, key + ".json");
3794
+ default:
3795
+ throw sthis.logger.Error().Url(url).Msg(`unsupported store type`).AsError();
3796
+ }
3797
+ }
4199
3798
 
4200
3799
  // src/runtime/wait-pr-multiformats/index.ts
4201
3800
  var wait_pr_multiformats_exports = {};
@@ -4208,17 +3807,16 @@ __export(wait_pr_multiformats_exports, {
4208
3807
  var codec_interface_exports = {};
4209
3808
 
4210
3809
  // src/runtime/index.ts
4211
- var import_cement17 = require("@adviser/cement");
4212
- init_version();
3810
+ var import_cement13 = require("@adviser/cement");
3811
+
3812
+ // src/runtime/gateways/file/version.ts
3813
+ var FILESTORE_VERSION = "v0.19-file";
4213
3814
 
4214
3815
  // src/runtime/gateways/indexdb/version.ts
4215
3816
  var INDEXDB_VERSION = "v0.19-indexdb";
4216
3817
 
4217
- // src/index.ts
4218
- init_utils();
4219
-
4220
3818
  // src/version.ts
4221
3819
  var PACKAGE_VERSION = Object.keys({
4222
- "0.19.121-dev": "xxxx"
3820
+ "0.19.121": "xxxx"
4223
3821
  })[0];
4224
3822
  //# sourceMappingURL=index.cjs.map