@fireproof/core 0.19.119 → 0.19.121-dev
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/{chunk-WVN66YAN.js → chunk-F4FC6B2T.js} +5 -13
- package/chunk-F4FC6B2T.js.map +1 -0
- package/{chunk-2D2X6HIB.js → chunk-RXC4JGJT.js} +13 -2
- package/chunk-RXC4JGJT.js.map +1 -0
- package/deno.json +2 -2
- package/{gateway-G4CPXEQF.js → gateway-C62S56GY.js} +2 -2
- package/{gateway-G4CPXEQF.js.map → gateway-C62S56GY.js.map} +1 -1
- package/{gateway-2O7QPHGW.js → gateway-VVS4QWDA.js} +3 -3
- package/gateway-VVS4QWDA.js.map +1 -0
- package/index.cjs +22 -18
- package/index.cjs.map +1 -1
- package/index.d.cts +2 -1
- package/index.d.ts +2 -1
- package/index.js +12 -10
- package/index.js.map +1 -1
- package/{key-bag-file-CBCAWTVG.js → key-bag-file-PWZ3QE7B.js} +3 -3
- package/{key-bag-indexdb-RTSMSGM7.js → key-bag-indexdb-SYG3YD4D.js} +3 -3
- package/metafile-cjs.json +1 -1
- package/metafile-esm.json +1 -1
- package/node/mem-filesystem.cjs.map +1 -1
- package/node/mem-filesystem.d.cts +1 -1
- package/node/mem-filesystem.d.ts +1 -1
- package/node/mem-filesystem.js.map +1 -1
- package/node/metafile-cjs.json +1 -1
- package/node/metafile-esm.json +1 -1
- package/node/node-filesystem.cjs.map +1 -1
- package/node/node-filesystem.d.cts +1 -2
- package/node/node-filesystem.d.ts +1 -2
- package/node/node-filesystem.js.map +1 -1
- package/package.json +14 -14
- package/react/index.cjs.map +1 -1
- package/react/index.d.cts +4 -33
- package/react/index.d.ts +4 -33
- package/react/index.js.map +1 -1
- package/react/metafile-cjs.json +1 -1
- package/react/metafile-esm.json +1 -1
- package/tests/fireproof/config.test.ts +1 -0
- package/tests/fireproof/multiple-ledger.test.ts +1 -1
- package/{utils-XESRUKDJ.js → utils-ZVVGAXFE.js} +3 -3
- package/web/gateway-impl.cjs +24 -167
- package/web/gateway-impl.cjs.map +1 -1
- package/web/gateway-impl.d.cts +5 -59
- package/web/gateway-impl.d.ts +5 -59
- package/web/gateway-impl.js +7 -162
- package/web/gateway-impl.js.map +1 -1
- package/web/metafile-cjs.json +1 -1
- package/web/metafile-esm.json +1 -1
- package/chunk-2D2X6HIB.js.map +0 -1
- package/chunk-WVN66YAN.js.map +0 -1
- package/gateway-2O7QPHGW.js.map +0 -1
- package/node/types-DARSfXlb.d.cts +0 -23
- package/node/types-DARSfXlb.d.ts +0 -23
- /package/{key-bag-file-CBCAWTVG.js.map → key-bag-file-PWZ3QE7B.js.map} +0 -0
- /package/{key-bag-indexdb-RTSMSGM7.js.map → key-bag-indexdb-SYG3YD4D.js.map} +0 -0
- /package/{utils-XESRUKDJ.js.map → utils-ZVVGAXFE.js.map} +0 -0
@@ -2,12 +2,12 @@ import {
|
|
2
2
|
getFileName,
|
3
3
|
getFileSystem,
|
4
4
|
getPath
|
5
|
-
} from "./chunk-
|
6
|
-
import "./chunk-
|
5
|
+
} from "./chunk-F4FC6B2T.js";
|
6
|
+
import "./chunk-RXC4JGJT.js";
|
7
7
|
import "./chunk-PZ5AY32C.js";
|
8
8
|
export {
|
9
9
|
getFileName,
|
10
10
|
getFileSystem,
|
11
11
|
getPath
|
12
12
|
};
|
13
|
-
//# sourceMappingURL=utils-
|
13
|
+
//# sourceMappingURL=utils-ZVVGAXFE.js.map
|
package/web/gateway-impl.cjs
CHANGED
@@ -26,156 +26,13 @@ __export(gateway_impl_exports, {
|
|
26
26
|
});
|
27
27
|
module.exports = __toCommonJS(gateway_impl_exports);
|
28
28
|
var import_idb = require("idb");
|
29
|
-
var
|
29
|
+
var import_cement = require("@adviser/cement");
|
30
30
|
|
31
31
|
// src/runtime/gateways/indexdb/version.ts
|
32
32
|
var INDEXDB_VERSION = "v0.19-indexdb";
|
33
33
|
|
34
|
-
// src/utils.ts
|
35
|
-
var import_cement = require("@adviser/cement");
|
36
|
-
var import_base58 = require("multiformats/bases/base58");
|
37
|
-
var _globalLogger = new import_cement.ResolveOnce();
|
38
|
-
function globalLogger() {
|
39
|
-
return _globalLogger.once(() => new import_cement.LoggerImpl());
|
40
|
-
}
|
41
|
-
var registerFP_DEBUG = new import_cement.ResolveOnce();
|
42
|
-
var pathOpsImpl = class {
|
43
|
-
join(...paths) {
|
44
|
-
return paths.map((i) => i.replace(/\/+$/, "")).join("/");
|
45
|
-
}
|
46
|
-
dirname(path) {
|
47
|
-
return path.split("/").slice(0, -1).join("/");
|
48
|
-
}
|
49
|
-
// homedir() {
|
50
|
-
// throw new Error("SysContainer:homedir is not available in seeded state");
|
51
|
-
// }
|
52
|
-
};
|
53
|
-
var pathOps = new pathOpsImpl();
|
54
|
-
function ensureLogger(sthis, componentName, ctx) {
|
55
|
-
let logger;
|
56
|
-
if ((0, import_cement.IsLogger)(sthis)) {
|
57
|
-
logger = sthis;
|
58
|
-
} else if (sthis && (0, import_cement.IsLogger)(sthis.logger)) {
|
59
|
-
logger = sthis.logger;
|
60
|
-
} else {
|
61
|
-
logger = globalLogger();
|
62
|
-
}
|
63
|
-
const cLogger = logger.With().Module(componentName);
|
64
|
-
const debug = [];
|
65
|
-
let exposeStack = false;
|
66
|
-
if (ctx) {
|
67
|
-
if ("debug" in ctx) {
|
68
|
-
if (typeof ctx.debug === "string" && ctx.debug.length > 0) {
|
69
|
-
debug.push(ctx.debug);
|
70
|
-
} else {
|
71
|
-
debug.push(componentName);
|
72
|
-
}
|
73
|
-
delete ctx.debug;
|
74
|
-
}
|
75
|
-
if ("exposeStack" in ctx) {
|
76
|
-
exposeStack = true;
|
77
|
-
delete ctx.exposeStack;
|
78
|
-
}
|
79
|
-
if ("this" in ctx) {
|
80
|
-
cLogger.Str("this", sthis.nextId(4).str);
|
81
|
-
delete ctx.this;
|
82
|
-
}
|
83
|
-
for (const [key, value] of Object.entries(ctx)) {
|
84
|
-
switch (typeof value) {
|
85
|
-
case "string":
|
86
|
-
cLogger.Str(key, value);
|
87
|
-
break;
|
88
|
-
case "number":
|
89
|
-
cLogger.Uint64(key, value);
|
90
|
-
break;
|
91
|
-
default:
|
92
|
-
if (value instanceof Date) {
|
93
|
-
cLogger.Str(key, value.toISOString());
|
94
|
-
} else if ((0, import_cement.isURL)(value)) {
|
95
|
-
cLogger.Str(key, value.toString());
|
96
|
-
} else if (typeof value === "function") {
|
97
|
-
cLogger.Ref(key, value);
|
98
|
-
} else {
|
99
|
-
cLogger.Any(key, value);
|
100
|
-
}
|
101
|
-
break;
|
102
|
-
}
|
103
|
-
}
|
104
|
-
}
|
105
|
-
registerFP_DEBUG.once(async () => {
|
106
|
-
sthis.env.onSet(
|
107
|
-
(key, value) => {
|
108
|
-
switch (key) {
|
109
|
-
case "FP_FORMAT": {
|
110
|
-
switch (value) {
|
111
|
-
case "jsonice":
|
112
|
-
logger.SetFormatter(new import_cement.JSONFormatter(logger.TxtEnDe(), 2));
|
113
|
-
break;
|
114
|
-
case "yaml":
|
115
|
-
logger.SetFormatter(new import_cement.YAMLFormatter(logger.TxtEnDe(), 2));
|
116
|
-
break;
|
117
|
-
case "json":
|
118
|
-
default:
|
119
|
-
logger.SetFormatter(new import_cement.JSONFormatter(logger.TxtEnDe()));
|
120
|
-
break;
|
121
|
-
}
|
122
|
-
break;
|
123
|
-
}
|
124
|
-
case "FP_DEBUG":
|
125
|
-
logger.SetDebug(value || []);
|
126
|
-
break;
|
127
|
-
case "FP_STACK":
|
128
|
-
logger.SetExposeStack(!!value);
|
129
|
-
break;
|
130
|
-
}
|
131
|
-
},
|
132
|
-
"FP_FORMAT",
|
133
|
-
"FP_DEBUG",
|
134
|
-
"FP_STACK"
|
135
|
-
);
|
136
|
-
}).finally(() => {
|
137
|
-
});
|
138
|
-
if (debug.length > 0) {
|
139
|
-
logger.SetDebug(debug);
|
140
|
-
}
|
141
|
-
if (exposeStack) {
|
142
|
-
logger.SetExposeStack(true);
|
143
|
-
}
|
144
|
-
const out = cLogger.Logger();
|
145
|
-
return out;
|
146
|
-
}
|
147
|
-
function getStore(url, sthis, joiner) {
|
148
|
-
const store = url.getParam("store");
|
149
|
-
switch (store) {
|
150
|
-
case "data":
|
151
|
-
case "wal":
|
152
|
-
case "meta":
|
153
|
-
break;
|
154
|
-
default:
|
155
|
-
throw sthis.logger.Error().Url(url).Msg(`store not found`).AsError();
|
156
|
-
}
|
157
|
-
let name = store;
|
158
|
-
if (url.hasParam("index")) {
|
159
|
-
name = joiner(url.getParam("index") || "idx", name);
|
160
|
-
}
|
161
|
-
return { store, name };
|
162
|
-
}
|
163
|
-
function getKey(url, logger) {
|
164
|
-
const result = url.getParam("key");
|
165
|
-
if (!result) throw logger.Error().Str("url", url.toString()).Msg(`key not found`).AsError();
|
166
|
-
return result;
|
167
|
-
}
|
168
|
-
async function exceptionWrapper(fn) {
|
169
|
-
return fn().catch((e) => import_cement.Result.Err(e));
|
170
|
-
}
|
171
|
-
var NotFoundError = class extends Error {
|
172
|
-
constructor() {
|
173
|
-
super(...arguments);
|
174
|
-
this.code = "ENOENT";
|
175
|
-
}
|
176
|
-
};
|
177
|
-
|
178
34
|
// src/runtime/gateways/indexdb/web/gateway-impl.ts
|
35
|
+
var import_core = require("@fireproof/core");
|
179
36
|
function ensureVersion(url) {
|
180
37
|
return url.build().defParam("version", INDEXDB_VERSION).URI();
|
181
38
|
}
|
@@ -185,7 +42,7 @@ function sanitzeKey(key) {
|
|
185
42
|
}
|
186
43
|
return key;
|
187
44
|
}
|
188
|
-
var onceConn = new
|
45
|
+
var onceConn = new import_cement.KeyedResolvOnce();
|
189
46
|
async function connectIdb(url, sthis) {
|
190
47
|
const dbName = getIndexDBName(url, sthis);
|
191
48
|
const once = await onceConn.get(dbName.fullDb).once(async () => {
|
@@ -221,7 +78,7 @@ function getIndexDBName(iurl, sthis) {
|
|
221
78
|
const dbName = url.getParam("name");
|
222
79
|
if (!dbName) throw sthis.logger.Error().Str("url", url.toString()).Msg(`name not found`).AsError();
|
223
80
|
const result = joinDBName(fullDb, dbName);
|
224
|
-
const objStore = getStore(url, sthis, joinDBName).name;
|
81
|
+
const objStore = (0, import_core.getStore)(url, sthis, joinDBName).name;
|
225
82
|
const connectionKey = [result, objStore].join(":");
|
226
83
|
return {
|
227
84
|
fullDb: result,
|
@@ -232,12 +89,12 @@ function getIndexDBName(iurl, sthis) {
|
|
232
89
|
}
|
233
90
|
var IndexDBGatewayImpl = class {
|
234
91
|
constructor(sthis) {
|
235
|
-
this.logger = ensureLogger(sthis, "IndexDBGateway");
|
92
|
+
this.logger = (0, import_core.ensureLogger)(sthis, "IndexDBGateway");
|
236
93
|
this.sthis = sthis;
|
237
94
|
}
|
238
95
|
// _db: IDBPDatabase<unknown> = {} as IDBPDatabase<unknown>;
|
239
96
|
async start(baseURL) {
|
240
|
-
return (0,
|
97
|
+
return (0, import_cement.exception2Result)(async () => {
|
241
98
|
this.logger.Debug().Url(baseURL).Msg("starting");
|
242
99
|
await this.sthis.start();
|
243
100
|
const ic = await connectIdb(baseURL, this.sthis);
|
@@ -246,11 +103,11 @@ var IndexDBGatewayImpl = class {
|
|
246
103
|
});
|
247
104
|
}
|
248
105
|
async close() {
|
249
|
-
return
|
106
|
+
return import_cement.Result.Ok(void 0);
|
250
107
|
}
|
251
108
|
async destroy(baseUrl) {
|
252
|
-
return (0,
|
253
|
-
const type = getStore(baseUrl, this.sthis, joinDBName).name;
|
109
|
+
return (0, import_cement.exception2Result)(async () => {
|
110
|
+
const type = (0, import_core.getStore)(baseUrl, this.sthis, joinDBName).name;
|
254
111
|
const idb = await connectIdb(baseUrl, this.sthis);
|
255
112
|
const trans = idb.db.transaction(type, "readwrite");
|
256
113
|
const object_store = trans.objectStore(type);
|
@@ -265,27 +122,27 @@ var IndexDBGatewayImpl = class {
|
|
265
122
|
});
|
266
123
|
}
|
267
124
|
buildUrl(baseUrl, key) {
|
268
|
-
return Promise.resolve(
|
125
|
+
return Promise.resolve(import_cement.Result.Ok(baseUrl.build().setParam("key", key).URI()));
|
269
126
|
}
|
270
127
|
async get(url) {
|
271
|
-
return exceptionWrapper(async () => {
|
272
|
-
const key = getKey(url, this.logger);
|
273
|
-
const store = getStore(url, this.sthis, joinDBName).name;
|
128
|
+
return (0, import_core.exceptionWrapper)(async () => {
|
129
|
+
const key = (0, import_core.getKey)(url, this.logger);
|
130
|
+
const store = (0, import_core.getStore)(url, this.sthis, joinDBName).name;
|
274
131
|
this.logger.Debug().Url(url).Str("key", key).Str("store", store).Msg("getting");
|
275
132
|
const { db } = await connectIdb(url, this.sthis);
|
276
133
|
const tx = db.transaction([store], "readonly");
|
277
134
|
const bytes = await tx.objectStore(store).get(sanitzeKey(key));
|
278
135
|
await tx.done;
|
279
136
|
if (!bytes) {
|
280
|
-
return
|
137
|
+
return import_cement.Result.Err(new import_core.NotFoundError(`missing ${key}`));
|
281
138
|
}
|
282
|
-
return
|
139
|
+
return import_cement.Result.Ok(bytes);
|
283
140
|
});
|
284
141
|
}
|
285
142
|
async put(url, value) {
|
286
|
-
return (0,
|
287
|
-
const key = getKey(url, this.logger);
|
288
|
-
const store = getStore(url, this.sthis, joinDBName).name;
|
143
|
+
return (0, import_cement.exception2Result)(async () => {
|
144
|
+
const key = (0, import_core.getKey)(url, this.logger);
|
145
|
+
const store = (0, import_core.getStore)(url, this.sthis, joinDBName).name;
|
289
146
|
this.logger.Debug().Url(url).Str("key", key).Str("store", store).Msg("putting");
|
290
147
|
const { db } = await connectIdb(url, this.sthis);
|
291
148
|
const tx = db.transaction([store], "readwrite");
|
@@ -294,26 +151,26 @@ var IndexDBGatewayImpl = class {
|
|
294
151
|
});
|
295
152
|
}
|
296
153
|
async delete(url) {
|
297
|
-
return (0,
|
298
|
-
const key = getKey(url, this.logger);
|
299
|
-
const store = getStore(url, this.sthis, joinDBName).name;
|
154
|
+
return (0, import_cement.exception2Result)(async () => {
|
155
|
+
const key = (0, import_core.getKey)(url, this.logger);
|
156
|
+
const store = (0, import_core.getStore)(url, this.sthis, joinDBName).name;
|
300
157
|
this.logger.Debug().Url(url).Str("key", key).Str("store", store).Msg("deleting");
|
301
158
|
const { db } = await connectIdb(url, this.sthis);
|
302
159
|
const tx = db.transaction([store], "readwrite");
|
303
160
|
await tx.objectStore(store).delete(sanitzeKey(key));
|
304
161
|
await tx.done;
|
305
|
-
return
|
162
|
+
return import_cement.Result.Ok(void 0);
|
306
163
|
});
|
307
164
|
}
|
308
165
|
};
|
309
166
|
var IndexDBTestStore = class {
|
310
167
|
constructor(sthis) {
|
311
168
|
this.sthis = sthis;
|
312
|
-
this.logger = ensureLogger(sthis, "IndexDBTestStore", {});
|
169
|
+
this.logger = (0, import_core.ensureLogger)(sthis, "IndexDBTestStore", {});
|
313
170
|
}
|
314
171
|
async get(url, key) {
|
315
172
|
const ic = await connectIdb(url, this.sthis);
|
316
|
-
const store = getStore(ic.url, this.sthis, joinDBName).name;
|
173
|
+
const store = (0, import_core.getStore)(ic.url, this.sthis, joinDBName).name;
|
317
174
|
this.logger.Debug().Str("key", key).Str("store", store).Msg("getting");
|
318
175
|
let bytes = await ic.db.get(store, sanitzeKey(key));
|
319
176
|
this.logger.Debug().Str("key", key).Str("store", store).Int("len", bytes.length).Msg("got");
|
package/web/gateway-impl.cjs.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../src/runtime/gateways/indexdb/web/gateway-impl.ts","../../../src/runtime/gateways/indexdb/version.ts","../../../src/utils.ts"],"sourcesContent":["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 \"../../../../utils.js\";\nimport { Gateway, GetResult, TestGateway } from \"../../../../blockstore/gateway.js\";\nimport { SuperThis } from \"../../../../types.js\";\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 IndexDBGatewayImpl implements 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<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 IndexDBTestStore implements 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 {\n Logger,\n LoggerImpl,\n IsLogger,\n Result,\n ResolveOnce,\n isURL,\n URI,\n CoerceURI,\n runtimeFn,\n envFactory,\n Env,\n toCryptoRuntime,\n CryptoRuntime,\n JSONFormatter,\n YAMLFormatter,\n} from \"@adviser/cement\";\nimport { PathOps, StoreType, SuperThis, SuperThisOpts, TextEndeCoder } from \"./types.js\";\nimport { base58btc } from \"multiformats/bases/base58\";\n\nexport type { Logger };\nexport { Result };\n\nconst _globalLogger = new ResolveOnce();\nfunction globalLogger(): Logger {\n return _globalLogger.once(() => new LoggerImpl());\n}\n\nconst registerFP_DEBUG = new ResolveOnce();\n\ninterface superThisOpts {\n readonly logger: Logger;\n readonly env: Env;\n readonly pathOps: PathOps;\n readonly crypto: CryptoRuntime;\n readonly ctx: Record<string, unknown>;\n readonly txt: TextEndeCoder;\n}\n\nclass SuperThisImpl implements SuperThis {\n readonly logger: Logger;\n readonly env: Env;\n readonly pathOps: PathOps;\n readonly ctx: Record<string, unknown>;\n readonly txt: TextEndeCoder;\n readonly crypto: CryptoRuntime;\n\n constructor(opts: superThisOpts) {\n this.logger = opts.logger;\n this.env = opts.env;\n this.crypto = opts.crypto;\n this.pathOps = opts.pathOps;\n this.txt = opts.txt;\n this.ctx = { ...opts.ctx };\n // console.log(\"superThis\", this);\n }\n\n nextId(bytes = 6): { str: string; bin: Uint8Array } {\n const bin = this.crypto.randomBytes(bytes);\n return {\n str: base58btc.encode(bin),\n bin,\n };\n }\n\n timeOrderedNextId(now?: number): { str: string } {\n now = typeof now === \"number\" ? now : new Date().getTime();\n // 49th bit\n const t = (0x1000000000000 + now).toString(16).replace(/^1/, \"\");\n const bin = this.crypto.randomBytes(10);\n bin[1] = (bin[1] & 0xf0) | (bin[1] | 0x08 && 0x0b);\n const hex = Array.from(bin)\n .map((i) => i.toString(16).padStart(2, \"0\"))\n .join(\"\");\n return {\n str: `${t.slice(0, 8)}-${t.slice(8)}-7${hex.slice(0, 3)}-${hex.slice(3, 7)}-${hex.slice(7, 19)}`,\n };\n }\n\n start(): Promise<void> {\n return Promise.resolve();\n }\n\n clone(override: Partial<SuperThisOpts>): SuperThis {\n return new SuperThisImpl({\n logger: override.logger || this.logger,\n env: envFactory(override.env) || this.env,\n crypto: override.crypto || this.crypto,\n pathOps: override.pathOps || this.pathOps,\n txt: override.txt || this.txt,\n ctx: { ...this.ctx, ...override.ctx },\n });\n }\n}\n\n// const pathOps =\nfunction presetEnv() {\n const penv = new Map([\n // [\"FP_DEBUG\", \"xxx\"],\n // [\"FP_ENV\", \"development\"],\n ...Array.from(\n Object.entries(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ((globalThis as any)[Symbol.for(\"FP_PRESET_ENV\")] || {}) as Record<string, string>,\n ),\n ), // .map(([k, v]) => [k, v as string])\n ]);\n // console.log(\">>>>>>\", penv)\n return penv;\n}\n// const envImpl = envFactory({\n// symbol: \"FP_ENV\",\n// presetEnv: presetEnv(),\n// });\nclass pathOpsImpl implements PathOps {\n join(...paths: string[]): string {\n return paths.map((i) => i.replace(/\\/+$/, \"\")).join(\"/\");\n }\n dirname(path: string) {\n return path.split(\"/\").slice(0, -1).join(\"/\");\n }\n // homedir() {\n // throw new Error(\"SysContainer:homedir is not available in seeded state\");\n // }\n}\nconst pathOps = new pathOpsImpl();\nconst txtOps = {\n // eslint-disable-next-line no-restricted-globals\n encode: (input: string) => new TextEncoder().encode(input),\n // eslint-disable-next-line no-restricted-globals\n decode: (input: Uint8Array) => new TextDecoder().decode(input),\n};\n\nexport function ensureSuperThis(osthis?: Partial<SuperThisOpts>): SuperThis {\n const env = envFactory({\n symbol: osthis?.env?.symbol || \"FP_ENV\",\n presetEnv: osthis?.env?.presetEnv || presetEnv(),\n });\n return new SuperThisImpl({\n logger: osthis?.logger || globalLogger(),\n env,\n crypto: osthis?.crypto || toCryptoRuntime(),\n ctx: osthis?.ctx || {},\n pathOps,\n txt: osthis?.txt || txtOps,\n });\n}\n\n// // eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function ensureSuperLog(sthis: SuperThis, componentName: string, ctx?: Record<string, unknown>): SuperThis {\n return sthis.clone({\n logger: ensureLogger(sthis, componentName, ctx),\n });\n}\n\nexport function ensureLogger(\n sthis: SuperThis /* Partial<LoggerOpts> | Logger */,\n componentName: string,\n ctx?: Record<string, unknown>,\n): Logger {\n // if (!opts?.logger) {\n // throw new Error(\"logger is required\");\n // }\n let logger: Logger;\n if (IsLogger(sthis)) {\n logger = sthis;\n } else if (sthis && IsLogger(sthis.logger)) {\n logger = sthis.logger;\n } else {\n logger = globalLogger();\n }\n const cLogger = logger.With().Module(componentName); //.Str(\"this\", uuidv7());\n const debug: string[] = [];\n let exposeStack = false;\n if (ctx) {\n if (\"debug\" in ctx) {\n if (typeof ctx.debug === \"string\" && ctx.debug.length > 0) {\n debug.push(ctx.debug);\n } else {\n debug.push(componentName);\n }\n delete ctx.debug;\n }\n if (\"exposeStack\" in ctx) {\n exposeStack = true;\n delete ctx.exposeStack;\n }\n if (\"this\" in ctx) {\n cLogger.Str(\"this\", sthis.nextId(4).str);\n delete ctx.this;\n }\n for (const [key, value] of Object.entries(ctx)) {\n switch (typeof value) {\n case \"string\":\n cLogger.Str(key, value);\n break;\n case \"number\":\n cLogger.Uint64(key, value);\n break;\n default:\n if (value instanceof Date) {\n cLogger.Str(key, value.toISOString());\n } else if (isURL(value)) {\n cLogger.Str(key, value.toString());\n } else if (typeof value === \"function\") {\n cLogger.Ref(key, value);\n } else {\n cLogger.Any(key, value);\n }\n break;\n }\n }\n }\n registerFP_DEBUG\n .once(async () => {\n // console.log(\"registerFP_DEBUG\", SysContainer.env)\n sthis.env.onSet(\n (key, value) => {\n // console.log(\"FP_DEBUG\", key, value, debug)\n switch (key) {\n case \"FP_FORMAT\": {\n switch (value) {\n case \"jsonice\":\n logger.SetFormatter(new JSONFormatter(logger.TxtEnDe(), 2));\n break;\n case \"yaml\":\n logger.SetFormatter(new YAMLFormatter(logger.TxtEnDe(), 2));\n break;\n case \"json\":\n default:\n logger.SetFormatter(new JSONFormatter(logger.TxtEnDe()));\n break;\n }\n break;\n }\n case \"FP_DEBUG\":\n logger.SetDebug(value || []);\n break;\n case \"FP_STACK\":\n logger.SetExposeStack(!!value);\n break;\n }\n },\n \"FP_FORMAT\",\n \"FP_DEBUG\",\n \"FP_STACK\",\n );\n })\n .finally(() => {\n /* do nothing */\n });\n\n if (debug.length > 0) {\n logger.SetDebug(debug);\n }\n if (exposeStack) {\n logger.SetExposeStack(true);\n }\n const out = cLogger.Logger();\n // out.Debug().Msg(\"logger ready\");\n return out;\n}\n\nexport type Joiner = (...toJoin: string[]) => string;\n\nexport interface Store {\n readonly store: StoreType;\n readonly name: string;\n}\n\nexport function getStore(url: URI, sthis: SuperThis, joiner: Joiner): Store {\n const store = url.getParam(\"store\");\n switch (store) {\n case \"data\":\n case \"wal\":\n case \"meta\":\n break;\n default:\n throw sthis.logger.Error().Url(url).Msg(`store not found`).AsError();\n }\n let name: string = store;\n if (url.hasParam(\"index\")) {\n name = joiner(url.getParam(\"index\") || \"idx\", name);\n }\n return { store, name };\n}\n\nexport function getKey(url: URI, logger: Logger): string {\n const result = url.getParam(\"key\");\n if (!result) throw logger.Error().Str(\"url\", url.toString()).Msg(`key not found`).AsError();\n return result;\n}\n\nexport function getName(sthis: SuperThis, url: URI): string {\n let result = url.getParam(\"name\");\n if (!result) {\n result = sthis.pathOps.dirname(url.pathname);\n if (result.length === 0) {\n throw sthis.logger.Error().Str(\"url\", url.toString()).Msg(`name not found`).AsError();\n }\n }\n return result;\n}\n\n// export function exception2Result<T = void>(fn: () => Promise<T>): Promise<Result<T>> {\n// return fn()\n// .then((value) => Result.Ok(value))\n// .catch((e) => Result.Err(e));\n// }\n\nexport async function exceptionWrapper<T, E extends Error>(fn: () => Promise<Result<T, E>>): Promise<Result<T, E>> {\n return fn().catch((e) => Result.Err(e));\n}\n\n// // the big side effect party --- hate it\n// export function sanitizeURL(url: URL) {\n// url.searchParams.sort();\n// // const searchParams = Object.entries(url.searchParams).sort(([a], [b]) => a.localeCompare(b));\n// // console.log(\"searchParams\", searchParams);\n// // for (const [key] of searchParams) {\n// // url.searchParams.delete(key);\n// // }\n// // for (const [key, value] of searchParams) {\n// // url.searchParams.set(key, value);\n// // }\n// }\n\nexport class NotFoundError extends Error {\n readonly code = \"ENOENT\";\n}\n\nexport function isNotFoundError(e: Error | Result<unknown> | unknown): e is NotFoundError {\n if (Result.Is(e)) {\n if (e.isOk()) return false;\n e = e.Err();\n }\n if ((e as NotFoundError).code === \"ENOENT\") return true;\n return false;\n}\n\nexport function dataDir(sthis: SuperThis, name?: string, base?: CoerceURI): URI {\n if (!base) {\n if (!runtimeFn().isBrowser) {\n const home = sthis.env.get(\"HOME\") || \"./\";\n base = sthis.env.get(\"FP_STORAGE_URL\") || `file://${sthis.pathOps.join(home, \".fireproof\")}`;\n } else {\n base = sthis.env.get(\"FP_STORAGE_URL\") || `indexdb://fp`;\n }\n }\n return URI.from(base.toString())\n .build()\n .setParam(\"name\", name || \"\")\n .URI();\n}\n\nexport function UInt8ArrayEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAqC;AACrC,IAAAA,iBAAuE;;;ACDhE,IAAM,kBAAkB;;;ACA/B,oBAgBO;AAEP,oBAA0B;AAK1B,IAAM,gBAAgB,IAAI,0BAAY;AACtC,SAAS,eAAuB;AAC9B,SAAO,cAAc,KAAK,MAAM,IAAI,yBAAW,CAAC;AAClD;AAEA,IAAM,mBAAmB,IAAI,0BAAY;AAsFzC,IAAM,cAAN,MAAqC;AAAA,EACnC,QAAQ,OAAyB;AAC/B,WAAO,MAAM,IAAI,CAAC,MAAM,EAAE,QAAQ,QAAQ,EAAE,CAAC,EAAE,KAAK,GAAG;AAAA,EACzD;AAAA,EACA,QAAQ,MAAc;AACpB,WAAO,KAAK,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG;AAAA,EAC9C;AAAA;AAAA;AAAA;AAIF;AACA,IAAM,UAAU,IAAI,YAAY;AA8BzB,SAAS,aACd,OACA,eACA,KACQ;AAIR,MAAI;AACJ,UAAI,wBAAS,KAAK,GAAG;AACnB,aAAS;AAAA,EACX,WAAW,aAAS,wBAAS,MAAM,MAAM,GAAG;AAC1C,aAAS,MAAM;AAAA,EACjB,OAAO;AACL,aAAS,aAAa;AAAA,EACxB;AACA,QAAM,UAAU,OAAO,KAAK,EAAE,OAAO,aAAa;AAClD,QAAM,QAAkB,CAAC;AACzB,MAAI,cAAc;AAClB,MAAI,KAAK;AACP,QAAI,WAAW,KAAK;AAClB,UAAI,OAAO,IAAI,UAAU,YAAY,IAAI,MAAM,SAAS,GAAG;AACzD,cAAM,KAAK,IAAI,KAAK;AAAA,MACtB,OAAO;AACL,cAAM,KAAK,aAAa;AAAA,MAC1B;AACA,aAAO,IAAI;AAAA,IACb;AACA,QAAI,iBAAiB,KAAK;AACxB,oBAAc;AACd,aAAO,IAAI;AAAA,IACb;AACA,QAAI,UAAU,KAAK;AACjB,cAAQ,IAAI,QAAQ,MAAM,OAAO,CAAC,EAAE,GAAG;AACvC,aAAO,IAAI;AAAA,IACb;AACA,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,cAAQ,OAAO,OAAO;AAAA,QACpB,KAAK;AACH,kBAAQ,IAAI,KAAK,KAAK;AACtB;AAAA,QACF,KAAK;AACH,kBAAQ,OAAO,KAAK,KAAK;AACzB;AAAA,QACF;AACE,cAAI,iBAAiB,MAAM;AACzB,oBAAQ,IAAI,KAAK,MAAM,YAAY,CAAC;AAAA,UACtC,eAAW,qBAAM,KAAK,GAAG;AACvB,oBAAQ,IAAI,KAAK,MAAM,SAAS,CAAC;AAAA,UACnC,WAAW,OAAO,UAAU,YAAY;AACtC,oBAAQ,IAAI,KAAK,KAAK;AAAA,UACxB,OAAO;AACL,oBAAQ,IAAI,KAAK,KAAK;AAAA,UACxB;AACA;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACA,mBACG,KAAK,YAAY;AAEhB,UAAM,IAAI;AAAA,MACR,CAAC,KAAK,UAAU;AAEd,gBAAQ,KAAK;AAAA,UACX,KAAK,aAAa;AAChB,oBAAQ,OAAO;AAAA,cACb,KAAK;AACH,uBAAO,aAAa,IAAI,4BAAc,OAAO,QAAQ,GAAG,CAAC,CAAC;AAC1D;AAAA,cACF,KAAK;AACH,uBAAO,aAAa,IAAI,4BAAc,OAAO,QAAQ,GAAG,CAAC,CAAC;AAC1D;AAAA,cACF,KAAK;AAAA,cACL;AACE,uBAAO,aAAa,IAAI,4BAAc,OAAO,QAAQ,CAAC,CAAC;AACvD;AAAA,YACJ;AACA;AAAA,UACF;AAAA,UACA,KAAK;AACH,mBAAO,SAAS,SAAS,CAAC,CAAC;AAC3B;AAAA,UACF,KAAK;AACH,mBAAO,eAAe,CAAC,CAAC,KAAK;AAC7B;AAAA,QACJ;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC,EACA,QAAQ,MAAM;AAAA,EAEf,CAAC;AAEH,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO,SAAS,KAAK;AAAA,EACvB;AACA,MAAI,aAAa;AACf,WAAO,eAAe,IAAI;AAAA,EAC5B;AACA,QAAM,MAAM,QAAQ,OAAO;AAE3B,SAAO;AACT;AASO,SAAS,SAAS,KAAU,OAAkB,QAAuB;AAC1E,QAAM,QAAQ,IAAI,SAAS,OAAO;AAClC,UAAQ,OAAO;AAAA,IACb,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH;AAAA,IACF;AACE,YAAM,MAAM,OAAO,MAAM,EAAE,IAAI,GAAG,EAAE,IAAI,iBAAiB,EAAE,QAAQ;AAAA,EACvE;AACA,MAAI,OAAe;AACnB,MAAI,IAAI,SAAS,OAAO,GAAG;AACzB,WAAO,OAAO,IAAI,SAAS,OAAO,KAAK,OAAO,IAAI;AAAA,EACpD;AACA,SAAO,EAAE,OAAO,KAAK;AACvB;AAEO,SAAS,OAAO,KAAU,QAAwB;AACvD,QAAM,SAAS,IAAI,SAAS,KAAK;AACjC,MAAI,CAAC,OAAQ,OAAM,OAAO,MAAM,EAAE,IAAI,OAAO,IAAI,SAAS,CAAC,EAAE,IAAI,eAAe,EAAE,QAAQ;AAC1F,SAAO;AACT;AAmBA,eAAsB,iBAAqC,IAAwD;AACjH,SAAO,GAAG,EAAE,MAAM,CAAC,MAAM,qBAAO,IAAI,CAAC,CAAC;AACxC;AAeO,IAAM,gBAAN,cAA4B,MAAM;AAAA,EAAlC;AAAA;AACL,SAAS,OAAO;AAAA;AAClB;;;AFjUA,SAAS,cAAc,KAAe;AACpC,SAAO,IAAI,MAAM,EAAE,SAAS,WAAW,eAAe,EAAE,IAAI;AAC9D;AASA,SAAS,WAAW,KAA2C;AAC7D,MAAI,IAAI,WAAW,GAAG;AACpB,UAAM,IAAI,CAAC;AAAA,EACb;AACA,SAAO;AACT;AAEA,IAAM,WAAW,IAAI,+BAAyB;AAC9C,eAAe,WAAW,KAAU,OAAoC;AACtE,QAAM,SAAS,eAAe,KAAK,KAAK;AACxC,QAAM,OAAO,MAAM,SAAS,IAAI,OAAO,MAAM,EAAE,KAAK,YAAY;AAC9D,UAAM,KAAK,UAAM,mBAAO,OAAO,QAAQ,GAAG;AAAA,MACxC,QAAQC,KAAI;AACV,SAAC,WAAW,QAAQ,OAAO,QAAQ,YAAY,WAAW,UAAU,EAAE,IAAI,CAAC,UAAU;AACnF,UAAAA,IAAG,kBAAkB,OAAO;AAAA,YAC1B,eAAe;AAAA,UACjB,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AACD,UAAM,QAAQ,MAAM,GAAG,IAAI,WAAW,SAAS;AAC/C,UAAM,UAAU,cAAc,GAAG,EAAE,SAAS,SAAS;AACrD,QAAI,CAAC,OAAO;AACV,YAAM,GAAG,IAAI,WAAW,EAAE,QAAQ,GAAG,SAAS;AAAA,IAChD,WAAW,MAAM,YAAY,SAAS;AACpC,YAAM,OAAO,KAAK,EAAE,IAAI,OAAO,IAAI,SAAS,CAAC,EAAE,IAAI,WAAW,OAAO,EAAE,IAAI,SAAS,MAAM,OAAO,EAAE,IAAI,kBAAkB;AAAA,IAC3H;AACA,WAAO,EAAE,IAAI,QAAQ,SAAS,IAAI;AAAA,EACpC,CAAC;AACD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,KAAK,IAAI,MAAM,EAAE,SAAS,WAAW,KAAK,OAAO,EAAE,IAAI;AAAA,EACzD;AACF;AASA,SAAS,cAAc,OAAyB;AAC9C,SAAO,MACJ,IAAI,CAAC,MAAM,EAAE,QAAQ,mBAAmB,EAAE,EAAE,QAAQ,mBAAmB,GAAG,CAAC,EAC3E,OAAO,CAAC,MAAM,EAAE,MAAM,EACtB,KAAK,GAAG;AACb;AAGO,SAAS,eAAe,MAAW,OAA0B;AAClE,QAAM,MAAM,cAAc,IAAI;AAC9B,QAAM,SAAS,IAAI,SAAS,QAAQ,QAAQ,EAAE,EAAE,QAAQ,SAAS,EAAE;AAOnE,QAAM,SAAS,IAAI,SAAS,MAAM;AAClC,MAAI,CAAC,OAAQ,OAAM,MAAM,OAAO,MAAM,EAAE,IAAI,OAAO,IAAI,SAAS,CAAC,EAAE,IAAI,gBAAgB,EAAE,QAAQ;AACjG,QAAM,SAAS,WAAW,QAAQ,MAAM;AACxC,QAAM,WAAW,SAAS,KAAK,OAAO,UAAU,EAAE;AAClD,QAAM,gBAAgB,CAAC,QAAQ,QAAQ,EAAE,KAAK,GAAG;AACjD,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,qBAAN,MAA4C;AAAA,EAGjD,YAAY,OAAkB;AAC5B,SAAK,SAAS,aAAa,OAAO,gBAAgB;AAClD,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA,EAIA,MAAM,MAAM,SAAoC;AAC9C,eAAO,iCAAiB,YAAY;AAClC,WAAK,OAAO,MAAM,EAAE,IAAI,OAAO,EAAE,IAAI,UAAU;AAC/C,YAAM,KAAK,MAAM,MAAM;AACvB,YAAM,KAAK,MAAM,WAAW,SAAS,KAAK,KAAK;AAC/C,WAAK,OAAO,MAAM,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,SAAS;AAC7C,aAAO,GAAG;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EACA,MAAM,QAA+B;AACnC,WAAO,sBAAO,GAAG,MAAS;AAAA,EAC5B;AAAA,EACA,MAAM,QAAQ,SAAqC;AACjD,eAAO,iCAAiB,YAAY;AAElC,YAAM,OAAO,SAAS,SAAS,KAAK,OAAO,UAAU,EAAE;AAEvD,YAAM,MAAM,MAAM,WAAW,SAAS,KAAK,KAAK;AAChD,YAAM,QAAQ,IAAI,GAAG,YAAY,MAAM,WAAW;AAClD,YAAM,eAAe,MAAM,YAAY,IAAI;AAC3C,YAAM,WAAW,CAAC;AAClB,eAAS,SAAS,MAAM,aAAa,WAAW,GAAG,QAAQ,SAAS,MAAM,OAAO,SAAS,GAAG;AAC3F,iBAAS,KAAK,OAAO,UAAU;AAAA,MACjC;AACA,iBAAW,OAAO,UAAU;AAC1B,cAAM,MAAM,GAAG,OAAO,MAAM,GAAG;AAAA,MACjC;AACA,YAAM,MAAM;AAAA,IACd,CAAC;AAAA,EACH;AAAA,EAEA,SAAS,SAAc,KAAmC;AACxD,WAAO,QAAQ,QAAQ,sBAAO,GAAG,QAAQ,MAAM,EAAE,SAAS,OAAO,GAAG,EAAE,IAAI,CAAC,CAAC;AAAA,EAC9E;AAAA,EAEA,MAAM,IAAI,KAA8B;AACtC,WAAO,iBAAiB,YAAY;AAClC,YAAM,MAAM,OAAO,KAAK,KAAK,MAAM;AACnC,YAAM,QAAQ,SAAS,KAAK,KAAK,OAAO,UAAU,EAAE;AACpD,WAAK,OAAO,MAAM,EAAE,IAAI,GAAG,EAAE,IAAI,OAAO,GAAG,EAAE,IAAI,SAAS,KAAK,EAAE,IAAI,SAAS;AAC9E,YAAM,EAAE,GAAG,IAAI,MAAM,WAAW,KAAK,KAAK,KAAK;AAC/C,YAAM,KAAK,GAAG,YAAY,CAAC,KAAK,GAAG,UAAU;AAC7C,YAAM,QAAQ,MAAM,GAAG,YAAY,KAAK,EAAE,IAAI,WAAW,GAAG,CAAC;AAC7D,YAAM,GAAG;AACT,UAAI,CAAC,OAAO;AACV,eAAO,sBAAO,IAAI,IAAI,cAAc,WAAW,GAAG,EAAE,CAAC;AAAA,MACvD;AACA,aAAO,sBAAO,GAAG,KAAmB;AAAA,IACtC,CAAC;AAAA,EACH;AAAA,EACA,MAAM,IAAI,KAAU,OAAmB;AACrC,eAAO,iCAAiB,YAAY;AAClC,YAAM,MAAM,OAAO,KAAK,KAAK,MAAM;AACnC,YAAM,QAAQ,SAAS,KAAK,KAAK,OAAO,UAAU,EAAE;AACpD,WAAK,OAAO,MAAM,EAAE,IAAI,GAAG,EAAE,IAAI,OAAO,GAAG,EAAE,IAAI,SAAS,KAAK,EAAE,IAAI,SAAS;AAC9E,YAAM,EAAE,GAAG,IAAI,MAAM,WAAW,KAAK,KAAK,KAAK;AAC/C,YAAM,KAAK,GAAG,YAAY,CAAC,KAAK,GAAG,WAAW;AAC9C,YAAM,GAAG,YAAY,KAAK,EAAE,IAAI,OAAO,WAAW,GAAG,CAAC;AACtD,YAAM,GAAG;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EACA,MAAM,OAAO,KAAU;AACrB,eAAO,iCAAiB,YAAY;AAClC,YAAM,MAAM,OAAO,KAAK,KAAK,MAAM;AACnC,YAAM,QAAQ,SAAS,KAAK,KAAK,OAAO,UAAU,EAAE;AACpD,WAAK,OAAO,MAAM,EAAE,IAAI,GAAG,EAAE,IAAI,OAAO,GAAG,EAAE,IAAI,SAAS,KAAK,EAAE,IAAI,UAAU;AAC/E,YAAM,EAAE,GAAG,IAAI,MAAM,WAAW,KAAK,KAAK,KAAK;AAC/C,YAAM,KAAK,GAAG,YAAY,CAAC,KAAK,GAAG,WAAW;AAC9C,YAAM,GAAG,YAAY,KAAK,EAAE,OAAO,WAAW,GAAG,CAAC;AAClD,YAAM,GAAG;AACT,aAAO,sBAAO,GAAG,MAAS;AAAA,IAC5B,CAAC;AAAA,EACH;AACF;AAsBO,IAAM,mBAAN,MAA8C;AAAA,EAGnD,YAAY,OAAkB;AAC5B,SAAK,QAAQ;AACb,SAAK,SAAS,aAAa,OAAO,oBAAoB,CAAC,CAAC;AAAA,EAC1D;AAAA,EACA,MAAM,IAAI,KAAU,KAAa;AAC/B,UAAM,KAAK,MAAM,WAAW,KAAK,KAAK,KAAK;AAC3C,UAAM,QAAQ,SAAS,GAAG,KAAK,KAAK,OAAO,UAAU,EAAE;AACvD,SAAK,OAAO,MAAM,EAAE,IAAI,OAAO,GAAG,EAAE,IAAI,SAAS,KAAK,EAAE,IAAI,SAAS;AACrE,QAAI,QAAQ,MAAM,GAAG,GAAG,IAAI,OAAO,WAAW,GAAG,CAAC;AAClD,SAAK,OAAO,MAAM,EAAE,IAAI,OAAO,GAAG,EAAE,IAAI,SAAS,KAAK,EAAE,IAAI,OAAO,MAAM,MAAM,EAAE,IAAI,KAAK;AAC1F,QAAI,OAAO,UAAU,UAAU;AAC7B,cAAQ,KAAK,MAAM,IAAI,OAAO,KAAK;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AACF;","names":["import_cement","db"]}
|
1
|
+
{"version":3,"sources":["../../../src/runtime/gateways/indexdb/web/gateway-impl.ts","../../../src/runtime/gateways/indexdb/version.ts"],"sourcesContent":["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 IndexDBGatewayImpl 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 IndexDBTestStore 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"],"mappings":"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","names":["db"]}
|
package/web/gateway-impl.d.cts
CHANGED
@@ -1,59 +1,5 @@
|
|
1
|
-
import {
|
2
|
-
|
3
|
-
interface PathOps {
|
4
|
-
join(...args: string[]): string;
|
5
|
-
dirname(path: string): string;
|
6
|
-
}
|
7
|
-
interface TextEndeCoder {
|
8
|
-
encode(input: string): Uint8Array;
|
9
|
-
decode(input: Uint8Array): string;
|
10
|
-
}
|
11
|
-
interface SuperThisOpts {
|
12
|
-
readonly logger: Logger;
|
13
|
-
readonly pathOps: PathOps;
|
14
|
-
readonly crypto: CryptoRuntime;
|
15
|
-
readonly env: EnvFactoryOpts;
|
16
|
-
readonly txt: TextEndeCoder;
|
17
|
-
readonly ctx: Record<string, unknown>;
|
18
|
-
}
|
19
|
-
interface SuperThis {
|
20
|
-
readonly logger: Logger;
|
21
|
-
readonly loggerCollector?: Logger;
|
22
|
-
readonly env: Env;
|
23
|
-
readonly pathOps: PathOps;
|
24
|
-
readonly ctx: Record<string, unknown>;
|
25
|
-
readonly txt: TextEndeCoder;
|
26
|
-
nextId(bytes?: number): {
|
27
|
-
str: string;
|
28
|
-
bin: Uint8Array;
|
29
|
-
};
|
30
|
-
timeOrderedNextId(time?: number): {
|
31
|
-
str: string;
|
32
|
-
};
|
33
|
-
start(): Promise<void>;
|
34
|
-
clone(override: Partial<SuperThisOpts>): SuperThis;
|
35
|
-
}
|
36
|
-
|
37
|
-
declare class NotFoundError extends Error {
|
38
|
-
readonly code = "ENOENT";
|
39
|
-
}
|
40
|
-
|
41
|
-
type GetResult = Result<Uint8Array, NotFoundError | Error>;
|
42
|
-
type VoidResult = Result<void>;
|
43
|
-
interface TestGateway {
|
44
|
-
get(url: URI, key: string): Promise<Uint8Array>;
|
45
|
-
}
|
46
|
-
type UnsubscribeResult = Result<() => void>;
|
47
|
-
interface Gateway {
|
48
|
-
buildUrl(baseUrl: URI, key: string): Promise<Result<URI>>;
|
49
|
-
start(baseUrl: URI): Promise<Result<URI>>;
|
50
|
-
close(baseUrl: URI): Promise<VoidResult>;
|
51
|
-
destroy(baseUrl: URI): Promise<VoidResult>;
|
52
|
-
put(url: URI, body: Uint8Array): Promise<VoidResult>;
|
53
|
-
get(url: URI): Promise<GetResult>;
|
54
|
-
delete(url: URI): Promise<VoidResult>;
|
55
|
-
subscribe?(url: URI, callback: (meta: Uint8Array) => void): Promise<UnsubscribeResult>;
|
56
|
-
}
|
1
|
+
import { URI, Logger, Result } from '@adviser/cement';
|
2
|
+
import { SuperThis, bs } from '@fireproof/core';
|
57
3
|
|
58
4
|
interface DbName {
|
59
5
|
readonly fullDb: string;
|
@@ -62,7 +8,7 @@ interface DbName {
|
|
62
8
|
readonly dbName: string;
|
63
9
|
}
|
64
10
|
declare function getIndexDBName(iurl: URI, sthis: SuperThis): DbName;
|
65
|
-
declare class IndexDBGatewayImpl implements Gateway {
|
11
|
+
declare class IndexDBGatewayImpl implements bs.Gateway {
|
66
12
|
readonly logger: Logger;
|
67
13
|
readonly sthis: SuperThis;
|
68
14
|
constructor(sthis: SuperThis);
|
@@ -70,11 +16,11 @@ declare class IndexDBGatewayImpl implements Gateway {
|
|
70
16
|
close(): Promise<Result<void>>;
|
71
17
|
destroy(baseUrl: URI): Promise<Result<void>>;
|
72
18
|
buildUrl(baseUrl: URI, key: string): Promise<Result<URI>>;
|
73
|
-
get(url: URI): Promise<GetResult>;
|
19
|
+
get(url: URI): Promise<bs.GetResult>;
|
74
20
|
put(url: URI, value: Uint8Array): Promise<Result<void, Error>>;
|
75
21
|
delete(url: URI): Promise<Result<Result<undefined, Error>, Error>>;
|
76
22
|
}
|
77
|
-
declare class IndexDBTestStore implements TestGateway {
|
23
|
+
declare class IndexDBTestStore implements bs.TestGateway {
|
78
24
|
readonly logger: Logger;
|
79
25
|
readonly sthis: SuperThis;
|
80
26
|
constructor(sthis: SuperThis);
|
package/web/gateway-impl.d.ts
CHANGED
@@ -1,59 +1,5 @@
|
|
1
|
-
import {
|
2
|
-
|
3
|
-
interface PathOps {
|
4
|
-
join(...args: string[]): string;
|
5
|
-
dirname(path: string): string;
|
6
|
-
}
|
7
|
-
interface TextEndeCoder {
|
8
|
-
encode(input: string): Uint8Array;
|
9
|
-
decode(input: Uint8Array): string;
|
10
|
-
}
|
11
|
-
interface SuperThisOpts {
|
12
|
-
readonly logger: Logger;
|
13
|
-
readonly pathOps: PathOps;
|
14
|
-
readonly crypto: CryptoRuntime;
|
15
|
-
readonly env: EnvFactoryOpts;
|
16
|
-
readonly txt: TextEndeCoder;
|
17
|
-
readonly ctx: Record<string, unknown>;
|
18
|
-
}
|
19
|
-
interface SuperThis {
|
20
|
-
readonly logger: Logger;
|
21
|
-
readonly loggerCollector?: Logger;
|
22
|
-
readonly env: Env;
|
23
|
-
readonly pathOps: PathOps;
|
24
|
-
readonly ctx: Record<string, unknown>;
|
25
|
-
readonly txt: TextEndeCoder;
|
26
|
-
nextId(bytes?: number): {
|
27
|
-
str: string;
|
28
|
-
bin: Uint8Array;
|
29
|
-
};
|
30
|
-
timeOrderedNextId(time?: number): {
|
31
|
-
str: string;
|
32
|
-
};
|
33
|
-
start(): Promise<void>;
|
34
|
-
clone(override: Partial<SuperThisOpts>): SuperThis;
|
35
|
-
}
|
36
|
-
|
37
|
-
declare class NotFoundError extends Error {
|
38
|
-
readonly code = "ENOENT";
|
39
|
-
}
|
40
|
-
|
41
|
-
type GetResult = Result<Uint8Array, NotFoundError | Error>;
|
42
|
-
type VoidResult = Result<void>;
|
43
|
-
interface TestGateway {
|
44
|
-
get(url: URI, key: string): Promise<Uint8Array>;
|
45
|
-
}
|
46
|
-
type UnsubscribeResult = Result<() => void>;
|
47
|
-
interface Gateway {
|
48
|
-
buildUrl(baseUrl: URI, key: string): Promise<Result<URI>>;
|
49
|
-
start(baseUrl: URI): Promise<Result<URI>>;
|
50
|
-
close(baseUrl: URI): Promise<VoidResult>;
|
51
|
-
destroy(baseUrl: URI): Promise<VoidResult>;
|
52
|
-
put(url: URI, body: Uint8Array): Promise<VoidResult>;
|
53
|
-
get(url: URI): Promise<GetResult>;
|
54
|
-
delete(url: URI): Promise<VoidResult>;
|
55
|
-
subscribe?(url: URI, callback: (meta: Uint8Array) => void): Promise<UnsubscribeResult>;
|
56
|
-
}
|
1
|
+
import { URI, Logger, Result } from '@adviser/cement';
|
2
|
+
import { SuperThis, bs } from '@fireproof/core';
|
57
3
|
|
58
4
|
interface DbName {
|
59
5
|
readonly fullDb: string;
|
@@ -62,7 +8,7 @@ interface DbName {
|
|
62
8
|
readonly dbName: string;
|
63
9
|
}
|
64
10
|
declare function getIndexDBName(iurl: URI, sthis: SuperThis): DbName;
|
65
|
-
declare class IndexDBGatewayImpl implements Gateway {
|
11
|
+
declare class IndexDBGatewayImpl implements bs.Gateway {
|
66
12
|
readonly logger: Logger;
|
67
13
|
readonly sthis: SuperThis;
|
68
14
|
constructor(sthis: SuperThis);
|
@@ -70,11 +16,11 @@ declare class IndexDBGatewayImpl implements Gateway {
|
|
70
16
|
close(): Promise<Result<void>>;
|
71
17
|
destroy(baseUrl: URI): Promise<Result<void>>;
|
72
18
|
buildUrl(baseUrl: URI, key: string): Promise<Result<URI>>;
|
73
|
-
get(url: URI): Promise<GetResult>;
|
19
|
+
get(url: URI): Promise<bs.GetResult>;
|
74
20
|
put(url: URI, value: Uint8Array): Promise<Result<void, Error>>;
|
75
21
|
delete(url: URI): Promise<Result<Result<undefined, Error>, Error>>;
|
76
22
|
}
|
77
|
-
declare class IndexDBTestStore implements TestGateway {
|
23
|
+
declare class IndexDBTestStore implements bs.TestGateway {
|
78
24
|
readonly logger: Logger;
|
79
25
|
readonly sthis: SuperThis;
|
80
26
|
constructor(sthis: SuperThis);
|