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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +3 -2
  2. package/deno/index.d.ts +7 -0
  3. package/deno/index.js +66 -0
  4. package/deno/index.js.map +1 -0
  5. package/deno/metafile-esm.json +1 -0
  6. package/deno.json +2 -3
  7. package/index.cjs +1819 -1051
  8. package/index.cjs.map +1 -1
  9. package/index.d.cts +746 -333
  10. package/index.d.ts +746 -333
  11. package/index.js +1792 -1026
  12. package/index.js.map +1 -1
  13. package/metafile-cjs.json +1 -1
  14. package/metafile-esm.json +1 -1
  15. package/node/index.cjs +16 -293
  16. package/node/index.cjs.map +1 -1
  17. package/node/index.d.cts +4 -40
  18. package/node/index.d.ts +4 -40
  19. package/node/index.js +22 -237
  20. package/node/index.js.map +1 -1
  21. package/node/metafile-cjs.json +1 -1
  22. package/node/metafile-esm.json +1 -1
  23. package/package.json +12 -4
  24. package/react/index.cjs.map +1 -1
  25. package/react/index.js.map +1 -1
  26. package/react/metafile-cjs.json +1 -1
  27. package/react/metafile-esm.json +1 -1
  28. package/tests/blockstore/fp-envelope.test.ts-off +65 -0
  29. package/tests/blockstore/interceptor-gateway.test.ts +122 -0
  30. package/tests/blockstore/keyed-crypto-indexdb-file.test.ts +130 -0
  31. package/tests/blockstore/keyed-crypto.test.ts +73 -118
  32. package/tests/blockstore/loader.test.ts +18 -9
  33. package/tests/blockstore/store.test.ts +40 -31
  34. package/tests/blockstore/transaction.test.ts +14 -13
  35. package/tests/fireproof/all-gateway.test.ts +283 -213
  36. package/tests/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.ts +324 -316
  37. package/tests/fireproof/crdt.test.ts +78 -19
  38. package/tests/fireproof/database.test.ts +225 -29
  39. package/tests/fireproof/fireproof.test.ts +92 -73
  40. package/tests/fireproof/hello.test.ts +17 -13
  41. package/tests/fireproof/indexer.test.ts +67 -43
  42. package/tests/fireproof/utils.test.ts +47 -6
  43. package/tests/gateway/file/loader-config.test.ts +307 -0
  44. package/tests/gateway/fp-envelope-serialize.test.ts +256 -0
  45. package/tests/gateway/indexdb/loader-config.test.ts +79 -0
  46. package/tests/helpers.ts +44 -17
  47. package/tests/react/useFireproof.test.tsx +1 -1
  48. package/tests/www/todo.html +24 -3
  49. package/web/index.cjs +102 -116
  50. package/web/index.cjs.map +1 -1
  51. package/web/index.d.cts +15 -29
  52. package/web/index.d.ts +15 -29
  53. package/web/index.js +91 -105
  54. package/web/index.js.map +1 -1
  55. package/web/metafile-cjs.json +1 -1
  56. package/web/metafile-esm.json +1 -1
  57. package/node/chunk-4A4RAVNS.js +0 -17
  58. package/node/chunk-4A4RAVNS.js.map +0 -1
  59. package/node/mem-filesystem-LPPT7QV5.js +0 -40
  60. package/node/mem-filesystem-LPPT7QV5.js.map +0 -1
  61. package/tests/fireproof/config.test.ts +0 -163
  62. /package/tests/blockstore/{fragment-gateway.test.ts → fragment-gateway.test.ts-off} +0 -0
  63. /package/tests/fireproof/{multiple-ledger.test.ts → multiple-database.test.ts} +0 -0
package/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'
package/web/index.d.ts 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'