@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.
- package/README.md +13 -12
- package/deno/index.d.ts +7 -0
- package/deno/index.js +66 -0
- package/deno/index.js.map +1 -0
- package/deno/metafile-esm.json +1 -0
- package/deno.json +2 -3
- package/index.cjs +1827 -1059
- package/index.cjs.map +1 -1
- package/index.d.cts +747 -334
- package/index.d.ts +747 -334
- package/index.js +1800 -1034
- package/index.js.map +1 -1
- package/metafile-cjs.json +1 -1
- package/metafile-esm.json +1 -1
- package/node/index.cjs +16 -293
- package/node/index.cjs.map +1 -1
- package/node/index.d.cts +4 -40
- package/node/index.d.ts +4 -40
- package/node/index.js +22 -237
- package/node/index.js.map +1 -1
- package/node/metafile-cjs.json +1 -1
- package/node/metafile-esm.json +1 -1
- package/package.json +14 -6
- package/react/index.cjs +22 -22
- package/react/index.cjs.map +1 -1
- package/react/index.d.cts +7 -7
- package/react/index.d.ts +7 -7
- package/react/index.js +22 -22
- package/react/index.js.map +1 -1
- package/react/metafile-cjs.json +1 -1
- package/react/metafile-esm.json +1 -1
- package/tests/blockstore/fp-envelope.test.ts-off +65 -0
- package/tests/blockstore/interceptor-gateway.test.ts +122 -0
- package/tests/blockstore/keyed-crypto-indexdb-file.test.ts +130 -0
- package/tests/blockstore/keyed-crypto.test.ts +73 -118
- package/tests/blockstore/loader.test.ts +18 -9
- package/tests/blockstore/store.test.ts +40 -31
- package/tests/blockstore/transaction.test.ts +14 -13
- package/tests/fireproof/all-gateway.test.ts +286 -216
- package/tests/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.ts +324 -316
- package/tests/fireproof/crdt.test.ts +78 -19
- package/tests/fireproof/fireproof.test.ts +111 -92
- package/tests/fireproof/hello.test.ts +21 -17
- package/tests/fireproof/indexer.test.ts +74 -50
- package/tests/fireproof/{database.test.ts → ledger.test.ts} +241 -45
- package/tests/fireproof/multiple-ledger.test.ts +2 -2
- package/tests/fireproof/utils.test.ts +47 -6
- package/tests/gateway/file/loader-config.test.ts +307 -0
- package/tests/gateway/fp-envelope-serialize.test.ts +256 -0
- package/tests/gateway/indexdb/loader-config.test.ts +79 -0
- package/tests/helpers.ts +44 -17
- package/tests/react/useFireproof.test.tsx +2 -2
- package/tests/www/gallery.html +2 -2
- package/tests/www/todo-aws.html +1 -1
- package/tests/www/todo-ipfs.html +1 -1
- package/tests/www/todo-local.html +1 -1
- package/tests/www/todo.html +25 -4
- package/web/index.cjs +102 -116
- package/web/index.cjs.map +1 -1
- package/web/index.d.cts +15 -29
- package/web/index.d.ts +15 -29
- package/web/index.js +91 -105
- package/web/index.js.map +1 -1
- package/web/metafile-cjs.json +1 -1
- package/web/metafile-esm.json +1 -1
- package/node/chunk-4A4RAVNS.js +0 -17
- package/node/chunk-4A4RAVNS.js.map +0 -1
- package/node/mem-filesystem-LPPT7QV5.js +0 -40
- package/node/mem-filesystem-LPPT7QV5.js.map +0 -1
- package/tests/fireproof/config.test.ts +0 -163
- /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 {
|
3
|
-
|
4
|
-
|
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
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
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 {
|
13
|
+
const { ledger, useLiveQuery, useDocument } = useFireproof("dbname");
|
14
14
|
expect(typeof useLiveQuery).toBe("function");
|
15
15
|
expect(typeof useDocument).toBe("function");
|
16
|
-
expect(
|
16
|
+
expect(ledger?.constructor.name).toMatch(/^Ledger/);
|
17
17
|
});
|
18
18
|
});
|
19
19
|
});
|
package/tests/www/gallery.html
CHANGED
@@ -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/
|
126
|
-
|
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 />
|
package/tests/www/todo-aws.html
CHANGED
package/tests/www/todo-ipfs.html
CHANGED
@@ -156,7 +156,7 @@
|
|
156
156
|
e.preventDefault();
|
157
157
|
e.target.disabled = true;
|
158
158
|
const input = document.querySelector("#join");
|
159
|
-
const {
|
159
|
+
const { ledger: newDb, connection: newConn } = await cx.joinShared(input.value);
|
160
160
|
setupDb(null, newDb, newConn);
|
161
161
|
};
|
162
162
|
|
package/tests/www/todo.html
CHANGED
@@ -75,8 +75,9 @@
|
|
75
75
|
|
76
76
|
let compactor = "🚗";
|
77
77
|
function drawInfo() {
|
78
|
-
document.querySelector("#carLog").innerText =
|
79
|
-
|
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() *
|
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
|
-
|
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/
|
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
|
80
|
+
var import_core2 = require("@fireproof/core");
|
42
81
|
function ensureVersion(url) {
|
43
|
-
return url.build().defParam(
|
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
|
55
|
-
const db = await (0,
|
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(
|
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().
|
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(
|
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(
|
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,
|
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(
|
98
|
-
this.
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
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
|
150
|
+
return import_cement2.Result.Ok(void 0);
|
113
151
|
}
|
114
|
-
async destroy(baseUrl) {
|
115
|
-
return (0,
|
116
|
-
const type = (0,
|
117
|
-
const idb =
|
118
|
-
const trans = idb.
|
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(
|
132
|
-
}
|
133
|
-
async get(url) {
|
134
|
-
return (0,
|
135
|
-
const key = (0,
|
136
|
-
const store = (0,
|
137
|
-
|
138
|
-
const
|
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
|
180
|
+
return import_cement2.Result.Err(new import_core2.NotFoundError(`missing ${key}`));
|
144
181
|
}
|
145
|
-
return
|
182
|
+
return Promise.resolve(import_cement2.Result.Ok(bytes));
|
146
183
|
});
|
147
184
|
}
|
148
|
-
async put(url,
|
149
|
-
return (0,
|
150
|
-
const key = (0,
|
151
|
-
const store = (0,
|
152
|
-
|
153
|
-
const
|
154
|
-
|
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,
|
161
|
-
const key = (0,
|
162
|
-
const store = (0,
|
163
|
-
|
164
|
-
const
|
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
|
203
|
+
return import_cement2.Result.Ok(void 0);
|
169
204
|
});
|
170
205
|
}
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
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
|
-
|
211
|
+
sthis.logger.Debug().Str("key", key).Str("store", store).Int("len", bytes.length).Msg("got");
|
183
212
|
if (typeof bytes === "string") {
|
184
|
-
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
|
-
|
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
|
-
|
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'
|