@fireproof/core 0.19.121-dev → 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 (103) 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 +3 -4
  7. package/index.cjs +1797 -1431
  8. package/index.cjs.map +1 -1
  9. package/index.d.cts +760 -381
  10. package/index.d.ts +760 -381
  11. package/index.js +1976 -913
  12. package/index.js.map +1 -1
  13. package/metafile-cjs.json +1 -1
  14. package/metafile-esm.json +1 -1
  15. package/node/{node-filesystem.cjs → index.cjs} +17 -6
  16. package/node/index.cjs.map +1 -0
  17. package/node/index.d.cts +7 -0
  18. package/node/index.d.ts +7 -0
  19. package/node/{node-filesystem.js → index.js} +25 -5
  20. package/node/index.js.map +1 -0
  21. package/node/metafile-cjs.json +1 -1
  22. package/node/metafile-esm.json +1 -1
  23. package/package.json +27 -17
  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 +75 -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 +218 -0
  59. package/web/index.cjs.map +1 -0
  60. package/web/index.d.cts +30 -0
  61. package/web/index.d.ts +30 -0
  62. package/web/index.js +195 -0
  63. package/web/index.js.map +1 -0
  64. package/web/metafile-cjs.json +1 -1
  65. package/web/metafile-esm.json +1 -1
  66. package/chunk-7EWIAXTM.js +0 -7
  67. package/chunk-7EWIAXTM.js.map +0 -1
  68. package/chunk-F4FC6B2T.js +0 -63
  69. package/chunk-F4FC6B2T.js.map +0 -1
  70. package/chunk-PZ5AY32C.js +0 -10
  71. package/chunk-PZ5AY32C.js.map +0 -1
  72. package/chunk-RXC4JGJT.js +0 -301
  73. package/chunk-RXC4JGJT.js.map +0 -1
  74. package/gateway-C62S56GY.js +0 -66
  75. package/gateway-C62S56GY.js.map +0 -1
  76. package/gateway-VVS4QWDA.js +0 -145
  77. package/gateway-VVS4QWDA.js.map +0 -1
  78. package/key-bag-file-PWZ3QE7B.js +0 -55
  79. package/key-bag-file-PWZ3QE7B.js.map +0 -1
  80. package/key-bag-indexdb-SYG3YD4D.js +0 -51
  81. package/key-bag-indexdb-SYG3YD4D.js.map +0 -1
  82. package/node/chunk-4A4RAVNS.js +0 -17
  83. package/node/chunk-4A4RAVNS.js.map +0 -1
  84. package/node/mem-filesystem.cjs +0 -72
  85. package/node/mem-filesystem.cjs.map +0 -1
  86. package/node/mem-filesystem.d.cts +0 -25
  87. package/node/mem-filesystem.d.ts +0 -25
  88. package/node/mem-filesystem.js +0 -40
  89. package/node/mem-filesystem.js.map +0 -1
  90. package/node/node-filesystem.cjs.map +0 -1
  91. package/node/node-filesystem.d.cts +0 -35
  92. package/node/node-filesystem.d.ts +0 -35
  93. package/node/node-filesystem.js.map +0 -1
  94. package/tests/fireproof/config.test.ts +0 -172
  95. package/utils-ZVVGAXFE.js +0 -13
  96. package/utils-ZVVGAXFE.js.map +0 -1
  97. package/web/gateway-impl.cjs +0 -183
  98. package/web/gateway-impl.cjs.map +0 -1
  99. package/web/gateway-impl.d.cts +0 -31
  100. package/web/gateway-impl.d.ts +0 -31
  101. package/web/gateway-impl.js +0 -162
  102. package/web/gateway-impl.js.map +0 -1
  103. /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 ADDED
@@ -0,0 +1,218 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/runtime/gateways/indexdb/web/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ GatewayImpl: () => IndexDBGateway,
24
+ KeyBagProviderImpl: () => KeyBagProviderIndexDB,
25
+ KeyBagProviderIndexDB: () => KeyBagProviderIndexDB
26
+ });
27
+ module.exports = __toCommonJS(index_exports);
28
+
29
+ // src/runtime/gateways/indexdb/web/key-bag-indexdb.ts
30
+ var import_idb = require("idb");
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");
75
+
76
+ // src/runtime/gateways/indexdb/version.ts
77
+ var INDEXDB_VERSION = "v0.19-indexdb";
78
+
79
+ // src/runtime/gateways/indexdb/web/gateway-impl.ts
80
+ var import_core2 = require("@fireproof/core");
81
+ function ensureVersion(url) {
82
+ return url.build().defParam(import_core2.PARAM.VERSION, INDEXDB_VERSION).URI();
83
+ }
84
+ var onceIndexDB = new import_cement2.KeyedResolvOnce();
85
+ function sanitzeKey(key) {
86
+ if (key.length === 1) {
87
+ key = key[0];
88
+ }
89
+ return key;
90
+ }
91
+ async function connectIdb(url, sthis) {
92
+ const dbName = getIndexDBName(url, sthis);
93
+ const once = await onceIndexDB.get(dbName.fullDb).once(async () => {
94
+ const db = await (0, import_idb2.openDB)(dbName.fullDb, 1, {
95
+ upgrade(db2) {
96
+ ["version", "data", "wal", "meta", "idx.data", "idx.wal", "idx.meta"].map((store) => {
97
+ db2.createObjectStore(store, {
98
+ autoIncrement: false
99
+ });
100
+ });
101
+ }
102
+ });
103
+ const found = await db.get("version", "version");
104
+ const version = ensureVersion(url).getParam(import_core2.PARAM.VERSION);
105
+ if (!found) {
106
+ await db.put("version", { version }, "version");
107
+ } else if (found.version !== version) {
108
+ sthis.logger.Warn().Url(url).Str("version", version).Str("found", found.version).Msg("version mismatch");
109
+ }
110
+ return { db, dbName, version, url };
111
+ });
112
+ return {
113
+ ...once,
114
+ url: url.build().setParam(import_core2.PARAM.VERSION, once.version).URI()
115
+ };
116
+ }
117
+ function joinDBName(...names) {
118
+ return names.map((i) => i.replace(/^[^a-zA-Z0-9]+/g, "").replace(/[^a-zA-Z0-9-]+/g, "_")).filter((i) => i.length).join(".");
119
+ }
120
+ function getIndexDBName(iurl, sthis) {
121
+ const url = ensureVersion(iurl);
122
+ const fullDb = url.pathname.replace(/^\/+/, "").replace(/\?.*$/, "");
123
+ const dbName = url.getParam(import_core2.PARAM.NAME);
124
+ if (!dbName) throw sthis.logger.Error().Str("url", url.toString()).Msg(`name not found`).AsError();
125
+ const result = joinDBName(fullDb, dbName);
126
+ const objStore = (0, import_core2.getStore)(url, sthis, joinDBName).name;
127
+ const connectionKey = [result, objStore].join(":");
128
+ return {
129
+ fullDb: result,
130
+ objStore,
131
+ connectionKey,
132
+ dbName
133
+ };
134
+ }
135
+ var IndexDBGateway = class {
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");
146
+ return ic.url;
147
+ });
148
+ }
149
+ async close() {
150
+ return import_cement2.Result.Ok(void 0);
151
+ }
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");
157
+ const object_store = trans.objectStore(type);
158
+ const toDelete = [];
159
+ for (let cursor = await object_store.openCursor(); cursor; cursor = await cursor.continue()) {
160
+ toDelete.push(cursor.primaryKey);
161
+ }
162
+ for (const key of toDelete) {
163
+ await trans.db.delete(type, key);
164
+ }
165
+ await trans.done;
166
+ });
167
+ }
168
+ buildUrl(baseUrl, key) {
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");
177
+ const bytes = await tx.objectStore(store).get(sanitzeKey(key));
178
+ await tx.done;
179
+ if (!bytes) {
180
+ return import_cement2.Result.Err(new import_core2.NotFoundError(`missing ${key}`));
181
+ }
182
+ return Promise.resolve(import_cement2.Result.Ok(bytes));
183
+ });
184
+ }
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));
192
+ await tx.done;
193
+ });
194
+ }
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");
201
+ await tx.objectStore(store).delete(sanitzeKey(key));
202
+ await tx.done;
203
+ return import_cement2.Result.Ok(void 0);
204
+ });
205
+ }
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");
210
+ let bytes = await ic.db.get(store, sanitzeKey(key));
211
+ sthis.logger.Debug().Str("key", key).Str("store", store).Int("len", bytes.length).Msg("got");
212
+ if (typeof bytes === "string") {
213
+ bytes = sthis.txt.encode(bytes);
214
+ }
215
+ return import_cement2.Result.Ok(bytes);
216
+ }
217
+ };
218
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,30 @@
1
+ import { IDBPDatabase } from 'idb';
2
+ import { ResolveOnce, URI, Logger, Result } from '@adviser/cement';
3
+ import { rt, SuperThis, bs } from '@fireproof/core';
4
+
5
+ declare class KeyBagProviderIndexDB implements rt.kb.KeyBagProvider {
6
+ readonly _db: ResolveOnce<IDBPDatabase<unknown>>;
7
+ readonly dbName: string;
8
+ readonly url: URI;
9
+ readonly logger: Logger;
10
+ readonly sthis: SuperThis;
11
+ constructor(url: URI, sthis: SuperThis);
12
+ _prepare(): Promise<IDBPDatabase<unknown>>;
13
+ get(id: string): Promise<rt.kb.KeyItem | undefined>;
14
+ set(id: string, item: rt.kb.KeyItem): Promise<void>;
15
+ }
16
+
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 };
30
+ declare module '@fireproof/core/web'
package/web/index.d.ts ADDED
@@ -0,0 +1,30 @@
1
+ import { IDBPDatabase } from 'idb';
2
+ import { ResolveOnce, URI, Logger, Result } from '@adviser/cement';
3
+ import { rt, SuperThis, bs } from '@fireproof/core';
4
+
5
+ declare class KeyBagProviderIndexDB implements rt.kb.KeyBagProvider {
6
+ readonly _db: ResolveOnce<IDBPDatabase<unknown>>;
7
+ readonly dbName: string;
8
+ readonly url: URI;
9
+ readonly logger: Logger;
10
+ readonly sthis: SuperThis;
11
+ constructor(url: URI, sthis: SuperThis);
12
+ _prepare(): Promise<IDBPDatabase<unknown>>;
13
+ get(id: string): Promise<rt.kb.KeyItem | undefined>;
14
+ set(id: string, item: rt.kb.KeyItem): Promise<void>;
15
+ }
16
+
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 };
30
+ declare module '@fireproof/core/web'