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

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 (71) hide show
  1. package/README.md +13 -12
  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 +1827 -1059
  8. package/index.cjs.map +1 -1
  9. package/index.d.cts +747 -334
  10. package/index.d.ts +747 -334
  11. package/index.js +1800 -1034
  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 +14 -6
  24. package/react/index.cjs +22 -22
  25. package/react/index.cjs.map +1 -1
  26. package/react/index.d.cts +7 -7
  27. package/react/index.d.ts +7 -7
  28. package/react/index.js +22 -22
  29. package/react/index.js.map +1 -1
  30. package/react/metafile-cjs.json +1 -1
  31. package/react/metafile-esm.json +1 -1
  32. package/tests/blockstore/fp-envelope.test.ts-off +65 -0
  33. package/tests/blockstore/interceptor-gateway.test.ts +122 -0
  34. package/tests/blockstore/keyed-crypto-indexdb-file.test.ts +130 -0
  35. package/tests/blockstore/keyed-crypto.test.ts +73 -118
  36. package/tests/blockstore/loader.test.ts +18 -9
  37. package/tests/blockstore/store.test.ts +40 -31
  38. package/tests/blockstore/transaction.test.ts +14 -13
  39. package/tests/fireproof/all-gateway.test.ts +286 -216
  40. package/tests/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.ts +324 -316
  41. package/tests/fireproof/crdt.test.ts +78 -19
  42. package/tests/fireproof/fireproof.test.ts +111 -92
  43. package/tests/fireproof/hello.test.ts +21 -17
  44. package/tests/fireproof/indexer.test.ts +74 -50
  45. package/tests/fireproof/{database.test.ts → ledger.test.ts} +241 -45
  46. package/tests/fireproof/multiple-ledger.test.ts +2 -2
  47. package/tests/fireproof/utils.test.ts +47 -6
  48. package/tests/gateway/file/loader-config.test.ts +307 -0
  49. package/tests/gateway/fp-envelope-serialize.test.ts +256 -0
  50. package/tests/gateway/indexdb/loader-config.test.ts +79 -0
  51. package/tests/helpers.ts +44 -17
  52. package/tests/react/useFireproof.test.tsx +2 -2
  53. package/tests/www/gallery.html +2 -2
  54. package/tests/www/todo-aws.html +1 -1
  55. package/tests/www/todo-ipfs.html +1 -1
  56. package/tests/www/todo-local.html +1 -1
  57. package/tests/www/todo.html +25 -4
  58. package/web/index.cjs +102 -116
  59. package/web/index.cjs.map +1 -1
  60. package/web/index.d.cts +15 -29
  61. package/web/index.d.ts +15 -29
  62. package/web/index.js +91 -105
  63. package/web/index.js.map +1 -1
  64. package/web/metafile-cjs.json +1 -1
  65. package/web/metafile-esm.json +1 -1
  66. package/node/chunk-4A4RAVNS.js +0 -17
  67. package/node/chunk-4A4RAVNS.js.map +0 -1
  68. package/node/mem-filesystem-LPPT7QV5.js +0 -40
  69. package/node/mem-filesystem-LPPT7QV5.js.map +0 -1
  70. package/tests/fireproof/config.test.ts +0 -163
  71. /package/tests/blockstore/{fragment-gateway.test.ts → fragment-gateway.test.ts-off} +0 -0
package/tests/helpers.ts CHANGED
@@ -1,7 +1,8 @@
1
- import { runtimeFn, toCryptoRuntime, URI } from "@adviser/cement";
2
- import { dataDir, rt, SuperThis } from "@fireproof/core";
3
-
4
- export { dataDir };
1
+ import { BuildURI, MockLogger, runtimeFn, toCryptoRuntime, URI, utils, LogCollector } from "@adviser/cement";
2
+ import { ensureSuperThis, rt, SuperThis, SuperThisOpts, bs, PARAM } from "@fireproof/core";
3
+ import { CID } from "multiformats";
4
+ import { sha256 } from "multiformats/hashes/sha2";
5
+ import * as json from "multiformats/codecs/json";
5
6
 
6
7
  export function sleep(ms: number) {
7
8
  return new Promise((resolve) => setTimeout(resolve, ms));
@@ -37,16 +38,42 @@ export function storageURL(sthis: SuperThis): URI {
37
38
  return merged;
38
39
  }
39
40
 
40
- // export type MockSuperThis = SuperThis & { logCollector: LogCollector };
41
- // // eslint-disable-next-line @typescript-eslint/no-unused-vars
42
- // export function mockSuperThis(sthis?: Partial<SuperThisOpts>): MockSuperThis {
43
- // const mockLog = MockLogger();
44
- // const ethis = ensureSuperThis({
45
- // logger: mockLog.logger,
46
- // ctx: {
47
- // logCollector: mockLog.logCollector,
48
- // },
49
- // }) as MockSuperThis;
50
- // ethis.logCollector = mockLog.logCollector;
51
- // return ethis;
52
- // }
41
+ export type MockSuperThis = SuperThis & { ctx: { readonly logCollector: LogCollector } };
42
+ export function mockSuperThis(sthis?: Partial<SuperThisOpts>): MockSuperThis {
43
+ const mockLog = MockLogger({
44
+ pass: new utils.ConsoleWriterStreamDefaultWriter(new utils.ConsoleWriterStream()),
45
+ });
46
+ return ensureSuperThis({
47
+ ...sthis,
48
+ logger: mockLog.logger,
49
+ ctx: {
50
+ logCollector: mockLog.logCollector,
51
+ },
52
+ }) as MockSuperThis;
53
+ }
54
+
55
+ export function noopUrl(name?: string): URI {
56
+ const burl = BuildURI.from("memory://noop");
57
+ burl.setParam(PARAM.NAME, name || "test");
58
+ return burl.URI();
59
+ }
60
+
61
+ export function simpleBlockOpts(sthis: SuperThis, name?: string) {
62
+ const url = noopUrl(name);
63
+ return {
64
+ keyBag: rt.kb.defaultKeyBagOpts(sthis),
65
+ storeRuntime: bs.toStoreRuntime(sthis),
66
+ storeUrls: {
67
+ file: url,
68
+ wal: url,
69
+ meta: url,
70
+ data: url,
71
+ },
72
+ };
73
+ }
74
+
75
+ export async function simpleCID(sthis: SuperThis) {
76
+ const bytes = json.encode({ hello: sthis.nextId().str });
77
+ const hash = await sha256.digest(bytes);
78
+ return CID.create(1, json.code, hash);
79
+ }
@@ -10,10 +10,10 @@ describe("HOOK: useFireproof", () => {
10
10
 
11
11
  it("renders the hook correctly and checks types", () => {
12
12
  renderHook(() => {
13
- const { database, useLiveQuery, useDocument } = useFireproof("dbname");
13
+ const { ledger, useLiveQuery, useDocument } = useFireproof("dbname");
14
14
  expect(typeof useLiveQuery).toBe("function");
15
15
  expect(typeof useDocument).toBe("function");
16
- expect(database?.constructor.name).toBe("Database");
16
+ expect(ledger?.constructor.name).toMatch(/^Ledger/);
17
17
  });
18
18
  });
19
19
  });
@@ -122,8 +122,8 @@
122
122
  <h3>Files</h3>
123
123
  <p>
124
124
  Data is stored locally and encrypted before upload to S3. This is a demo so the encryption key is not managed securely. Read
125
- more about <a href="https://use-fireproof.com/docs/database-api/replication">Fireproof replication options.</a> You can also
126
- see a demo without images but <a href="https://fireproof.storage/s3up-test.html">with compaction and refresh buttons.</a>
125
+ more about <a href="https://use-fireproof.com/docs/ledger-api/replication">Fireproof replication options.</a> You can also see
126
+ a demo without images but <a href="https://fireproof.storage/s3up-test.html">with compaction and refresh buttons.</a>
127
127
  </p>
128
128
  <label for="files-up"><strong>Drop files:</strong></label>
129
129
  <input accept="image/*" title="save to Fireproof" type="file" id="files-up" multiple />
@@ -211,7 +211,7 @@
211
211
 
212
212
  <body>
213
213
  <h1><a href="https://use-fireproof.com/">Fireproof</a> Test App</h1>
214
- Database:
214
+ Ledger:
215
215
  <input title="Change list" type="text" name="list" id="list" />
216
216
  <button onclick="changeList(event)">Switch</button>
217
217
 
@@ -156,7 +156,7 @@
156
156
  e.preventDefault();
157
157
  e.target.disabled = true;
158
158
  const input = document.querySelector("#join");
159
- const { database: newDb, connection: newConn } = await cx.joinShared(input.value);
159
+ const { ledger: newDb, connection: newConn } = await cx.joinShared(input.value);
160
160
  setupDb(null, newDb, newConn);
161
161
  };
162
162
 
@@ -196,7 +196,7 @@
196
196
 
197
197
  <body>
198
198
  <h1><a href="https://use-fireproof.com/">Fireproof</a> Test App</h1>
199
- Database:
199
+ Ledger:
200
200
  <input title="Change list" type="text" name="list" id="list" />
201
201
  <button onclick="changeList(event)">Switch</button>
202
202
 
@@ -75,8 +75,9 @@
75
75
 
76
76
  let compactor = "🚗";
77
77
  function drawInfo() {
78
- document.querySelector("#carLog").innerText =
79
- ` ⏰ ${db._crdt.clock.head.length} ${compactor} ${cx.loader.carLog.length} 📩 ${1}`;
78
+ document.querySelector("#carLog").innerText = ` ⏰ ${db._crdt.clock.head.length} ${compactor} ${
79
+ cx.loader.carLog.length
80
+ } 📩 ${1}`;
80
81
  }
81
82
  const doRedraw = async () => {
82
83
  drawInfo();
@@ -164,7 +165,7 @@
164
165
  const timeout =
165
166
  10 +
166
167
  Math.pow(db._crdt.clock.head.length + cx.loader.taskManager.queue.length, 2) *
167
- (Math.floor(Math.random() * 2000) + 2000);
168
+ (Math.floor(Math.random() * 1000) + 1000);
168
169
  // console.log('go worker', timeout/ 1000)
169
170
  worker = setTimeout(async () => {
170
171
  await Promise.all(
@@ -195,6 +196,25 @@
195
196
  };
196
197
  window.toggleWorker = toggleWorker;
197
198
 
199
+ async function writeStorm(e) {
200
+ e.preventDefault();
201
+ compactor = "🐦‍🔥";
202
+ drawInfo();
203
+
204
+ const dcs = await db.allDocs();
205
+ const lastRow = dcs.rows[dcs.rows.length - 1];
206
+ const theDoc = lastRow.value;
207
+ for (let i = 0; i < 50; i++) {
208
+ theDoc.clicks = (theDoc.clicks || 0) + 1;
209
+ theDoc.completed = !theDoc.completed;
210
+ await db.put(theDoc);
211
+ }
212
+
213
+ drawInfo();
214
+ compactor = "🚗";
215
+ }
216
+ window.writeStorm = writeStorm;
217
+
198
218
  async function doCompact(e) {
199
219
  e.preventDefault();
200
220
  compactor = "🚕";
@@ -215,12 +235,13 @@
215
235
 
216
236
  <body>
217
237
  <h1><a href="https://use-fireproof.com/">Fireproof</a> Test App</h1>
218
- Database:
238
+ Ledger:
219
239
  <input title="Change list" type="text" name="list" id="list" />
220
240
  <button onclick="changeList(event)">Switch</button>
221
241
 
222
242
  <p>This version of the Fireprof test app uses PartyKit as the storage backend. Refresh is automatic and live.</p>
223
243
 
244
+ <button id="rocket" onclick="writeStorm(event)">🚀</button>
224
245
  <button id="robot" onclick="toggleWorker(event)">🤖</button>
225
246
  <span id="carLog" onclick="doCompact(event)"></span>
226
247
  <span id="cxInfo"></span>
package/web/index.cjs CHANGED
@@ -21,38 +21,77 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
23
  GatewayImpl: () => IndexDBGateway,
24
- GatewayTestImpl: () => IndexDBTestGateway,
25
- IndexDBGateway: () => IndexDBGateway,
26
- IndexDBTestGateway: () => IndexDBTestGateway,
27
24
  KeyBagProviderImpl: () => KeyBagProviderIndexDB,
28
- KeyBagProviderIndexDB: () => KeyBagProviderIndexDB,
29
- getIndexDBName: () => getIndexDBName
25
+ KeyBagProviderIndexDB: () => KeyBagProviderIndexDB
30
26
  });
31
27
  module.exports = __toCommonJS(index_exports);
32
28
 
33
- // src/runtime/gateways/indexdb/web/gateway-impl.ts
29
+ // src/runtime/gateways/indexdb/web/key-bag-indexdb.ts
34
30
  var import_idb = require("idb");
35
31
  var import_cement = require("@adviser/cement");
32
+ var import_core = require("@fireproof/core");
33
+ var KeyBagProviderIndexDB = class {
34
+ constructor(url, sthis) {
35
+ this._db = new import_cement.ResolveOnce();
36
+ this.sthis = sthis;
37
+ this.logger = sthis.logger;
38
+ this.url = url;
39
+ this.dbName = import_core.rt.getPath(this.url, this.sthis);
40
+ }
41
+ async _prepare() {
42
+ return this._db.once(async () => {
43
+ return await (0, import_idb.openDB)(this.dbName, 1, {
44
+ upgrade(db) {
45
+ ["bag"].map((store) => {
46
+ db.createObjectStore(store, {
47
+ autoIncrement: false
48
+ });
49
+ });
50
+ }
51
+ });
52
+ });
53
+ }
54
+ async get(id) {
55
+ const db = await this._prepare();
56
+ const tx = db.transaction(["bag"], "readonly");
57
+ const keyItem = await tx.objectStore("bag").get(id);
58
+ await tx.done;
59
+ if (!keyItem) {
60
+ return void 0;
61
+ }
62
+ return keyItem;
63
+ }
64
+ async set(id, item) {
65
+ const db = await this._prepare();
66
+ const tx = db.transaction(["bag"], "readwrite");
67
+ await tx.objectStore("bag").put(item, id);
68
+ await tx.done;
69
+ }
70
+ };
71
+
72
+ // src/runtime/gateways/indexdb/web/gateway-impl.ts
73
+ var import_idb2 = require("idb");
74
+ var import_cement2 = require("@adviser/cement");
36
75
 
37
76
  // src/runtime/gateways/indexdb/version.ts
38
77
  var INDEXDB_VERSION = "v0.19-indexdb";
39
78
 
40
79
  // src/runtime/gateways/indexdb/web/gateway-impl.ts
41
- var import_core = require("@fireproof/core");
80
+ var import_core2 = require("@fireproof/core");
42
81
  function ensureVersion(url) {
43
- return url.build().defParam("version", INDEXDB_VERSION).URI();
82
+ return url.build().defParam(import_core2.PARAM.VERSION, INDEXDB_VERSION).URI();
44
83
  }
84
+ var onceIndexDB = new import_cement2.KeyedResolvOnce();
45
85
  function sanitzeKey(key) {
46
86
  if (key.length === 1) {
47
87
  key = key[0];
48
88
  }
49
89
  return key;
50
90
  }
51
- var onceConn = new import_cement.KeyedResolvOnce();
52
91
  async function connectIdb(url, sthis) {
53
92
  const dbName = getIndexDBName(url, sthis);
54
- const once = await onceConn.get(dbName.fullDb).once(async () => {
55
- const db = await (0, import_idb.openDB)(dbName.fullDb, 1, {
93
+ const once = await onceIndexDB.get(dbName.fullDb).once(async () => {
94
+ const db = await (0, import_idb2.openDB)(dbName.fullDb, 1, {
56
95
  upgrade(db2) {
57
96
  ["version", "data", "wal", "meta", "idx.data", "idx.wal", "idx.meta"].map((store) => {
58
97
  db2.createObjectStore(store, {
@@ -62,17 +101,17 @@ async function connectIdb(url, sthis) {
62
101
  }
63
102
  });
64
103
  const found = await db.get("version", "version");
65
- const version = ensureVersion(url).getParam("version");
104
+ const version = ensureVersion(url).getParam(import_core2.PARAM.VERSION);
66
105
  if (!found) {
67
106
  await db.put("version", { version }, "version");
68
107
  } else if (found.version !== version) {
69
- sthis.logger.Warn().Str("url", url.toString()).Str("version", version).Str("found", found.version).Msg("version mismatch");
108
+ sthis.logger.Warn().Url(url).Str("version", version).Str("found", found.version).Msg("version mismatch");
70
109
  }
71
110
  return { db, dbName, version, url };
72
111
  });
73
112
  return {
74
113
  ...once,
75
- url: url.build().setParam("version", once.version).URI()
114
+ url: url.build().setParam(import_core2.PARAM.VERSION, once.version).URI()
76
115
  };
77
116
  }
78
117
  function joinDBName(...names) {
@@ -81,10 +120,10 @@ function joinDBName(...names) {
81
120
  function getIndexDBName(iurl, sthis) {
82
121
  const url = ensureVersion(iurl);
83
122
  const fullDb = url.pathname.replace(/^\/+/, "").replace(/\?.*$/, "");
84
- const dbName = url.getParam("name");
123
+ const dbName = url.getParam(import_core2.PARAM.NAME);
85
124
  if (!dbName) throw sthis.logger.Error().Str("url", url.toString()).Msg(`name not found`).AsError();
86
125
  const result = joinDBName(fullDb, dbName);
87
- const objStore = (0, import_core.getStore)(url, sthis, joinDBName).name;
126
+ const objStore = (0, import_core2.getStore)(url, sthis, joinDBName).name;
88
127
  const connectionKey = [result, objStore].join(":");
89
128
  return {
90
129
  fullDb: result,
@@ -94,28 +133,27 @@ function getIndexDBName(iurl, sthis) {
94
133
  };
95
134
  }
96
135
  var IndexDBGateway = class {
97
- constructor(sthis) {
98
- this.logger = (0, import_core.ensureLogger)(sthis, "IndexDBGateway");
99
- this.sthis = sthis;
100
- }
101
- // _db: IDBPDatabase<unknown> = {} as IDBPDatabase<unknown>;
102
- async start(baseURL) {
103
- return (0, import_cement.exception2Result)(async () => {
104
- this.logger.Debug().Url(baseURL).Msg("starting");
105
- await this.sthis.start();
106
- const ic = await connectIdb(baseURL, this.sthis);
107
- this.logger.Debug().Url(ic.url).Msg("started");
136
+ constructor() {
137
+ this._db = {};
138
+ }
139
+ async start(baseURL, sthis) {
140
+ return (0, import_cement2.exception2Result)(async () => {
141
+ await sthis.start();
142
+ sthis.logger.Debug().Url(baseURL).Msg("starting");
143
+ const ic = await connectIdb(baseURL, sthis);
144
+ this._db = ic.db;
145
+ sthis.logger.Debug().Url(ic.url).Msg("started");
108
146
  return ic.url;
109
147
  });
110
148
  }
111
149
  async close() {
112
- return import_cement.Result.Ok(void 0);
150
+ return import_cement2.Result.Ok(void 0);
113
151
  }
114
- async destroy(baseUrl) {
115
- return (0, import_cement.exception2Result)(async () => {
116
- const type = (0, import_core.getStore)(baseUrl, this.sthis, joinDBName).name;
117
- const idb = await connectIdb(baseUrl, this.sthis);
118
- const trans = idb.db.transaction(type, "readwrite");
152
+ async destroy(baseUrl, sthis) {
153
+ return (0, import_cement2.exception2Result)(async () => {
154
+ const type = (0, import_core2.getStore)(baseUrl, sthis, joinDBName).name;
155
+ const idb = this._db;
156
+ const trans = idb.transaction(type, "readwrite");
119
157
  const object_store = trans.objectStore(type);
120
158
  const toDelete = [];
121
159
  for (let cursor = await object_store.openCursor(); cursor; cursor = await cursor.continue()) {
@@ -128,105 +166,53 @@ var IndexDBGateway = class {
128
166
  });
129
167
  }
130
168
  buildUrl(baseUrl, key) {
131
- return Promise.resolve(import_cement.Result.Ok(baseUrl.build().setParam("key", key).URI()));
132
- }
133
- async get(url) {
134
- return (0, import_core.exceptionWrapper)(async () => {
135
- const key = (0, import_core.getKey)(url, this.logger);
136
- const store = (0, import_core.getStore)(url, this.sthis, joinDBName).name;
137
- this.logger.Debug().Url(url).Str("key", key).Str("store", store).Msg("getting");
138
- const { db } = await connectIdb(url, this.sthis);
139
- const tx = db.transaction([store], "readonly");
169
+ return Promise.resolve(import_cement2.Result.Ok(baseUrl.build().setParam(import_core2.PARAM.KEY, key).URI()));
170
+ }
171
+ async get(url, sthis) {
172
+ return (0, import_core2.exceptionWrapper)(async () => {
173
+ const key = (0, import_core2.getKey)(url, sthis.logger);
174
+ const store = (0, import_core2.getStore)(url, sthis, joinDBName).name;
175
+ sthis.logger.Debug().Url(url).Str("key", key).Str("store", store).Msg("getting");
176
+ const tx = this._db.transaction([store], "readonly");
140
177
  const bytes = await tx.objectStore(store).get(sanitzeKey(key));
141
178
  await tx.done;
142
179
  if (!bytes) {
143
- return import_cement.Result.Err(new import_core.NotFoundError(`missing ${key}`));
180
+ return import_cement2.Result.Err(new import_core2.NotFoundError(`missing ${key}`));
144
181
  }
145
- return import_cement.Result.Ok(bytes);
182
+ return Promise.resolve(import_cement2.Result.Ok(bytes));
146
183
  });
147
184
  }
148
- async put(url, value) {
149
- return (0, import_cement.exception2Result)(async () => {
150
- const key = (0, import_core.getKey)(url, this.logger);
151
- const store = (0, import_core.getStore)(url, this.sthis, joinDBName).name;
152
- this.logger.Debug().Url(url).Str("key", key).Str("store", store).Msg("putting");
153
- const { db } = await connectIdb(url, this.sthis);
154
- const tx = db.transaction([store], "readwrite");
155
- await tx.objectStore(store).put(value, sanitzeKey(key));
185
+ async put(url, bytes, sthis) {
186
+ return (0, import_cement2.exception2Result)(async () => {
187
+ const key = (0, import_core2.getKey)(url, sthis.logger);
188
+ const store = (0, import_core2.getStore)(url, sthis, joinDBName).name;
189
+ sthis.logger.Debug().Url(url).Str("key", key).Str("store", store).Msg("putting");
190
+ const tx = this._db.transaction([store], "readwrite");
191
+ await tx.objectStore(store).put(bytes, sanitzeKey(key));
156
192
  await tx.done;
157
193
  });
158
194
  }
159
- async delete(url) {
160
- return (0, import_cement.exception2Result)(async () => {
161
- const key = (0, import_core.getKey)(url, this.logger);
162
- const store = (0, import_core.getStore)(url, this.sthis, joinDBName).name;
163
- this.logger.Debug().Url(url).Str("key", key).Str("store", store).Msg("deleting");
164
- const { db } = await connectIdb(url, this.sthis);
165
- const tx = db.transaction([store], "readwrite");
195
+ async delete(url, sthis) {
196
+ return (0, import_cement2.exception2Result)(async () => {
197
+ const key = (0, import_core2.getKey)(url, sthis.logger);
198
+ const store = (0, import_core2.getStore)(url, sthis, joinDBName).name;
199
+ sthis.logger.Debug().Url(url).Str("key", key).Str("store", store).Msg("deleting");
200
+ const tx = this._db.transaction([store], "readwrite");
166
201
  await tx.objectStore(store).delete(sanitzeKey(key));
167
202
  await tx.done;
168
- return import_cement.Result.Ok(void 0);
203
+ return import_cement2.Result.Ok(void 0);
169
204
  });
170
205
  }
171
- };
172
- var IndexDBTestGateway = class {
173
- constructor(sthis) {
174
- this.sthis = sthis;
175
- this.logger = (0, import_core.ensureLogger)(sthis, "IndexDBTestStore", {});
176
- }
177
- async get(url, key) {
178
- const ic = await connectIdb(url, this.sthis);
179
- const store = (0, import_core.getStore)(ic.url, this.sthis, joinDBName).name;
180
- this.logger.Debug().Str("key", key).Str("store", store).Msg("getting");
206
+ async getPlain(url, key, sthis) {
207
+ const ic = await connectIdb(url, sthis);
208
+ const store = (0, import_core2.getStore)(ic.url, sthis, joinDBName).name;
209
+ sthis.logger.Debug().Str("key", key).Str("store", store).Msg("getting");
181
210
  let bytes = await ic.db.get(store, sanitzeKey(key));
182
- this.logger.Debug().Str("key", key).Str("store", store).Int("len", bytes.length).Msg("got");
211
+ sthis.logger.Debug().Str("key", key).Str("store", store).Int("len", bytes.length).Msg("got");
183
212
  if (typeof bytes === "string") {
184
- bytes = this.sthis.txt.encode(bytes);
213
+ bytes = sthis.txt.encode(bytes);
185
214
  }
186
- return bytes;
187
- }
188
- };
189
-
190
- // src/runtime/gateways/indexdb/web/key-bag-indexdb.ts
191
- var import_idb2 = require("idb");
192
- var import_cement2 = require("@adviser/cement");
193
- var import_core2 = require("@fireproof/core");
194
- var KeyBagProviderIndexDB = class {
195
- constructor(url, sthis) {
196
- this._db = new import_cement2.ResolveOnce();
197
- this.sthis = sthis;
198
- this.logger = sthis.logger;
199
- this.url = url;
200
- this.dbName = import_core2.rt.getPath(this.url, this.sthis);
201
- }
202
- async _prepare() {
203
- return this._db.once(async () => {
204
- return await (0, import_idb2.openDB)(this.dbName, 1, {
205
- upgrade(db) {
206
- ["bag"].map((store) => {
207
- db.createObjectStore(store, {
208
- autoIncrement: false
209
- });
210
- });
211
- }
212
- });
213
- });
214
- }
215
- async get(id) {
216
- const db = await this._prepare();
217
- const tx = db.transaction(["bag"], "readonly");
218
- const keyItem = await tx.objectStore("bag").get(id);
219
- await tx.done;
220
- if (!keyItem) {
221
- return void 0;
222
- }
223
- return keyItem;
224
- }
225
- async set(id, item) {
226
- const db = await this._prepare();
227
- const tx = db.transaction(["bag"], "readwrite");
228
- await tx.objectStore("bag").put(item, id);
229
- await tx.done;
215
+ return import_cement2.Result.Ok(bytes);
230
216
  }
231
217
  };
232
218
  //# sourceMappingURL=index.cjs.map
package/web/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/runtime/gateways/indexdb/web/index.ts","../../../src/runtime/gateways/indexdb/web/gateway-impl.ts","../../../src/runtime/gateways/indexdb/version.ts","../../../src/runtime/gateways/indexdb/web/key-bag-indexdb.ts"],"sourcesContent":["export * from \"./gateway-impl.js\";\nexport * from \"./key-bag-indexdb.js\";\n\nimport { KeyBagProviderIndexDB as KeyBagProviderImpl } from \"./key-bag-indexdb.js\";\n\nexport { KeyBagProviderImpl };\n\nimport { IndexDBGateway as GatewayImpl, IndexDBTestGateway as GatewayTestImpl } from \"./gateway-impl.js\";\nexport { GatewayImpl, GatewayTestImpl };\n","import { openDB, IDBPDatabase } from \"idb\";\nimport { exception2Result, KeyedResolvOnce, Logger, Result, URI } from \"@adviser/cement\";\n\nimport { INDEXDB_VERSION } from \"../version.js\";\nimport { ensureLogger, exceptionWrapper, getKey, getStore, NotFoundError } from \"@fireproof/core\";\nimport type { bs } from \"@fireproof/core\";\nimport type { SuperThis } from \"@fireproof/core\";\n\nfunction ensureVersion(url: URI): URI {\n return url.build().defParam(\"version\", INDEXDB_VERSION).URI();\n}\n\ninterface IDBConn {\n readonly db: IDBPDatabase<unknown>;\n readonly dbName: DbName;\n readonly version: string;\n readonly url: URI;\n}\n\nfunction sanitzeKey(key: string | string[]): string | string[] {\n if (key.length === 1) {\n key = key[0];\n }\n return key;\n}\n\nconst onceConn = new KeyedResolvOnce<IDBConn>();\nasync function connectIdb(url: URI, sthis: SuperThis): Promise<IDBConn> {\n const dbName = getIndexDBName(url, sthis);\n const once = await onceConn.get(dbName.fullDb).once(async () => {\n const db = await openDB(dbName.fullDb, 1, {\n upgrade(db) {\n [\"version\", \"data\", \"wal\", \"meta\", \"idx.data\", \"idx.wal\", \"idx.meta\"].map((store) => {\n db.createObjectStore(store, {\n autoIncrement: false,\n });\n });\n },\n });\n const found = await db.get(\"version\", \"version\");\n const version = ensureVersion(url).getParam(\"version\") as string;\n if (!found) {\n await db.put(\"version\", { version }, \"version\");\n } else if (found.version !== version) {\n sthis.logger.Warn().Str(\"url\", url.toString()).Str(\"version\", version).Str(\"found\", found.version).Msg(\"version mismatch\");\n }\n return { db, dbName, version, url };\n });\n return {\n ...once,\n url: url.build().setParam(\"version\", once.version).URI(),\n };\n}\n\nexport interface DbName {\n readonly fullDb: string;\n readonly objStore: string;\n readonly connectionKey: string;\n readonly dbName: string;\n}\n\nfunction joinDBName(...names: string[]): string {\n return names\n .map((i) => i.replace(/^[^a-zA-Z0-9]+/g, \"\").replace(/[^a-zA-Z0-9-]+/g, \"_\"))\n .filter((i) => i.length)\n .join(\".\");\n}\n\n// const schemaVersion = new Map<string, number>();\nexport function getIndexDBName(iurl: URI, sthis: SuperThis): DbName {\n const url = ensureVersion(iurl);\n const fullDb = url.pathname.replace(/^\\/+/, \"\").replace(/\\?.*$/, \"\"); // cut leading slashes\n // const type = getStore(url);\n // const storageVersion = url.searchParams.get(\"version\");\n // not nice but we need to pass the version to the db name\n // url.searchParams.set(\"version\", storageVersion);\n // console.log(\"getIndexDBName:\", url.toString(), { fullDb, type, branch });\n // const dbName = fullDb.replace(new RegExp(`^fp.${storageVersion}.`), \"\"); // cut fp prefix\n const dbName = url.getParam(\"name\");\n if (!dbName) throw sthis.logger.Error().Str(\"url\", url.toString()).Msg(`name not found`).AsError();\n const result = joinDBName(fullDb, dbName);\n const objStore = getStore(url, sthis, joinDBName).name;\n const connectionKey = [result, objStore].join(\":\");\n return {\n fullDb: result,\n objStore,\n connectionKey,\n dbName,\n };\n}\n\nexport class IndexDBGateway implements bs.Gateway {\n readonly logger: Logger;\n readonly sthis: SuperThis;\n constructor(sthis: SuperThis) {\n this.logger = ensureLogger(sthis, \"IndexDBGateway\");\n this.sthis = sthis;\n }\n\n // _db: IDBPDatabase<unknown> = {} as IDBPDatabase<unknown>;\n\n async start(baseURL: URI): Promise<Result<URI>> {\n return exception2Result(async () => {\n this.logger.Debug().Url(baseURL).Msg(\"starting\");\n await this.sthis.start();\n const ic = await connectIdb(baseURL, this.sthis);\n this.logger.Debug().Url(ic.url).Msg(\"started\");\n return ic.url;\n });\n }\n async close(): Promise<Result<void>> {\n return Result.Ok(undefined);\n }\n async destroy(baseUrl: URI): Promise<Result<void>> {\n return exception2Result(async () => {\n // return deleteDB(getIndexDBName(this.url).fullDb);\n const type = getStore(baseUrl, this.sthis, joinDBName).name;\n // console.log(\"IndexDBDataStore:destroy\", type);\n const idb = await connectIdb(baseUrl, this.sthis);\n const trans = idb.db.transaction(type, \"readwrite\");\n const object_store = trans.objectStore(type);\n const toDelete = [];\n for (let cursor = await object_store.openCursor(); cursor; cursor = await cursor.continue()) {\n toDelete.push(cursor.primaryKey);\n }\n for (const key of toDelete) {\n await trans.db.delete(type, key);\n }\n await trans.done;\n });\n }\n\n buildUrl(baseUrl: URI, key: string): Promise<Result<URI>> {\n return Promise.resolve(Result.Ok(baseUrl.build().setParam(\"key\", key).URI()));\n }\n\n async get(url: URI): Promise<bs.GetResult> {\n return exceptionWrapper(async () => {\n const key = getKey(url, this.logger);\n const store = getStore(url, this.sthis, joinDBName).name;\n this.logger.Debug().Url(url).Str(\"key\", key).Str(\"store\", store).Msg(\"getting\");\n const { db } = await connectIdb(url, this.sthis);\n const tx = db.transaction([store], \"readonly\");\n const bytes = await tx.objectStore(store).get(sanitzeKey(key));\n await tx.done;\n if (!bytes) {\n return Result.Err(new NotFoundError(`missing ${key}`));\n }\n return Result.Ok(bytes as Uint8Array);\n });\n }\n async put(url: URI, value: Uint8Array) {\n return exception2Result(async () => {\n const key = getKey(url, this.logger);\n const store = getStore(url, this.sthis, joinDBName).name;\n this.logger.Debug().Url(url).Str(\"key\", key).Str(\"store\", store).Msg(\"putting\");\n const { db } = await connectIdb(url, this.sthis);\n const tx = db.transaction([store], \"readwrite\");\n await tx.objectStore(store).put(value, sanitzeKey(key));\n await tx.done;\n });\n }\n async delete(url: URI) {\n return exception2Result(async () => {\n const key = getKey(url, this.logger);\n const store = getStore(url, this.sthis, joinDBName).name;\n this.logger.Debug().Url(url).Str(\"key\", key).Str(\"store\", store).Msg(\"deleting\");\n const { db } = await connectIdb(url, this.sthis);\n const tx = db.transaction([store], \"readwrite\");\n await tx.objectStore(store).delete(sanitzeKey(key));\n await tx.done;\n return Result.Ok(undefined);\n });\n }\n}\n\n// export class IndexDBDataGateway extends IndexDBGateway {\n// readonly storeType = \"data\";\n// constructor(logger: Logger) {\n// super(ensureLogger(logger, \"IndexDBDataGateway\"));\n// }\n// }\n\n// export class IndexDBWalGateway extends IndexDBGateway {\n// readonly storeType = \"wal\";\n// constructor(logger: Logger) {\n// super(ensureLogger(logger, \"IndexDBWalGateway\"));\n// }\n// }\n// export class IndexDBMetaGateway extends IndexDBGateway {\n// readonly storeType = \"meta\";\n// constructor(logger: Logger) {\n// super(ensureLogger(logger, \"IndexDBMetaGateway\"));\n// }\n// }\n\nexport class IndexDBTestGateway implements bs.TestGateway {\n readonly logger: Logger;\n readonly sthis: SuperThis;\n constructor(sthis: SuperThis) {\n this.sthis = sthis;\n this.logger = ensureLogger(sthis, \"IndexDBTestStore\", {});\n }\n async get(url: URI, key: string) {\n const ic = await connectIdb(url, this.sthis);\n const store = getStore(ic.url, this.sthis, joinDBName).name;\n this.logger.Debug().Str(\"key\", key).Str(\"store\", store).Msg(\"getting\");\n let bytes = await ic.db.get(store, sanitzeKey(key));\n this.logger.Debug().Str(\"key\", key).Str(\"store\", store).Int(\"len\", bytes.length).Msg(\"got\");\n if (typeof bytes === \"string\") {\n bytes = this.sthis.txt.encode(bytes);\n }\n return bytes as Uint8Array;\n }\n}\n","export const INDEXDB_VERSION = \"v0.19-indexdb\";\n","import { IDBPDatabase, openDB } from \"idb\";\nimport { Logger, ResolveOnce, URI } from \"@adviser/cement\";\nimport { SuperThis, rt } from \"@fireproof/core\";\n\nexport class KeyBagProviderIndexDB implements rt.kb.KeyBagProvider {\n readonly _db: ResolveOnce<IDBPDatabase<unknown>> = new ResolveOnce<IDBPDatabase<unknown>>();\n\n readonly dbName: string;\n readonly url: URI;\n readonly logger: Logger;\n readonly sthis: SuperThis;\n constructor(url: URI, sthis: SuperThis) {\n this.sthis = sthis;\n this.logger = sthis.logger;\n this.url = url;\n this.dbName = rt.getPath(this.url, this.sthis);\n }\n\n async _prepare(): Promise<IDBPDatabase<unknown>> {\n return this._db.once(async () => {\n return await openDB(this.dbName, 1, {\n upgrade(db) {\n // console.log('upgrade:', dbName);\n [\"bag\"].map((store) => {\n db.createObjectStore(store, {\n autoIncrement: false,\n });\n });\n },\n });\n });\n }\n\n async get(id: string): Promise<rt.kb.KeyItem | undefined> {\n const db = await this._prepare();\n const tx = db.transaction([\"bag\"], \"readonly\");\n const keyItem = await tx.objectStore(\"bag\").get(id);\n await tx.done;\n if (!keyItem) {\n return undefined;\n }\n return keyItem;\n }\n\n async set(id: string, item: rt.kb.KeyItem): Promise<void> {\n const db = await this._prepare();\n const tx = db.transaction([\"bag\"], \"readwrite\");\n await tx.objectStore(\"bag\").put(item, id);\n await tx.done;\n }\n}\n"],"mappings":"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","names":["db","import_idb","import_cement","import_core"]}
1
+ {"version":3,"sources":["../../../src/runtime/gateways/indexdb/web/index.ts","../../../src/runtime/gateways/indexdb/web/key-bag-indexdb.ts","../../../src/runtime/gateways/indexdb/web/gateway-impl.ts","../../../src/runtime/gateways/indexdb/version.ts"],"sourcesContent":["// export * from \"./gateway-impl.js\";\n\nexport * from \"./key-bag-indexdb.js\";\nimport { KeyBagProviderIndexDB as KeyBagProviderImpl } from \"./key-bag-indexdb.js\";\n\nexport { KeyBagProviderImpl };\n\nimport { IndexDBGateway as GatewayImpl } from \"./gateway-impl.js\";\nexport { GatewayImpl };\n","import { IDBPDatabase, openDB } from \"idb\";\nimport { Logger, ResolveOnce, URI } from \"@adviser/cement\";\nimport { SuperThis, rt } from \"@fireproof/core\";\n\nexport class KeyBagProviderIndexDB implements rt.kb.KeyBagProvider {\n readonly _db: ResolveOnce<IDBPDatabase<unknown>> = new ResolveOnce<IDBPDatabase<unknown>>();\n\n readonly dbName: string;\n readonly url: URI;\n readonly logger: Logger;\n readonly sthis: SuperThis;\n constructor(url: URI, sthis: SuperThis) {\n this.sthis = sthis;\n this.logger = sthis.logger;\n this.url = url;\n this.dbName = rt.getPath(this.url, this.sthis);\n }\n\n async _prepare(): Promise<IDBPDatabase<unknown>> {\n return this._db.once(async () => {\n return await openDB(this.dbName, 1, {\n upgrade(db) {\n // console.log('upgrade:', dbName);\n [\"bag\"].map((store) => {\n db.createObjectStore(store, {\n autoIncrement: false,\n });\n });\n },\n });\n });\n }\n\n async get(id: string): Promise<rt.kb.KeyItem | undefined> {\n const db = await this._prepare();\n const tx = db.transaction([\"bag\"], \"readonly\");\n const keyItem = await tx.objectStore(\"bag\").get(id);\n await tx.done;\n if (!keyItem) {\n return undefined;\n }\n return keyItem;\n }\n\n async set(id: string, item: rt.kb.KeyItem): Promise<void> {\n const db = await this._prepare();\n const tx = db.transaction([\"bag\"], \"readwrite\");\n await tx.objectStore(\"bag\").put(item, id);\n await tx.done;\n }\n}\n","import { openDB, IDBPDatabase } from \"idb\";\nimport { exception2Result, KeyedResolvOnce, Result, URI } from \"@adviser/cement\";\n\nimport { INDEXDB_VERSION } from \"../version.js\";\nimport { NotFoundError, PARAM, exceptionWrapper, getKey, getStore, type SuperThis, bs } from \"@fireproof/core\";\n\nfunction ensureVersion(url: URI): URI {\n return url.build().defParam(PARAM.VERSION, INDEXDB_VERSION).URI();\n}\n\ninterface IDBConn {\n readonly db: IDBPDatabase<unknown>;\n readonly dbName: DbName;\n readonly version: string;\n readonly url: URI;\n}\nconst onceIndexDB = new KeyedResolvOnce<IDBConn>();\n\nfunction sanitzeKey(key: string | string[]): string | string[] {\n if (key.length === 1) {\n key = key[0];\n }\n return key;\n}\n\nasync function connectIdb(url: URI, sthis: SuperThis): Promise<IDBConn> {\n const dbName = getIndexDBName(url, sthis);\n const once = await onceIndexDB.get(dbName.fullDb).once(async () => {\n const db = await openDB(dbName.fullDb, 1, {\n upgrade(db) {\n [\"version\", \"data\", \"wal\", \"meta\", \"idx.data\", \"idx.wal\", \"idx.meta\"].map((store) => {\n db.createObjectStore(store, {\n autoIncrement: false,\n });\n });\n },\n });\n const found = await db.get(\"version\", \"version\");\n const version = ensureVersion(url).getParam(PARAM.VERSION) as string;\n if (!found) {\n await db.put(\"version\", { version }, \"version\");\n } else if (found.version !== version) {\n sthis.logger.Warn().Url(url).Str(\"version\", version).Str(\"found\", found.version).Msg(\"version mismatch\");\n }\n return { db, dbName, version, url };\n });\n return {\n ...once,\n url: url.build().setParam(PARAM.VERSION, once.version).URI(),\n };\n}\n\nexport interface DbName {\n readonly fullDb: string;\n readonly objStore: string;\n readonly connectionKey: string;\n readonly dbName: string;\n}\n\nfunction joinDBName(...names: string[]): string {\n return names\n .map((i) => i.replace(/^[^a-zA-Z0-9]+/g, \"\").replace(/[^a-zA-Z0-9-]+/g, \"_\"))\n .filter((i) => i.length)\n .join(\".\");\n}\n\nexport function getIndexDBName(iurl: URI, sthis: SuperThis): DbName {\n const url = ensureVersion(iurl);\n const fullDb = url.pathname.replace(/^\\/+/, \"\").replace(/\\?.*$/, \"\"); // cut leading slashes\n const dbName = url.getParam(PARAM.NAME);\n if (!dbName) throw sthis.logger.Error().Str(\"url\", url.toString()).Msg(`name not found`).AsError();\n const result = joinDBName(fullDb, dbName);\n const objStore = getStore(url, sthis, joinDBName).name;\n const connectionKey = [result, objStore].join(\":\");\n return {\n fullDb: result,\n objStore,\n connectionKey,\n dbName,\n };\n}\n\nexport class IndexDBGateway implements bs.Gateway {\n _db: IDBPDatabase<unknown> = {} as IDBPDatabase<unknown>;\n\n async start(baseURL: URI, sthis: SuperThis): Promise<Result<URI>> {\n return exception2Result(async () => {\n await sthis.start();\n sthis.logger.Debug().Url(baseURL).Msg(\"starting\");\n const ic = await connectIdb(baseURL, sthis);\n this._db = ic.db;\n sthis.logger.Debug().Url(ic.url).Msg(\"started\");\n return ic.url;\n });\n }\n async close(): Promise<Result<void>> {\n return Result.Ok(undefined);\n }\n async destroy(baseUrl: URI, sthis: SuperThis): Promise<Result<void>> {\n return exception2Result(async () => {\n // return deleteDB(getIndexDBName(this.url).fullDb);\n const type = getStore(baseUrl, sthis, joinDBName).name;\n // console.log(\"IndexDBDataStore:destroy\", type);\n const idb = this._db;\n const trans = idb.transaction(type, \"readwrite\");\n const object_store = trans.objectStore(type);\n const toDelete = [];\n for (let cursor = await object_store.openCursor(); cursor; cursor = await cursor.continue()) {\n toDelete.push(cursor.primaryKey);\n }\n for (const key of toDelete) {\n await trans.db.delete(type, key);\n }\n await trans.done;\n });\n }\n\n buildUrl(baseUrl: URI, key: string): Promise<Result<URI>> {\n return Promise.resolve(Result.Ok(baseUrl.build().setParam(PARAM.KEY, key).URI()));\n }\n\n async get(url: URI, sthis: SuperThis): Promise<bs.GetResult> {\n return exceptionWrapper(async () => {\n const key = getKey(url, sthis.logger);\n const store = getStore(url, sthis, joinDBName).name;\n sthis.logger.Debug().Url(url).Str(\"key\", key).Str(\"store\", store).Msg(\"getting\");\n const tx = this._db.transaction([store], \"readonly\");\n const bytes = await tx.objectStore(store).get(sanitzeKey(key));\n await tx.done;\n if (!bytes) {\n return Result.Err(new NotFoundError(`missing ${key}`));\n }\n return Promise.resolve(Result.Ok(bytes));\n });\n }\n async put(url: URI, bytes: Uint8Array, sthis: SuperThis): Promise<Result<void>> {\n return exception2Result(async () => {\n const key = getKey(url, sthis.logger);\n const store = getStore(url, sthis, joinDBName).name;\n sthis.logger.Debug().Url(url).Str(\"key\", key).Str(\"store\", store).Msg(\"putting\");\n const tx = this._db.transaction([store], \"readwrite\");\n await tx.objectStore(store).put(bytes, sanitzeKey(key));\n await tx.done;\n });\n }\n async delete(url: URI, sthis: SuperThis) {\n return exception2Result(async () => {\n const key = getKey(url, sthis.logger);\n const store = getStore(url, sthis, joinDBName).name;\n sthis.logger.Debug().Url(url).Str(\"key\", key).Str(\"store\", store).Msg(\"deleting\");\n const tx = this._db.transaction([store], \"readwrite\");\n await tx.objectStore(store).delete(sanitzeKey(key));\n await tx.done;\n return Result.Ok(undefined);\n });\n }\n\n async getPlain(url: URI, key: string, sthis: SuperThis): Promise<Result<Uint8Array>> {\n const ic = await connectIdb(url, sthis);\n const store = getStore(ic.url, sthis, joinDBName).name;\n sthis.logger.Debug().Str(\"key\", key).Str(\"store\", store).Msg(\"getting\");\n let bytes = await ic.db.get(store, sanitzeKey(key));\n sthis.logger.Debug().Str(\"key\", key).Str(\"store\", store).Int(\"len\", bytes.length).Msg(\"got\");\n if (typeof bytes === \"string\") {\n bytes = sthis.txt.encode(bytes);\n }\n return Result.Ok(bytes as Uint8Array);\n }\n}\n","export const INDEXDB_VERSION = \"v0.19-indexdb\";\n"],"mappings":"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","names":["import_idb","import_cement","import_core","db"]}
package/web/index.d.cts CHANGED
@@ -1,32 +1,6 @@
1
- import { URI, Logger, Result, ResolveOnce } from '@adviser/cement';
2
- import { SuperThis, bs, rt } from '@fireproof/core';
3
1
  import { IDBPDatabase } from 'idb';
4
-
5
- interface DbName {
6
- readonly fullDb: string;
7
- readonly objStore: string;
8
- readonly connectionKey: string;
9
- readonly dbName: string;
10
- }
11
- declare function getIndexDBName(iurl: URI, sthis: SuperThis): DbName;
12
- declare class IndexDBGateway implements bs.Gateway {
13
- readonly logger: Logger;
14
- readonly sthis: SuperThis;
15
- constructor(sthis: SuperThis);
16
- start(baseURL: URI): Promise<Result<URI>>;
17
- close(): Promise<Result<void>>;
18
- destroy(baseUrl: URI): Promise<Result<void>>;
19
- buildUrl(baseUrl: URI, key: string): Promise<Result<URI>>;
20
- get(url: URI): Promise<bs.GetResult>;
21
- put(url: URI, value: Uint8Array): Promise<Result<void, Error>>;
22
- delete(url: URI): Promise<Result<Result<undefined, Error>, Error>>;
23
- }
24
- declare class IndexDBTestGateway implements bs.TestGateway {
25
- readonly logger: Logger;
26
- readonly sthis: SuperThis;
27
- constructor(sthis: SuperThis);
28
- get(url: URI, key: string): Promise<Uint8Array<ArrayBufferLike>>;
29
- }
2
+ import { ResolveOnce, URI, Logger, Result } from '@adviser/cement';
3
+ import { rt, SuperThis, bs } from '@fireproof/core';
30
4
 
31
5
  declare class KeyBagProviderIndexDB implements rt.kb.KeyBagProvider {
32
6
  readonly _db: ResolveOnce<IDBPDatabase<unknown>>;
@@ -40,5 +14,17 @@ declare class KeyBagProviderIndexDB implements rt.kb.KeyBagProvider {
40
14
  set(id: string, item: rt.kb.KeyItem): Promise<void>;
41
15
  }
42
16
 
43
- export { type DbName, IndexDBGateway as GatewayImpl, IndexDBTestGateway as GatewayTestImpl, IndexDBGateway, IndexDBTestGateway, KeyBagProviderIndexDB as KeyBagProviderImpl, KeyBagProviderIndexDB, getIndexDBName };
17
+ declare class IndexDBGateway implements bs.Gateway {
18
+ _db: IDBPDatabase<unknown>;
19
+ start(baseURL: URI, sthis: SuperThis): Promise<Result<URI>>;
20
+ close(): Promise<Result<void>>;
21
+ destroy(baseUrl: URI, sthis: SuperThis): Promise<Result<void>>;
22
+ buildUrl(baseUrl: URI, key: string): Promise<Result<URI>>;
23
+ get(url: URI, sthis: SuperThis): Promise<bs.GetResult>;
24
+ put(url: URI, bytes: Uint8Array, sthis: SuperThis): Promise<Result<void>>;
25
+ delete(url: URI, sthis: SuperThis): Promise<Result<Result<undefined, Error>, Error>>;
26
+ getPlain(url: URI, key: string, sthis: SuperThis): Promise<Result<Uint8Array>>;
27
+ }
28
+
29
+ export { IndexDBGateway as GatewayImpl, KeyBagProviderIndexDB as KeyBagProviderImpl, KeyBagProviderIndexDB };
44
30
  declare module '@fireproof/core/web'