@fireproof/core 0.19.121 → 0.20.0-dev-preview-06

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 (63) hide show
  1. package/README.md +3 -2
  2. package/deno/index.d.ts +7 -0
  3. package/deno/index.js +66 -0
  4. package/deno/index.js.map +1 -0
  5. package/deno/metafile-esm.json +1 -0
  6. package/deno.json +2 -3
  7. package/index.cjs +1819 -1051
  8. package/index.cjs.map +1 -1
  9. package/index.d.cts +746 -333
  10. package/index.d.ts +746 -333
  11. package/index.js +1792 -1026
  12. package/index.js.map +1 -1
  13. package/metafile-cjs.json +1 -1
  14. package/metafile-esm.json +1 -1
  15. package/node/index.cjs +16 -293
  16. package/node/index.cjs.map +1 -1
  17. package/node/index.d.cts +4 -40
  18. package/node/index.d.ts +4 -40
  19. package/node/index.js +22 -237
  20. package/node/index.js.map +1 -1
  21. package/node/metafile-cjs.json +1 -1
  22. package/node/metafile-esm.json +1 -1
  23. package/package.json +12 -4
  24. package/react/index.cjs.map +1 -1
  25. package/react/index.js.map +1 -1
  26. package/react/metafile-cjs.json +1 -1
  27. package/react/metafile-esm.json +1 -1
  28. package/tests/blockstore/fp-envelope.test.ts-off +65 -0
  29. package/tests/blockstore/interceptor-gateway.test.ts +122 -0
  30. package/tests/blockstore/keyed-crypto-indexdb-file.test.ts +130 -0
  31. package/tests/blockstore/keyed-crypto.test.ts +73 -118
  32. package/tests/blockstore/loader.test.ts +18 -9
  33. package/tests/blockstore/store.test.ts +40 -31
  34. package/tests/blockstore/transaction.test.ts +14 -13
  35. package/tests/fireproof/all-gateway.test.ts +283 -213
  36. package/tests/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.ts +324 -316
  37. package/tests/fireproof/crdt.test.ts +78 -19
  38. package/tests/fireproof/database.test.ts +225 -29
  39. package/tests/fireproof/fireproof.test.ts +92 -73
  40. package/tests/fireproof/hello.test.ts +17 -13
  41. package/tests/fireproof/indexer.test.ts +67 -43
  42. package/tests/fireproof/utils.test.ts +47 -6
  43. package/tests/gateway/file/loader-config.test.ts +307 -0
  44. package/tests/gateway/fp-envelope-serialize.test.ts +256 -0
  45. package/tests/gateway/indexdb/loader-config.test.ts +79 -0
  46. package/tests/helpers.ts +44 -17
  47. package/tests/react/useFireproof.test.tsx +1 -1
  48. package/tests/www/todo.html +24 -3
  49. package/web/index.cjs +102 -116
  50. package/web/index.cjs.map +1 -1
  51. package/web/index.d.cts +15 -29
  52. package/web/index.d.ts +15 -29
  53. package/web/index.js +91 -105
  54. package/web/index.js.map +1 -1
  55. package/web/metafile-cjs.json +1 -1
  56. package/web/metafile-esm.json +1 -1
  57. package/node/chunk-4A4RAVNS.js +0 -17
  58. package/node/chunk-4A4RAVNS.js.map +0 -1
  59. package/node/mem-filesystem-LPPT7QV5.js +0 -40
  60. package/node/mem-filesystem-LPPT7QV5.js.map +0 -1
  61. package/tests/fireproof/config.test.ts +0 -163
  62. /package/tests/blockstore/{fragment-gateway.test.ts → fragment-gateway.test.ts-off} +0 -0
  63. /package/tests/fireproof/{multiple-ledger.test.ts → multiple-database.test.ts} +0 -0
package/node/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,6 +27,13 @@ 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
 
30
+ // src/runtime/gateways/file/node/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ getSysFileSystem: () => getSysFileSystem
34
+ });
35
+ module.exports = __toCommonJS(index_exports);
36
+
33
37
  // src/runtime/gateways/file/node/to-array-buffer.ts
34
38
  function toArrayBuffer(buffer) {
35
39
  if (typeof buffer === "string") {
@@ -42,75 +46,8 @@ function toArrayBuffer(buffer) {
42
46
  }
43
47
  return view;
44
48
  }
45
- var init_to_array_buffer = __esm({
46
- "src/runtime/gateways/file/node/to-array-buffer.ts"() {
47
- "use strict";
48
- }
49
- });
50
-
51
- // src/runtime/gateways/file/node/mem-filesystem.ts
52
- var mem_filesystem_exports = {};
53
- __export(mem_filesystem_exports, {
54
- MemFileSystem: () => MemFileSystem
55
- });
56
- var import_memfs, MemFileSystem;
57
- var init_mem_filesystem = __esm({
58
- "src/runtime/gateways/file/node/mem-filesystem.ts"() {
59
- "use strict";
60
- import_memfs = require("memfs");
61
- init_to_array_buffer();
62
- MemFileSystem = class {
63
- async start() {
64
- return this;
65
- }
66
- mkdir(path, options) {
67
- return import_memfs.fs.promises.mkdir(path, options);
68
- }
69
- readdir(path, options) {
70
- return import_memfs.fs.promises.readdir(path, options);
71
- }
72
- rm(path, options) {
73
- return import_memfs.fs.promises.rm(path, options);
74
- }
75
- copyFile(source, destination) {
76
- return import_memfs.fs.promises.copyFile(source, destination);
77
- }
78
- async readfile(path, options) {
79
- const ret = await import_memfs.fs.promises.readFile(path, options);
80
- return toArrayBuffer(ret);
81
- }
82
- stat(path) {
83
- return import_memfs.fs.promises.stat(path);
84
- }
85
- unlink(path) {
86
- return import_memfs.fs.promises.unlink(path);
87
- }
88
- writefile(path, data) {
89
- return import_memfs.fs.promises.writeFile(path, Buffer.from(data));
90
- }
91
- };
92
- }
93
- });
94
-
95
- // src/runtime/gateways/file/node/index.ts
96
- var index_exports = {};
97
- __export(index_exports, {
98
- GatewayImpl: () => FileGateway,
99
- GatewayTestImpl: () => FileTestGateway,
100
- KeyBagProviderFile: () => KeyBagProviderFile,
101
- KeyBagProviderImpl: () => KeyBagProviderFile,
102
- getFileSystem: () => getFileSystem
103
- });
104
- module.exports = __toCommonJS(index_exports);
105
-
106
- // src/runtime/gateways/file/node/key-bag-file.ts
107
- var import_core = require("@fireproof/core");
108
-
109
- // src/runtime/gateways/file/node/get-file-system.ts
110
- var import_cement2 = require("@adviser/cement");
111
49
 
112
50
  // src/runtime/gateways/file/node/node-filesystem.ts
113
- init_to_array_buffer();
114
51
  var import_cement = require("@adviser/cement");
115
52
  var NodeFileSystem = class {
116
53
  async start() {
@@ -147,228 +84,14 @@ var NodeFileSystem = class {
147
84
  }
148
85
  };
149
86
 
150
- // src/runtime/gateways/file/node/get-file-system.ts
151
- var externalLoaders = new import_cement2.KeyedResolvOnce();
152
- async function getFileSystem(url) {
153
- const name = url.getParam("fs", "node");
154
- let fs2;
155
- switch (name) {
156
- case "mem":
157
- fs2 = await externalLoaders.get(name).once(async () => {
158
- const { MemFileSystem: MemFileSystem2 } = await Promise.resolve().then(() => (init_mem_filesystem(), mem_filesystem_exports));
159
- return new MemFileSystem2();
160
- });
161
- break;
162
- // case 'deno': {
163
- // const { DenoFileSystem } = await import("./deno-filesystem.js");
164
- // fs = new DenoFileSystem();
165
- // break;
166
- // }
167
- default:
168
- fs2 = await externalLoaders.get(name).once(async () => {
169
- return new NodeFileSystem();
170
- });
171
- }
172
- return fs2.start();
173
- }
174
-
175
- // src/runtime/gateways/file/node/key-bag-file.ts
176
- var KeyBagProviderFile = class {
177
- async _prepare(id) {
178
- await this.sthis.start();
179
- let sysFS;
180
- switch (this.url.protocol) {
181
- case "file:": {
182
- sysFS = await getFileSystem(this.url);
183
- break;
184
- }
185
- default:
186
- throw this.logger.Error().Url(this.url).Msg("unsupported protocol").AsError();
187
- }
188
- const dirName = this.url.pathname;
189
- await sysFS.mkdir(dirName, { recursive: true });
190
- return {
191
- dirName,
192
- sysFS,
193
- fName: this.sthis.pathOps.join(dirName, `${id.replace(/[^a-zA-Z0-9]/g, "_")}.json`)
194
- };
195
- }
196
- constructor(url, sthis) {
197
- this.url = url;
198
- this.sthis = sthis;
199
- this.logger = sthis.logger;
200
- }
201
- async get(id) {
202
- const ctx = await this._prepare(id);
203
- try {
204
- const p = await ctx.sysFS.readfile(ctx.fName);
205
- const ki = JSON.parse(this.sthis.txt.decode(p));
206
- return ki;
207
- } catch (e) {
208
- if ((0, import_core.isNotFoundError)(e)) {
209
- return void 0;
210
- }
211
- throw this.logger.Error().Err(e).Str("file", ctx.dirName).Msg("read bag failed").AsError();
212
- }
213
- }
214
- async set(id, item) {
215
- const ctx = await this._prepare(id);
216
- const p = this.sthis.txt.encode(JSON.stringify(item, null, 2));
217
- await ctx.sysFS.writefile(ctx.fName, p);
218
- }
219
- };
220
-
221
- // src/runtime/gateways/file/version.ts
222
- var FILESTORE_VERSION = "v0.19-file";
223
-
224
- // src/runtime/gateways/file/node/gateway-impl.ts
225
- var import_cement3 = require("@adviser/cement");
226
- var import_core3 = require("@fireproof/core");
227
-
228
- // src/runtime/gateways/file/node/utils.ts
229
- var import_core2 = require("@fireproof/core");
230
- function getPath(url, sthis) {
231
- const basePath = url.pathname;
232
- const name = url.getParam("name");
233
- if (name) {
234
- const version = url.getParam("version");
235
- if (!version) throw sthis.logger.Error().Url(url).Msg(`version not found`).AsError();
236
- return sthis.pathOps.join(basePath, version, name);
237
- }
238
- return sthis.pathOps.join(basePath);
239
- }
240
- function getFileName(url, sthis) {
241
- const key = url.getParam("key");
242
- if (!key) throw sthis.logger.Error().Url(url).Msg(`key not found`).AsError();
243
- const res = (0, import_core2.getStore)(url, sthis, (...a) => a.join("-"));
244
- switch (res.store) {
245
- case "data":
246
- return sthis.pathOps.join(res.name, key + ".car");
247
- case "wal":
248
- case "meta":
249
- return sthis.pathOps.join(res.name, key + ".json");
250
- default:
251
- throw sthis.logger.Error().Url(url).Msg(`unsupported store type`).AsError();
252
- }
87
+ // src/runtime/gateways/file/node/get-sys-file-system.ts
88
+ var import_cement2 = require("@adviser/cement");
89
+ var nfs = new import_cement2.ResolveOnce();
90
+ async function getSysFileSystem(url) {
91
+ return nfs.once(async () => {
92
+ const nfs2 = new NodeFileSystem();
93
+ await nfs2.start();
94
+ return nfs2;
95
+ });
253
96
  }
254
-
255
- // src/runtime/gateways/file/node/gateway-impl.ts
256
- var versionFiles = new import_cement3.KeyedResolvOnce();
257
- var FileGateway = class {
258
- constructor(sthis) {
259
- this.sthis = sthis;
260
- this.logger = sthis.logger;
261
- }
262
- async getVersionFromFile(fs2, path, logger) {
263
- return versionFiles.get(path).once(async () => {
264
- await fs2.mkdir(path, { recursive: true });
265
- const vFile = this.sthis.pathOps.join(path, "version");
266
- const vFileStat = await fs2.stat(vFile).catch(() => void 0);
267
- if (!vFileStat) {
268
- await fs2.writefile(this.sthis.pathOps.join(path, "version"), FILESTORE_VERSION);
269
- return FILESTORE_VERSION;
270
- } else if (!vFileStat.isFile()) {
271
- throw logger.Error().Str("file", vFile).Msg(`version file is a directory`).AsError();
272
- }
273
- const v = await fs2.readfile(vFile);
274
- const vStr = this.sthis.txt.decode(v);
275
- if (vStr !== FILESTORE_VERSION) {
276
- logger.Warn().Str("file", vFile).Str("from", vStr).Str("expected", FILESTORE_VERSION).Msg(`version mismatch`);
277
- }
278
- return vStr;
279
- });
280
- }
281
- start(baseURL) {
282
- return (0, import_cement3.exception2Result)(async () => {
283
- const fs2 = await getFileSystem(baseURL);
284
- const url = baseURL.build();
285
- url.defParam("version", FILESTORE_VERSION);
286
- const dbUrl = await this.buildUrl(url.URI(), "dummy");
287
- const dbdirFile = this.getFilePath(dbUrl.Ok());
288
- await fs2.mkdir(this.sthis.pathOps.dirname(dbdirFile), { recursive: true });
289
- const dbroot = this.sthis.pathOps.dirname(dbdirFile);
290
- this.logger.Debug().Url(url.URI()).Str("dbroot", dbroot).Msg("start");
291
- url.setParam("version", await this.getVersionFromFile(fs2, dbroot, this.logger));
292
- return url.URI();
293
- });
294
- }
295
- async buildUrl(baseUrl, key) {
296
- return import_cement3.Result.Ok(baseUrl.build().setParam("key", key).URI());
297
- }
298
- async close() {
299
- return import_cement3.Result.Ok(void 0);
300
- }
301
- // abstract buildUrl(baseUrl: URL, key: string): Promise<Result<URL>>;
302
- getFilePath(url) {
303
- const key = url.getParam("key");
304
- if (!key) throw this.logger.Error().Url(url).Msg(`key not found`).AsError();
305
- return this.sthis.pathOps.join(getPath(url, this.sthis), getFileName(url, this.sthis));
306
- }
307
- async put(url, body) {
308
- return (0, import_cement3.exception2Result)(async () => {
309
- const file = await this.getFilePath(url);
310
- this.logger.Debug().Str("url", url.toString()).Str("file", file).Msg("put");
311
- await getFileSystem(url).then((fs2) => fs2.writefile(file, body));
312
- });
313
- }
314
- async get(url) {
315
- return (0, import_core3.exceptionWrapper)(async () => {
316
- const file = this.getFilePath(url);
317
- try {
318
- const res = await getFileSystem(url).then((fs2) => fs2.readfile(file));
319
- this.logger.Debug().Url(url.asURL()).Str("file", file).Msg("get");
320
- return import_cement3.Result.Ok(new Uint8Array(res));
321
- } catch (e) {
322
- if ((0, import_core3.isNotFoundError)(e)) {
323
- return import_cement3.Result.Err(new import_core3.NotFoundError(`file not found: ${file}`));
324
- }
325
- return import_cement3.Result.Err(e);
326
- }
327
- });
328
- }
329
- async delete(url) {
330
- return (0, import_cement3.exception2Result)(async () => {
331
- await getFileSystem(url).then((fs2) => fs2.unlink(this.getFilePath(url)));
332
- });
333
- }
334
- async destroy(baseURL) {
335
- const url = await this.buildUrl(baseURL, "x");
336
- if (url.isErr()) return url;
337
- const filepath = this.sthis.pathOps.dirname(this.getFilePath(url.Ok()));
338
- const fs2 = await getFileSystem(baseURL);
339
- let files = [];
340
- try {
341
- files = await fs2.readdir(filepath);
342
- } catch (e) {
343
- if (!(0, import_core3.isNotFoundError)(e)) {
344
- throw this.logger.Error().Err(e).Str("dir", filepath).Msg("destroy:readdir").AsError();
345
- }
346
- }
347
- for (const file of files) {
348
- const pathed = this.sthis.pathOps.join(filepath, file);
349
- try {
350
- await fs2.unlink(pathed);
351
- } catch (e) {
352
- if (!(0, import_core3.isNotFoundError)(e)) {
353
- throw this.logger.Error().Err(e).Str("file", pathed).Msg("destroy:unlink").AsError();
354
- }
355
- }
356
- }
357
- return import_cement3.Result.Ok(void 0);
358
- }
359
- };
360
- var FileTestGateway = class {
361
- constructor(sthis) {
362
- this.logger = (0, import_core3.ensureLogger)(sthis, "FileTestStore");
363
- this.sthis = sthis;
364
- }
365
- async get(iurl, key) {
366
- const url = iurl.build().setParam("key", key).URI();
367
- const dbFile = this.sthis.pathOps.join(getPath(url, this.sthis), getFileName(url, this.sthis));
368
- this.logger.Debug().Url(url).Str("dbFile", dbFile).Msg("get");
369
- const buffer = await (await getFileSystem(url)).readfile(dbFile);
370
- this.logger.Debug().Url(url).Str("dbFile", dbFile).Len(buffer).Msg("got");
371
- return buffer;
372
- }
373
- };
374
97
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/runtime/gateways/file/node/to-array-buffer.ts","../../../src/runtime/gateways/file/node/mem-filesystem.ts","../../../src/runtime/gateways/file/node/index.ts","../../../src/runtime/gateways/file/node/key-bag-file.ts","../../../src/runtime/gateways/file/node/get-file-system.ts","../../../src/runtime/gateways/file/node/node-filesystem.ts","../../../src/runtime/gateways/file/version.ts","../../../src/runtime/gateways/file/node/gateway-impl.ts","../../../src/runtime/gateways/file/node/utils.ts"],"sourcesContent":["export function toArrayBuffer(buffer: Buffer | string): Uint8Array {\n if (typeof buffer === \"string\") {\n buffer = Buffer.from(buffer);\n }\n const ab = new ArrayBuffer(buffer.length);\n const view = new Uint8Array(ab);\n for (let i = 0; i < buffer.length; ++i) {\n view[i] = buffer[i];\n }\n return view;\n}\n","import type { PathLike, MakeDirectoryOptions, Stats } from \"fs\";\nimport { fs } from \"memfs\";\nimport { IReaddirOptions } from \"memfs/lib/node/types/options.js\";\nimport { toArrayBuffer } from \"./to-array-buffer.js\";\nimport type { SysFileSystem } from \"@fireproof/core\";\n\nexport class MemFileSystem implements SysFileSystem {\n async start(): Promise<SysFileSystem> {\n return this;\n }\n mkdir(path: PathLike, options?: { recursive: boolean }): Promise<string | undefined> {\n return fs.promises.mkdir(path, options);\n }\n readdir(path: PathLike, options?: IReaddirOptions): Promise<string[]> {\n return fs.promises.readdir(path, options) as Promise<string[]>;\n }\n rm(path: PathLike, options?: MakeDirectoryOptions & { recursive: boolean }): Promise<void> {\n return fs.promises.rm(path, options);\n }\n copyFile(source: PathLike, destination: PathLike): Promise<void> {\n return fs.promises.copyFile(source, destination);\n }\n async readfile(path: PathLike, options?: { encoding: BufferEncoding; flag?: string }): Promise<Uint8Array> {\n const ret = await fs.promises.readFile(path, options);\n return toArrayBuffer(ret);\n }\n stat(path: PathLike): Promise<Stats> {\n return fs.promises.stat(path) as Promise<Stats>;\n }\n unlink(path: PathLike): Promise<void> {\n return fs.promises.unlink(path);\n }\n writefile(path: PathLike, data: Uint8Array | string): Promise<void> {\n return fs.promises.writeFile(path, Buffer.from(data));\n }\n}\n","export * from \"./key-bag-file.js\";\n\n// test needs that\nexport * from \"./get-file-system.js\";\n\nimport { KeyBagProviderFile as KeyBagProviderImpl } from \"./key-bag-file.js\";\n\nexport { KeyBagProviderImpl };\n\nimport { FileGateway as GatewayImpl, FileTestGateway as GatewayTestImpl } from \"./gateway-impl.js\";\nexport { GatewayImpl, GatewayTestImpl };\n","import { URI } from \"@adviser/cement\";\nimport { isNotFoundError, Logger } from \"@fireproof/core\";\nimport type { rt, SuperThis, SysFileSystem } from \"@fireproof/core\";\nimport { getFileSystem } from \"./get-file-system.js\";\n\ninterface KeyBagCtx {\n readonly dirName: string;\n readonly sysFS: SysFileSystem;\n readonly fName: string;\n}\n\nexport class KeyBagProviderFile implements rt.kb.KeyBagProvider {\n async _prepare(id: string): Promise<KeyBagCtx> {\n await this.sthis.start();\n let sysFS: SysFileSystem;\n switch (this.url.protocol) {\n case \"file:\": {\n sysFS = await getFileSystem(this.url);\n break;\n }\n default:\n throw this.logger.Error().Url(this.url).Msg(\"unsupported protocol\").AsError();\n }\n const dirName = this.url.pathname;\n await sysFS.mkdir(dirName, { recursive: true });\n return {\n dirName,\n sysFS,\n fName: this.sthis.pathOps.join(dirName, `${id.replace(/[^a-zA-Z0-9]/g, \"_\")}.json`),\n };\n }\n\n private readonly url: URI;\n readonly logger: Logger;\n readonly sthis: SuperThis;\n constructor(url: URI, sthis: SuperThis) {\n this.url = url;\n this.sthis = sthis;\n this.logger = sthis.logger;\n }\n\n async get(id: string): Promise<rt.kb.KeyItem | undefined> {\n const ctx = await this._prepare(id);\n try {\n const p = await ctx.sysFS.readfile(ctx.fName);\n const ki = JSON.parse(this.sthis.txt.decode(p)) as rt.kb.KeyItem;\n return ki;\n } catch (e) {\n if (isNotFoundError(e)) {\n return undefined;\n }\n throw this.logger.Error().Err(e).Str(\"file\", ctx.dirName).Msg(\"read bag failed\").AsError();\n }\n }\n\n async set(id: string, item: rt.kb.KeyItem): Promise<void> {\n const ctx = await this._prepare(id);\n const p = this.sthis.txt.encode(JSON.stringify(item, null, 2));\n await ctx.sysFS.writefile(ctx.fName, p);\n }\n}\n","import { KeyedResolvOnce, type URI } from \"@adviser/cement\";\nimport type { SysFileSystem } from \"@fireproof/core\";\nimport { NodeFileSystem } from \"./node-filesystem.js\";\n\nconst externalLoaders = new KeyedResolvOnce<SysFileSystem>();\nexport async function getFileSystem(url: URI): Promise<SysFileSystem> {\n const name = url.getParam(\"fs\", \"node\");\n let fs: SysFileSystem;\n switch (name) {\n case \"mem\":\n fs = await externalLoaders.get(name).once(async () => {\n const { MemFileSystem } = await import(\"./mem-filesystem.js\");\n return new MemFileSystem();\n });\n break;\n // case 'deno': {\n // const { DenoFileSystem } = await import(\"./deno-filesystem.js\");\n // fs = new DenoFileSystem();\n // break;\n // }\n default:\n fs = await externalLoaders.get(name).once(async () => {\n return new NodeFileSystem();\n });\n }\n return fs.start();\n}\n","import type { PathLike, MakeDirectoryOptions, Stats, ObjectEncodingOptions } from \"node:fs\";\nimport type { mkdir, readdir, rm, copyFile, readFile, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { toArrayBuffer } from \"./to-array-buffer.js\";\nimport type { SysFileSystem } from \"@fireproof/core\";\nimport { runtimeFn } from \"@adviser/cement\";\n\nexport class NodeFileSystem implements SysFileSystem {\n fs?: {\n mkdir: typeof mkdir;\n readdir: typeof readdir;\n rm: typeof rm;\n copyFile: typeof copyFile;\n readFile: typeof readFile;\n stat: typeof stat;\n unlink: typeof unlink;\n writeFile: typeof writeFile;\n };\n\n async start(): Promise<SysFileSystem> {\n this.fs = await import(\"node:fs/promises\");\n return this;\n }\n async mkdir(path: PathLike, options?: { recursive: boolean }): Promise<string | undefined> {\n return this.fs?.mkdir(path, options);\n }\n async readdir(path: PathLike, options?: ObjectEncodingOptions): Promise<string[]> {\n return this.fs?.readdir(path, options) as Promise<string[]>;\n }\n async rm(path: PathLike, options?: MakeDirectoryOptions & { recursive: boolean }): Promise<void> {\n return this.fs?.rm(path, options);\n }\n async copyFile(source: PathLike, destination: PathLike): Promise<void> {\n return this.fs?.copyFile(source, destination);\n }\n async readfile(path: PathLike, options?: { encoding: BufferEncoding; flag?: string }): Promise<Uint8Array> {\n const ret = (await this.fs?.readFile(path, options)) as Buffer;\n return toArrayBuffer(ret);\n }\n stat(path: PathLike): Promise<Stats> {\n return this.fs?.stat(path) as Promise<Stats>;\n }\n async unlink(path: PathLike): Promise<void> {\n return this.fs?.unlink(path);\n }\n async writefile(path: PathLike, data: Uint8Array | string): Promise<void> {\n if (runtimeFn().isDeno) {\n return this.fs?.writeFile(path, data);\n }\n return this.fs?.writeFile(path, Buffer.from(data));\n }\n}\n\n// import { type NodeMap, join } from \"../../sys-container.js\";\n// import type { ObjectEncodingOptions, PathLike } from \"fs\";\n// import * as fs from \"fs/promises\";\n// import * as path from \"path\";\n// import * as os from \"os\";\n// import * as url from \"url\";\n// import { toArrayBuffer } from \"./utils.js\";\n\n// export async function createNodeSysContainer(): Promise<NodeMap> {\n// // const nodePath = \"node:path\";\n// // const nodeOS = \"node:os\";\n// // const nodeURL = \"node:url\";\n// // const nodeFS = \"node:fs\";\n// // const fs = (await import(\"node:fs\")).promises;\n// // const assert = \"assert\";\n// // const path = await import(\"node:path\");\n// return {\n// state: \"node\",\n// ...path,\n// // ...(await import(\"node:os\")),\n// // ...(await import(\"node:url\")),\n// ...os,\n// ...url,\n// ...fs,\n// join,\n// stat: fs.stat as NodeMap[\"stat\"],\n// readdir: fs.readdir as NodeMap[\"readdir\"],\n// readfile: async (path: PathLike, options?: ObjectEncodingOptions): Promise<Uint8Array> => {\n// const rs = await fs.readFile(path, options);\n// return toArrayBuffer(rs);\n// },\n// writefile: fs.writeFile as NodeMap[\"writefile\"],\n// };\n// }\n","export const FILESTORE_VERSION = \"v0.19-file\";\n","import { FILESTORE_VERSION } from \"../version.js\";\nimport { exception2Result, KeyedResolvOnce, Logger, Result, URI } from \"@adviser/cement\";\nimport { ensureLogger, exceptionWrapper, isNotFoundError, NotFoundError, bs } from \"@fireproof/core\";\nimport { getFileName, getPath } from \"./utils.js\";\nimport type { SuperThis, SysFileSystem } from \"@fireproof/core\";\nimport { getFileSystem } from \"./get-file-system.js\";\n\nconst versionFiles = new KeyedResolvOnce<string>();\n\nexport class FileGateway implements bs.Gateway {\n // abstract readonly storeType: StoreType;\n readonly logger: Logger;\n readonly sthis: SuperThis;\n\n constructor(sthis: SuperThis) {\n this.sthis = sthis;\n this.logger = sthis.logger;\n }\n\n async getVersionFromFile(fs: SysFileSystem, path: string, logger: Logger): Promise<string> {\n return versionFiles.get(path).once(async () => {\n await fs.mkdir(path, { recursive: true });\n const vFile = this.sthis.pathOps.join(path, \"version\");\n const vFileStat = await fs.stat(vFile).catch(() => undefined);\n if (!vFileStat) {\n await fs.writefile(this.sthis.pathOps.join(path, \"version\"), FILESTORE_VERSION);\n return FILESTORE_VERSION;\n } else if (!vFileStat.isFile()) {\n throw logger.Error().Str(\"file\", vFile).Msg(`version file is a directory`).AsError();\n }\n const v = await fs.readfile(vFile);\n const vStr = this.sthis.txt.decode(v);\n if (vStr !== FILESTORE_VERSION) {\n logger.Warn().Str(\"file\", vFile).Str(\"from\", vStr).Str(\"expected\", FILESTORE_VERSION).Msg(`version mismatch`);\n }\n return vStr;\n });\n }\n\n start(baseURL: URI): Promise<Result<URI>> {\n return exception2Result(async () => {\n const fs = await getFileSystem(baseURL);\n const url = baseURL.build();\n url.defParam(\"version\", FILESTORE_VERSION);\n // url.defParam(\"store\", this.storeType);\n const dbUrl = await this.buildUrl(url.URI(), \"dummy\");\n const dbdirFile = this.getFilePath(dbUrl.Ok());\n await fs.mkdir(this.sthis.pathOps.dirname(dbdirFile), { recursive: true });\n const dbroot = this.sthis.pathOps.dirname(dbdirFile);\n this.logger.Debug().Url(url.URI()).Str(\"dbroot\", dbroot).Msg(\"start\");\n url.setParam(\"version\", await this.getVersionFromFile(fs, dbroot, this.logger));\n return url.URI();\n });\n }\n\n async buildUrl(baseUrl: URI, key: string): Promise<Result<URI>> {\n return Result.Ok(baseUrl.build().setParam(\"key\", key).URI());\n }\n\n async close(): Promise<Result<void>> {\n return Result.Ok(undefined);\n }\n // abstract buildUrl(baseUrl: URL, key: string): Promise<Result<URL>>;\n\n getFilePath(url: URI): string {\n const key = url.getParam(\"key\");\n if (!key) throw this.logger.Error().Url(url).Msg(`key not found`).AsError();\n return this.sthis.pathOps.join(getPath(url, this.sthis), getFileName(url, this.sthis));\n }\n\n async put(url: URI, body: Uint8Array): Promise<Result<void>> {\n return exception2Result(async () => {\n const file = await this.getFilePath(url);\n this.logger.Debug().Str(\"url\", url.toString()).Str(\"file\", file).Msg(\"put\");\n await getFileSystem(url).then((fs) => fs.writefile(file, body));\n });\n }\n\n async get(url: URI): Promise<bs.GetResult> {\n return exceptionWrapper(async () => {\n const file = this.getFilePath(url);\n try {\n const res = await getFileSystem(url).then((fs) => fs.readfile(file));\n this.logger.Debug().Url(url.asURL()).Str(\"file\", file).Msg(\"get\");\n return Result.Ok(new Uint8Array(res));\n } catch (e: unknown) {\n // this.logger.Error().Err(e).Str(\"file\", file).Msg(\"get\");\n if (isNotFoundError(e)) {\n return Result.Err(new NotFoundError(`file not found: ${file}`));\n }\n return Result.Err(e as Error);\n }\n });\n }\n\n async delete(url: URI): Promise<Result<void>> {\n return exception2Result(async () => {\n await getFileSystem(url).then((fs) => fs.unlink(this.getFilePath(url)));\n });\n }\n\n async destroy(baseURL: URI): Promise<Result<void>> {\n const url = await this.buildUrl(baseURL, \"x\");\n if (url.isErr()) return url;\n const filepath = this.sthis.pathOps.dirname(this.getFilePath(url.Ok()));\n const fs = await getFileSystem(baseURL);\n let files: string[] = [];\n try {\n files = await fs.readdir(filepath);\n } catch (e: unknown) {\n if (!isNotFoundError(e)) {\n throw this.logger.Error().Err(e).Str(\"dir\", filepath).Msg(\"destroy:readdir\").AsError();\n }\n }\n for (const file of files) {\n const pathed = this.sthis.pathOps.join(filepath, file);\n try {\n await fs.unlink(pathed);\n } catch (e: unknown) {\n if (!isNotFoundError(e)) {\n throw this.logger.Error().Err(e).Str(\"file\", pathed).Msg(\"destroy:unlink\").AsError();\n }\n }\n }\n return Result.Ok(undefined);\n }\n}\n\nexport class FileTestGateway implements bs.TestGateway {\n readonly logger: Logger;\n readonly sthis: SuperThis;\n constructor(sthis: SuperThis) {\n this.logger = ensureLogger(sthis, \"FileTestStore\");\n this.sthis = sthis;\n }\n\n async get(iurl: URI, key: string) {\n const url = iurl.build().setParam(\"key\", key).URI();\n const dbFile = this.sthis.pathOps.join(getPath(url, this.sthis), getFileName(url, this.sthis));\n this.logger.Debug().Url(url).Str(\"dbFile\", dbFile).Msg(\"get\");\n const buffer = await (await getFileSystem(url)).readfile(dbFile);\n this.logger.Debug().Url(url).Str(\"dbFile\", dbFile).Len(buffer).Msg(\"got\");\n return buffer;\n }\n}\n","import type { URI } from \"@adviser/cement\";\nimport { getStore } from \"@fireproof/core\";\nimport type { SuperThis } from \"@fireproof/core\";\n\nexport function getPath(url: URI, sthis: SuperThis): string {\n const basePath = url.pathname;\n // .toString()\n // .replace(new RegExp(`^${url.protocol}//`), \"\")\n // .replace(/\\?.*$/, \"\");\n const name = url.getParam(\"name\");\n if (name) {\n const version = url.getParam(\"version\");\n if (!version) throw sthis.logger.Error().Url(url).Msg(`version not found`).AsError();\n return sthis.pathOps.join(basePath, version, name);\n }\n return sthis.pathOps.join(basePath);\n}\n\nexport function getFileName(url: URI, sthis: SuperThis): string {\n const key = url.getParam(\"key\");\n if (!key) throw sthis.logger.Error().Url(url).Msg(`key not found`).AsError();\n const res = getStore(url, sthis, (...a: string[]) => a.join(\"-\"));\n switch (res.store) {\n case \"data\":\n return sthis.pathOps.join(res.name, key + \".car\");\n case \"wal\":\n case \"meta\":\n return sthis.pathOps.join(res.name, key + \".json\");\n default:\n throw sthis.logger.Error().Url(url).Msg(`unsupported store type`).AsError();\n }\n}\n"],"mappings":"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","names":["import_cement","fs","MemFileSystem","import_cement","import_core","import_core","fs"]}
1
+ {"version":3,"sources":["../../../src/runtime/gateways/file/node/index.ts","../../../src/runtime/gateways/file/node/to-array-buffer.ts","../../../src/runtime/gateways/file/node/node-filesystem.ts","../../../src/runtime/gateways/file/node/get-sys-file-system.ts"],"sourcesContent":["// test needs that\nexport * from \"./get-sys-file-system.js\";\n","export function toArrayBuffer(buffer: Buffer | string): Uint8Array {\n if (typeof buffer === \"string\") {\n buffer = Buffer.from(buffer);\n }\n const ab = new ArrayBuffer(buffer.length);\n const view = new Uint8Array(ab);\n for (let i = 0; i < buffer.length; ++i) {\n view[i] = buffer[i];\n }\n return view;\n}\n","import type { PathLike, MakeDirectoryOptions, Stats, ObjectEncodingOptions } from \"node:fs\";\nimport type { mkdir, readdir, rm, copyFile, readFile, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { toArrayBuffer } from \"./to-array-buffer.js\";\nimport type { SysFileSystem } from \"@fireproof/core\";\nimport { runtimeFn } from \"@adviser/cement\";\n\nexport class NodeFileSystem implements SysFileSystem {\n fs?: {\n mkdir: typeof mkdir;\n readdir: typeof readdir;\n rm: typeof rm;\n copyFile: typeof copyFile;\n readFile: typeof readFile;\n stat: typeof stat;\n unlink: typeof unlink;\n writeFile: typeof writeFile;\n };\n\n async start(): Promise<SysFileSystem> {\n this.fs = await import(\"node:fs/promises\");\n return this;\n }\n async mkdir(path: PathLike, options?: { recursive: boolean }): Promise<string | undefined> {\n return this.fs?.mkdir(path, options);\n }\n async readdir(path: PathLike, options?: ObjectEncodingOptions): Promise<string[]> {\n return this.fs?.readdir(path, options) as Promise<string[]>;\n }\n async rm(path: PathLike, options?: MakeDirectoryOptions & { recursive: boolean }): Promise<void> {\n return this.fs?.rm(path, options);\n }\n async copyFile(source: PathLike, destination: PathLike): Promise<void> {\n return this.fs?.copyFile(source, destination);\n }\n async readfile(path: PathLike, options?: { encoding: BufferEncoding; flag?: string }): Promise<Uint8Array> {\n const ret = (await this.fs?.readFile(path, options)) as Buffer;\n return toArrayBuffer(ret);\n }\n stat(path: PathLike): Promise<Stats> {\n return this.fs?.stat(path) as Promise<Stats>;\n }\n async unlink(path: PathLike): Promise<void> {\n return this.fs?.unlink(path);\n }\n async writefile(path: PathLike, data: Uint8Array | string): Promise<void> {\n if (runtimeFn().isDeno) {\n return this.fs?.writeFile(path, data);\n }\n return this.fs?.writeFile(path, Buffer.from(data));\n }\n}\n\n// import { type NodeMap, join } from \"../../sys-container.js\";\n// import type { ObjectEncodingOptions, PathLike } from \"fs\";\n// import * as fs from \"fs/promises\";\n// import * as path from \"path\";\n// import * as os from \"os\";\n// import * as url from \"url\";\n// import { toArrayBuffer } from \"./utils.js\";\n\n// export async function createNodeSysContainer(): Promise<NodeMap> {\n// // const nodePath = \"node:path\";\n// // const nodeOS = \"node:os\";\n// // const nodeURL = \"node:url\";\n// // const nodeFS = \"node:fs\";\n// // const fs = (await import(\"node:fs\")).promises;\n// // const assert = \"assert\";\n// // const path = await import(\"node:path\");\n// return {\n// state: \"node\",\n// ...path,\n// // ...(await import(\"node:os\")),\n// // ...(await import(\"node:url\")),\n// ...os,\n// ...url,\n// ...fs,\n// join,\n// stat: fs.stat as NodeMap[\"stat\"],\n// readdir: fs.readdir as NodeMap[\"readdir\"],\n// readfile: async (path: PathLike, options?: ObjectEncodingOptions): Promise<Uint8Array> => {\n// const rs = await fs.readFile(path, options);\n// return toArrayBuffer(rs);\n// },\n// writefile: fs.writeFile as NodeMap[\"writefile\"],\n// };\n// }\n","import type { SysFileSystem } from \"@fireproof/core\";\nimport { NodeFileSystem } from \"./node-filesystem.js\";\nimport { ResolveOnce, URI } from \"@adviser/cement\";\n\nconst nfs = new ResolveOnce<SysFileSystem>();\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport async function getSysFileSystem(url: URI): Promise<SysFileSystem> {\n return nfs.once(async () => {\n const nfs = new NodeFileSystem();\n await nfs.start();\n return nfs;\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,SAAS,cAAc,QAAqC;AACjE,MAAI,OAAO,WAAW,UAAU;AAC9B,aAAS,OAAO,KAAK,MAAM;AAAA,EAC7B;AACA,QAAM,KAAK,IAAI,YAAY,OAAO,MAAM;AACxC,QAAM,OAAO,IAAI,WAAW,EAAE;AAC9B,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,EAAE,GAAG;AACtC,SAAK,CAAC,IAAI,OAAO,CAAC;AAAA,EACpB;AACA,SAAO;AACT;;;ACNA,oBAA0B;AAEnB,IAAM,iBAAN,MAA8C;AAAA,EAYnD,MAAM,QAAgC;AACpC,SAAK,KAAK,MAAM,OAAO,aAAkB;AACzC,WAAO;AAAA,EACT;AAAA,EACA,MAAM,MAAM,MAAgB,SAA+D;AACzF,WAAO,KAAK,IAAI,MAAM,MAAM,OAAO;AAAA,EACrC;AAAA,EACA,MAAM,QAAQ,MAAgB,SAAoD;AAChF,WAAO,KAAK,IAAI,QAAQ,MAAM,OAAO;AAAA,EACvC;AAAA,EACA,MAAM,GAAG,MAAgB,SAAwE;AAC/F,WAAO,KAAK,IAAI,GAAG,MAAM,OAAO;AAAA,EAClC;AAAA,EACA,MAAM,SAAS,QAAkB,aAAsC;AACrE,WAAO,KAAK,IAAI,SAAS,QAAQ,WAAW;AAAA,EAC9C;AAAA,EACA,MAAM,SAAS,MAAgB,SAA4E;AACzG,UAAM,MAAO,MAAM,KAAK,IAAI,SAAS,MAAM,OAAO;AAClD,WAAO,cAAc,GAAG;AAAA,EAC1B;AAAA,EACA,KAAK,MAAgC;AACnC,WAAO,KAAK,IAAI,KAAK,IAAI;AAAA,EAC3B;AAAA,EACA,MAAM,OAAO,MAA+B;AAC1C,WAAO,KAAK,IAAI,OAAO,IAAI;AAAA,EAC7B;AAAA,EACA,MAAM,UAAU,MAAgB,MAA0C;AACxE,YAAI,yBAAU,EAAE,QAAQ;AACtB,aAAO,KAAK,IAAI,UAAU,MAAM,IAAI;AAAA,IACtC;AACA,WAAO,KAAK,IAAI,UAAU,MAAM,OAAO,KAAK,IAAI,CAAC;AAAA,EACnD;AACF;;;AChDA,IAAAA,iBAAiC;AAEjC,IAAM,MAAM,IAAI,2BAA2B;AAE3C,eAAsB,iBAAiB,KAAkC;AACvE,SAAO,IAAI,KAAK,YAAY;AAC1B,UAAMC,OAAM,IAAI,eAAe;AAC/B,UAAMA,KAAI,MAAM;AAChB,WAAOA;AAAA,EACT,CAAC;AACH;","names":["import_cement","nfs"]}
package/node/index.d.cts CHANGED
@@ -1,43 +1,7 @@
1
- import { URI, Logger as Logger$1, Result } from '@adviser/cement';
2
- import { rt, Logger, SuperThis, SysFileSystem, bs } from '@fireproof/core';
1
+ import { SysFileSystem } from '@fireproof/core';
2
+ import { URI } from '@adviser/cement';
3
3
 
4
- interface KeyBagCtx {
5
- readonly dirName: string;
6
- readonly sysFS: SysFileSystem;
7
- readonly fName: string;
8
- }
9
- declare class KeyBagProviderFile implements rt.kb.KeyBagProvider {
10
- _prepare(id: string): Promise<KeyBagCtx>;
11
- private readonly url;
12
- readonly logger: Logger;
13
- readonly sthis: SuperThis;
14
- constructor(url: URI, sthis: SuperThis);
15
- get(id: string): Promise<rt.kb.KeyItem | undefined>;
16
- set(id: string, item: rt.kb.KeyItem): Promise<void>;
17
- }
4
+ declare function getSysFileSystem(url: URI): Promise<SysFileSystem>;
18
5
 
19
- declare function getFileSystem(url: URI): Promise<SysFileSystem>;
20
-
21
- declare class FileGateway implements bs.Gateway {
22
- readonly logger: Logger$1;
23
- readonly sthis: SuperThis;
24
- constructor(sthis: SuperThis);
25
- getVersionFromFile(fs: SysFileSystem, path: string, logger: Logger$1): Promise<string>;
26
- start(baseURL: URI): Promise<Result<URI>>;
27
- buildUrl(baseUrl: URI, key: string): Promise<Result<URI>>;
28
- close(): Promise<Result<void>>;
29
- getFilePath(url: URI): string;
30
- put(url: URI, body: Uint8Array): Promise<Result<void>>;
31
- get(url: URI): Promise<bs.GetResult>;
32
- delete(url: URI): Promise<Result<void>>;
33
- destroy(baseURL: URI): Promise<Result<void>>;
34
- }
35
- declare class FileTestGateway implements bs.TestGateway {
36
- readonly logger: Logger$1;
37
- readonly sthis: SuperThis;
38
- constructor(sthis: SuperThis);
39
- get(iurl: URI, key: string): Promise<Uint8Array<ArrayBufferLike>>;
40
- }
41
-
42
- export { FileGateway as GatewayImpl, FileTestGateway as GatewayTestImpl, KeyBagProviderFile, KeyBagProviderFile as KeyBagProviderImpl, getFileSystem };
6
+ export { getSysFileSystem };
43
7
  declare module '@fireproof/core/node'
package/node/index.d.ts CHANGED
@@ -1,43 +1,7 @@
1
- import { URI, Logger as Logger$1, Result } from '@adviser/cement';
2
- import { rt, Logger, SuperThis, SysFileSystem, bs } from '@fireproof/core';
1
+ import { SysFileSystem } from '@fireproof/core';
2
+ import { URI } from '@adviser/cement';
3
3
 
4
- interface KeyBagCtx {
5
- readonly dirName: string;
6
- readonly sysFS: SysFileSystem;
7
- readonly fName: string;
8
- }
9
- declare class KeyBagProviderFile implements rt.kb.KeyBagProvider {
10
- _prepare(id: string): Promise<KeyBagCtx>;
11
- private readonly url;
12
- readonly logger: Logger;
13
- readonly sthis: SuperThis;
14
- constructor(url: URI, sthis: SuperThis);
15
- get(id: string): Promise<rt.kb.KeyItem | undefined>;
16
- set(id: string, item: rt.kb.KeyItem): Promise<void>;
17
- }
4
+ declare function getSysFileSystem(url: URI): Promise<SysFileSystem>;
18
5
 
19
- declare function getFileSystem(url: URI): Promise<SysFileSystem>;
20
-
21
- declare class FileGateway implements bs.Gateway {
22
- readonly logger: Logger$1;
23
- readonly sthis: SuperThis;
24
- constructor(sthis: SuperThis);
25
- getVersionFromFile(fs: SysFileSystem, path: string, logger: Logger$1): Promise<string>;
26
- start(baseURL: URI): Promise<Result<URI>>;
27
- buildUrl(baseUrl: URI, key: string): Promise<Result<URI>>;
28
- close(): Promise<Result<void>>;
29
- getFilePath(url: URI): string;
30
- put(url: URI, body: Uint8Array): Promise<Result<void>>;
31
- get(url: URI): Promise<bs.GetResult>;
32
- delete(url: URI): Promise<Result<void>>;
33
- destroy(baseURL: URI): Promise<Result<void>>;
34
- }
35
- declare class FileTestGateway implements bs.TestGateway {
36
- readonly logger: Logger$1;
37
- readonly sthis: SuperThis;
38
- constructor(sthis: SuperThis);
39
- get(iurl: URI, key: string): Promise<Uint8Array<ArrayBufferLike>>;
40
- }
41
-
42
- export { FileGateway as GatewayImpl, FileTestGateway as GatewayTestImpl, KeyBagProviderFile, KeyBagProviderFile as KeyBagProviderImpl, getFileSystem };
6
+ export { getSysFileSystem };
43
7
  declare module '@fireproof/core/node'