@fireproof/core 0.19.101 → 0.19.102

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. package/{chunk-3EB3ENHT.js → chunk-OFGPKRCM.js} +25 -54
  2. package/chunk-OFGPKRCM.js.map +1 -0
  3. package/chunk-WS3YRPIA.js +75 -0
  4. package/chunk-WS3YRPIA.js.map +1 -0
  5. package/{gateway-GK5QZ6KP.js → gateway-5FCWPX5W.js} +12 -13
  6. package/gateway-5FCWPX5W.js.map +1 -0
  7. package/{gateway-TQTGDRCN.js → gateway-H7UD6TNB.js} +8 -9
  8. package/gateway-H7UD6TNB.js.map +1 -0
  9. package/index.cjs +1571 -1992
  10. package/index.cjs.map +1 -1
  11. package/index.d.cts +117 -257
  12. package/index.d.ts +117 -257
  13. package/index.global.js +12280 -12741
  14. package/index.global.js.map +1 -1
  15. package/index.js +1463 -1790
  16. package/index.js.map +1 -1
  17. package/{key-bag-file-VOSSK46F.js → key-bag-file-WADZBHYG.js} +3 -4
  18. package/{key-bag-file-VOSSK46F.js.map → key-bag-file-WADZBHYG.js.map} +1 -1
  19. package/{key-bag-indexdb-AXTQOSMC.js → key-bag-indexdb-PGVAI3FJ.js} +3 -4
  20. package/{key-bag-indexdb-AXTQOSMC.js.map → key-bag-indexdb-PGVAI3FJ.js.map} +1 -1
  21. package/mem-filesystem-YPPJV7Q2.js +41 -0
  22. package/mem-filesystem-YPPJV7Q2.js.map +1 -0
  23. package/metafile-cjs.json +1 -1
  24. package/metafile-esm.json +1 -1
  25. package/metafile-iife.json +1 -1
  26. package/{node-filesystem-CFRXFSO7.js → node-filesystem-INX4ZTHE.js} +9 -6
  27. package/node-filesystem-INX4ZTHE.js.map +1 -0
  28. package/package.json +1 -1
  29. package/tests/blockstore/keyed-crypto.test.ts +227 -63
  30. package/tests/blockstore/loader.test.ts +11 -19
  31. package/tests/blockstore/store.test.ts +19 -23
  32. package/tests/blockstore/transaction.test.ts +12 -12
  33. package/tests/fireproof/all-gateway.test.ts +193 -201
  34. package/tests/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.ts +316 -324
  35. package/tests/fireproof/config.test.ts +172 -0
  36. package/tests/fireproof/crdt.test.ts +16 -67
  37. package/tests/fireproof/database.test.ts +21 -183
  38. package/tests/fireproof/fireproof.test.ts +74 -83
  39. package/tests/fireproof/hello.test.ts +14 -18
  40. package/tests/fireproof/indexer.test.ts +43 -53
  41. package/tests/fireproof/utils.test.ts +6 -18
  42. package/tests/helpers.ts +9 -27
  43. package/tests/react/useFireproof.test.tsx +1 -1
  44. package/{utils-STA2C35G.js → utils-QO2HIWGI.js} +3 -4
  45. package/chunk-3EB3ENHT.js.map +0 -1
  46. package/chunk-HQ7D3PEU.js +0 -61
  47. package/chunk-HQ7D3PEU.js.map +0 -1
  48. package/chunk-PZ5AY32C.js +0 -10
  49. package/deno-filesystem-Q2IJ7YDR.js +0 -57
  50. package/deno-filesystem-Q2IJ7YDR.js.map +0 -1
  51. package/gateway-GK5QZ6KP.js.map +0 -1
  52. package/gateway-TQTGDRCN.js.map +0 -1
  53. package/key-bag-memory-LWE6ARPX.js +0 -29
  54. package/key-bag-memory-LWE6ARPX.js.map +0 -1
  55. package/node-filesystem-CFRXFSO7.js.map +0 -1
  56. package/tests/blockstore/keyed-crypto-indexdb-file.test.ts +0 -129
  57. package/tests/gateway/file/loader-config.test.ts +0 -303
  58. package/tests/gateway/indexdb/loader-config.test.ts +0 -75
  59. package/utils-STA2C35G.js.map +0 -1
  60. /package/tests/fireproof/{fireproof.fixture.ts → fireproof.test.fixture.ts} +0 -0
  61. /package/{chunk-PZ5AY32C.js.map → utils-QO2HIWGI.js.map} +0 -0
@@ -1,4 +1,4 @@
1
- import { Index, index, Database, CRDT, IndexRows, DatabaseOpts, toStoreURIRuntime, bs, rt, DatabaseFactory } from "@fireproof/core";
1
+ import { Index, index, Database, CRDT, IndexRows } from "@fireproof/core";
2
2
  import { mockSuperThis } from "../helpers";
3
3
 
4
4
  interface TestType {
@@ -14,24 +14,24 @@ describe("basic Index", () => {
14
14
  afterEach(async function () {
15
15
  await db.close();
16
16
  await db.destroy();
17
- // await indexer.close();
18
- // await indexer.destroy();
17
+ await indexer.close();
18
+ await indexer.destroy();
19
19
  });
20
20
  beforeEach(async function () {
21
21
  await sthis.start();
22
- db = DatabaseFactory("test-indexer");
22
+ db = new Database("test-indexer");
23
23
  await db.put({ title: "amazing" });
24
24
  await db.put({ title: "creative" });
25
25
  await db.put({ title: "bazillas" });
26
- indexer = new Index<string, TestType>(sthis, db.crdt, "hello", (doc) => {
26
+ indexer = new Index<string, TestType>(sthis, db._crdt, "hello", (doc) => {
27
27
  didMap = true;
28
28
  return doc.title;
29
29
  });
30
30
  await indexer.ready();
31
31
  });
32
32
  it("should have properties", function () {
33
- expect(indexer.crdt).toBe(db.crdt);
34
- // expect(indexer.crdt.name).toBe("test-indexer");
33
+ expect(indexer.crdt).toBe(db._crdt);
34
+ expect(indexer.crdt.name).toBe("test-indexer");
35
35
  expect(indexer.name).toBe("hello");
36
36
  expect(indexer.mapFn).toBeTruthy();
37
37
  });
@@ -101,17 +101,17 @@ describe("Index query with compound key", function () {
101
101
  afterEach(async function () {
102
102
  await db.close();
103
103
  await db.destroy();
104
- // await indexer.close();
105
- // await indexer.destroy();
104
+ await indexer.close();
105
+ await indexer.destroy();
106
106
  });
107
107
  beforeEach(async function () {
108
108
  await sthis.start();
109
- db = DatabaseFactory("test-indexer");
109
+ db = new Database("test-indexer");
110
110
  await db.put({ title: "amazing", score: 1 });
111
111
  await db.put({ title: "creative", score: 2 });
112
112
  await db.put({ title: "creative", score: 20 });
113
113
  await db.put({ title: "bazillas", score: 3 });
114
- indexer = new Index<[string, number], TestType>(sthis, db.crdt, "hello", (doc) => {
114
+ indexer = new Index<[string, number], TestType>(sthis, db._crdt, "hello", (doc) => {
115
115
  return [doc.title, doc.score];
116
116
  });
117
117
  await indexer.ready();
@@ -131,16 +131,16 @@ describe("basic Index with map fun", function () {
131
131
  afterEach(async function () {
132
132
  await db.close();
133
133
  await db.destroy();
134
- // await indexer.close();
135
- // await indexer.destroy();
134
+ await indexer.close();
135
+ await indexer.destroy();
136
136
  });
137
137
  beforeEach(async function () {
138
138
  await sthis.start();
139
- db = DatabaseFactory("test-indexer");
139
+ db = new Database("test-indexer");
140
140
  await db.put({ title: "amazing" });
141
141
  await db.put({ title: "creative" });
142
142
  await db.put({ title: "bazillas" });
143
- indexer = new Index<string, TestType>(sthis, db.crdt, "hello", (doc, map) => {
143
+ indexer = new Index<string, TestType>(sthis, db._crdt, "hello", (doc, map) => {
144
144
  map(doc.title);
145
145
  });
146
146
  await indexer.ready();
@@ -164,11 +164,11 @@ describe("basic Index with map fun with value", function () {
164
164
  });
165
165
  beforeEach(async function () {
166
166
  await sthis.start();
167
- db = DatabaseFactory("test-indexer");
167
+ db = new Database("test-indexer");
168
168
  await db.put({ title: "amazing" });
169
169
  await db.put({ title: "creative" });
170
170
  await db.put({ title: "bazillas" });
171
- indexer = new Index<string, TestType, number>(sthis, db.crdt, "hello", (doc, map) => {
171
+ indexer = new Index<string, TestType, number>(sthis, db._crdt, "hello", (doc, map) => {
172
172
  map(doc.title, doc.title.length);
173
173
  });
174
174
  });
@@ -199,17 +199,17 @@ describe("Index query with map and compound key", function () {
199
199
  afterEach(async function () {
200
200
  await db.close();
201
201
  await db.destroy();
202
- // await indexer.close();
203
- // await indexer.destroy();
202
+ await indexer.close();
203
+ await indexer.destroy();
204
204
  });
205
205
  beforeEach(async function () {
206
206
  await sthis.start();
207
- db = DatabaseFactory("test-indexer");
207
+ db = new Database("test-indexer");
208
208
  await db.put({ title: "amazing", score: 1 });
209
209
  await db.put({ title: "creative", score: 2 });
210
210
  await db.put({ title: "creative", score: 20 });
211
211
  await db.put({ title: "bazillas", score: 3 });
212
- indexer = new Index<[string, number], TestType>(sthis, db.crdt, "hello", (doc, emit) => {
212
+ indexer = new Index<[string, number], TestType>(sthis, db._crdt, "hello", (doc, emit) => {
213
213
  emit([doc.title, doc.score]);
214
214
  });
215
215
  await indexer.ready();
@@ -229,16 +229,16 @@ describe("basic Index with string fun", function () {
229
229
  afterEach(async function () {
230
230
  await db.close();
231
231
  await db.destroy();
232
- // await indexer.close();
233
- // await indexer.destroy();
232
+ await indexer.close();
233
+ await indexer.destroy();
234
234
  });
235
235
  beforeEach(async function () {
236
236
  await sthis.start();
237
- db = DatabaseFactory("test-indexer");
237
+ db = new Database("test-indexer");
238
238
  await db.put({ title: "amazing" });
239
239
  await db.put({ title: "creative" });
240
240
  await db.put({ title: "bazillas" });
241
- indexer = new Index(sthis, db.crdt, "title");
241
+ indexer = new Index(sthis, db._crdt, "title");
242
242
  await indexer.ready();
243
243
  });
244
244
  it("should get results", async function () {
@@ -265,43 +265,31 @@ describe("basic Index upon cold start", function () {
265
265
  let mapFn: (doc: TestType) => string;
266
266
  let result: IndexRows<string, TestType>;
267
267
  const sthis = mockSuperThis();
268
- let dbOpts: DatabaseOpts;
269
268
  // result, mapFn;
270
269
  afterEach(async function () {
271
270
  await crdt.close();
272
271
  await crdt.destroy();
273
- // await indexer.close();
274
- // await indexer.destroy();
272
+ await indexer.close();
273
+ await indexer.destroy();
275
274
  });
276
275
  beforeEach(async function () {
277
276
  await sthis.start();
278
- const logger = sthis.logger.With().Module("IndexerTest").Logger();
279
- logger.Debug().Msg("enter beforeEach");
280
- dbOpts = {
281
- keyBag: rt.kb.defaultKeyBagOpts(sthis),
282
- storeUrls: toStoreURIRuntime(sthis, "test-indexer-cold"),
283
- storeEnDe: bs.ensureStoreEnDeFile({}),
284
- };
285
- crdt = new CRDT<TestType>(sthis, dbOpts);
277
+ // db = database()
278
+ crdt = new CRDT<TestType>(sthis, "test-indexer-cold", { persistIndexes: true });
286
279
  await crdt.bulk([
287
280
  { id: "abc1", value: { title: "amazing" } },
288
281
  { id: "abc2", value: { title: "creative" } },
289
282
  { id: "abc3", value: { title: "bazillas" } },
290
283
  ]);
291
- logger.Debug().Msg("post bulk beforeEach");
292
284
  didMap = 0;
293
285
  mapFn = (doc) => {
294
286
  didMap++;
295
287
  return doc.title;
296
288
  };
297
- indexer = await index<string, TestType>({ crdt: crdt }, "hello", mapFn);
298
- logger.Debug().Msg("post index beforeEach");
289
+ indexer = await index<string, TestType>(sthis, { _crdt: crdt }, "hello", mapFn);
299
290
  await indexer.ready();
300
- logger.Debug().Msg("post indexer.ready beforeEach");
301
291
  // new Index(db._crdt.indexBlockstore, db._crdt, 'hello', mapFn)
302
292
  result = await indexer.query();
303
-
304
- logger.Debug().Msg("post indexer.query beforeEach");
305
293
  expect(indexer.indexHead).toEqual(crdt.clock.head);
306
294
  });
307
295
  it("should call map on first query", function () {
@@ -314,12 +302,12 @@ describe("basic Index upon cold start", function () {
314
302
  expect(result.rows.length).toEqual(3);
315
303
  });
316
304
  it("should work on cold load", async function () {
317
- const crdt2 = new CRDT<TestType>(sthis, dbOpts);
305
+ const crdt2 = new CRDT<TestType>(sthis, "test-indexer-cold", { persistIndexes: true });
318
306
  await crdt2.ready();
319
307
  const { result, head } = await crdt2.changes();
320
308
  expect(result).toBeTruthy();
321
309
  await crdt2.ready();
322
- const indexer2 = await index<string, TestType>({ crdt: crdt2 }, "hello", mapFn);
310
+ const indexer2 = await index<string, TestType>(sthis, { _crdt: crdt2 }, "hello", mapFn);
323
311
  await indexer2.ready();
324
312
  const result2 = await indexer2.query();
325
313
  expect(indexer2.indexHead).toEqual(head);
@@ -329,8 +317,8 @@ describe("basic Index upon cold start", function () {
329
317
  });
330
318
  it.skip("should not rerun the map function on seen changes", async function () {
331
319
  didMap = 0;
332
- const crdt2 = new CRDT<TestType>(sthis, dbOpts);
333
- const indexer2 = await index({ crdt: crdt2 }, "hello", mapFn);
320
+ const crdt2 = new CRDT<TestType>(sthis, "test-indexer-cold", { persistIndexes: true });
321
+ const indexer2 = await index(sthis, { _crdt: crdt2 }, "hello", mapFn);
334
322
  const { result, head } = await crdt2.changes([]);
335
323
  expect(result.length).toEqual(3);
336
324
  expect(head.length).toEqual(1);
@@ -354,8 +342,10 @@ describe("basic Index upon cold start", function () {
354
342
  expect(didMap).toEqual(1);
355
343
  });
356
344
  it("should ignore meta when map function definiton changes", async function () {
357
- const crdt2 = new CRDT<TestType>(sthis, dbOpts);
358
- const result = await index<string, TestType>({ crdt: crdt2 }, "hello", (doc) => doc.title.split("").reverse().join("")).query();
345
+ const crdt2 = new CRDT<TestType>(sthis, "test-indexer-cold");
346
+ const result = await index<string, TestType>(sthis, { _crdt: crdt2 }, "hello", (doc) =>
347
+ doc.title.split("").reverse().join(""),
348
+ ).query();
359
349
  expect(result.rows.length).toEqual(3);
360
350
  expect(result.rows[0].key).toEqual("evitaerc"); // creative
361
351
  });
@@ -369,20 +359,20 @@ describe("basic Index with no data", function () {
369
359
  afterEach(async function () {
370
360
  await db.close();
371
361
  await db.destroy();
372
- // await indexer.close();
373
- // await indexer.destroy();
362
+ await indexer.close();
363
+ await indexer.destroy();
374
364
  });
375
365
  beforeEach(async function () {
376
366
  await sthis.start();
377
- db = DatabaseFactory("test-indexer");
378
- indexer = new Index<string, TestType>(sthis, db.crdt, "hello", (doc) => {
367
+ db = new Database("test-indexer");
368
+ indexer = new Index<string, TestType>(sthis, db._crdt, "hello", (doc) => {
379
369
  didMap = true;
380
370
  return doc.title;
381
371
  });
382
372
  await indexer.ready();
383
373
  });
384
374
  it("should have properties", function () {
385
- expect(indexer.crdt).toEqual(db.crdt);
375
+ expect(indexer.crdt).toEqual(db._crdt);
386
376
  expect(indexer.name).toEqual("hello");
387
377
  expect(indexer.mapFn).toBeTruthy();
388
378
  });
@@ -1,6 +1,8 @@
1
- import { runtimeFn, URI } from "@adviser/cement";
1
+ import { URI } from "@adviser/cement";
2
2
  import { rt, getStore, ensureSuperLog } from "@fireproof/core";
3
3
  import { mockSuperThis } from "../helpers";
4
+
5
+ // only for test
4
6
  import { UUID } from "uuidv7";
5
7
 
6
8
  describe("utils", () => {
@@ -19,7 +21,7 @@ describe("utils", () => {
19
21
  const storeOpts = [
20
22
  {
21
23
  type: "data",
22
- suffix: ".tar",
24
+ suffix: ".car",
23
25
  },
24
26
  {
25
27
  type: "wal",
@@ -32,16 +34,14 @@ describe("utils", () => {
32
34
  ];
33
35
  it("getfilename plain", () => {
34
36
  for (const store of storeOpts) {
35
- const url = URI.from(`file://./x/path?store=${store.type}&name=name&key=key&version=version&suffix=${store.suffix}`);
37
+ const url = URI.from(`file://./x/path?store=${store.type}&name=name&key=key&version=version`);
36
38
  expect(rt.getFileName(url, logger)).toEqual(`${store.type}/key${store.suffix}`);
37
39
  }
38
40
  });
39
41
 
40
42
  it("getfilename index", () => {
41
43
  for (const store of storeOpts) {
42
- const url = URI.from(
43
- `file://./x/path?index=idx&store=${store.type}&name=name&key=key&version=version&suffix=${store.suffix}`,
44
- );
44
+ const url = URI.from(`file://./x/path?index=idx&store=${store.type}&name=name&key=key&version=version`);
45
45
  expect(rt.getFileName(url, logger)).toEqual(`idx-${store.type}/key${store.suffix}`);
46
46
  }
47
47
  });
@@ -82,15 +82,3 @@ describe("utils", () => {
82
82
  expect(id.slice(0, 15)).toBe("cafebabe-beef-7");
83
83
  });
84
84
  });
85
-
86
- describe("runtime", () => {
87
- it("runtime", () => {
88
- const isNode = !!(typeof process === "object" && process.versions?.node);
89
- expect(runtimeFn()).toEqual({
90
- isBrowser: !isNode,
91
- isDeno: false,
92
- isNodeIsh: isNode,
93
- isReactNative: false,
94
- });
95
- });
96
- });
package/tests/helpers.ts CHANGED
@@ -1,5 +1,7 @@
1
- import { BuildURI, MockLogger, runtimeFn, toCryptoRuntime, URI, utils, LogCollector } from "@adviser/cement";
2
- import { ensureSuperThis, rt, SuperThis, SuperThisOpts, bs, PARAM } from "@fireproof/core";
1
+ import { LogCollector, MockLogger, runtimeFn, toCryptoRuntime, URI } from "@adviser/cement";
2
+ import { dataDir, ensureSuperThis, rt, SuperThis, SuperThisOpts } from "@fireproof/core";
3
+
4
+ export { dataDir };
3
5
 
4
6
  export function sleep(ms: number) {
5
7
  return new Promise((resolve) => setTimeout(resolve, ms));
@@ -35,36 +37,16 @@ export function storageURL(sthis: SuperThis): URI {
35
37
  return merged;
36
38
  }
37
39
 
38
- export type MockSuperThis = SuperThis & { ctx: { logCollector: LogCollector } };
40
+ export type MockSuperThis = SuperThis & { logCollector: LogCollector };
39
41
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
40
42
  export function mockSuperThis(sthis?: Partial<SuperThisOpts>): MockSuperThis {
41
- const mockLog = MockLogger({
42
- pass: new utils.ConsoleWriterStreamDefaultWriter(new utils.ConsoleWriterStream()),
43
- });
44
- return ensureSuperThis({
43
+ const mockLog = MockLogger();
44
+ const ethis = ensureSuperThis({
45
45
  logger: mockLog.logger,
46
46
  ctx: {
47
47
  logCollector: mockLog.logCollector,
48
48
  },
49
49
  }) as MockSuperThis;
50
- }
51
-
52
- export function noopUrl(name?: string): URI {
53
- const burl = BuildURI.from("memory://noop");
54
- burl.setParam(PARAM.NAME, name || "test");
55
- return burl.URI();
56
- }
57
-
58
- export function simpleBlockOpts(sthis: SuperThis, name?: string) {
59
- const url = noopUrl(name);
60
- return {
61
- keyBag: rt.kb.defaultKeyBagOpts(sthis),
62
- storeRuntime: bs.toStoreRuntime(sthis),
63
- storeUrls: {
64
- file: url,
65
- wal: url,
66
- meta: url,
67
- data: url,
68
- },
69
- };
50
+ ethis.logCollector = mockLog.logCollector;
51
+ return ethis;
70
52
  }
@@ -13,7 +13,7 @@ describe("HOOK: useFireproof", () => {
13
13
  const { database, useLiveQuery, useDocument } = useFireproof("dbname");
14
14
  expect(typeof useLiveQuery).toBe("function");
15
15
  expect(typeof useDocument).toBe("function");
16
- expect(database?.constructor.name).toMatch(/^Database/);
16
+ expect(database?.constructor.name).toBe("Database");
17
17
  });
18
18
  });
19
19
  });
@@ -3,13 +3,12 @@ import {
3
3
  getFileSystem,
4
4
  getPath,
5
5
  toArrayBuffer
6
- } from "./chunk-HQ7D3PEU.js";
7
- import "./chunk-3EB3ENHT.js";
8
- import "./chunk-PZ5AY32C.js";
6
+ } from "./chunk-WS3YRPIA.js";
7
+ import "./chunk-OFGPKRCM.js";
9
8
  export {
10
9
  getFileName,
11
10
  getFileSystem,
12
11
  getPath,
13
12
  toArrayBuffer
14
13
  };
15
- //# sourceMappingURL=utils-STA2C35G.js.map
14
+ //# sourceMappingURL=utils-QO2HIWGI.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/types.ts","../../src/utils.ts"],"sourcesContent":["import type { EventLink } from \"@web3-storage/pail/clock/api\";\nimport type { Operation } from \"@web3-storage/pail/crdt/api\";\n\nimport type { DbMeta, AnyLink, StoreUrlsOpts, StoreEnDeFile } from \"./blockstore/index.js\";\nimport { EnvFactoryOpts, Env, Logger, CryptoRuntime } from \"@adviser/cement\";\n\n// import type { MakeDirectoryOptions, PathLike, Stats } from \"fs\";\nimport { KeyBagOpts } from \"./runtime/key-bag.js\";\n\nexport type Falsy = false | null | undefined;\n\nexport function isFalsy(value: unknown): value is Falsy {\n return value === false && value === null && value === undefined;\n}\n\nexport enum PARAM {\n SUFFIX = \"suffix\",\n URL_GEN = \"urlGen\", // \"urlGen\" | \"default\"\n STORE_KEY = \"storekey\",\n STORE = \"store\",\n KEY = \"key\",\n INDEX = \"index\",\n NAME = \"name\",\n VERSION = \"version\",\n FRAG_SIZE = \"fragSize\",\n IV_VERIFY = \"ivVerify\",\n IV_HASH = \"ivHash\",\n FRAG_FID = \"fid\",\n FRAG_OFS = \"ofs\",\n FRAG_LEN = \"len\",\n FRAG_HEAD = \"headerSize\",\n // FS = \"fs\",\n}\n\nexport function throwFalsy<T>(value: T | Falsy): T {\n if (isFalsy(value)) {\n throw new Error(\"value is Falsy\");\n }\n return value;\n}\n\nexport function falsyToUndef<T>(value: T | Falsy): T | undefined {\n if (isFalsy(value)) {\n return undefined;\n }\n return value;\n}\n\nexport type StoreType = \"data\" | \"wal\" | \"meta\";\nexport interface FPStats {\n isFile(): boolean;\n isDirectory(): boolean;\n isBlockDevice(): boolean;\n isCharacterDevice(): boolean;\n isSymbolicLink(): boolean;\n isFIFO(): boolean;\n isSocket(): boolean;\n uid: number | Falsy;\n gid: number | Falsy;\n size: number | Falsy;\n atime: Date | Falsy;\n mtime: Date | Falsy;\n ctime: Date | Falsy;\n birthtime: Date | Falsy;\n}\n\nexport interface SysFileSystem {\n start(): Promise<SysFileSystem>;\n mkdir(path: string, options?: { recursive: boolean }): Promise<string | undefined>;\n readdir(path: string /*, options?: unknown*/): Promise<string[]>;\n rm(path: string, options?: { recursive: boolean }): Promise<void>;\n copyFile(source: string, destination: string): Promise<void>;\n readfile(path: string /*, options?: { encoding: BufferEncoding; flag?: string }*/): Promise<Uint8Array>;\n stat(path: string): Promise<FPStats>;\n unlink(path: string): Promise<void>;\n writefile(path: string, data: Uint8Array | string): Promise<void>;\n}\n\nexport interface PathOps {\n join(...args: string[]): string;\n dirname(path: string): string;\n basename(path: string): string;\n}\n\nexport interface TextEndeCoder {\n encode(input: string): Uint8Array;\n decode(input: Uint8Array): string;\n}\nexport interface SuperThisOpts {\n // readonly crypto?: CryptoRuntime;\n readonly logger: Logger;\n readonly pathOps: PathOps;\n readonly crypto: CryptoRuntime;\n readonly env: EnvFactoryOpts;\n readonly txt: TextEndeCoder;\n readonly ctx: Record<string, unknown>;\n}\n\nexport interface SuperThis {\n readonly logger: Logger;\n readonly env: Env;\n readonly pathOps: PathOps;\n readonly ctx: Record<string, unknown>;\n readonly txt: TextEndeCoder;\n timeOrderedNextId(time?: number): { str: string; toString: () => string };\n nextId(bytes?: number): { str: string; bin: Uint8Array; toString: () => string };\n start(): Promise<void>;\n clone(override: Partial<SuperThisOpts>): SuperThis;\n}\n\nexport interface ConfigOpts extends Partial<SuperThisOpts> {\n readonly public?: boolean;\n readonly meta?: DbMeta;\n // readonly persistIndexes?: boolean;\n readonly autoCompact?: number;\n readonly storeUrls?: StoreUrlsOpts;\n readonly storeEnDe?: StoreEnDeFile;\n readonly threshold?: number;\n readonly keyBag?: Partial<KeyBagOpts>;\n}\n\nexport type ClockLink = EventLink<Operation>;\n\nexport type ClockHead = ClockLink[];\n\nexport type DocFragment = Uint8Array | string | number | boolean | null | AnyLink | DocFragment[] | object;\n// | { [key: string]: DocFragment };\n\nexport type DocLiteral = string | number | boolean | Uint8Array | unknown;\n\nexport type DocObject = NonNullable<unknown>;\nexport type DocTypes = DocObject;\n\nexport type DocRecord<T extends DocObject> = T;\n\nexport type UnknownDoc = DocRecord<never>;\n\nexport type DocFiles = Record<string, DocFileMeta | File>;\n\nexport interface DocBase {\n readonly _id: string;\n readonly _files?: DocFiles;\n readonly _publicFiles?: DocFiles;\n readonly _deleted?: boolean;\n}\n\nexport type DocWithId<T extends DocTypes> = DocBase & T;\n\nexport type DocSet<T extends DocTypes> = Partial<DocBase> & T;\n\nexport interface DocFileMeta {\n readonly type: string;\n readonly size: number;\n readonly cid: AnyLink;\n readonly car?: AnyLink;\n url?: string;\n file?: () => Promise<File>;\n}\n\nexport interface DocUpdate<T extends DocTypes> {\n readonly id: string;\n readonly value?: DocSet<T>;\n readonly del?: boolean;\n readonly clock?: ClockLink; // would be useful to give ClockLinks a type\n}\n\n// todo merge into above\nexport interface DocValue<T extends DocTypes> {\n readonly doc: DocWithId<T>;\n readonly del: boolean;\n readonly cid: AnyLink;\n}\n\nexport type KeyLiteral = string | number | boolean;\nexport type IndexKeyType = KeyLiteral | KeyLiteral[];\nexport type IndexKey<K extends IndexKeyType> = [K, string];\n\nexport interface IndexUpdate<K extends IndexKeyType> {\n readonly key: IndexKey<K>;\n readonly value?: DocFragment;\n readonly del?: boolean;\n}\n\nexport interface IndexUpdateString {\n readonly key: string;\n readonly value?: DocFragment;\n readonly del?: boolean;\n}\n\n// export interface IndexRowObject<K extends IndexKeyType, T extends DocObject> {\n// readonly id: string;\n// readonly key: K;\n// readonly value: T\n// // readonly row: T // DocFragment;\n// // readonly doc?: DocWithId<T>;\n// // value?: T;\n// // readonly del?: boolean;\n// }\n\n// export interface IndexRowLiteral<K extends IndexKeyType, T extends DocLiteral> {\n// readonly id: string;\n// readonly key: IndexKey<K>;\n// readonly value: T\n// }\n\n// export type IndexRow<K extends IndexKeyType, T extends DocTypes> =\n// T extends DocLiteral ? IndexRowLiteral<K, T> : IndexRowObject<K, T>\n\nexport interface IndexRow<K extends IndexKeyType, T extends DocObject, R extends DocFragment> {\n readonly id: string;\n readonly key: K; // IndexKey<K>;\n readonly value: R;\n readonly doc?: DocWithId<T>;\n}\n\nexport interface IndexRows<K extends IndexKeyType, T extends DocObject, R extends DocFragment = T> {\n readonly rows: IndexRow<K, T, R>[];\n}\nexport interface CRDTMeta {\n readonly head: ClockHead;\n}\n\nexport interface IndexTransactionMeta {\n readonly indexes: Record<string, IdxMeta>;\n}\n\nexport interface FileTransactionMeta {\n readonly files?: AnyLink[];\n}\n\nexport type MetaType = CRDTMeta | IndexTransactionMeta | FileTransactionMeta;\n\nexport interface IdxMeta {\n readonly byId: AnyLink;\n readonly byKey: AnyLink;\n readonly map: string;\n readonly name: string;\n readonly head: ClockHead;\n}\n\nexport interface IdxMetaMap {\n readonly indexes?: Map<string, IdxMeta>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface QueryOpts<K extends IndexKeyType> {\n readonly descending?: boolean;\n readonly limit?: number;\n includeDocs?: boolean;\n readonly range?: [IndexKeyType, IndexKeyType];\n readonly key?: DocFragment;\n readonly keys?: DocFragment[];\n prefix?: IndexKeyType;\n}\n\nexport interface AllDocsQueryOpts extends QueryOpts<string> {\n readonly key?: string;\n readonly keys?: string[];\n prefix?: string;\n}\n\nexport interface AllDocsResponse<T extends DocTypes> {\n readonly rows: {\n readonly key: string;\n readonly value: DocWithId<T>;\n }[];\n readonly clock: ClockHead;\n readonly name?: string;\n}\n\ntype EmitFn = (k: IndexKeyType, v?: DocFragment) => void;\nexport type MapFn<T extends DocTypes> = (doc: DocWithId<T>, emit: EmitFn) => DocFragment | unknown;\n\nexport interface ChangesOptions {\n readonly dirty?: boolean;\n readonly limit?: number;\n}\n\nexport interface ChangesResponseRow<T extends DocTypes> {\n readonly key: string;\n readonly value: DocWithId<T>;\n readonly clock?: ClockLink;\n}\n\nexport interface ChangesResponse<T extends DocTypes> {\n readonly clock: ClockHead;\n readonly rows: ChangesResponseRow<T>[];\n readonly name?: string;\n}\n\nexport interface DocResponse {\n readonly id: string;\n readonly clock: ClockHead;\n readonly name?: string;\n}\n\nexport type UpdateListenerFn<T extends DocTypes> = (docs: DocWithId<T>[]) => Promise<void> | void;\nexport type NoUpdateListenerFn = () => Promise<void> | void;\nexport type ListenerFn<T extends DocTypes> = UpdateListenerFn<T> | NoUpdateListenerFn;\n\nexport interface CRDTEntry {\n data: string;\n parents: string[];\n cid: string;\n}\n","import {\n Logger,\n LoggerImpl,\n IsLogger,\n Result,\n ResolveOnce,\n isURL,\n URI,\n envFactory,\n Env,\n toCryptoRuntime,\n CryptoRuntime,\n JSONFormatter,\n YAMLFormatter,\n} from \"@adviser/cement\";\nimport { PARAM, PathOps, StoreType, SuperThis, SuperThisOpts, TextEndeCoder } from \"./types\";\nimport { base58btc } from \"multiformats/bases/base58\";\n\nexport type { Logger };\nexport { Result };\n\nconst globalLogger: Logger = new LoggerImpl();\n\nconst registerFP_DEBUG = new ResolveOnce();\n\ninterface superThisOpts {\n readonly logger: Logger;\n readonly env: Env;\n readonly pathOps: PathOps;\n readonly crypto: CryptoRuntime;\n readonly ctx: Record<string, unknown>;\n readonly txt: TextEndeCoder;\n}\n\nclass superThis implements SuperThis {\n readonly logger: Logger;\n readonly env: Env;\n readonly pathOps: PathOps;\n readonly ctx: Record<string, unknown>;\n readonly txt: TextEndeCoder;\n readonly crypto: CryptoRuntime;\n\n constructor(opts: superThisOpts) {\n this.logger = opts.logger;\n this.env = opts.env;\n this.crypto = opts.crypto;\n this.pathOps = opts.pathOps;\n this.txt = opts.txt;\n this.ctx = { ...opts.ctx };\n // console.log(\"superThis\", this);\n }\n\n nextId(bytes = 6): { str: string; bin: Uint8Array } {\n const bin = this.crypto.randomBytes(bytes);\n return {\n str: base58btc.encode(bin),\n bin,\n };\n }\n\n timeOrderedNextId(now?: number): { str: string } {\n now = typeof now === \"number\" ? now : new Date().getTime();\n // 49th bit\n const t = (0x1000000000000 + now).toString(16).replace(/^1/, \"\");\n const bin = this.crypto.randomBytes(10);\n bin[1] = (bin[1] & 0xf0) | (bin[1] | 0x08 && 0x0b);\n const hex = Array.from(bin)\n .map((i) => i.toString(16).padStart(2, \"0\"))\n .join(\"\");\n return {\n str: `${t.slice(0, 8)}-${t.slice(8)}-7${hex.slice(0, 3)}-${hex.slice(3, 7)}-${hex.slice(7, 19)}`,\n };\n }\n\n start(): Promise<void> {\n return Promise.resolve();\n }\n\n clone(override: Partial<SuperThisOpts>): SuperThis {\n return new superThis({\n logger: override.logger || this.logger,\n env: envFactory(override.env) || this.env,\n crypto: override.crypto || this.crypto,\n pathOps: override.pathOps || this.pathOps,\n txt: override.txt || this.txt,\n ctx: { ...this.ctx, ...override.ctx },\n });\n }\n}\n\n// const pathOps =\nfunction presetEnv() {\n const penv = new Map([\n // [\"FP_DEBUG\", \"xxx\"],\n // [\"FP_ENV\", \"development\"],\n ...Array.from(\n Object.entries(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ((globalThis as any)[Symbol.for(\"FP_PRESET_ENV\")] || {}) as Record<string, string>,\n ),\n ), // .map(([k, v]) => [k, v as string])\n ]);\n // console.log(\">>>>>>\", penv)\n return penv;\n}\n// const envImpl = envFactory({\n// symbol: \"FP_ENV\",\n// presetEnv: presetEnv(),\n// });\nclass pathOpsImpl implements PathOps {\n join(...paths: string[]): string {\n return paths.map((i) => i.replace(/\\/+$/, \"\")).join(\"/\");\n }\n dirname(path: string) {\n return path.split(\"/\").slice(0, -1).join(\"/\");\n }\n basename(path: string): string {\n return path.split(\"/\").pop() || \"\";\n }\n // homedir() {\n // throw new Error(\"SysContainer:homedir is not available in seeded state\");\n // }\n}\nconst pathOps = new pathOpsImpl();\nconst txtOps = {\n encode: (input: string) => new TextEncoder().encode(input),\n decode: (input: Uint8Array) => new TextDecoder().decode(input),\n};\n\nexport function ensureSuperThis(osthis?: Partial<SuperThisOpts>): SuperThis {\n const env = envFactory({\n symbol: osthis?.env?.symbol || \"FP_ENV\",\n presetEnv: osthis?.env?.presetEnv || presetEnv(),\n });\n return new superThis({\n logger: osthis?.logger || globalLogger,\n env,\n crypto: osthis?.crypto || toCryptoRuntime(),\n ctx: osthis?.ctx || {},\n pathOps,\n txt: osthis?.txt || txtOps,\n });\n}\n\n// // eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function ensureSuperLog(sthis: SuperThis, componentName: string, ctx?: Record<string, unknown>): SuperThis {\n return sthis.clone({\n logger: ensureLogger(sthis, componentName, ctx),\n });\n}\n\nexport function ensureLogger(\n sthis: SuperThis /* 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(sthis)) {\n logger = sthis;\n } else if (sthis && IsLogger(sthis.logger)) {\n logger = sthis.logger;\n }\n const cLogger = logger.With().Module(componentName); //.Str(\"this\", uuidv7());\n const debug: string[] = [];\n let exposeStack = false;\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 (\"exposeStack\" in ctx) {\n exposeStack = true;\n delete ctx.exposeStack;\n }\n if (\"exposeStack\" in ctx) {\n exposeStack = true;\n delete ctx.exposeStack;\n }\n if (\"this\" in ctx) {\n cLogger.Str(\"this\", sthis.nextId(4).str);\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 (isURL(value)) {\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 sthis.env.onSet(\n (key, value) => {\n // console.log(\"FP_DEBUG\", key, value, debug)\n switch (key) {\n case \"FP_FORMAT\": {\n switch (value) {\n case \"jsonice\":\n logger.SetFormatter(new JSONFormatter(logger.TxtEnDe(), 2));\n break;\n case \"yaml\":\n logger.SetFormatter(new YAMLFormatter(logger.TxtEnDe(), 2));\n break;\n case \"json\":\n default:\n logger.SetFormatter(new JSONFormatter(logger.TxtEnDe()));\n break;\n }\n break;\n }\n case \"FP_DEBUG\":\n logger.SetDebug(value || []);\n break;\n case \"FP_STACK\":\n logger.SetExposeStack(!!value);\n break;\n }\n },\n \"FP_FORMAT\",\n \"FP_DEBUG\",\n \"FP_STACK\",\n );\n })\n .finally(() => {\n /* do nothing */\n });\n\n if (debug.length > 0) {\n logger.SetDebug(debug);\n }\n if (exposeStack) {\n logger.SetExposeStack(true);\n }\n const out = cLogger.Logger();\n if (sthis.env.get(\"FP_CONSTRUCTOR_DEBUG\")) {\n out.Debug().Msg(\"constructor\");\n }\n return out;\n}\n\nexport type Joiner = (...toJoin: string[]) => string;\n\nexport interface Store {\n readonly store: StoreType;\n readonly name: string;\n}\n\nexport function getStore(url: URI, sthis: SuperThis, joiner: Joiner): Store {\n const store = url.getParam(PARAM.STORE);\n switch (store) {\n case \"data\":\n case \"wal\":\n case \"meta\":\n break;\n default:\n throw sthis.logger.Error().Url(url).Msg(`store not found`).AsError();\n throw sthis.logger.Error().Url(url).Msg(`store not found`).AsError();\n }\n let name: string = store;\n if (url.hasParam(\"index\")) {\n name = joiner(url.getParam(PARAM.INDEX) || \"idx\", name);\n }\n return { store, name };\n}\n\nexport function getKey(url: URI, logger: Logger): string {\n const result = url.getParam(PARAM.KEY);\n if (!result) throw logger.Error().Str(\"url\", url.toString()).Msg(`key not found`).AsError();\n return result;\n}\n\nexport function getName(sthis: SuperThis, url: URI): string {\n let result = url.getParam(PARAM.NAME);\n if (!result) {\n result = sthis.pathOps.dirname(url.pathname);\n if (result.length === 0) {\n throw sthis.logger.Error().Str(\"url\", url.toString()).Msg(`name not found`).AsError();\n }\n }\n return result;\n}\n\n// export 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\n// // the big side effect party --- hate it\n// export function sanitizeURL(url: URL) {\n// url.searchParams.sort();\n// // const searchParams = Object.entries(url.searchParams).sort(([a], [b]) => a.localeCompare(b));\n// // console.log(\"searchParams\", searchParams);\n// // for (const [key] of searchParams) {\n// // url.searchParams.delete(key);\n// // }\n// // for (const [key, value] of searchParams) {\n// // url.searchParams.set(key, value);\n// // }\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 function UInt8ArrayEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n"],"mappings":"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","names":["PARAM"]}
package/chunk-HQ7D3PEU.js DELETED
@@ -1,61 +0,0 @@
1
- import {
2
- getStore
3
- } from "./chunk-3EB3ENHT.js";
4
-
5
- // src/runtime/gateways/file/utils.ts
6
- import { runtimeFn } from "@adviser/cement";
7
- async function getFileSystem(url) {
8
- let fs;
9
- if (runtimeFn().isDeno) {
10
- const { DenoFileSystem } = await import("./deno-filesystem-Q2IJ7YDR.js");
11
- fs = new DenoFileSystem();
12
- } else if (runtimeFn().isNodeIsh) {
13
- const { NodeFileSystem } = await import("./node-filesystem-CFRXFSO7.js");
14
- fs = new NodeFileSystem();
15
- } else {
16
- throw new Error("unsupported runtime");
17
- }
18
- return fs.start();
19
- }
20
- function getPath(url, sthis) {
21
- const basePath = url.pathname;
22
- const name = url.getParam("name" /* NAME */);
23
- if (name) {
24
- return sthis.pathOps.join(basePath, name);
25
- }
26
- return sthis.pathOps.join(basePath);
27
- }
28
- function getFileName(url, sthis) {
29
- const key = url.getParam("key" /* KEY */);
30
- if (!key) throw sthis.logger.Error().Url(url).Msg(`key not found`).AsError();
31
- const res = getStore(url, sthis, (...a) => a.join("-"));
32
- switch (res.store) {
33
- case "data": {
34
- return sthis.pathOps.join(res.name, key + (url.getParam("suffix" /* SUFFIX */) || ""));
35
- }
36
- case "wal":
37
- case "meta":
38
- return sthis.pathOps.join(res.name, key + ".json");
39
- default:
40
- throw sthis.logger.Error().Url(url).Msg(`unsupported store type`).AsError();
41
- }
42
- }
43
- function toArrayBuffer(buffer) {
44
- if (typeof buffer === "string") {
45
- buffer = Buffer.from(buffer);
46
- }
47
- const ab = new ArrayBuffer(buffer.length);
48
- const view = new Uint8Array(ab);
49
- for (let i = 0; i < buffer.length; ++i) {
50
- view[i] = buffer[i];
51
- }
52
- return view;
53
- }
54
-
55
- export {
56
- getFileSystem,
57
- getPath,
58
- getFileName,
59
- toArrayBuffer
60
- };
61
- //# sourceMappingURL=chunk-HQ7D3PEU.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/runtime/gateways/file/utils.ts"],"sourcesContent":["import { runtimeFn, URI } from \"@adviser/cement\";\nimport { getStore } from \"../../../utils.js\";\nimport { PARAM, SuperThis, SysFileSystem } from \"../../../types.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport async function getFileSystem(url: URI): Promise<SysFileSystem> {\n // const name = url.getParam(PARAM.FS);\n // let fs: SysFileSystem;\n // switch (name) {\n // case \"mem\":\n // {\n // const { MemFileSystem } = await import(\"./mem-filesystem.js\");\n // fs = new MemFileSystem();\n // }\n // break;\n // case \"node\":\n // case \"sys\":\n // default: {\n let fs: SysFileSystem;\n if (runtimeFn().isDeno) {\n const { DenoFileSystem } = await import(\"./deno-filesystem.js\");\n fs = new DenoFileSystem();\n } else if (runtimeFn().isNodeIsh) {\n const { NodeFileSystem } = await import(\"./node-filesystem.js\");\n fs = new NodeFileSystem();\n } else {\n throw new Error(\"unsupported runtime\");\n }\n return fs.start();\n}\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(PARAM.NAME);\n if (name) {\n // const version = url.getParam(PARAM.VERSION);\n // if (!version) throw sthis.logger.Error().Url(url).Msg(`version not found`).AsError();\n // if (!url.hasParam(PARAM.URL_GEN) || url.getParam(PARAM.URL_GEN) === \"default\") {\n return sthis.pathOps.join(basePath, name);\n // }\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(PARAM.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 // if (!url.hasParam(PARAM.SUFFIX)) {\n // throw sthis.logger.Error().Url(url).Msg(`unsupported suffix`).AsError();\n // }\n return sthis.pathOps.join(res.name, key + (url.getParam(PARAM.SUFFIX) || \"\"));\n }\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\nexport 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"],"mappings":";;;;;AAAA,SAAS,iBAAsB;AAK/B,eAAsB,cAAc,KAAkC;AAapE,MAAI;AACJ,MAAI,UAAU,EAAE,QAAQ;AACtB,UAAM,EAAE,eAAe,IAAI,MAAM,OAAO,+BAAsB;AAC9D,SAAK,IAAI,eAAe;AAAA,EAC1B,WAAW,UAAU,EAAE,WAAW;AAChC,UAAM,EAAE,eAAe,IAAI,MAAM,OAAO,+BAAsB;AAC9D,SAAK,IAAI,eAAe;AAAA,EAC1B,OAAO;AACL,UAAM,IAAI,MAAM,qBAAqB;AAAA,EACvC;AACA,SAAO,GAAG,MAAM;AAClB;AAEO,SAAS,QAAQ,KAAU,OAA0B;AAC1D,QAAM,WAAW,IAAI;AAIrB,QAAM,OAAO,IAAI,0BAAmB;AACpC,MAAI,MAAM;AAIR,WAAO,MAAM,QAAQ,KAAK,UAAU,IAAI;AAAA,EAG1C;AACA,SAAO,MAAM,QAAQ,KAAK,QAAQ;AACpC;AAEO,SAAS,YAAY,KAAU,OAA0B;AAC9D,QAAM,MAAM,IAAI,wBAAkB;AAClC,MAAI,CAAC,IAAK,OAAM,MAAM,OAAO,MAAM,EAAE,IAAI,GAAG,EAAE,IAAI,eAAe,EAAE,QAAQ;AAC3E,QAAM,MAAM,SAAS,KAAK,OAAO,IAAI,MAAgB,EAAE,KAAK,GAAG,CAAC;AAChE,UAAQ,IAAI,OAAO;AAAA,IACjB,KAAK,QAAQ;AAIX,aAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,OAAO,IAAI,8BAAqB,KAAK,GAAG;AAAA,IAC9E;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AACH,aAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,MAAM,OAAO;AAAA,IACnD;AACE,YAAM,MAAM,OAAO,MAAM,EAAE,IAAI,GAAG,EAAE,IAAI,wBAAwB,EAAE,QAAQ;AAAA,EAC9E;AACF;AAEO,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;","names":[]}
package/chunk-PZ5AY32C.js DELETED
@@ -1,10 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __export = (target, all) => {
3
- for (var name in all)
4
- __defProp(target, name, { get: all[name], enumerable: true });
5
- };
6
-
7
- export {
8
- __export
9
- };
10
- //# sourceMappingURL=chunk-PZ5AY32C.js.map
@@ -1,57 +0,0 @@
1
- import "./chunk-PZ5AY32C.js";
2
-
3
- // src/runtime/gateways/file/deno-filesystem.ts
4
- var DenoFileSystem = class {
5
- async start() {
6
- this.fs = Deno;
7
- return this;
8
- }
9
- async mkdir(path, options) {
10
- return this.fs?.mkdir(path, options).then(() => path);
11
- }
12
- async readdir(path) {
13
- const ret = [];
14
- for await (const dirEntry of this.fs.readdir(path)) {
15
- ret.push(dirEntry.name);
16
- }
17
- return ret;
18
- }
19
- async rm(path, options) {
20
- return this.fs?.rm(path, options);
21
- }
22
- async copyFile(source, destination) {
23
- return this.fs?.copyFile(source, destination);
24
- }
25
- async readfile(path) {
26
- return this.fs.readFile(path);
27
- }
28
- async stat(path) {
29
- const x = await this.fs.stat(path);
30
- return {
31
- isFile: () => x.isFile,
32
- isDirectory: () => x.isDirectory,
33
- isBlockDevice: () => !!x.isBlockDevice,
34
- isCharacterDevice: () => !!x.isCharDevice,
35
- isSymbolicLink: () => !!x.isSymlink,
36
- isFIFO: () => !!x.isFifo,
37
- isSocket: () => !!x.isSocket,
38
- uid: x.uid,
39
- gid: x.gid,
40
- size: x.size,
41
- atime: x.atime,
42
- mtime: x.mtime,
43
- ctime: x.birthtime,
44
- birthtime: x.birthtime
45
- };
46
- }
47
- async unlink(path) {
48
- return this.fs?.unlink(path);
49
- }
50
- async writefile(path, data) {
51
- return this.fs?.writeFile(path, Buffer.from(data));
52
- }
53
- };
54
- export {
55
- DenoFileSystem
56
- };
57
- //# sourceMappingURL=deno-filesystem-Q2IJ7YDR.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/runtime/gateways/file/deno-filesystem.ts"],"sourcesContent":["import { FPStats, SysFileSystem } from \"../../../types.js\";\n\nexport class DenoFileSystem implements SysFileSystem {\n fs?: {\n mkdir: typeof Deno.mkdir;\n readdir: typeof Deno.readDir;\n rm: typeof Deno.remove;\n copyFile: typeof Deno.copyFile;\n readFile: typeof Deno.readFile;\n stat: typeof Deno.stat;\n unlink: typeof Deno.remove;\n writeFile: typeof Deno.writeFile;\n };\n\n async start(): Promise<SysFileSystem> {\n this.fs = Deno as unknown as DenoFileSystem[\"fs\"];\n return this;\n }\n async mkdir(path: string, options?: { recursive: boolean }): Promise<string | undefined> {\n return this.fs?.mkdir(path, options).then(() => path);\n }\n async readdir(path: string): Promise<string[]> {\n const ret = [];\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n for await (const dirEntry of this.fs!.readdir(path)) {\n ret.push(dirEntry.name);\n }\n return ret;\n }\n async rm(path: string, options?: { recursive: boolean }): Promise<void> {\n return this.fs?.rm(path, options);\n }\n async copyFile(source: string, destination: string): Promise<void> {\n return this.fs?.copyFile(source, destination);\n }\n async readfile(path: string): Promise<Uint8Array> {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.fs!.readFile(path);\n }\n async stat(path: string): Promise<FPStats> {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const x = await this.fs!.stat(path);\n return {\n isFile: () => x.isFile,\n isDirectory: () => x.isDirectory,\n isBlockDevice: () => !!x.isBlockDevice,\n isCharacterDevice: () => !!x.isCharDevice,\n isSymbolicLink: () => !!x.isSymlink,\n isFIFO: () => !!x.isFifo,\n isSocket: () => !!x.isSocket,\n uid: x.uid,\n gid: x.gid,\n size: x.size,\n atime: x.atime,\n mtime: x.mtime,\n ctime: x.birthtime,\n birthtime: x.birthtime,\n };\n }\n async unlink(path: string): Promise<void> {\n return this.fs?.unlink(path);\n }\n async writefile(path: string, data: Uint8Array | string): Promise<void> {\n return this.fs?.writeFile(path, Buffer.from(data));\n }\n}\n"],"mappings":";;;AAEO,IAAM,iBAAN,MAA8C;AAAA,EAYnD,MAAM,QAAgC;AACpC,SAAK,KAAK;AACV,WAAO;AAAA,EACT;AAAA,EACA,MAAM,MAAM,MAAc,SAA+D;AACvF,WAAO,KAAK,IAAI,MAAM,MAAM,OAAO,EAAE,KAAK,MAAM,IAAI;AAAA,EACtD;AAAA,EACA,MAAM,QAAQ,MAAiC;AAC7C,UAAM,MAAM,CAAC;AAEb,qBAAiB,YAAY,KAAK,GAAI,QAAQ,IAAI,GAAG;AACnD,UAAI,KAAK,SAAS,IAAI;AAAA,IACxB;AACA,WAAO;AAAA,EACT;AAAA,EACA,MAAM,GAAG,MAAc,SAAiD;AACtE,WAAO,KAAK,IAAI,GAAG,MAAM,OAAO;AAAA,EAClC;AAAA,EACA,MAAM,SAAS,QAAgB,aAAoC;AACjE,WAAO,KAAK,IAAI,SAAS,QAAQ,WAAW;AAAA,EAC9C;AAAA,EACA,MAAM,SAAS,MAAmC;AAEhD,WAAO,KAAK,GAAI,SAAS,IAAI;AAAA,EAC/B;AAAA,EACA,MAAM,KAAK,MAAgC;AAEzC,UAAM,IAAI,MAAM,KAAK,GAAI,KAAK,IAAI;AAClC,WAAO;AAAA,MACL,QAAQ,MAAM,EAAE;AAAA,MAChB,aAAa,MAAM,EAAE;AAAA,MACrB,eAAe,MAAM,CAAC,CAAC,EAAE;AAAA,MACzB,mBAAmB,MAAM,CAAC,CAAC,EAAE;AAAA,MAC7B,gBAAgB,MAAM,CAAC,CAAC,EAAE;AAAA,MAC1B,QAAQ,MAAM,CAAC,CAAC,EAAE;AAAA,MAClB,UAAU,MAAM,CAAC,CAAC,EAAE;AAAA,MACpB,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,MAAM,EAAE;AAAA,MACR,OAAO,EAAE;AAAA,MACT,OAAO,EAAE;AAAA,MACT,OAAO,EAAE;AAAA,MACT,WAAW,EAAE;AAAA,IACf;AAAA,EACF;AAAA,EACA,MAAM,OAAO,MAA6B;AACxC,WAAO,KAAK,IAAI,OAAO,IAAI;AAAA,EAC7B;AAAA,EACA,MAAM,UAAU,MAAc,MAA0C;AACtE,WAAO,KAAK,IAAI,UAAU,MAAM,OAAO,KAAK,IAAI,CAAC;AAAA,EACnD;AACF;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/runtime/gateways/file/gateway.ts"],"sourcesContent":["import { FILESTORE_VERSION } from \"./version.js\";\nimport { exception2Result, KeyedResolvOnce, Logger, Result, URI } from \"@adviser/cement\";\nimport { ensureLogger, ensureSuperLog, exceptionWrapper, isNotFoundError, NotFoundError } from \"../../../utils.js\";\nimport { Gateway, GetResult, TestGateway } from \"../../../blockstore/gateway.js\";\nimport { getFileName, getFileSystem, getPath } from \"./utils.js\";\nimport { PARAM, SuperThis, SysFileSystem } from \"../../../types.js\";\n\nconst versionFiles = new KeyedResolvOnce<string>();\n\nexport class FileGateway implements Gateway {\n // abstract readonly storeType: StoreType;\n readonly logger: Logger;\n readonly sthis: SuperThis;\n\n _fs?: SysFileSystem;\n\n get fs(): SysFileSystem {\n if (!this._fs) throw this.logger.Error().Msg(\"fs not initialized\").AsError();\n return this._fs;\n }\n\n constructor(sthis: SuperThis) {\n this.sthis = ensureSuperLog(sthis, \"FileGateway\", { this: 1 });\n this.logger = this.sthis.logger;\n }\n\n async getVersionFromFile(path: string, logger: Logger): Promise<string> {\n return versionFiles.get(path).once(async () => {\n await this.fs.mkdir(path, { recursive: true });\n const vFile = this.sthis.pathOps.join(path, \"version\");\n const vFileStat = await this.fs.stat(vFile).catch(() => undefined);\n if (!vFileStat) {\n await this.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 this.fs.readfile(vFile);\n const vStr = new TextDecoder().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 this._fs = await getFileSystem(baseURL);\n const url = baseURL.build();\n url.defParam(PARAM.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 this.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(PARAM.VERSION, await this.getVersionFromFile(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(PARAM.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(PARAM.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 this.fs.writefile(file, body);\n });\n }\n\n async get(url: URI): Promise<GetResult> {\n return exceptionWrapper(async () => {\n const file = this.getFilePath(url);\n try {\n this.logger.Debug().Url(url).Str(\"file\", file).Msg(\"get\");\n const res = await this.fs.readfile(file);\n return Result.Ok(new Uint8Array(res));\n } catch (e: unknown) {\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 this.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 let files: string[] = [];\n try {\n files = await this.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 this.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\n// export class FileWALGateway extends FileGateway {\n// readonly storeType = \"wal\";\n// constructor(logger: Logger) {\n// super(ensureLogger(logger, \"FileWALGateway\"));\n// }\n// }\n\n// export class FileMetaGateway extends FileGateway {\n// readonly storeType = \"meta\";\n// constructor(logger: Logger) {\n// super(ensureLogger(logger, \"FileMetaGateway\"));\n// }\n// }\n\n// export class FileDataGateway extends FileGateway {\n// readonly storeType = \"data\";\n// readonly branches = new Set<string>();\n// constructor(logger: Logger) {\n// // console.log(\"FileDataGateway->\", logger);\n// super(ensureLogger(logger, \"FileDataGateway\"));\n// }\n// }\n\nexport class FileTestStore implements 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(PARAM.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"],"mappings":"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","names":[]}