@fireproof/core 0.18.0 → 0.19.0-dev-use-fix

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. package/README.md +29 -15
  2. package/chunk-AZVWSRER.js +208 -0
  3. package/chunk-AZVWSRER.js.map +1 -0
  4. package/chunk-H3A2HMMM.js +164 -0
  5. package/chunk-H3A2HMMM.js.map +1 -0
  6. package/chunk-NZNG6TQT.js +370 -0
  7. package/chunk-NZNG6TQT.js.map +1 -0
  8. package/chunk-VZGT7ZYP.js +22 -0
  9. package/chunk-VZGT7ZYP.js.map +1 -0
  10. package/chunk-ZHO4NMWL.js +39 -0
  11. package/chunk-ZHO4NMWL.js.map +1 -0
  12. package/index.cjs +4706 -0
  13. package/index.cjs.map +1 -0
  14. package/index.d.cts +1012 -0
  15. package/index.d.ts +1012 -0
  16. package/index.js +2856 -0
  17. package/index.js.map +1 -0
  18. package/metafile-cjs.json +1 -0
  19. package/metafile-esm.json +1 -0
  20. package/node-sys-container-E7LADX2Z.js +29 -0
  21. package/node-sys-container-E7LADX2Z.js.map +1 -0
  22. package/package.json +23 -109
  23. package/sqlite-data-store-3ST7XOLX.js +120 -0
  24. package/sqlite-data-store-3ST7XOLX.js.map +1 -0
  25. package/sqlite-meta-store-QOIMCSJ7.js +137 -0
  26. package/sqlite-meta-store-QOIMCSJ7.js.map +1 -0
  27. package/sqlite-wal-store-JFBQPOYT.js +123 -0
  28. package/sqlite-wal-store-JFBQPOYT.js.map +1 -0
  29. package/store-file-CSS5THFH.js +193 -0
  30. package/store-file-CSS5THFH.js.map +1 -0
  31. package/store-indexdb-DR4HELVP.js +20 -0
  32. package/store-indexdb-DR4HELVP.js.map +1 -0
  33. package/store-sql-BG6SMGQJ.js +344 -0
  34. package/store-sql-BG6SMGQJ.js.map +1 -0
  35. package/tests/blockstore/loader.test.ts +265 -0
  36. package/tests/blockstore/store.test.ts +164 -0
  37. package/tests/blockstore/transaction.test.ts +121 -0
  38. package/tests/fireproof/config.test.ts +212 -0
  39. package/tests/fireproof/crdt.test.ts +434 -0
  40. package/tests/fireproof/database.test.ts +466 -0
  41. package/tests/fireproof/fireproof.test.ts +602 -0
  42. package/tests/fireproof/hello.test.ts +54 -0
  43. package/tests/fireproof/indexer.test.ts +389 -0
  44. package/tests/helpers.ts +81 -0
  45. package/tests/react/useFireproof.test.tsx +19 -0
  46. package/tests/www/gallery.html +132 -0
  47. package/tests/www/iife.html +42 -0
  48. package/tests/www/todo-aws.html +232 -0
  49. package/tests/www/todo-ipfs.html +213 -0
  50. package/tests/www/todo-local.html +214 -0
  51. package/tests/www/todo-netlify.html +227 -0
  52. package/tests/www/todo.html +236 -0
  53. package/dist/browser/fireproof.cjs +0 -1172
  54. package/dist/browser/fireproof.cjs.map +0 -1
  55. package/dist/browser/fireproof.d.cts +0 -268
  56. package/dist/browser/fireproof.d.ts +0 -268
  57. package/dist/browser/fireproof.global.js +0 -24178
  58. package/dist/browser/fireproof.global.js.map +0 -1
  59. package/dist/browser/fireproof.js +0 -1147
  60. package/dist/browser/fireproof.js.map +0 -1
  61. package/dist/browser/metafile-cjs.json +0 -1
  62. package/dist/browser/metafile-esm.json +0 -1
  63. package/dist/browser/metafile-iife.json +0 -1
  64. package/dist/memory/fireproof.cjs +0 -1172
  65. package/dist/memory/fireproof.cjs.map +0 -1
  66. package/dist/memory/fireproof.d.cts +0 -268
  67. package/dist/memory/fireproof.d.ts +0 -268
  68. package/dist/memory/fireproof.global.js +0 -24178
  69. package/dist/memory/fireproof.global.js.map +0 -1
  70. package/dist/memory/fireproof.js +0 -1147
  71. package/dist/memory/fireproof.js.map +0 -1
  72. package/dist/memory/metafile-cjs.json +0 -1
  73. package/dist/memory/metafile-esm.json +0 -1
  74. package/dist/memory/metafile-iife.json +0 -1
  75. package/dist/node/fireproof.cjs +0 -1172
  76. package/dist/node/fireproof.cjs.map +0 -1
  77. package/dist/node/fireproof.d.cts +0 -268
  78. package/dist/node/fireproof.d.ts +0 -268
  79. package/dist/node/fireproof.global.js +0 -38540
  80. package/dist/node/fireproof.global.js.map +0 -1
  81. package/dist/node/fireproof.js +0 -1138
  82. package/dist/node/fireproof.js.map +0 -1
  83. package/dist/node/metafile-cjs.json +0 -1
  84. package/dist/node/metafile-esm.json +0 -1
  85. package/dist/node/metafile-iife.json +0 -1
@@ -0,0 +1,370 @@
1
+ import {
2
+ SysContainer,
3
+ __export,
4
+ join
5
+ } from "./chunk-H3A2HMMM.js";
6
+
7
+ // src/utils.ts
8
+ import { LoggerImpl, IsLogger, Result, ResolveOnce } from "@adviser/cement";
9
+
10
+ // src/runtime/index.ts
11
+ var runtime_exports = {};
12
+ __export(runtime_exports, {
13
+ FILESTORE_VERSION: () => FILESTORE_VERSION,
14
+ INDEXDB_VERSION: () => INDEXDB_VERSION,
15
+ SQLITE_VERSION: () => SQLITE_VERSION,
16
+ SysContainer: () => SysContainer,
17
+ crypto: () => crypto_exports,
18
+ dataDir: () => dataDir,
19
+ ensureIndexName: () => ensureIndexName,
20
+ files: () => files_exports,
21
+ getFileName: () => getFileName,
22
+ getPath: () => getPath,
23
+ join: () => join,
24
+ sql: () => store_sql_exports
25
+ });
26
+
27
+ // src/runtime/data-dir.ts
28
+ import { isDeno, isNode } from "std-env";
29
+ function dataDir(name, base) {
30
+ if (!base) {
31
+ if (isNode || isDeno) {
32
+ base = SysContainer.env.get("FP_STORAGE_URL") || `file://${SysContainer.join(SysContainer.homedir(), ".fireproof")}`;
33
+ } else {
34
+ base = `indexdb://fp`;
35
+ }
36
+ }
37
+ let url;
38
+ if (typeof base === "string") {
39
+ try {
40
+ url = new URL(base.toString());
41
+ } catch (e) {
42
+ try {
43
+ base = `file://${base}`;
44
+ url = new URL(base);
45
+ } catch (e2) {
46
+ throw new Error(`invalid base url: ${base}`);
47
+ }
48
+ }
49
+ } else {
50
+ url = base;
51
+ }
52
+ url.searchParams.set("name", name || "");
53
+ return url.toString();
54
+ }
55
+
56
+ // src/runtime/store-sql/index.ts
57
+ var store_sql_exports = {};
58
+ __export(store_sql_exports, {
59
+ DefaultSQLTableNames: () => DefaultSQLTableNames,
60
+ ensureSQLOpts: () => ensureSQLOpts
61
+ });
62
+
63
+ // src/runtime/store-sql/types.ts
64
+ var DefaultSQLTableNames = {
65
+ data: "Datas",
66
+ meta: "Metas",
67
+ wal: "Wals"
68
+ };
69
+
70
+ // src/runtime/store-sql/ensurer.ts
71
+ function sqlTableName(...names) {
72
+ return names.map((name) => name.replace(/^[^a-zA-Z0-9]+/, "").replace(/[^a-zA-Z0-9]+/g, "_")).filter((i) => i.length).join("_");
73
+ }
74
+ function ensureTableNames(url, opts) {
75
+ let isIndex = "";
76
+ if (url.searchParams.has("index")) {
77
+ isIndex = url.searchParams.get("index") || ".idx";
78
+ }
79
+ const ret = opts?.tableNames || DefaultSQLTableNames;
80
+ if (isIndex.length) {
81
+ return {
82
+ data: sqlTableName(isIndex, ret.data),
83
+ meta: sqlTableName(isIndex, ret.meta),
84
+ wal: sqlTableName(isIndex, ret.wal)
85
+ };
86
+ }
87
+ return {
88
+ data: sqlTableName(ret.data),
89
+ meta: sqlTableName(ret.meta),
90
+ wal: sqlTableName(ret.wal)
91
+ };
92
+ }
93
+ var textEncoder = new TextEncoder();
94
+ function ensureTextEncoder(opts) {
95
+ return opts?.textEncoder || textEncoder;
96
+ }
97
+ var textDecoder = new TextDecoder();
98
+ function ensureTextDecoder(opts) {
99
+ return opts?.textDecoder || textDecoder;
100
+ }
101
+ function url2sqlFlavor(url, logger) {
102
+ const flavor = url.protocol.replace(/:.*$/, "");
103
+ switch (flavor) {
104
+ case "sqlite":
105
+ case "mysql":
106
+ case "postgres":
107
+ return flavor;
108
+ default:
109
+ throw logger.Error().Str("flavor", flavor).Msg("unsupported protocol").AsError();
110
+ }
111
+ }
112
+ function ensureSQLOpts(url, opts, componentName, ctx) {
113
+ const logger = ensureLogger(opts, componentName, ctx);
114
+ return {
115
+ url,
116
+ sqlFlavor: url2sqlFlavor(url, logger),
117
+ tableNames: ensureTableNames(url, opts),
118
+ logger,
119
+ textEncoder: ensureTextEncoder(opts),
120
+ textDecoder: ensureTextDecoder(opts)
121
+ };
122
+ }
123
+
124
+ // src/runtime/crypto.ts
125
+ var crypto_exports = {};
126
+ __export(crypto_exports, {
127
+ toCryptoOpts: () => toCryptoOpts
128
+ });
129
+ function randomBytes(size) {
130
+ const bytes = new Uint8Array(size);
131
+ if (size > 0) {
132
+ crypto.getRandomValues(bytes);
133
+ }
134
+ return bytes;
135
+ }
136
+ function digestSHA256(data) {
137
+ return Promise.resolve(crypto.subtle.digest("SHA-256", data));
138
+ }
139
+ function toCryptoOpts(cryptoOpts = {}) {
140
+ const opts = {
141
+ importKey: cryptoOpts.importKey || crypto.subtle.importKey.bind(crypto.subtle),
142
+ encrypt: cryptoOpts.encrypt || crypto.subtle.encrypt.bind(crypto.subtle),
143
+ decrypt: cryptoOpts.decrypt || crypto.subtle.decrypt.bind(crypto.subtle),
144
+ randomBytes: cryptoOpts.randomBytes || randomBytes,
145
+ digestSHA256: cryptoOpts.digestSHA256 || digestSHA256
146
+ };
147
+ return opts;
148
+ }
149
+
150
+ // src/runtime/files.ts
151
+ var files_exports = {};
152
+ __export(files_exports, {
153
+ decodeFile: () => decodeFile,
154
+ encodeFile: () => encodeFile
155
+ });
156
+ import * as UnixFS from "@ipld/unixfs";
157
+ import * as raw from "multiformats/codecs/raw";
158
+ import { withMaxChunkSize } from "@ipld/unixfs/file/chunker/fixed";
159
+ import { withWidth } from "@ipld/unixfs/file/layout/balanced";
160
+ import { exporter } from "ipfs-unixfs-exporter";
161
+ var queuingStrategy = UnixFS.withCapacity();
162
+ var settings = UnixFS.configure({
163
+ fileChunkEncoder: raw,
164
+ smallFileEncoder: raw,
165
+ chunker: withMaxChunkSize(1024 * 1024),
166
+ fileLayout: withWidth(1024)
167
+ });
168
+ async function collect(collectable) {
169
+ const chunks = [];
170
+ await collectable.pipeTo(
171
+ new WritableStream({
172
+ write(chunk) {
173
+ chunks.push(chunk);
174
+ }
175
+ })
176
+ );
177
+ return chunks;
178
+ }
179
+ async function encodeFile(blob) {
180
+ const readable = createFileEncoderStream(blob);
181
+ const blocks = await collect(readable);
182
+ return { cid: blocks.at(-1).cid, blocks };
183
+ }
184
+ async function decodeFile(blocks, cid, meta) {
185
+ const entry = await exporter(cid.toString(), blocks, { length: meta.size });
186
+ const chunks = [];
187
+ for await (const chunk of entry.content()) {
188
+ chunks.push(chunk);
189
+ }
190
+ return new File(chunks, entry.name, { type: meta.type, lastModified: 0 });
191
+ }
192
+ function createFileEncoderStream(blob) {
193
+ const { readable, writable } = new TransformStream({}, queuingStrategy);
194
+ const unixfsWriter = UnixFS.createWriter({ writable, settings });
195
+ const fileBuilder = new UnixFSFileBuilder("", blob);
196
+ void (async () => {
197
+ await fileBuilder.finalize(unixfsWriter);
198
+ await unixfsWriter.close();
199
+ })();
200
+ return readable;
201
+ }
202
+ var UnixFSFileBuilder = class {
203
+ #file;
204
+ constructor(name, file) {
205
+ this.name = name;
206
+ this.#file = file;
207
+ }
208
+ async finalize(writer) {
209
+ const unixfsFileWriter = UnixFS.createFileWriter(writer);
210
+ await this.#file.stream().pipeTo(
211
+ new WritableStream({
212
+ async write(chunk) {
213
+ await unixfsFileWriter.write(chunk);
214
+ }
215
+ })
216
+ );
217
+ return await unixfsFileWriter.close();
218
+ }
219
+ };
220
+
221
+ // src/runtime/store-file-version.ts
222
+ var FILESTORE_VERSION = "v0.19-file";
223
+
224
+ // src/runtime/store-indexdb-version.ts
225
+ var INDEXDB_VERSION = "v0.19-indexdb";
226
+
227
+ // src/runtime/store-sql/v0.19-sqlite/version.ts
228
+ var SQLITE_VERSION = "v0.19-sqlite";
229
+
230
+ // src/utils.ts
231
+ import { uuidv7 } from "uuidv7";
232
+ var globalLogger = new LoggerImpl();
233
+ var registerFP_DEBUG = new ResolveOnce();
234
+ function ensureLogger(optsOrLogger, componentName, ctx) {
235
+ let logger = globalLogger;
236
+ if (IsLogger(optsOrLogger)) {
237
+ logger = optsOrLogger;
238
+ } else if (optsOrLogger && IsLogger(optsOrLogger.logger)) {
239
+ logger = optsOrLogger.logger;
240
+ }
241
+ const cLogger = logger.With().Module(componentName);
242
+ const debug = [];
243
+ if (ctx) {
244
+ if ("debug" in ctx) {
245
+ if (typeof ctx.debug === "string" && ctx.debug.length > 0) {
246
+ debug.push(ctx.debug);
247
+ } else {
248
+ debug.push(componentName);
249
+ }
250
+ delete ctx.debug;
251
+ }
252
+ if ("this" in ctx) {
253
+ cLogger.Str("this", uuidv7());
254
+ delete ctx.this;
255
+ }
256
+ for (const [key, value] of Object.entries(ctx)) {
257
+ switch (typeof value) {
258
+ case "string":
259
+ cLogger.Str(key, value);
260
+ break;
261
+ case "number":
262
+ cLogger.Uint64(key, value);
263
+ break;
264
+ default:
265
+ if (value instanceof Date) {
266
+ cLogger.Str(key, value.toISOString());
267
+ } else if (value instanceof URL) {
268
+ cLogger.Str(key, value.toString());
269
+ } else if (typeof value === "function") {
270
+ cLogger.Ref(key, value);
271
+ } else {
272
+ cLogger.Any(key, value);
273
+ }
274
+ break;
275
+ }
276
+ }
277
+ }
278
+ registerFP_DEBUG.once(async () => {
279
+ SysContainer.env.onSet((key, value) => {
280
+ if (value) {
281
+ logger.SetDebug(value);
282
+ }
283
+ }, "FP_DEBUG");
284
+ }).finally(() => {
285
+ });
286
+ if (debug.length > 0) {
287
+ logger.SetDebug(debug);
288
+ }
289
+ const out = cLogger.Logger();
290
+ return out;
291
+ }
292
+ function getStore(url, logger, joiner) {
293
+ let result = url.searchParams.get("store");
294
+ if (!result) throw logger.Error().Str("url", url.toString()).Msg(`store not found`).AsError();
295
+ if (url.searchParams.has("index")) {
296
+ result = joiner(url.searchParams.get("index") || "idx", result);
297
+ }
298
+ return result;
299
+ }
300
+ function getKey(url, logger) {
301
+ const result = url.searchParams.get("key");
302
+ if (!result) throw logger.Error().Str("url", url.toString()).Msg(`key not found`).AsError();
303
+ return result;
304
+ }
305
+ function getName(url, logger) {
306
+ let result = url.searchParams.get("name");
307
+ if (!result) {
308
+ result = SysContainer.dirname(url.pathname);
309
+ if (result.length === 0) {
310
+ throw logger.Error().Str("url", url.toString()).Msg(`name not found`).AsError();
311
+ }
312
+ }
313
+ return result;
314
+ }
315
+ function exception2Result(fn) {
316
+ return fn().then((value) => Result.Ok(value)).catch((e) => Result.Err(e));
317
+ }
318
+ async function exceptionWrapper(fn) {
319
+ return fn().catch((e) => Result.Err(e));
320
+ }
321
+
322
+ // src/runtime/store-file-utils.ts
323
+ async function getPath(url, logger) {
324
+ const basePath = url.toString().replace(new RegExp(`^${url.protocol}//`), "").replace(/\?.*$/, "");
325
+ const name = url.searchParams.get("name");
326
+ if (name) {
327
+ const version = url.searchParams.get("version");
328
+ if (!version) throw logger.Error().Str("url", url.toString()).Msg(`version not found`).AsError();
329
+ return SysContainer.join(basePath, version, name);
330
+ }
331
+ return SysContainer.join(basePath);
332
+ }
333
+ function getFileName(url, key, logger) {
334
+ switch (getStore(url, logger, (...a) => a.join("/"))) {
335
+ case "data":
336
+ return key + ".car";
337
+ case "meta":
338
+ return key + ".json";
339
+ default:
340
+ throw logger.Error().Str("url", url.toString()).Msg(`unsupported store type`).AsError();
341
+ }
342
+ }
343
+ function ensureIndexName(url, name) {
344
+ if (url.searchParams.has("index")) {
345
+ name = (url.searchParams.get("index")?.replace(/[^a-zA-Z0-9]/g, "") || "idx") + "-" + name;
346
+ }
347
+ return name;
348
+ }
349
+
350
+ export {
351
+ dataDir,
352
+ getPath,
353
+ getFileName,
354
+ ensureIndexName,
355
+ ensureSQLOpts,
356
+ toCryptoOpts,
357
+ encodeFile,
358
+ decodeFile,
359
+ FILESTORE_VERSION,
360
+ INDEXDB_VERSION,
361
+ SQLITE_VERSION,
362
+ runtime_exports,
363
+ ensureLogger,
364
+ getStore,
365
+ getKey,
366
+ getName,
367
+ exception2Result,
368
+ exceptionWrapper
369
+ };
370
+ //# sourceMappingURL=chunk-NZNG6TQT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils.ts","../../src/runtime/index.ts","../../src/runtime/data-dir.ts","../../src/runtime/store-sql/index.ts","../../src/runtime/store-sql/types.ts","../../src/runtime/store-sql/ensurer.ts","../../src/runtime/crypto.ts","../../src/runtime/files.ts","../../src/runtime/store-file-version.ts","../../src/runtime/store-indexdb-version.ts","../../src/runtime/store-sql/v0.19-sqlite/version.ts","../../src/runtime/store-file-utils.ts"],"sourcesContent":["import { Logger, LoggerImpl, IsLogger, Result, ResolveOnce } from \"@adviser/cement\";\nimport { SysContainer } from \"./runtime\";\nimport { uuidv7 } from \"uuidv7\";\n\nexport type { Logger };\n\nconst globalLogger: Logger = new LoggerImpl();\n\nexport interface LoggerOpts {\n readonly logger?: Logger;\n}\n\nconst registerFP_DEBUG = new ResolveOnce();\n\nexport function ensureLogger(\n optsOrLogger: Partial<LoggerOpts> | Logger,\n componentName: string,\n ctx?: Record<string, unknown>,\n): Logger {\n // if (!opts?.logger) {\n // throw new Error(\"logger is required\");\n // }\n let logger = globalLogger;\n if (IsLogger(optsOrLogger)) {\n logger = optsOrLogger;\n } else if (optsOrLogger && IsLogger(optsOrLogger.logger)) {\n logger = optsOrLogger.logger;\n }\n const cLogger = logger.With().Module(componentName); //.Str(\"this\", uuidv7());\n const debug: string[] = [];\n if (ctx) {\n if (\"debug\" in ctx) {\n if (typeof ctx.debug === \"string\" && ctx.debug.length > 0) {\n debug.push(ctx.debug);\n } else {\n debug.push(componentName);\n }\n delete ctx.debug;\n }\n if (\"this\" in ctx) {\n cLogger.Str(\"this\", uuidv7());\n delete ctx.this;\n }\n for (const [key, value] of Object.entries(ctx)) {\n switch (typeof value) {\n case \"string\":\n cLogger.Str(key, value);\n break;\n case \"number\":\n cLogger.Uint64(key, value);\n break;\n default:\n if (value instanceof Date) {\n cLogger.Str(key, value.toISOString());\n } else if (value instanceof URL) {\n cLogger.Str(key, value.toString());\n } else if (typeof value === \"function\") {\n cLogger.Ref(key, value);\n } else {\n cLogger.Any(key, value);\n }\n break;\n }\n }\n }\n registerFP_DEBUG\n .once(async () => {\n // console.log(\"registerFP_DEBUG\", SysContainer.env)\n SysContainer.env.onSet((key, value) => {\n // console.log(\"FP_DEBUG\", key, value, debug)\n if (value) {\n logger.SetDebug(value);\n }\n }, \"FP_DEBUG\");\n })\n .finally(() => {\n /* do nothing */\n });\n\n if (debug.length > 0) {\n logger.SetDebug(debug);\n }\n const out = cLogger.Logger();\n // out.Debug().Msg(\"logger ready\");\n return out;\n}\n\nexport type Joiner = (...toJoin: string[]) => string;\n\nexport function getStore(url: URL, logger: Logger, joiner: Joiner): string {\n let result = url.searchParams.get(\"store\");\n if (!result) throw logger.Error().Str(\"url\", url.toString()).Msg(`store not found`).AsError();\n if (url.searchParams.has(\"index\")) {\n result = joiner(url.searchParams.get(\"index\") || \"idx\", result);\n }\n return result;\n}\n\nexport function getKey(url: URL, logger: Logger): string {\n const result = url.searchParams.get(\"key\");\n if (!result) throw logger.Error().Str(\"url\", url.toString()).Msg(`key not found`).AsError();\n return result;\n}\n\nexport function getName(url: URL, logger: Logger): string {\n let result = url.searchParams.get(\"name\");\n if (!result) {\n result = SysContainer.dirname(url.pathname);\n if (result.length === 0) {\n throw logger.Error().Str(\"url\", url.toString()).Msg(`name not found`).AsError();\n }\n }\n return result;\n}\n\nexport function exception2Result<T = void>(fn: () => Promise<T>): Promise<Result<T>> {\n return fn()\n .then((value) => Result.Ok(value))\n .catch((e) => Result.Err(e));\n}\n\nexport async function exceptionWrapper<T, E extends Error>(fn: () => Promise<Result<T, E>>): Promise<Result<T, E>> {\n return fn().catch((e) => Result.Err(e));\n}\n","export * from \"./sys-container.js\";\nexport * from \"./data-dir.js\";\nexport * from \"./store-file-utils.js\";\n\nexport * as sql from \"./store-sql/index.js\";\nexport * as crypto from \"./crypto.js\";\nexport * as files from \"./files.js\";\n\nexport { FILESTORE_VERSION } from \"./store-file-version.js\";\nexport { INDEXDB_VERSION } from \"./store-indexdb-version.js\";\nexport { SQLITE_VERSION } from \"./store-sql/v0.19-sqlite/version.js\";\n","import { SysContainer } from \"./sys-container.js\";\nimport { isDeno, isNode } from \"std-env\";\n\nexport function dataDir(name?: string, base?: string | URL): string {\n if (!base) {\n if (isNode || isDeno) {\n base = SysContainer.env.get(\"FP_STORAGE_URL\") || `file://${SysContainer.join(SysContainer.homedir(), \".fireproof\")}`;\n } else {\n base = `indexdb://fp`;\n }\n }\n let url: URL;\n if (typeof base === \"string\") {\n try {\n url = new URL(base.toString());\n } catch (e) {\n try {\n base = `file://${base}`;\n url = new URL(base);\n } catch (e) {\n throw new Error(`invalid base url: ${base}`);\n }\n }\n } else {\n url = base;\n }\n url.searchParams.set(\"name\", name || \"\");\n return url.toString();\n}\n","// export * from \"./sqlite-adapter-better-sqlite3.js\";\nexport * from \"./types.js\";\nexport * from \"./ensurer.js\";\n","import { Logger, Result } from \"@adviser/cement\";\nimport type { RunResult } from \"better-sqlite3\";\n\nexport interface DBConnection {\n connect(): Promise<void>;\n readonly opts: SQLOpts;\n}\n\nexport interface SQLStore<IType, KType, OType = IType[]> {\n readonly dbConn: DBConnection;\n start(url: URL): Promise<void>;\n insert(url: URL, ose: IType): Promise<RunResult>;\n select(url: URL, car: KType): Promise<OType>;\n delete(url: URL, car: KType): Promise<RunResult>;\n close(url: URL): Promise<Result<void>>;\n destroy(url: URL): Promise<Result<void>>;\n}\n\nexport interface SQLTableNames {\n readonly data: string;\n readonly meta: string;\n readonly wal: string;\n}\n\nexport const DefaultSQLTableNames: SQLTableNames = {\n data: \"Datas\",\n meta: \"Metas\",\n wal: \"Wals\",\n};\n\nexport interface SQLOpts {\n readonly url: URL;\n readonly sqlFlavor: \"sqlite\" | \"mysql\" | \"postgres\";\n readonly tableNames: SQLTableNames;\n readonly logger: Logger;\n readonly textEncoder: TextEncoder;\n readonly textDecoder: TextDecoder;\n}\n\nexport interface WalKey {\n readonly name: string;\n readonly branch: string;\n}\n\nexport interface WalRecord extends WalKey {\n readonly state: Uint8Array;\n readonly updated_at: Date;\n}\n\nexport type WalSQLStore = SQLStore<WalRecord, WalKey>;\n\nexport interface MetaType {\n readonly name: string;\n readonly branch: string;\n readonly meta: Uint8Array;\n}\n\nexport interface MetaRecordKey {\n readonly name: string;\n readonly branch: string;\n}\n\nexport interface MetaRecord extends MetaRecordKey {\n readonly meta: Uint8Array;\n readonly updated_at: Date;\n}\n\nexport type MetaSQLStore = SQLStore<MetaRecord, MetaRecordKey>;\n\nexport interface DataRecord {\n readonly name: string;\n readonly car: string;\n readonly data: Uint8Array;\n readonly updated_at: Date;\n}\n\nexport type DataSQLStore = SQLStore<DataRecord, string>;\n","import { ensureLogger, type Logger } from \"../../utils\";\nimport { SQLOpts, SQLTableNames, DefaultSQLTableNames } from \"./types\";\n\nfunction sqlTableName(...names: string[]): string {\n return names\n .map((name) => name.replace(/^[^a-zA-Z0-9]+/, \"\").replace(/[^a-zA-Z0-9]+/g, \"_\"))\n .filter((i) => i.length)\n .join(\"_\");\n}\n\nfunction ensureTableNames(url: URL, opts?: Partial<SQLOpts>): SQLTableNames {\n let isIndex = \"\";\n if (url.searchParams.has(\"index\")) {\n isIndex = url.searchParams.get(\"index\") || \".idx\";\n }\n const ret = opts?.tableNames || DefaultSQLTableNames;\n // console.log(\"isIndex->\", opts?.url, isIndex, sqlTableName(isIndex, ret.data));\n if (isIndex.length) {\n return {\n data: sqlTableName(isIndex, ret.data),\n meta: sqlTableName(isIndex, ret.meta),\n wal: sqlTableName(isIndex, ret.wal),\n };\n }\n return {\n data: sqlTableName(ret.data),\n meta: sqlTableName(ret.meta),\n wal: sqlTableName(ret.wal),\n };\n}\n\nconst textEncoder = new TextEncoder();\nfunction ensureTextEncoder(opts?: Partial<SQLOpts>): TextEncoder {\n return opts?.textEncoder || textEncoder;\n}\n\nconst textDecoder = new TextDecoder();\nfunction ensureTextDecoder(opts?: Partial<SQLOpts>): TextDecoder {\n return opts?.textDecoder || textDecoder;\n}\n\nfunction url2sqlFlavor(url: URL, logger: Logger): \"sqlite\" | \"mysql\" | \"postgres\" {\n const flavor = url.protocol.replace(/:.*$/, \"\");\n switch (flavor) {\n case \"sqlite\":\n case \"mysql\":\n case \"postgres\":\n return flavor;\n default:\n throw logger.Error().Str(\"flavor\", flavor).Msg(\"unsupported protocol\").AsError();\n }\n}\n\nexport function ensureSQLOpts(url: URL, opts: Partial<SQLOpts>, componentName: string, ctx?: Record<string, unknown>): SQLOpts {\n const logger = ensureLogger(opts, componentName, ctx);\n return {\n url,\n sqlFlavor: url2sqlFlavor(url, logger),\n tableNames: ensureTableNames(url, opts),\n logger,\n textEncoder: ensureTextEncoder(opts),\n textDecoder: ensureTextDecoder(opts),\n };\n}\n","import { CryptoOpts } from \"../blockstore/index.js\";\n\nfunction randomBytes(size: number) {\n const bytes = new Uint8Array(size);\n if (size > 0) {\n crypto.getRandomValues(bytes);\n }\n return bytes;\n}\n\nfunction digestSHA256(data: Uint8Array): Promise<ArrayBuffer> {\n return Promise.resolve(crypto.subtle.digest(\"SHA-256\", data));\n}\n\nexport function toCryptoOpts(cryptoOpts: Partial<CryptoOpts> = {}): CryptoOpts {\n const opts = {\n importKey: cryptoOpts.importKey || crypto.subtle.importKey.bind(crypto.subtle),\n encrypt: cryptoOpts.encrypt || crypto.subtle.encrypt.bind(crypto.subtle),\n decrypt: cryptoOpts.decrypt || crypto.subtle.decrypt.bind(crypto.subtle),\n randomBytes: cryptoOpts.randomBytes || randomBytes,\n digestSHA256: cryptoOpts.digestSHA256 || digestSHA256,\n };\n // console.log(\"cryptoOpts\", cryptoOpts, opts)\n return opts;\n}\n","import * as UnixFS from \"@ipld/unixfs\";\nimport * as raw from \"multiformats/codecs/raw\";\nimport { withMaxChunkSize } from \"@ipld/unixfs/file/chunker/fixed\";\nimport { withWidth } from \"@ipld/unixfs/file/layout/balanced\";\n\nimport type { View } from \"@ipld/unixfs\";\nimport { DocFileMeta } from \"../types.js\";\n\nimport { exporter, ReadableStorage } from \"ipfs-unixfs-exporter\";\nimport { BlobLike, AnyLink, AnyBlock } from \"../blockstore/index.js\";\n\nconst queuingStrategy = UnixFS.withCapacity();\n\nconst settings = UnixFS.configure({\n fileChunkEncoder: raw,\n smallFileEncoder: raw,\n chunker: withMaxChunkSize(1024 * 1024),\n fileLayout: withWidth(1024),\n});\n\nasync function collect<T>(collectable: ReadableStream<T>): Promise<T[]> {\n const chunks: T[] = [];\n await collectable.pipeTo(\n new WritableStream({\n write(chunk) {\n chunks.push(chunk);\n },\n }),\n );\n return chunks;\n}\n\nexport async function encodeFile(blob: BlobLike): Promise<{ cid: AnyLink; blocks: AnyBlock[] }> {\n const readable = createFileEncoderStream(blob);\n const blocks = await collect(readable);\n return { cid: blocks.at(-1).cid, blocks };\n}\n\nexport async function decodeFile(blocks: unknown, cid: AnyLink, meta: DocFileMeta): Promise<File> {\n const entry = await exporter(cid.toString(), blocks as ReadableStorage, { length: meta.size });\n const chunks = [];\n for await (const chunk of entry.content()) {\n chunks.push(chunk);\n }\n return new File(chunks, entry.name, { type: meta.type, lastModified: 0 });\n}\n\nfunction createFileEncoderStream(blob: BlobLike) {\n const { readable, writable } = new TransformStream({}, queuingStrategy);\n const unixfsWriter = UnixFS.createWriter({ writable, settings });\n const fileBuilder = new UnixFSFileBuilder(\"\", blob);\n void (async () => {\n await fileBuilder.finalize(unixfsWriter);\n await unixfsWriter.close();\n })();\n return readable;\n}\n\nclass UnixFSFileBuilder {\n #file;\n readonly name: string;\n constructor(name: string, file: BlobLike) {\n this.name = name;\n this.#file = file;\n }\n\n async finalize(writer: View) {\n const unixfsFileWriter = UnixFS.createFileWriter(writer);\n await this.#file.stream().pipeTo(\n new WritableStream({\n async write(chunk) {\n await unixfsFileWriter.write(chunk as Uint8Array);\n },\n }),\n );\n return await unixfsFileWriter.close();\n }\n}\n","export const FILESTORE_VERSION = \"v0.19-file\";\n","export const INDEXDB_VERSION = \"v0.19-indexdb\";\n","export const SQLITE_VERSION = \"v0.19-sqlite\";\n","import { Logger, getStore } from \"../utils.js\";\nimport { SysContainer } from \"./sys-container.js\";\n\nexport async function getPath(url: URL, logger: Logger): Promise<string> {\n const basePath = url\n .toString()\n .replace(new RegExp(`^${url.protocol}//`), \"\")\n .replace(/\\?.*$/, \"\");\n const name = url.searchParams.get(\"name\");\n if (name) {\n const version = url.searchParams.get(\"version\");\n if (!version) throw logger.Error().Str(\"url\", url.toString()).Msg(`version not found`).AsError();\n return SysContainer.join(basePath, version, name);\n }\n return SysContainer.join(basePath);\n}\n\nexport function getFileName(url: URL, key: string, logger: Logger): string {\n switch (getStore(url, logger, (...a: string[]) => a.join(\"/\"))) {\n case \"data\":\n return key + \".car\";\n case \"meta\":\n return key + \".json\";\n default:\n throw logger.Error().Str(\"url\", url.toString()).Msg(`unsupported store type`).AsError();\n }\n}\n\nexport function ensureIndexName(url: URL, name: string): string {\n if (url.searchParams.has(\"index\")) {\n name = (url.searchParams.get(\"index\")?.replace(/[^a-zA-Z0-9]/g, \"\") || \"idx\") + \"-\" + name;\n }\n return name;\n}\n"],"mappings":"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","names":["e"]}
@@ -0,0 +1,22 @@
1
+ // src/blockstore/gateway.ts
2
+ import { Result } from "@adviser/cement";
3
+ var NotFoundError = class extends Error {
4
+ constructor() {
5
+ super(...arguments);
6
+ this.code = "ENOENT";
7
+ }
8
+ };
9
+ function isNotFoundError(e) {
10
+ if (Result.Is(e)) {
11
+ if (e.isOk()) return false;
12
+ e = e.Err();
13
+ }
14
+ if (e.code === "ENOENT") return true;
15
+ return false;
16
+ }
17
+
18
+ export {
19
+ NotFoundError,
20
+ isNotFoundError
21
+ };
22
+ //# sourceMappingURL=chunk-VZGT7ZYP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/blockstore/gateway.ts"],"sourcesContent":["import { Result } from \"@adviser/cement\";\n\nexport interface GatewayOpts {\n readonly gateway: Gateway;\n}\n\nexport class NotFoundError extends Error {\n readonly code = \"ENOENT\";\n}\n\nexport function isNotFoundError(e: Error | Result<unknown> | unknown): e is NotFoundError {\n if (Result.Is(e)) {\n if (e.isOk()) return false;\n e = e.Err();\n }\n if ((e as NotFoundError).code === \"ENOENT\") return true;\n return false;\n}\n\nexport type GetResult = Result<Uint8Array, NotFoundError | Error>;\nexport type VoidResult = Result<void>;\n\nexport interface Gateway {\n // all the methods never throw!\n // an error is reported as a Result\n buildUrl(baseUrl: URL, key: string): Promise<Result<URL>>;\n // start updates URL --> hate this side effect\n start(baseUrl: URL): Promise<VoidResult>;\n close(baseUrl: URL): Promise<VoidResult>;\n destroy(baseUrl: URL): Promise<VoidResult>;\n put(url: URL, body: Uint8Array): Promise<VoidResult>;\n // get could return a NotFoundError if the key is not found\n get(url: URL): Promise<GetResult>;\n delete(url: URL): Promise<VoidResult>;\n}\n"],"mappings":";AAAA,SAAS,cAAc;AAMhB,IAAM,gBAAN,cAA4B,MAAM;AAAA,EAAlC;AAAA;AACL,SAAS,OAAO;AAAA;AAClB;AAEO,SAAS,gBAAgB,GAA0D;AACxF,MAAI,OAAO,GAAG,CAAC,GAAG;AAChB,QAAI,EAAE,KAAK,EAAG,QAAO;AACrB,QAAI,EAAE,IAAI;AAAA,EACZ;AACA,MAAK,EAAoB,SAAS,SAAU,QAAO;AACnD,SAAO;AACT;","names":[]}
@@ -0,0 +1,39 @@
1
+ import {
2
+ SQLITE_VERSION,
3
+ ensureLogger
4
+ } from "./chunk-NZNG6TQT.js";
5
+
6
+ // src/runtime/store-sql/v0.19-sqlite/sqlite-ensure-version.ts
7
+ import { ResolveOnce } from "@adviser/cement";
8
+ var once = new ResolveOnce();
9
+ async function ensureSQLiteVersion(url, dbConn) {
10
+ const version = await once.once(async () => {
11
+ const logger = ensureLogger(dbConn.opts, "ensureSQLiteVersion", {
12
+ version: SQLITE_VERSION,
13
+ url: dbConn.url.toString()
14
+ });
15
+ await dbConn.client.prepare(
16
+ `CREATE TABLE IF NOT EXISTS version (
17
+ version TEXT NOT NULL,
18
+ updated_at TEXT NOT NULL)`
19
+ ).run();
20
+ const rows = await dbConn.client.prepare(`select version from version`).all();
21
+ if (rows.length > 1) {
22
+ throw logger.Error().Msg(`more than one version row found`).AsError();
23
+ }
24
+ if (rows.length === 0) {
25
+ await dbConn.client.prepare(`insert into version (version, updated_at) values (?, ?)`).run(SQLITE_VERSION, (/* @__PURE__ */ new Date()).toISOString());
26
+ return SQLITE_VERSION;
27
+ }
28
+ if (rows[0].version !== SQLITE_VERSION) {
29
+ logger.Warn().Any("row", rows[0]).Msg(`version mismatch`);
30
+ }
31
+ return rows[0].version;
32
+ });
33
+ url.searchParams.set("version", version);
34
+ }
35
+
36
+ export {
37
+ ensureSQLiteVersion
38
+ };
39
+ //# sourceMappingURL=chunk-ZHO4NMWL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/runtime/store-sql/v0.19-sqlite/sqlite-ensure-version.ts"],"sourcesContent":["import { SQLiteConnection } from \"../sqlite-adapter-better-sqlite3\";\nimport { SQLITE_VERSION } from \"./version\";\nimport { ResolveOnce } from \"@adviser/cement\";\nimport { ensureLogger } from \"../../../utils\";\n\nconst once = new ResolveOnce<string>();\nexport async function ensureSQLiteVersion(url: URL, dbConn: SQLiteConnection) {\n const version = await once.once(async () => {\n const logger = ensureLogger(dbConn.opts, \"ensureSQLiteVersion\", {\n version: SQLITE_VERSION,\n url: dbConn.url.toString(),\n });\n await dbConn.client\n .prepare(\n `CREATE TABLE IF NOT EXISTS version (\n version TEXT NOT NULL,\n updated_at TEXT NOT NULL)`,\n )\n .run();\n const rows = (await dbConn.client.prepare(`select version from version`).all()) as { version: string }[];\n if (rows.length > 1) {\n throw logger.Error().Msg(`more than one version row found`).AsError();\n }\n if (rows.length === 0) {\n await dbConn.client\n .prepare(`insert into version (version, updated_at) values (?, ?)`)\n .run(SQLITE_VERSION, new Date().toISOString());\n return SQLITE_VERSION;\n }\n if (rows[0].version !== SQLITE_VERSION) {\n logger.Warn().Any(\"row\", rows[0]).Msg(`version mismatch`);\n }\n return rows[0].version;\n });\n url.searchParams.set(\"version\", version);\n}\n"],"mappings":";;;;;;AAEA,SAAS,mBAAmB;AAG5B,IAAM,OAAO,IAAI,YAAoB;AACrC,eAAsB,oBAAoB,KAAU,QAA0B;AAC5E,QAAM,UAAU,MAAM,KAAK,KAAK,YAAY;AAC1C,UAAM,SAAS,aAAa,OAAO,MAAM,uBAAuB;AAAA,MAC9D,SAAS;AAAA,MACT,KAAK,OAAO,IAAI,SAAS;AAAA,IAC3B,CAAC;AACD,UAAM,OAAO,OACV;AAAA,MACC;AAAA;AAAA;AAAA,IAGF,EACC,IAAI;AACP,UAAM,OAAQ,MAAM,OAAO,OAAO,QAAQ,6BAA6B,EAAE,IAAI;AAC7E,QAAI,KAAK,SAAS,GAAG;AACnB,YAAM,OAAO,MAAM,EAAE,IAAI,iCAAiC,EAAE,QAAQ;AAAA,IACtE;AACA,QAAI,KAAK,WAAW,GAAG;AACrB,YAAM,OAAO,OACV,QAAQ,yDAAyD,EACjE,IAAI,iBAAgB,oBAAI,KAAK,GAAE,YAAY,CAAC;AAC/C,aAAO;AAAA,IACT;AACA,QAAI,KAAK,CAAC,EAAE,YAAY,gBAAgB;AACtC,aAAO,KAAK,EAAE,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,IAAI,kBAAkB;AAAA,IAC1D;AACA,WAAO,KAAK,CAAC,EAAE;AAAA,EACjB,CAAC;AACD,MAAI,aAAa,IAAI,WAAW,OAAO;AACzC;","names":[]}