@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.
- 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 +3 -4
- package/index.cjs +1797 -1431
- package/index.cjs.map +1 -1
- package/index.d.cts +760 -381
- package/index.d.ts +760 -381
- package/index.js +1976 -913
- package/index.js.map +1 -1
- package/metafile-cjs.json +1 -1
- package/metafile-esm.json +1 -1
- package/node/{node-filesystem.cjs → index.cjs} +17 -6
- package/node/index.cjs.map +1 -0
- package/node/index.d.cts +7 -0
- package/node/index.d.ts +7 -0
- package/node/{node-filesystem.js → index.js} +25 -5
- package/node/index.js.map +1 -0
- package/node/metafile-cjs.json +1 -1
- package/node/metafile-esm.json +1 -1
- package/package.json +27 -17
- 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 +75 -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 +218 -0
- package/web/index.cjs.map +1 -0
- package/web/index.d.cts +30 -0
- package/web/index.d.ts +30 -0
- package/web/index.js +195 -0
- package/web/index.js.map +1 -0
- package/web/metafile-cjs.json +1 -1
- package/web/metafile-esm.json +1 -1
- package/chunk-7EWIAXTM.js +0 -7
- package/chunk-7EWIAXTM.js.map +0 -1
- package/chunk-F4FC6B2T.js +0 -63
- package/chunk-F4FC6B2T.js.map +0 -1
- package/chunk-PZ5AY32C.js +0 -10
- package/chunk-PZ5AY32C.js.map +0 -1
- package/chunk-RXC4JGJT.js +0 -301
- package/chunk-RXC4JGJT.js.map +0 -1
- package/gateway-C62S56GY.js +0 -66
- package/gateway-C62S56GY.js.map +0 -1
- package/gateway-VVS4QWDA.js +0 -145
- package/gateway-VVS4QWDA.js.map +0 -1
- package/key-bag-file-PWZ3QE7B.js +0 -55
- package/key-bag-file-PWZ3QE7B.js.map +0 -1
- package/key-bag-indexdb-SYG3YD4D.js +0 -51
- package/key-bag-indexdb-SYG3YD4D.js.map +0 -1
- package/node/chunk-4A4RAVNS.js +0 -17
- package/node/chunk-4A4RAVNS.js.map +0 -1
- package/node/mem-filesystem.cjs +0 -72
- package/node/mem-filesystem.cjs.map +0 -1
- package/node/mem-filesystem.d.cts +0 -25
- package/node/mem-filesystem.d.ts +0 -25
- package/node/mem-filesystem.js +0 -40
- package/node/mem-filesystem.js.map +0 -1
- package/node/node-filesystem.cjs.map +0 -1
- package/node/node-filesystem.d.cts +0 -35
- package/node/node-filesystem.d.ts +0 -35
- package/node/node-filesystem.js.map +0 -1
- package/tests/fireproof/config.test.ts +0 -172
- package/utils-ZVVGAXFE.js +0 -13
- package/utils-ZVVGAXFE.js.map +0 -1
- package/web/gateway-impl.cjs +0 -183
- package/web/gateway-impl.cjs.map +0 -1
- package/web/gateway-impl.d.cts +0 -31
- package/web/gateway-impl.d.ts +0 -31
- package/web/gateway-impl.js +0 -162
- package/web/gateway-impl.js.map +0 -1
- /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
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"]}
|
package/web/index.d.cts
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'
|
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'
|