@fireproof/core 0.19.8-dev-alldocs-export → 0.19.8-dev-cra
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-DG6XSV44.js → chunk-BNL4PVBF.js} +25 -81
- package/chunk-BNL4PVBF.js.map +1 -0
- package/{chunk-OWQAHX2V.js → chunk-JW2QT6BF.js} +24 -4
- package/chunk-JW2QT6BF.js.map +1 -0
- package/index.cjs +443 -1300
- package/index.cjs.map +1 -1
- package/index.d.cts +156 -167
- package/index.d.ts +156 -167
- package/index.global.js +1036 -1214
- package/index.global.js.map +1 -1
- package/index.js +64 -59
- package/index.js.map +1 -1
- package/metafile-cjs.json +1 -1
- package/metafile-esm.json +1 -1
- package/metafile-iife.json +1 -1
- package/node-sys-container-MIEX6ELJ.js +29 -0
- package/node-sys-container-MIEX6ELJ.js.map +1 -0
- package/package.json +3 -2
- package/{store-file-WD746RSY.js → store-file-VJ6BI4II.js} +6 -8
- package/{store-file-WD746RSY.js.map → store-file-VJ6BI4II.js.map} +1 -1
- package/{chunk-5UFCF36O.js → store-indexdb-WLRSICCB.js} +7 -17
- package/store-indexdb-WLRSICCB.js.map +1 -0
- package/tests/fireproof/config.test.ts +14 -70
- package/tests/fireproof/database.test.ts +4 -4
- package/tests/fireproof/fireproof.test.ts +5 -5
- package/tests/fireproof/hello.test.ts +2 -2
- package/chunk-5UFCF36O.js.map +0 -1
- package/chunk-DG6XSV44.js.map +0 -1
- package/chunk-OWQAHX2V.js.map +0 -1
- package/chunk-PRQHQG4I.js +0 -39
- package/chunk-PRQHQG4I.js.map +0 -1
- package/chunk-VZGT7ZYP.js +0 -22
- package/chunk-VZGT7ZYP.js.map +0 -1
- package/node-sys-container-TTGEC66A.js +0 -29
- package/node-sys-container-TTGEC66A.js.map +0 -1
- package/sqlite-data-store-MA55LVQE.js +0 -120
- package/sqlite-data-store-MA55LVQE.js.map +0 -1
- package/sqlite-meta-store-UNQKVYRM.js +0 -137
- package/sqlite-meta-store-UNQKVYRM.js.map +0 -1
- package/sqlite-wal-store-KVUOC4PO.js +0 -123
- package/sqlite-wal-store-KVUOC4PO.js.map +0 -1
- package/store-indexdb-NG45BU3Q.js +0 -20
- package/store-indexdb-NG45BU3Q.js.map +0 -1
- package/store-sql-QVFNIGND.js +0 -344
- package/store-sql-QVFNIGND.js.map +0 -1
package/index.cjs
CHANGED
@@ -58,17 +58,13 @@ __export(node_sys_container_exports, {
|
|
58
58
|
createNodeSysContainer: () => createNodeSysContainer
|
59
59
|
});
|
60
60
|
async function createNodeSysContainer() {
|
61
|
-
const nodePath = "node:path";
|
62
|
-
const nodeOS = "node:os";
|
63
|
-
const nodeURL = "node:url";
|
64
|
-
const nodeFS = "node:fs";
|
65
|
-
const fs = (await import(nodeFS)).promises;
|
66
|
-
const path = await import(nodePath);
|
67
61
|
return {
|
68
62
|
state: "node",
|
69
63
|
...path,
|
70
|
-
...await import(
|
71
|
-
...await import(
|
64
|
+
// ...(await import("node:os")),
|
65
|
+
// ...(await import("node:url")),
|
66
|
+
...os,
|
67
|
+
...url,
|
72
68
|
...fs,
|
73
69
|
join,
|
74
70
|
stat: fs.stat,
|
@@ -77,22 +73,46 @@ async function createNodeSysContainer() {
|
|
77
73
|
writefile: fs.writeFile
|
78
74
|
};
|
79
75
|
}
|
76
|
+
var fs, path, os, url;
|
80
77
|
var init_node_sys_container = __esm({
|
81
78
|
"src/runtime/node-sys-container.ts"() {
|
82
79
|
"use strict";
|
83
80
|
init_sys_container();
|
81
|
+
fs = __toESM(require("fs/promises"), 1);
|
82
|
+
path = __toESM(require("path"), 1);
|
83
|
+
os = __toESM(require("os"), 1);
|
84
|
+
url = __toESM(require("url"), 1);
|
84
85
|
}
|
85
86
|
});
|
86
87
|
|
87
88
|
// src/runtime/sys-container.ts
|
89
|
+
function isSet(value, ref = globalThis) {
|
90
|
+
const [head, ...tail] = value.split(".");
|
91
|
+
if (["object", "function"].includes(typeof ref) && ref && ["object", "function"].includes(typeof ref[head]) && ref[head]) {
|
92
|
+
if (tail.length <= 1) {
|
93
|
+
return true;
|
94
|
+
}
|
95
|
+
return isSet(tail.join("."), ref[head]);
|
96
|
+
}
|
97
|
+
return false;
|
98
|
+
}
|
99
|
+
function runtimeFn() {
|
100
|
+
const isNodeIsh = isSet("process.versions.node");
|
101
|
+
const isDeno = isSet("Deno");
|
102
|
+
return {
|
103
|
+
isNodeIsh,
|
104
|
+
isBrowser: !(isNodeIsh || isDeno),
|
105
|
+
isDeno,
|
106
|
+
isReactNative: false
|
107
|
+
};
|
108
|
+
}
|
88
109
|
function join(...paths) {
|
89
110
|
return paths.map((i) => i.replace(/\/+$/, "")).join("/");
|
90
111
|
}
|
91
|
-
var
|
112
|
+
var import_uuidv7, import_cement, onceStart, envImpl, sysContainer, SysContainer;
|
92
113
|
var init_sys_container = __esm({
|
93
114
|
"src/runtime/sys-container.ts"() {
|
94
115
|
"use strict";
|
95
|
-
stdEnv = __toESM(require("std-env"), 1);
|
96
116
|
import_uuidv7 = require("uuidv7");
|
97
117
|
import_cement = require("@adviser/cement");
|
98
118
|
init_types();
|
@@ -109,18 +129,18 @@ var init_sys_container = __esm({
|
|
109
129
|
this.freight = {
|
110
130
|
state: "seeded",
|
111
131
|
join,
|
112
|
-
dirname: (
|
132
|
+
dirname: (path2) => path2.split("/").slice(0, -1).join("/"),
|
113
133
|
homedir: () => {
|
114
134
|
throw new Error("SysContainer:homedir is not available in seeded state");
|
115
135
|
},
|
116
136
|
fileURLToPath: (strurl) => {
|
117
|
-
let
|
137
|
+
let url2;
|
118
138
|
if (typeof strurl === "string") {
|
119
|
-
|
139
|
+
url2 = new URL(strurl);
|
120
140
|
} else {
|
121
|
-
|
141
|
+
url2 = strurl;
|
122
142
|
}
|
123
|
-
return
|
143
|
+
return url2.pathname;
|
124
144
|
},
|
125
145
|
// assert: (condition: unknown, message?: string | Error) => {
|
126
146
|
// if (!condition) {
|
@@ -145,13 +165,14 @@ var init_sys_container = __esm({
|
|
145
165
|
this.logSeeded("homedir");
|
146
166
|
return throwFalsy(this.freight).homedir();
|
147
167
|
};
|
168
|
+
this.runtime = runtimeFn;
|
148
169
|
this.env = envImpl;
|
149
170
|
}
|
150
171
|
async start() {
|
151
172
|
await onceStart.once(async () => {
|
152
173
|
switch (this.freight.state) {
|
153
174
|
case "seeded":
|
154
|
-
if (
|
175
|
+
if (this.runtime().isNodeIsh) {
|
155
176
|
const { createNodeSysContainer: createNodeSysContainer2 } = await Promise.resolve().then(() => (init_node_sys_container(), node_sys_container_exports));
|
156
177
|
this.freight = await createNodeSysContainer2();
|
157
178
|
} else {
|
@@ -164,49 +185,49 @@ var init_sys_container = __esm({
|
|
164
185
|
}
|
165
186
|
});
|
166
187
|
}
|
167
|
-
async readdir(
|
188
|
+
async readdir(path2, options) {
|
168
189
|
this.logSeeded("readdir");
|
169
|
-
return throwFalsy(this.freight).readdir(
|
190
|
+
return throwFalsy(this.freight).readdir(path2, options) || [];
|
170
191
|
}
|
171
|
-
async readdirent(
|
192
|
+
async readdirent(path2, options) {
|
172
193
|
this.logSeeded("readdirent");
|
173
|
-
return throwFalsy(this.freight).readdir(
|
194
|
+
return throwFalsy(this.freight).readdir(path2, { ...options, withFileTypes: true }) || [];
|
174
195
|
}
|
175
|
-
async readfile(
|
196
|
+
async readfile(path2, options) {
|
176
197
|
this.logSeeded("readfile");
|
177
|
-
return throwFalsy(this.freight).readfile(
|
198
|
+
return throwFalsy(this.freight).readfile(path2, options);
|
178
199
|
}
|
179
|
-
async mkdir(
|
200
|
+
async mkdir(path2, options) {
|
180
201
|
this.logSeeded("mkdir");
|
181
|
-
return throwFalsy(this.freight).mkdir(
|
202
|
+
return throwFalsy(this.freight).mkdir(path2, options);
|
182
203
|
}
|
183
|
-
async rm(
|
204
|
+
async rm(path2, options) {
|
184
205
|
this.logSeeded("rm");
|
185
|
-
return throwFalsy(this.freight).rm(
|
206
|
+
return throwFalsy(this.freight).rm(path2, options);
|
186
207
|
}
|
187
|
-
async unlink(
|
208
|
+
async unlink(path2) {
|
188
209
|
this.logSeeded("unlink");
|
189
|
-
return throwFalsy(this.freight).unlink(
|
210
|
+
return throwFalsy(this.freight).unlink(path2);
|
190
211
|
}
|
191
|
-
async writefile(
|
212
|
+
async writefile(path2, data) {
|
192
213
|
this.logSeeded("writefile");
|
193
|
-
return throwFalsy(this.freight).writefile(
|
214
|
+
return throwFalsy(this.freight).writefile(path2, data);
|
194
215
|
}
|
195
216
|
async copyFile(source, destination) {
|
196
217
|
this.logSeeded("copyFile");
|
197
218
|
return throwFalsy(this.freight).copyFile(source, destination);
|
198
219
|
}
|
199
|
-
async stat(
|
220
|
+
async stat(path2) {
|
200
221
|
this.logSeeded("stat");
|
201
|
-
return throwFalsy(this.freight).stat(
|
222
|
+
return throwFalsy(this.freight).stat(path2);
|
202
223
|
}
|
203
|
-
fileURLToPath(
|
224
|
+
fileURLToPath(url2) {
|
204
225
|
this.logSeeded("fileURLToPath");
|
205
|
-
return throwFalsy(this.freight).fileURLToPath(
|
226
|
+
return throwFalsy(this.freight).fileURLToPath(url2);
|
206
227
|
}
|
207
|
-
dirname(
|
228
|
+
dirname(path2) {
|
208
229
|
this.logSeeded("dirname");
|
209
|
-
return throwFalsy(this.freight).dirname(
|
230
|
+
return throwFalsy(this.freight).dirname(path2);
|
210
231
|
}
|
211
232
|
join(...args) {
|
212
233
|
this.logSeeded("join");
|
@@ -226,63 +247,61 @@ var init_sys_container = __esm({
|
|
226
247
|
// src/runtime/data-dir.ts
|
227
248
|
function dataDir(name, base) {
|
228
249
|
if (!base) {
|
229
|
-
if (
|
250
|
+
if (SysContainer.runtime().isNodeIsh || SysContainer.runtime().isDeno) {
|
230
251
|
base = SysContainer.env.get("FP_STORAGE_URL") || `file://${SysContainer.join(SysContainer.homedir(), ".fireproof")}`;
|
231
252
|
} else {
|
232
253
|
base = `indexdb://fp`;
|
233
254
|
}
|
234
255
|
}
|
235
|
-
let
|
256
|
+
let url2;
|
236
257
|
if (typeof base === "string") {
|
237
258
|
try {
|
238
|
-
|
259
|
+
url2 = new URL(base.toString());
|
239
260
|
} catch (e) {
|
240
261
|
try {
|
241
262
|
base = `file://${base}`;
|
242
|
-
|
263
|
+
url2 = new URL(base);
|
243
264
|
} catch (e2) {
|
244
265
|
throw new Error(`invalid base url: ${base}`);
|
245
266
|
}
|
246
267
|
}
|
247
268
|
} else {
|
248
|
-
|
269
|
+
url2 = base;
|
249
270
|
}
|
250
|
-
|
251
|
-
return
|
271
|
+
url2.searchParams.set("name", name || "");
|
272
|
+
return url2.toString();
|
252
273
|
}
|
253
|
-
var import_std_env;
|
254
274
|
var init_data_dir = __esm({
|
255
275
|
"src/runtime/data-dir.ts"() {
|
256
276
|
"use strict";
|
257
277
|
init_sys_container();
|
258
|
-
import_std_env = require("std-env");
|
259
278
|
}
|
260
279
|
});
|
261
280
|
|
262
281
|
// src/runtime/store-file-utils.ts
|
263
|
-
async function getPath(
|
264
|
-
const basePath =
|
265
|
-
const name =
|
282
|
+
async function getPath(url2, logger) {
|
283
|
+
const basePath = url2.toString().replace(new RegExp(`^${url2.protocol}//`), "").replace(/\?.*$/, "");
|
284
|
+
const name = url2.searchParams.get("name");
|
266
285
|
if (name) {
|
267
|
-
const version =
|
268
|
-
if (!version) throw logger.Error().Str("url",
|
286
|
+
const version = url2.searchParams.get("version");
|
287
|
+
if (!version) throw logger.Error().Str("url", url2.toString()).Msg(`version not found`).AsError();
|
269
288
|
return SysContainer.join(basePath, version, name);
|
270
289
|
}
|
271
290
|
return SysContainer.join(basePath);
|
272
291
|
}
|
273
|
-
function getFileName(
|
274
|
-
switch (getStore(
|
292
|
+
function getFileName(url2, key, logger) {
|
293
|
+
switch (getStore(url2, logger, (...a) => a.join("/"))) {
|
275
294
|
case "data":
|
276
295
|
return key + ".car";
|
277
296
|
case "meta":
|
278
297
|
return key + ".json";
|
279
298
|
default:
|
280
|
-
throw logger.Error().Str("url",
|
299
|
+
throw logger.Error().Str("url", url2.toString()).Msg(`unsupported store type`).AsError();
|
281
300
|
}
|
282
301
|
}
|
283
|
-
function ensureIndexName(
|
284
|
-
if (
|
285
|
-
name = (
|
302
|
+
function ensureIndexName(url2, name) {
|
303
|
+
if (url2.searchParams.has("index")) {
|
304
|
+
name = (url2.searchParams.get("index")?.replace(/[^a-zA-Z0-9]/g, "") || "idx") + "-" + name;
|
286
305
|
}
|
287
306
|
return name;
|
288
307
|
}
|
@@ -294,95 +313,6 @@ var init_store_file_utils = __esm({
|
|
294
313
|
}
|
295
314
|
});
|
296
315
|
|
297
|
-
// src/runtime/store-sql/types.ts
|
298
|
-
var DefaultSQLTableNames;
|
299
|
-
var init_types2 = __esm({
|
300
|
-
"src/runtime/store-sql/types.ts"() {
|
301
|
-
"use strict";
|
302
|
-
DefaultSQLTableNames = {
|
303
|
-
data: "Datas",
|
304
|
-
meta: "Metas",
|
305
|
-
wal: "Wals"
|
306
|
-
};
|
307
|
-
}
|
308
|
-
});
|
309
|
-
|
310
|
-
// src/runtime/store-sql/ensurer.ts
|
311
|
-
function sqlTableName(...names) {
|
312
|
-
return names.map((name) => name.replace(/^[^a-zA-Z0-9]+/, "").replace(/[^a-zA-Z0-9]+/g, "_")).filter((i) => i.length).join("_");
|
313
|
-
}
|
314
|
-
function ensureTableNames(url, opts) {
|
315
|
-
let isIndex = "";
|
316
|
-
if (url.searchParams.has("index")) {
|
317
|
-
isIndex = url.searchParams.get("index") || ".idx";
|
318
|
-
}
|
319
|
-
const ret = opts?.tableNames || DefaultSQLTableNames;
|
320
|
-
if (isIndex.length) {
|
321
|
-
return {
|
322
|
-
data: sqlTableName(isIndex, ret.data),
|
323
|
-
meta: sqlTableName(isIndex, ret.meta),
|
324
|
-
wal: sqlTableName(isIndex, ret.wal)
|
325
|
-
};
|
326
|
-
}
|
327
|
-
return {
|
328
|
-
data: sqlTableName(ret.data),
|
329
|
-
meta: sqlTableName(ret.meta),
|
330
|
-
wal: sqlTableName(ret.wal)
|
331
|
-
};
|
332
|
-
}
|
333
|
-
function ensureTextEncoder(opts) {
|
334
|
-
return opts?.textEncoder || textEncoder;
|
335
|
-
}
|
336
|
-
function ensureTextDecoder(opts) {
|
337
|
-
return opts?.textDecoder || textDecoder;
|
338
|
-
}
|
339
|
-
function url2sqlFlavor(url, logger) {
|
340
|
-
const flavor = url.protocol.replace(/:.*$/, "");
|
341
|
-
switch (flavor) {
|
342
|
-
case "sqlite":
|
343
|
-
case "mysql":
|
344
|
-
case "postgres":
|
345
|
-
return flavor;
|
346
|
-
default:
|
347
|
-
throw logger.Error().Str("flavor", flavor).Msg("unsupported protocol").AsError();
|
348
|
-
}
|
349
|
-
}
|
350
|
-
function ensureSQLOpts(url, opts, componentName, ctx) {
|
351
|
-
const logger = ensureLogger(opts, componentName, ctx);
|
352
|
-
return {
|
353
|
-
url,
|
354
|
-
sqlFlavor: url2sqlFlavor(url, logger),
|
355
|
-
tableNames: ensureTableNames(url, opts),
|
356
|
-
logger,
|
357
|
-
textEncoder: ensureTextEncoder(opts),
|
358
|
-
textDecoder: ensureTextDecoder(opts)
|
359
|
-
};
|
360
|
-
}
|
361
|
-
var textEncoder, textDecoder;
|
362
|
-
var init_ensurer = __esm({
|
363
|
-
"src/runtime/store-sql/ensurer.ts"() {
|
364
|
-
"use strict";
|
365
|
-
init_utils();
|
366
|
-
init_types2();
|
367
|
-
textEncoder = new TextEncoder();
|
368
|
-
textDecoder = new TextDecoder();
|
369
|
-
}
|
370
|
-
});
|
371
|
-
|
372
|
-
// src/runtime/store-sql/index.ts
|
373
|
-
var store_sql_exports = {};
|
374
|
-
__export(store_sql_exports, {
|
375
|
-
DefaultSQLTableNames: () => DefaultSQLTableNames,
|
376
|
-
ensureSQLOpts: () => ensureSQLOpts
|
377
|
-
});
|
378
|
-
var init_store_sql = __esm({
|
379
|
-
"src/runtime/store-sql/index.ts"() {
|
380
|
-
"use strict";
|
381
|
-
init_types2();
|
382
|
-
init_ensurer();
|
383
|
-
}
|
384
|
-
});
|
385
|
-
|
386
316
|
// src/runtime/crypto.ts
|
387
317
|
var crypto_exports = {};
|
388
318
|
__export(crypto_exports, {
|
@@ -509,21 +439,11 @@ var init_store_indexdb_version = __esm({
|
|
509
439
|
}
|
510
440
|
});
|
511
441
|
|
512
|
-
// src/runtime/store-sql/v0.19-sqlite/version.ts
|
513
|
-
var SQLITE_VERSION;
|
514
|
-
var init_version = __esm({
|
515
|
-
"src/runtime/store-sql/v0.19-sqlite/version.ts"() {
|
516
|
-
"use strict";
|
517
|
-
SQLITE_VERSION = "v0.19-sqlite";
|
518
|
-
}
|
519
|
-
});
|
520
|
-
|
521
442
|
// src/runtime/index.ts
|
522
443
|
var runtime_exports = {};
|
523
444
|
__export(runtime_exports, {
|
524
445
|
FILESTORE_VERSION: () => FILESTORE_VERSION,
|
525
446
|
INDEXDB_VERSION: () => INDEXDB_VERSION,
|
526
|
-
SQLITE_VERSION: () => SQLITE_VERSION,
|
527
447
|
SysContainer: () => SysContainer,
|
528
448
|
crypto: () => crypto_exports,
|
529
449
|
dataDir: () => dataDir,
|
@@ -531,8 +451,7 @@ __export(runtime_exports, {
|
|
531
451
|
files: () => files_exports,
|
532
452
|
getFileName: () => getFileName,
|
533
453
|
getPath: () => getPath,
|
534
|
-
join: () => join
|
535
|
-
sql: () => store_sql_exports
|
454
|
+
join: () => join
|
536
455
|
});
|
537
456
|
var init_runtime = __esm({
|
538
457
|
"src/runtime/index.ts"() {
|
@@ -540,12 +459,10 @@ var init_runtime = __esm({
|
|
540
459
|
init_sys_container();
|
541
460
|
init_data_dir();
|
542
461
|
init_store_file_utils();
|
543
|
-
init_store_sql();
|
544
462
|
init_crypto();
|
545
463
|
init_files();
|
546
464
|
init_store_file_version();
|
547
465
|
init_store_indexdb_version();
|
548
|
-
init_version();
|
549
466
|
}
|
550
467
|
});
|
551
468
|
|
@@ -608,25 +525,25 @@ function ensureLogger(optsOrLogger, componentName, ctx) {
|
|
608
525
|
const out = cLogger.Logger();
|
609
526
|
return out;
|
610
527
|
}
|
611
|
-
function getStore(
|
612
|
-
let result =
|
613
|
-
if (!result) throw logger.Error().Str("url",
|
614
|
-
if (
|
615
|
-
result = joiner(
|
528
|
+
function getStore(url2, logger, joiner) {
|
529
|
+
let result = url2.searchParams.get("store");
|
530
|
+
if (!result) throw logger.Error().Str("url", url2.toString()).Msg(`store not found`).AsError();
|
531
|
+
if (url2.searchParams.has("index")) {
|
532
|
+
result = joiner(url2.searchParams.get("index") || "idx", result);
|
616
533
|
}
|
617
534
|
return result;
|
618
535
|
}
|
619
|
-
function getKey(
|
620
|
-
const result =
|
621
|
-
if (!result) throw logger.Error().Str("url",
|
536
|
+
function getKey(url2, logger) {
|
537
|
+
const result = url2.searchParams.get("key");
|
538
|
+
if (!result) throw logger.Error().Str("url", url2.toString()).Msg(`key not found`).AsError();
|
622
539
|
return result;
|
623
540
|
}
|
624
|
-
function getName(
|
625
|
-
let result =
|
541
|
+
function getName(url2, logger) {
|
542
|
+
let result = url2.searchParams.get("name");
|
626
543
|
if (!result) {
|
627
|
-
result = SysContainer.dirname(
|
544
|
+
result = SysContainer.dirname(url2.pathname);
|
628
545
|
if (result.length === 0) {
|
629
|
-
throw logger.Error().Str("url",
|
546
|
+
throw logger.Error().Str("url", url2.toString()).Msg(`name not found`).AsError();
|
630
547
|
}
|
631
548
|
}
|
632
549
|
return result;
|
@@ -672,209 +589,6 @@ var init_gateway = __esm({
|
|
672
589
|
}
|
673
590
|
});
|
674
591
|
|
675
|
-
// src/runtime/store-indexdb.ts
|
676
|
-
var store_indexdb_exports = {};
|
677
|
-
__export(store_indexdb_exports, {
|
678
|
-
IndexDBDataGateway: () => IndexDBDataGateway,
|
679
|
-
IndexDBMetaGateway: () => IndexDBMetaGateway,
|
680
|
-
IndexDBTestStore: () => IndexDBTestStore,
|
681
|
-
IndexDBWalGateway: () => IndexDBWalGateway,
|
682
|
-
getIndexDBName: () => getIndexDBName,
|
683
|
-
guardVersion: () => guardVersion
|
684
|
-
});
|
685
|
-
function ensureVersion(url) {
|
686
|
-
const ret = new URL(url.toString());
|
687
|
-
ret.searchParams.set("version", url.searchParams.get("version") || INDEXDB_VERSION);
|
688
|
-
return ret;
|
689
|
-
}
|
690
|
-
function guardVersion(url) {
|
691
|
-
if (!url.searchParams.has("version")) {
|
692
|
-
return import_cement4.Result.Err(`missing version: ${url.toString()}`);
|
693
|
-
}
|
694
|
-
return import_cement4.Result.Ok(url);
|
695
|
-
}
|
696
|
-
function sanitzeKey(key) {
|
697
|
-
if (key.length === 1) {
|
698
|
-
key = key[0];
|
699
|
-
}
|
700
|
-
return key;
|
701
|
-
}
|
702
|
-
async function connectIdb(url, logger) {
|
703
|
-
const dbName = getIndexDBName(url, logger);
|
704
|
-
const once2 = await onceIndexDB.get(dbName.fullDb).once(async () => {
|
705
|
-
const db = await (0, import_idb.openDB)(dbName.fullDb, 1, {
|
706
|
-
upgrade(db2) {
|
707
|
-
["version", "data", "wal", "meta", "idx.data", "idx.wal", "idx.meta"].map((store) => {
|
708
|
-
db2.createObjectStore(store, {
|
709
|
-
autoIncrement: false
|
710
|
-
});
|
711
|
-
});
|
712
|
-
}
|
713
|
-
});
|
714
|
-
const found = await db.get("version", "version");
|
715
|
-
const version = url.searchParams.get("version") || INDEXDB_VERSION;
|
716
|
-
if (!found) {
|
717
|
-
await db.put("version", { version }, "version");
|
718
|
-
} else if (found.version !== version) {
|
719
|
-
logger.Warn().Str("url", url.toString()).Str("version", version).Str("found", found.version).Msg("version mismatch");
|
720
|
-
}
|
721
|
-
return { db, dbName, version };
|
722
|
-
});
|
723
|
-
url.searchParams.set("version", once2.version);
|
724
|
-
return once2.db;
|
725
|
-
}
|
726
|
-
function joinDBName(...names) {
|
727
|
-
return names.map((i) => i.replace(/^[^a-zA-Z0-9]+/g, "").replace(/[^a-zA-Z0-9]+/g, "_")).filter((i) => i.length).join(".");
|
728
|
-
}
|
729
|
-
function getIndexDBName(iurl, logger) {
|
730
|
-
const url = ensureVersion(iurl);
|
731
|
-
const fullDb = url.pathname.replace(/^\/+/, "").replace(/\?.*$/, "");
|
732
|
-
const dbName = url.searchParams.get("name");
|
733
|
-
if (!dbName) throw logger.Error().Str("url", url.toString()).Msg(`name not found`).AsError();
|
734
|
-
const result = joinDBName(fullDb, dbName);
|
735
|
-
const objStore = getStore(url, logger, joinDBName);
|
736
|
-
const connectionKey = [result, objStore].join(":");
|
737
|
-
return {
|
738
|
-
fullDb: result,
|
739
|
-
objStore,
|
740
|
-
connectionKey,
|
741
|
-
dbName
|
742
|
-
};
|
743
|
-
}
|
744
|
-
var import_idb, import_cement4, onceIndexDB, IndexDBGateway, IndexDBDataGateway, IndexDBWalGateway, IndexDBMetaGateway, txtEncoder, IndexDBTestStore;
|
745
|
-
var init_store_indexdb = __esm({
|
746
|
-
"src/runtime/store-indexdb.ts"() {
|
747
|
-
"use strict";
|
748
|
-
import_idb = require("idb");
|
749
|
-
import_cement4 = require("@adviser/cement");
|
750
|
-
init_store_indexdb_version();
|
751
|
-
init_utils();
|
752
|
-
init_gateway();
|
753
|
-
init_sys_container();
|
754
|
-
onceIndexDB = new import_cement4.KeyedResolvOnce();
|
755
|
-
IndexDBGateway = class {
|
756
|
-
constructor(logger) {
|
757
|
-
this.db = {};
|
758
|
-
this.logger = logger;
|
759
|
-
}
|
760
|
-
idb() {
|
761
|
-
this.db;
|
762
|
-
}
|
763
|
-
async start(baseURL) {
|
764
|
-
return exception2Result(async () => {
|
765
|
-
this.logger.Debug().Url(baseURL).Msg("starting");
|
766
|
-
await SysContainer.start();
|
767
|
-
this.db = await connectIdb(baseURL, this.logger);
|
768
|
-
this.logger.Debug().Url(baseURL).Msg("started");
|
769
|
-
});
|
770
|
-
}
|
771
|
-
async close() {
|
772
|
-
return import_cement4.Result.Ok(void 0);
|
773
|
-
}
|
774
|
-
async destroy(baseUrl) {
|
775
|
-
return exception2Result(async () => {
|
776
|
-
const type = getStore(baseUrl, this.logger, joinDBName);
|
777
|
-
const idb = this.db;
|
778
|
-
const trans = idb.transaction(type, "readwrite");
|
779
|
-
const object_store = trans.objectStore(type);
|
780
|
-
const toDelete = [];
|
781
|
-
for (let cursor = await object_store.openCursor(); cursor; cursor = await cursor.continue()) {
|
782
|
-
toDelete.push(cursor.primaryKey);
|
783
|
-
}
|
784
|
-
for (const key of toDelete) {
|
785
|
-
await trans.db.delete(type, key);
|
786
|
-
}
|
787
|
-
await trans.done;
|
788
|
-
});
|
789
|
-
}
|
790
|
-
async get(url) {
|
791
|
-
return exceptionWrapper(async () => {
|
792
|
-
const key = getKey(url, this.logger);
|
793
|
-
const store = getStore(url, this.logger, joinDBName);
|
794
|
-
this.logger.Debug().Url(url).Str("key", key).Str("store", store).Msg("getting");
|
795
|
-
const tx = this.db.transaction([store], "readonly");
|
796
|
-
const bytes = await tx.objectStore(store).get(sanitzeKey(key));
|
797
|
-
await tx.done;
|
798
|
-
if (!bytes) {
|
799
|
-
return import_cement4.Result.Err(new NotFoundError(`missing ${key}`));
|
800
|
-
}
|
801
|
-
return import_cement4.Result.Ok(bytes);
|
802
|
-
});
|
803
|
-
}
|
804
|
-
async put(url, value) {
|
805
|
-
return exception2Result(async () => {
|
806
|
-
const key = getKey(url, this.logger);
|
807
|
-
const store = getStore(url, this.logger, joinDBName);
|
808
|
-
this.logger.Debug().Url(url).Str("key", key).Str("store", store).Msg("putting");
|
809
|
-
const tx = this.db.transaction([store], "readwrite");
|
810
|
-
await tx.objectStore(store).put(value, sanitzeKey(key));
|
811
|
-
await tx.done;
|
812
|
-
});
|
813
|
-
}
|
814
|
-
async delete(url) {
|
815
|
-
return exception2Result(async () => {
|
816
|
-
const key = getKey(url, this.logger);
|
817
|
-
const store = getStore(url, this.logger, joinDBName);
|
818
|
-
this.logger.Debug().Url(url).Str("key", key).Str("store", store).Msg("deleting");
|
819
|
-
const tx = this.db.transaction([store], "readwrite");
|
820
|
-
await tx.objectStore(store).delete(sanitzeKey(key));
|
821
|
-
await tx.done;
|
822
|
-
return import_cement4.Result.Ok(void 0);
|
823
|
-
});
|
824
|
-
}
|
825
|
-
};
|
826
|
-
IndexDBDataGateway = class extends IndexDBGateway {
|
827
|
-
constructor(logger) {
|
828
|
-
super(ensureLogger(logger, "IndexDBDataGateway", {}));
|
829
|
-
}
|
830
|
-
buildUrl(baseUrl, key) {
|
831
|
-
const url = new URL(baseUrl.toString());
|
832
|
-
url.searchParams.set("key", key);
|
833
|
-
return Promise.resolve(import_cement4.Result.Ok(url));
|
834
|
-
}
|
835
|
-
};
|
836
|
-
IndexDBWalGateway = class extends IndexDBGateway {
|
837
|
-
constructor(logger) {
|
838
|
-
super(ensureLogger(logger, "IndexDBWalGateway", {}));
|
839
|
-
}
|
840
|
-
buildUrl(baseUrl, key) {
|
841
|
-
const url = new URL(baseUrl.toString());
|
842
|
-
url.searchParams.set("key", key);
|
843
|
-
return Promise.resolve(import_cement4.Result.Ok(url));
|
844
|
-
}
|
845
|
-
};
|
846
|
-
IndexDBMetaGateway = class extends IndexDBGateway {
|
847
|
-
constructor(logger) {
|
848
|
-
super(ensureLogger(logger, "IndexDBDataGateway", {}));
|
849
|
-
this.branches = /* @__PURE__ */ new Set();
|
850
|
-
}
|
851
|
-
async buildUrl(baseUrl, key) {
|
852
|
-
const url = new URL(baseUrl.toString());
|
853
|
-
this.branches.add(key);
|
854
|
-
url.searchParams.set("key", key);
|
855
|
-
return import_cement4.Result.Ok(url);
|
856
|
-
}
|
857
|
-
};
|
858
|
-
txtEncoder = new TextEncoder();
|
859
|
-
IndexDBTestStore = class {
|
860
|
-
constructor(logger) {
|
861
|
-
this.logger = ensureLogger(logger, "IndexDBTestStore", {});
|
862
|
-
}
|
863
|
-
async get(url, key) {
|
864
|
-
const db = await connectIdb(url, this.logger);
|
865
|
-
const store = getStore(url, this.logger, joinDBName);
|
866
|
-
this.logger.Debug().Str("key", key).Str("store", store).Msg("getting");
|
867
|
-
let bytes = await db.get(store, sanitzeKey(key));
|
868
|
-
this.logger.Debug().Str("key", key).Str("store", store).Int("len", bytes.length).Msg("got");
|
869
|
-
if (typeof bytes === "string") {
|
870
|
-
bytes = txtEncoder.encode(bytes);
|
871
|
-
}
|
872
|
-
return bytes;
|
873
|
-
}
|
874
|
-
};
|
875
|
-
}
|
876
|
-
});
|
877
|
-
|
878
592
|
// src/runtime/store-file.ts
|
879
593
|
var store_file_exports = {};
|
880
594
|
__export(store_file_exports, {
|
@@ -883,18 +597,18 @@ __export(store_file_exports, {
|
|
883
597
|
FileTestStore: () => FileTestStore,
|
884
598
|
FileWALGateway: () => FileWALGateway
|
885
599
|
});
|
886
|
-
async function ensureVersionFile(
|
887
|
-
let
|
888
|
-
if (!
|
889
|
-
|
890
|
-
versionFiles.set(
|
891
|
-
}
|
892
|
-
await
|
893
|
-
await SysContainer.mkdir(
|
894
|
-
const vFile = SysContainer.join(
|
600
|
+
async function ensureVersionFile(path2, logger) {
|
601
|
+
let once = versionFiles.get(path2);
|
602
|
+
if (!once) {
|
603
|
+
once = new import_cement6.ResolveOnce();
|
604
|
+
versionFiles.set(path2, once);
|
605
|
+
}
|
606
|
+
await once.once(async () => {
|
607
|
+
await SysContainer.mkdir(path2, { recursive: true });
|
608
|
+
const vFile = SysContainer.join(path2, "version");
|
895
609
|
const vFileStat = await SysContainer.stat(vFile).catch(() => void 0);
|
896
610
|
if (!vFileStat) {
|
897
|
-
await SysContainer.writefile(SysContainer.join(
|
611
|
+
await SysContainer.writefile(SysContainer.join(path2, "version"), FILESTORE_VERSION);
|
898
612
|
return;
|
899
613
|
} else if (!vFileStat.isFile()) {
|
900
614
|
throw logger.Error().Str("file", vFile).Msg(`version file is a directory`).AsError();
|
@@ -904,7 +618,7 @@ async function ensureVersionFile(path, logger) {
|
|
904
618
|
console.warn(`version mismatch:${vFile}: ${v.toString()}!=${FILESTORE_VERSION}`);
|
905
619
|
}
|
906
620
|
});
|
907
|
-
return
|
621
|
+
return path2;
|
908
622
|
}
|
909
623
|
function toArrayBuffer(buffer) {
|
910
624
|
const ab = new ArrayBuffer(buffer.length);
|
@@ -914,13 +628,13 @@ function toArrayBuffer(buffer) {
|
|
914
628
|
}
|
915
629
|
return view;
|
916
630
|
}
|
917
|
-
var
|
631
|
+
var import_cement6, versionFiles, FileGateway, FileWALGateway, FileMetaGateway, FileDataGateway, FileTestStore;
|
918
632
|
var init_store_file = __esm({
|
919
633
|
"src/runtime/store-file.ts"() {
|
920
634
|
"use strict";
|
921
635
|
init_sys_container();
|
922
636
|
init_store_file_version();
|
923
|
-
|
637
|
+
import_cement6 = require("@adviser/cement");
|
924
638
|
init_utils();
|
925
639
|
init_gateway();
|
926
640
|
init_store_file_utils();
|
@@ -933,54 +647,54 @@ var init_store_file = __esm({
|
|
933
647
|
return exception2Result(async () => {
|
934
648
|
await SysContainer.start();
|
935
649
|
baseURL.searchParams.set("version", baseURL.searchParams.get("version") || FILESTORE_VERSION);
|
936
|
-
const
|
937
|
-
if (
|
938
|
-
const dbdir = this.getFilePath(
|
650
|
+
const url2 = await this.buildUrl(baseURL, "dummy");
|
651
|
+
if (url2.isErr()) return url2;
|
652
|
+
const dbdir = this.getFilePath(url2.Ok());
|
939
653
|
await SysContainer.mkdir(SysContainer.dirname(dbdir), { recursive: true });
|
940
654
|
const dbroot = SysContainer.dirname(dbdir);
|
941
|
-
this.logger.Debug().Str("url",
|
655
|
+
this.logger.Debug().Str("url", url2.Ok().toString()).Str("dbroot", SysContainer.dirname(dbroot)).Msg("start");
|
942
656
|
await ensureVersionFile(dbroot, this.logger);
|
943
657
|
});
|
944
658
|
}
|
945
659
|
async close() {
|
946
|
-
return
|
660
|
+
return import_cement6.Result.Ok(void 0);
|
947
661
|
}
|
948
|
-
getFilePath(
|
949
|
-
const
|
950
|
-
this.logger.Debug().Str("url",
|
951
|
-
return
|
662
|
+
getFilePath(url2) {
|
663
|
+
const path2 = url2.toString().replace(/^file:\/\//, "").replace(/\?.*$/, "");
|
664
|
+
this.logger.Debug().Str("url", url2.toString()).Str("path", path2).Msg("getFilePath");
|
665
|
+
return path2;
|
952
666
|
}
|
953
|
-
async put(
|
667
|
+
async put(url2, body) {
|
954
668
|
return exception2Result(async () => {
|
955
|
-
const file = this.getFilePath(
|
956
|
-
this.logger.Debug().Str("url",
|
669
|
+
const file = this.getFilePath(url2);
|
670
|
+
this.logger.Debug().Str("url", url2.toString()).Str("file", file).Msg("put");
|
957
671
|
await SysContainer.writefile(file, body);
|
958
672
|
});
|
959
673
|
}
|
960
|
-
async get(
|
674
|
+
async get(url2) {
|
961
675
|
return exceptionWrapper(async () => {
|
962
|
-
const file = this.getFilePath(
|
676
|
+
const file = this.getFilePath(url2);
|
963
677
|
try {
|
964
678
|
const res = await SysContainer.readfile(file);
|
965
|
-
this.logger.Debug().Url(
|
966
|
-
return
|
679
|
+
this.logger.Debug().Url(url2).Str("file", file).Msg("get");
|
680
|
+
return import_cement6.Result.Ok(new Uint8Array(res));
|
967
681
|
} catch (e) {
|
968
682
|
if (isNotFoundError(e)) {
|
969
|
-
return
|
683
|
+
return import_cement6.Result.Err(new NotFoundError(`file not found: ${file}`));
|
970
684
|
}
|
971
|
-
return
|
685
|
+
return import_cement6.Result.Err(e);
|
972
686
|
}
|
973
687
|
});
|
974
688
|
}
|
975
|
-
async delete(
|
689
|
+
async delete(url2) {
|
976
690
|
return exception2Result(async () => {
|
977
|
-
await SysContainer.unlink(this.getFilePath(
|
691
|
+
await SysContainer.unlink(this.getFilePath(url2));
|
978
692
|
});
|
979
693
|
}
|
980
694
|
async destroyDir(baseURL) {
|
981
|
-
const
|
982
|
-
if (
|
983
|
-
const filepath = SysContainer.dirname(this.getFilePath(
|
695
|
+
const url2 = await this.buildUrl(baseURL, "x");
|
696
|
+
if (url2.isErr()) return url2;
|
697
|
+
const filepath = SysContainer.dirname(this.getFilePath(url2.Ok()));
|
984
698
|
let dir = [];
|
985
699
|
try {
|
986
700
|
dir = await SysContainer.readdir(filepath);
|
@@ -999,7 +713,7 @@ var init_store_file = __esm({
|
|
999
713
|
}
|
1000
714
|
}
|
1001
715
|
}
|
1002
|
-
return
|
716
|
+
return import_cement6.Result.Ok(void 0);
|
1003
717
|
}
|
1004
718
|
};
|
1005
719
|
FileWALGateway = class extends FileGateway {
|
@@ -1010,9 +724,9 @@ var init_store_file = __esm({
|
|
1010
724
|
return this.destroyDir(baseURL);
|
1011
725
|
}
|
1012
726
|
async buildUrl(baseUrl, key) {
|
1013
|
-
const
|
1014
|
-
|
1015
|
-
return
|
727
|
+
const url2 = new URL(baseUrl.toString());
|
728
|
+
url2.pathname = SysContainer.join(await getPath(baseUrl, this.logger), ensureIndexName(baseUrl, "wal"), key + ".json");
|
729
|
+
return import_cement6.Result.Ok(url2);
|
1016
730
|
}
|
1017
731
|
};
|
1018
732
|
FileMetaGateway = class extends FileGateway {
|
@@ -1023,9 +737,9 @@ var init_store_file = __esm({
|
|
1023
737
|
return this.destroyDir(baseURL);
|
1024
738
|
}
|
1025
739
|
async buildUrl(baseUrl, key) {
|
1026
|
-
const
|
1027
|
-
|
1028
|
-
return
|
740
|
+
const url2 = new URL(baseUrl.toString());
|
741
|
+
url2.pathname = SysContainer.join(await getPath(baseUrl, this.logger), ensureIndexName(baseUrl, "meta"), key + ".json");
|
742
|
+
return import_cement6.Result.Ok(url2);
|
1029
743
|
}
|
1030
744
|
};
|
1031
745
|
FileDataGateway = class extends FileGateway {
|
@@ -1037,21 +751,21 @@ var init_store_file = __esm({
|
|
1037
751
|
return this.destroyDir(baseURL);
|
1038
752
|
}
|
1039
753
|
async buildUrl(baseUrl, key) {
|
1040
|
-
const
|
1041
|
-
|
1042
|
-
return
|
754
|
+
const url2 = new URL(baseUrl.toString());
|
755
|
+
url2.pathname = SysContainer.join(await getPath(baseUrl, this.logger), ensureIndexName(baseUrl, "data"), key + ".car");
|
756
|
+
return import_cement6.Result.Ok(url2);
|
1043
757
|
}
|
1044
758
|
};
|
1045
759
|
FileTestStore = class {
|
1046
760
|
constructor(logger) {
|
1047
761
|
this.logger = ensureLogger(logger, "FileTestStore");
|
1048
762
|
}
|
1049
|
-
async get(
|
1050
|
-
const logger = ensureLogger(this.logger, "get", { url:
|
763
|
+
async get(url2, key) {
|
764
|
+
const logger = ensureLogger(this.logger, "get", { url: url2.toString(), key });
|
1051
765
|
const dbFile = SysContainer.join(
|
1052
|
-
await getPath(
|
1053
|
-
getStore(
|
1054
|
-
getFileName(
|
766
|
+
await getPath(url2, this.logger),
|
767
|
+
getStore(url2, this.logger, SysContainer.join),
|
768
|
+
getFileName(url2, key, this.logger)
|
1055
769
|
);
|
1056
770
|
logger.Debug().Str("dbFile", dbFile).Msg("get");
|
1057
771
|
const buffer = await SysContainer.readfile(dbFile);
|
@@ -1062,776 +776,197 @@ var init_store_file = __esm({
|
|
1062
776
|
}
|
1063
777
|
});
|
1064
778
|
|
1065
|
-
// src/runtime/store-
|
1066
|
-
var
|
1067
|
-
|
1068
|
-
|
1069
|
-
|
1070
|
-
|
1071
|
-
|
1072
|
-
|
1073
|
-
onceSQLiteConnections = new import_cement8.KeyedResolvOnce();
|
1074
|
-
SQLiteConnection = class _SQLiteConnection {
|
1075
|
-
static fromURL(url, opts = {}) {
|
1076
|
-
return new _SQLiteConnection(url, opts);
|
1077
|
-
}
|
1078
|
-
get client() {
|
1079
|
-
if (!this._client) {
|
1080
|
-
throw this.logger.Error().Msg("client not connected").AsError();
|
1081
|
-
}
|
1082
|
-
return this._client;
|
1083
|
-
}
|
1084
|
-
constructor(url, opts) {
|
1085
|
-
this.opts = ensureSQLOpts(url, opts, "SQLiteConnection", { url });
|
1086
|
-
this.logger = this.opts.logger;
|
1087
|
-
this.url = url;
|
1088
|
-
this.logger.Debug().Msg("constructor");
|
1089
|
-
}
|
1090
|
-
async connect() {
|
1091
|
-
let fName = this.url.toString().replace("sqlite://", "").replace(/\?.*$/, "");
|
1092
|
-
if (!fName) {
|
1093
|
-
throw this.logger.Error().Str("url", this.url.toString()).Msg("filename is empty").AsError();
|
1094
|
-
}
|
1095
|
-
const hasName = this.url.searchParams.get("name");
|
1096
|
-
if (hasName) {
|
1097
|
-
fName = SysContainer.join(fName, hasName);
|
1098
|
-
if (!fName.endsWith(".sqlite")) {
|
1099
|
-
fName += ".sqlite";
|
1100
|
-
}
|
1101
|
-
}
|
1102
|
-
this._client = await onceSQLiteConnections.get(fName).once(async () => {
|
1103
|
-
this.logger.Debug().Str("filename", fName).Msg("connect");
|
1104
|
-
const Sqlite3Database = (await import("better-sqlite3")).default;
|
1105
|
-
if (hasName) {
|
1106
|
-
await SysContainer.mkdir(SysContainer.dirname(fName), { recursive: true });
|
1107
|
-
}
|
1108
|
-
const db = new Sqlite3Database(fName, {
|
1109
|
-
// verbose: console.log,
|
1110
|
-
nativeBinding: "./node_modules/better-sqlite3/build/Release/better_sqlite3.node"
|
1111
|
-
});
|
1112
|
-
if (!db) {
|
1113
|
-
throw this.logger.Error().Msg("connect failed").AsError();
|
1114
|
-
}
|
1115
|
-
return db;
|
1116
|
-
});
|
1117
|
-
}
|
1118
|
-
async close() {
|
1119
|
-
this.logger.Debug().Msg("close");
|
1120
|
-
await this.client.close();
|
1121
|
-
}
|
1122
|
-
};
|
1123
|
-
}
|
779
|
+
// src/runtime/store-indexdb.ts
|
780
|
+
var store_indexdb_exports = {};
|
781
|
+
__export(store_indexdb_exports, {
|
782
|
+
IndexDBDataGateway: () => IndexDBDataGateway,
|
783
|
+
IndexDBMetaGateway: () => IndexDBMetaGateway,
|
784
|
+
IndexDBTestStore: () => IndexDBTestStore,
|
785
|
+
IndexDBWalGateway: () => IndexDBWalGateway,
|
786
|
+
getIndexDBName: () => getIndexDBName
|
1124
787
|
});
|
1125
|
-
|
1126
|
-
|
1127
|
-
|
1128
|
-
|
1129
|
-
switch (databaseURL.protocol) {
|
1130
|
-
case "sqlite:":
|
1131
|
-
logger.Debug().Str("databaseURL", databaseURL.toString()).Msg("connecting to sqlite");
|
1132
|
-
return SQLiteConnection.fromURL(databaseURL, {
|
1133
|
-
...opts,
|
1134
|
-
logger
|
1135
|
-
});
|
1136
|
-
default:
|
1137
|
-
throw logger.Error().Msg("unsupported protocol " + databaseURL.protocol).AsError();
|
1138
|
-
}
|
788
|
+
function ensureVersion(url2) {
|
789
|
+
const ret = new URL(url2.toString());
|
790
|
+
ret.searchParams.set("version", url2.searchParams.get("version") || INDEXDB_VERSION);
|
791
|
+
return ret;
|
1139
792
|
}
|
1140
|
-
|
1141
|
-
|
1142
|
-
|
1143
|
-
init_utils();
|
1144
|
-
init_sqlite_adapter_better_sqlite3();
|
793
|
+
function sanitzeKey(key) {
|
794
|
+
if (key.length === 1) {
|
795
|
+
key = key[0];
|
1145
796
|
}
|
1146
|
-
|
1147
|
-
|
1148
|
-
// src/runtime/store-sql/v0.19-sqlite/sqlite-ensure-version.ts
|
1149
|
-
async function ensureSQLiteVersion(url, dbConn) {
|
1150
|
-
const version = await once.once(async () => {
|
1151
|
-
const logger = ensureLogger(dbConn.opts, "ensureSQLiteVersion", {
|
1152
|
-
version: SQLITE_VERSION,
|
1153
|
-
url: dbConn.url.toString()
|
1154
|
-
});
|
1155
|
-
await dbConn.client.prepare(
|
1156
|
-
`CREATE TABLE IF NOT EXISTS version (
|
1157
|
-
version TEXT NOT NULL,
|
1158
|
-
updated_at TEXT NOT NULL)`
|
1159
|
-
).run();
|
1160
|
-
const rows = await dbConn.client.prepare(`select version from version`).all();
|
1161
|
-
if (rows.length > 1) {
|
1162
|
-
throw logger.Error().Msg(`more than one version row found`).AsError();
|
1163
|
-
}
|
1164
|
-
if (rows.length === 0) {
|
1165
|
-
await dbConn.client.prepare(`insert into version (version, updated_at) values (?, ?)`).run(SQLITE_VERSION, (/* @__PURE__ */ new Date()).toISOString());
|
1166
|
-
return SQLITE_VERSION;
|
1167
|
-
}
|
1168
|
-
if (rows[0].version !== SQLITE_VERSION) {
|
1169
|
-
logger.Warn().Any("row", rows[0]).Msg(`version mismatch`);
|
1170
|
-
}
|
1171
|
-
return rows[0].version;
|
1172
|
-
});
|
1173
|
-
url.searchParams.set("version", version);
|
797
|
+
return key;
|
1174
798
|
}
|
1175
|
-
|
1176
|
-
|
1177
|
-
|
1178
|
-
|
1179
|
-
|
1180
|
-
|
1181
|
-
|
1182
|
-
|
1183
|
-
|
1184
|
-
});
|
1185
|
-
|
1186
|
-
// src/runtime/store-sql/v0.19-sqlite/sqlite-wal-store.ts
|
1187
|
-
var sqlite_wal_store_exports = {};
|
1188
|
-
__export(sqlite_wal_store_exports, {
|
1189
|
-
V0_18_0SQLiteWalStore: () => V0_18_0SQLiteWalStore,
|
1190
|
-
WalSQLRecordBuilder: () => WalSQLRecordBuilder
|
1191
|
-
});
|
1192
|
-
var import_cement10, WalSQLRecordBuilder, V0_18_0SQLiteWalStore;
|
1193
|
-
var init_sqlite_wal_store = __esm({
|
1194
|
-
"src/runtime/store-sql/v0.19-sqlite/sqlite-wal-store.ts"() {
|
1195
|
-
"use strict";
|
1196
|
-
import_cement10 = require("@adviser/cement");
|
1197
|
-
init_sqlite_ensure_version();
|
1198
|
-
init_utils();
|
1199
|
-
WalSQLRecordBuilder = class _WalSQLRecordBuilder {
|
1200
|
-
#record;
|
1201
|
-
constructor(record) {
|
1202
|
-
this.#record = record;
|
1203
|
-
}
|
1204
|
-
static fromRecord(record) {
|
1205
|
-
return new _WalSQLRecordBuilder(record);
|
1206
|
-
}
|
1207
|
-
build() {
|
1208
|
-
return this.#record;
|
1209
|
-
}
|
1210
|
-
};
|
1211
|
-
V0_18_0SQLiteWalStore = class {
|
1212
|
-
constructor(dbConn) {
|
1213
|
-
this.dbConn = dbConn;
|
1214
|
-
this.textEncoder = dbConn.opts.textEncoder;
|
1215
|
-
this.logger = ensureLogger(dbConn.opts, "SQLiteWalStore");
|
1216
|
-
this.logger.Debug().Msg("constructor");
|
1217
|
-
}
|
1218
|
-
async start(url) {
|
1219
|
-
this.logger.Debug().Msg("start");
|
1220
|
-
await this.dbConn.connect();
|
1221
|
-
await ensureSQLiteVersion(url, this.dbConn);
|
1222
|
-
}
|
1223
|
-
table(url) {
|
1224
|
-
return getStore(url, this.logger, (...x) => x.join("_"));
|
1225
|
-
}
|
1226
|
-
#createTable = new import_cement10.KeyedResolvOnce();
|
1227
|
-
async createTable(url) {
|
1228
|
-
return this.#createTable.get(this.table(url)).once(async (table) => {
|
1229
|
-
await this.dbConn.client.prepare(
|
1230
|
-
`CREATE TABLE IF NOT EXISTS ${table} (
|
1231
|
-
name TEXT not null,
|
1232
|
-
branch TEXT not null,
|
1233
|
-
state BLOB NOT NULL,
|
1234
|
-
updated_at TEXT NOT NULL,
|
1235
|
-
PRIMARY KEY (name, branch)
|
1236
|
-
)`
|
1237
|
-
).run();
|
1238
|
-
});
|
1239
|
-
}
|
1240
|
-
#insertStmt = new import_cement10.KeyedResolvOnce();
|
1241
|
-
async insertStmt(url) {
|
1242
|
-
return this.#insertStmt.get(this.table(url)).once(async (table) => {
|
1243
|
-
await this.createTable(url);
|
1244
|
-
return this.dbConn.client.prepare(`insert into ${table}
|
1245
|
-
(name, branch, state, updated_at)
|
1246
|
-
values (?, ?, ?, ?)
|
1247
|
-
ON CONFLICT(name, branch) DO UPDATE SET state=?, updated_at=?
|
1248
|
-
`);
|
1249
|
-
});
|
1250
|
-
}
|
1251
|
-
#selectStmt = new import_cement10.KeyedResolvOnce();
|
1252
|
-
async selectStmt(url) {
|
1253
|
-
return this.#selectStmt.get(this.table(url)).once(async (table) => {
|
1254
|
-
await this.createTable(url);
|
1255
|
-
return this.dbConn.client.prepare(
|
1256
|
-
`select name, branch, state, updated_at from ${table}
|
1257
|
-
where name = ? and branch = ?`
|
1258
|
-
);
|
1259
|
-
});
|
1260
|
-
}
|
1261
|
-
#deleteStmt = new import_cement10.KeyedResolvOnce();
|
1262
|
-
async deleteStmt(url) {
|
1263
|
-
return this.#deleteStmt.get(this.table(url)).once(async (table) => {
|
1264
|
-
await this.createTable(url);
|
1265
|
-
return this.dbConn.client.prepare(`delete from ${table} where name = ? and branch = ?`);
|
1266
|
-
});
|
1267
|
-
}
|
1268
|
-
async insert(url, ose) {
|
1269
|
-
const wal = WalSQLRecordBuilder.fromRecord(ose).build();
|
1270
|
-
const bufState = Buffer.from(this.textEncoder.encode(JSON.stringify(wal.state)));
|
1271
|
-
return this.insertStmt(url).then(
|
1272
|
-
(i) => i.run(ose.name, ose.branch, bufState, wal.updated_at.toISOString(), bufState, wal.updated_at.toISOString())
|
1273
|
-
);
|
1274
|
-
}
|
1275
|
-
async select(url, key) {
|
1276
|
-
const res = (await this.selectStmt(url).then((i) => i.all(key.name, key.branch))).map((irow) => {
|
1277
|
-
const row = irow;
|
1278
|
-
return {
|
1279
|
-
name: row.name,
|
1280
|
-
branch: row.branch,
|
1281
|
-
state: Uint8Array.from(row.state),
|
1282
|
-
updated_at: new Date(row.updated_at)
|
1283
|
-
};
|
1284
|
-
});
|
1285
|
-
this.logger.Debug().Str("name", key.name).Str("branch", key.branch).Uint64("res", res.length).Msg("select");
|
1286
|
-
return res;
|
1287
|
-
}
|
1288
|
-
async delete(url, key) {
|
1289
|
-
this.logger.Debug().Str("name", key.name).Str("branch", key.branch).Msg("delete");
|
1290
|
-
return this.deleteStmt(url).then((i) => i.run(key.name, key.branch));
|
1291
|
-
}
|
1292
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
1293
|
-
async close(url) {
|
1294
|
-
this.logger.Debug().Msg("close");
|
1295
|
-
return import_cement10.Result.Ok(void 0);
|
1296
|
-
}
|
1297
|
-
async destroy(url) {
|
1298
|
-
return exception2Result(async () => {
|
1299
|
-
this.logger.Debug().Msg("destroy");
|
1300
|
-
await this.createTable(url);
|
1301
|
-
await this.dbConn.client.prepare(`delete from ${this.table(url)}`).run();
|
1302
|
-
});
|
1303
|
-
}
|
1304
|
-
};
|
1305
|
-
}
|
1306
|
-
});
|
1307
|
-
|
1308
|
-
// src/runtime/store-sql/v0.19-sqlite/sqlite-data-store.ts
|
1309
|
-
var sqlite_data_store_exports = {};
|
1310
|
-
__export(sqlite_data_store_exports, {
|
1311
|
-
DataSQLRecordBuilder: () => DataSQLRecordBuilder,
|
1312
|
-
V0_18_0SQLiteDataStore: () => V0_18_0SQLiteDataStore
|
1313
|
-
});
|
1314
|
-
var import_cement11, DataSQLRecordBuilder, V0_18_0SQLiteDataStore;
|
1315
|
-
var init_sqlite_data_store = __esm({
|
1316
|
-
"src/runtime/store-sql/v0.19-sqlite/sqlite-data-store.ts"() {
|
1317
|
-
"use strict";
|
1318
|
-
import_cement11 = require("@adviser/cement");
|
1319
|
-
init_sqlite_ensure_version();
|
1320
|
-
init_utils();
|
1321
|
-
DataSQLRecordBuilder = class _DataSQLRecordBuilder {
|
1322
|
-
constructor(dataRecord) {
|
1323
|
-
this.dataRecord = dataRecord;
|
1324
|
-
}
|
1325
|
-
static fromUploadParams(data, params) {
|
1326
|
-
return new _DataSQLRecordBuilder({
|
1327
|
-
name: params.name,
|
1328
|
-
car: params.car,
|
1329
|
-
data,
|
1330
|
-
updated_at: /* @__PURE__ */ new Date()
|
1331
|
-
});
|
1332
|
-
}
|
1333
|
-
build() {
|
1334
|
-
return this.dataRecord;
|
1335
|
-
}
|
1336
|
-
};
|
1337
|
-
V0_18_0SQLiteDataStore = class {
|
1338
|
-
constructor(dbConn) {
|
1339
|
-
this.dbConn = dbConn;
|
1340
|
-
this.logger = ensureLogger(dbConn.opts, "SQLiteDataStore");
|
1341
|
-
this.logger.Debug().Msg("constructor");
|
1342
|
-
}
|
1343
|
-
table(url) {
|
1344
|
-
return getStore(url, this.logger, (...x) => x.join("_"));
|
1345
|
-
}
|
1346
|
-
#createTable = new import_cement11.KeyedResolvOnce();
|
1347
|
-
async createTable(url) {
|
1348
|
-
return this.#createTable.get(this.table(url)).once(async (table) => {
|
1349
|
-
await this.dbConn.client.prepare(
|
1350
|
-
`CREATE TABLE IF NOT EXISTS ${table} (
|
1351
|
-
name TEXT NOT NULL,
|
1352
|
-
car TEXT PRIMARY KEY,
|
1353
|
-
data BLOB NOT NULL,
|
1354
|
-
updated_at TEXT NOT NULL)`
|
1355
|
-
).run();
|
1356
|
-
});
|
1357
|
-
}
|
1358
|
-
#insertStmt = new import_cement11.KeyedResolvOnce();
|
1359
|
-
async insertStmt(url) {
|
1360
|
-
return this.#insertStmt.get(this.table(url)).once(async (table) => {
|
1361
|
-
await this.createTable(url);
|
1362
|
-
return this.dbConn.client.prepare(`
|
1363
|
-
insert into ${table}
|
1364
|
-
(name, car, data, updated_at) values (?, ?, ?, ?)
|
1365
|
-
ON CONFLICT(car) DO UPDATE SET updated_at=?`);
|
1366
|
-
});
|
1367
|
-
}
|
1368
|
-
#selectStmt = new import_cement11.KeyedResolvOnce();
|
1369
|
-
async selectStmt(url) {
|
1370
|
-
return this.#selectStmt.get(this.table(url)).once(async (table) => {
|
1371
|
-
await this.createTable(url);
|
1372
|
-
return this.dbConn.client.prepare(`select name, car, data, updated_at from ${table} where car = ?`);
|
1373
|
-
});
|
1374
|
-
}
|
1375
|
-
#deleteStmt = new import_cement11.KeyedResolvOnce();
|
1376
|
-
async deleteStmt(url) {
|
1377
|
-
return this.#deleteStmt.get(this.table(url)).once(async (table) => {
|
1378
|
-
await this.createTable(url);
|
1379
|
-
return this.dbConn.client.prepare(`delete from ${table} where car = ?`);
|
1380
|
-
});
|
1381
|
-
}
|
1382
|
-
async start(url) {
|
1383
|
-
this.logger.Debug().Msg("start-connect");
|
1384
|
-
await this.dbConn.connect();
|
1385
|
-
this.logger.Debug().Msg("start-connected");
|
1386
|
-
await ensureSQLiteVersion(url, this.dbConn);
|
1387
|
-
this.logger.Debug().Msg("start-set-version");
|
1388
|
-
}
|
1389
|
-
async insert(url, ose) {
|
1390
|
-
this.logger.Debug().Str("name", ose.name).Str("car", ose.car).Uint64("data-len", ose.data.length).Msg("insert");
|
1391
|
-
const updated_at = ose.updated_at.toISOString();
|
1392
|
-
return this.insertStmt(url).then((i) => i.run(ose.name, ose.car, Buffer.from(ose.data), updated_at, updated_at));
|
1393
|
-
}
|
1394
|
-
async select(url, car) {
|
1395
|
-
this.logger.Debug().Str("car", car).Msg("select");
|
1396
|
-
return (await this.selectStmt(url).then((i) => i.all(car))).map((irow) => {
|
1397
|
-
const row = irow;
|
1398
|
-
return {
|
1399
|
-
name: row.name,
|
1400
|
-
car: row.car,
|
1401
|
-
data: Uint8Array.from(row.data),
|
1402
|
-
updated_at: new Date(row.updated_at)
|
1403
|
-
};
|
1404
|
-
});
|
1405
|
-
}
|
1406
|
-
async delete(url, car) {
|
1407
|
-
this.logger.Debug().Str("car", car).Msg("delete");
|
1408
|
-
const ret = await this.deleteStmt(url).then((i) => i.run(car));
|
1409
|
-
return ret;
|
1410
|
-
}
|
1411
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
1412
|
-
async close(url) {
|
1413
|
-
this.logger.Debug().Msg("close");
|
1414
|
-
return import_cement11.Result.Ok(void 0);
|
1415
|
-
}
|
1416
|
-
async destroy(url) {
|
1417
|
-
return exception2Result(async () => {
|
1418
|
-
this.logger.Debug().Msg("destroy");
|
1419
|
-
await this.createTable(url);
|
1420
|
-
await this.dbConn.client.prepare(`delete from ${this.table(url)}`).run();
|
1421
|
-
});
|
1422
|
-
}
|
1423
|
-
};
|
1424
|
-
}
|
1425
|
-
});
|
1426
|
-
|
1427
|
-
// src/runtime/store-sql/v0.19-sqlite/sqlite-meta-store.ts
|
1428
|
-
var sqlite_meta_store_exports = {};
|
1429
|
-
__export(sqlite_meta_store_exports, {
|
1430
|
-
MetaSQLRecordBuilder: () => MetaSQLRecordBuilder,
|
1431
|
-
V0_18_0SQLiteMetaStore: () => V0_18_0SQLiteMetaStore
|
1432
|
-
});
|
1433
|
-
var import_cement12, MetaSQLRecordBuilder, V0_18_0SQLiteMetaStore;
|
1434
|
-
var init_sqlite_meta_store = __esm({
|
1435
|
-
"src/runtime/store-sql/v0.19-sqlite/sqlite-meta-store.ts"() {
|
1436
|
-
"use strict";
|
1437
|
-
import_cement12 = require("@adviser/cement");
|
1438
|
-
init_sqlite_ensure_version();
|
1439
|
-
init_utils();
|
1440
|
-
MetaSQLRecordBuilder = class _MetaSQLRecordBuilder {
|
1441
|
-
constructor(record, textEncoder3) {
|
1442
|
-
this.record = record;
|
1443
|
-
this.textEncoder = textEncoder3;
|
1444
|
-
}
|
1445
|
-
static fromUploadMetaFnParams(data, params, textEncoder3) {
|
1446
|
-
return new _MetaSQLRecordBuilder(
|
1447
|
-
{
|
1448
|
-
name: params.name,
|
1449
|
-
branch: params.branch,
|
1450
|
-
meta: data,
|
1451
|
-
updated_at: /* @__PURE__ */ new Date()
|
1452
|
-
},
|
1453
|
-
textEncoder3
|
1454
|
-
);
|
1455
|
-
}
|
1456
|
-
static fromBytes(str, name, branch, textEncoder3) {
|
1457
|
-
return new _MetaSQLRecordBuilder(
|
1458
|
-
{
|
1459
|
-
name,
|
1460
|
-
branch,
|
1461
|
-
meta: textEncoder3.encode(str),
|
1462
|
-
updated_at: /* @__PURE__ */ new Date()
|
1463
|
-
},
|
1464
|
-
textEncoder3
|
1465
|
-
);
|
1466
|
-
}
|
1467
|
-
build() {
|
1468
|
-
return this.record;
|
1469
|
-
}
|
1470
|
-
};
|
1471
|
-
V0_18_0SQLiteMetaStore = class {
|
1472
|
-
constructor(dbConn) {
|
1473
|
-
this.dbConn = dbConn;
|
1474
|
-
this.logger = ensureLogger(dbConn.opts, "SQLiteMetaStore");
|
1475
|
-
this.logger.Debug().Msg("constructor");
|
1476
|
-
}
|
1477
|
-
async start(url) {
|
1478
|
-
this.logger.Debug().Url(url).Msg("starting");
|
1479
|
-
await this.dbConn.connect();
|
1480
|
-
await ensureSQLiteVersion(url, this.dbConn);
|
1481
|
-
this.logger.Debug().Url(url).Msg("started");
|
1482
|
-
}
|
1483
|
-
table(url) {
|
1484
|
-
return getStore(url, this.logger, (...x) => x.join("_"));
|
1485
|
-
}
|
1486
|
-
#createTable = new import_cement12.KeyedResolvOnce();
|
1487
|
-
async createTable(url) {
|
1488
|
-
return this.#createTable.get(this.table(url)).once(async (table) => {
|
1489
|
-
await this.dbConn.client.prepare(
|
1490
|
-
`CREATE TABLE IF NOT EXISTS ${table} (
|
1491
|
-
name TEXT not null,
|
1492
|
-
branch TEXT not null,
|
1493
|
-
meta BLOB NOT NULL,
|
1494
|
-
updated_at TEXT NOT NULL,
|
1495
|
-
PRIMARY KEY (name, branch)
|
1496
|
-
)`
|
1497
|
-
).run();
|
1498
|
-
});
|
1499
|
-
}
|
1500
|
-
#insertStmt = new import_cement12.KeyedResolvOnce();
|
1501
|
-
async insertStmt(url) {
|
1502
|
-
return this.#insertStmt.get(this.table(url)).once(async (table) => {
|
1503
|
-
await this.createTable(url);
|
1504
|
-
return this.dbConn.client.prepare(`insert into ${table}
|
1505
|
-
(name, branch, meta, updated_at)
|
1506
|
-
values (?, ?, ?, ?)
|
1507
|
-
ON CONFLICT(name, branch) DO UPDATE SET meta=?, updated_at=?
|
1508
|
-
`);
|
1509
|
-
});
|
1510
|
-
}
|
1511
|
-
#selectStmt = new import_cement12.KeyedResolvOnce();
|
1512
|
-
async selectStmt(url) {
|
1513
|
-
return this.#selectStmt.get(this.table(url)).once(async (table) => {
|
1514
|
-
await this.createTable(url);
|
1515
|
-
return this.dbConn.client.prepare(`select name, branch, meta, updated_at from ${table} where name = ? and branch = ?`);
|
1516
|
-
});
|
1517
|
-
}
|
1518
|
-
#deleteStmt = new import_cement12.KeyedResolvOnce();
|
1519
|
-
async deleteStmt(url) {
|
1520
|
-
return this.#deleteStmt.get(this.table(url)).once(async (table) => {
|
1521
|
-
await this.createTable(url);
|
1522
|
-
return this.dbConn.client.prepare(`delete from ${table} where name = ? and branch = ?`);
|
1523
|
-
});
|
1524
|
-
}
|
1525
|
-
async insert(url, ose) {
|
1526
|
-
this.logger.Debug().Str("name", ose.name).Str("branch", ose.branch).Uint64("data-len", ose.meta.length).Msg("insert");
|
1527
|
-
const bufMeta = Buffer.from(ose.meta);
|
1528
|
-
return this.insertStmt(url).then(
|
1529
|
-
(i) => i.run(ose.name, ose.branch, bufMeta, ose.updated_at.toISOString(), bufMeta, ose.updated_at.toISOString())
|
1530
|
-
);
|
1531
|
-
}
|
1532
|
-
async select(url, key) {
|
1533
|
-
this.logger.Debug().Str("name", key.name).Str("branch", key.branch).Msg("select");
|
1534
|
-
return (await this.selectStmt(url).then((i) => i.all(key.name, key.branch))).map((irow) => {
|
1535
|
-
const row = irow;
|
1536
|
-
return {
|
1537
|
-
name: row.name,
|
1538
|
-
branch: row.branch,
|
1539
|
-
meta: Uint8Array.from(row.meta),
|
1540
|
-
updated_at: new Date(row.updated_at)
|
1541
|
-
};
|
1542
|
-
});
|
1543
|
-
}
|
1544
|
-
async delete(url, key) {
|
1545
|
-
this.logger.Debug().Str("name", key.name).Str("branch", key.branch).Msg("delete");
|
1546
|
-
return this.deleteStmt(url).then((i) => i.run(key.name, key.branch));
|
1547
|
-
}
|
1548
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
1549
|
-
async close(url) {
|
1550
|
-
this.logger.Debug().Msg("close");
|
1551
|
-
return import_cement12.Result.Ok(void 0);
|
1552
|
-
}
|
1553
|
-
async destroy(url) {
|
1554
|
-
return exception2Result(async () => {
|
1555
|
-
this.logger.Debug().Msg("destroy");
|
1556
|
-
await this.dbConn.client.prepare(`delete from ${this.table(url)}`).run();
|
799
|
+
async function connectIdb(url2, logger) {
|
800
|
+
const dbName = getIndexDBName(url2, logger);
|
801
|
+
const once = await onceIndexDB.get(dbName.fullDb).once(async () => {
|
802
|
+
const db = await (0, import_idb.openDB)(dbName.fullDb, 1, {
|
803
|
+
upgrade(db2) {
|
804
|
+
["version", "data", "wal", "meta", "idx.data", "idx.wal", "idx.meta"].map((store) => {
|
805
|
+
db2.createObjectStore(store, {
|
806
|
+
autoIncrement: false
|
807
|
+
});
|
1557
808
|
});
|
1558
809
|
}
|
1559
|
-
};
|
1560
|
-
|
1561
|
-
|
1562
|
-
|
1563
|
-
|
1564
|
-
|
1565
|
-
|
1566
|
-
case "sqlite": {
|
1567
|
-
const { V0_18_0SQLiteWalStore: V0_18_0SQLiteWalStore2 } = await Promise.resolve().then(() => (init_sqlite_wal_store(), sqlite_wal_store_exports));
|
1568
|
-
const store = new V0_18_0SQLiteWalStore2(db);
|
1569
|
-
return store;
|
810
|
+
});
|
811
|
+
const found = await db.get("version", "version");
|
812
|
+
const version = url2.searchParams.get("version") || INDEXDB_VERSION;
|
813
|
+
if (!found) {
|
814
|
+
await db.put("version", { version }, "version");
|
815
|
+
} else if (found.version !== version) {
|
816
|
+
logger.Warn().Str("url", url2.toString()).Str("version", version).Str("found", found.version).Msg("version mismatch");
|
1570
817
|
}
|
1571
|
-
|
1572
|
-
|
1573
|
-
|
818
|
+
return { db, dbName, version };
|
819
|
+
});
|
820
|
+
url2.searchParams.set("version", once.version);
|
821
|
+
return once.db;
|
1574
822
|
}
|
1575
|
-
|
1576
|
-
|
1577
|
-
case "sqlite": {
|
1578
|
-
const { V0_18_0SQLiteDataStore: V0_18_0SQLiteDataStore2 } = await Promise.resolve().then(() => (init_sqlite_data_store(), sqlite_data_store_exports));
|
1579
|
-
const store = new V0_18_0SQLiteDataStore2(db);
|
1580
|
-
return store;
|
1581
|
-
}
|
1582
|
-
default:
|
1583
|
-
throw ensureLogger(db.opts, "DataStoreFactory").Error().Msg("unsupported db connection").AsError();
|
1584
|
-
}
|
823
|
+
function joinDBName(...names) {
|
824
|
+
return names.map((i) => i.replace(/^[^a-zA-Z0-9]+/g, "").replace(/[^a-zA-Z0-9]+/g, "_")).filter((i) => i.length).join(".");
|
1585
825
|
}
|
1586
|
-
|
1587
|
-
|
1588
|
-
|
1589
|
-
|
1590
|
-
|
1591
|
-
|
1592
|
-
|
1593
|
-
|
1594
|
-
|
1595
|
-
|
826
|
+
function getIndexDBName(iurl, logger) {
|
827
|
+
const url2 = ensureVersion(iurl);
|
828
|
+
const fullDb = url2.pathname.replace(/^\/+/, "").replace(/\?.*$/, "");
|
829
|
+
const dbName = url2.searchParams.get("name");
|
830
|
+
if (!dbName) throw logger.Error().Str("url", url2.toString()).Msg(`name not found`).AsError();
|
831
|
+
const result = joinDBName(fullDb, dbName);
|
832
|
+
const objStore = getStore(url2, logger, joinDBName);
|
833
|
+
const connectionKey = [result, objStore].join(":");
|
834
|
+
return {
|
835
|
+
fullDb: result,
|
836
|
+
objStore,
|
837
|
+
connectionKey,
|
838
|
+
dbName
|
839
|
+
};
|
1596
840
|
}
|
1597
|
-
var
|
1598
|
-
|
1599
|
-
|
1600
|
-
init_utils();
|
1601
|
-
init_version();
|
1602
|
-
}
|
1603
|
-
});
|
1604
|
-
|
1605
|
-
// src/runtime/store-sql/store-sql.ts
|
1606
|
-
var store_sql_exports2 = {};
|
1607
|
-
__export(store_sql_exports2, {
|
1608
|
-
SQLDataGateway: () => SQLDataGateway,
|
1609
|
-
SQLMetaGateway: () => SQLMetaGateway,
|
1610
|
-
SQLTestStore: () => SQLTestStore,
|
1611
|
-
SQLWalGateway: () => SQLWalGateway
|
1612
|
-
});
|
1613
|
-
var import_cement13, SQLWalGateway, SQLMetaGateway, SQLDataGateway, SQLTestStore;
|
1614
|
-
var init_store_sql2 = __esm({
|
1615
|
-
"src/runtime/store-sql/store-sql.ts"() {
|
841
|
+
var import_idb, import_cement7, onceIndexDB, IndexDBGateway, IndexDBDataGateway, IndexDBWalGateway, IndexDBMetaGateway, txtEncoder, IndexDBTestStore;
|
842
|
+
var init_store_indexdb = __esm({
|
843
|
+
"src/runtime/store-indexdb.ts"() {
|
1616
844
|
"use strict";
|
1617
|
-
|
1618
|
-
|
1619
|
-
|
845
|
+
import_idb = require("idb");
|
846
|
+
import_cement7 = require("@adviser/cement");
|
847
|
+
init_store_indexdb_version();
|
1620
848
|
init_utils();
|
1621
849
|
init_gateway();
|
1622
|
-
|
850
|
+
init_sys_container();
|
851
|
+
onceIndexDB = new import_cement7.KeyedResolvOnce();
|
852
|
+
IndexDBGateway = class {
|
1623
853
|
constructor(logger) {
|
1624
|
-
this.
|
1625
|
-
this.logger =
|
854
|
+
this.db = {};
|
855
|
+
this.logger = logger;
|
1626
856
|
}
|
1627
|
-
|
1628
|
-
|
1629
|
-
url.searchParams.set("key", key);
|
1630
|
-
return Promise.resolve(import_cement13.Result.Ok(url));
|
857
|
+
idb() {
|
858
|
+
this.db;
|
1631
859
|
}
|
1632
|
-
async start(
|
860
|
+
async start(baseURL) {
|
1633
861
|
return exception2Result(async () => {
|
1634
|
-
this.logger.Debug().Url(
|
1635
|
-
|
1636
|
-
|
1637
|
-
|
1638
|
-
this.walSQLStore = ws;
|
862
|
+
this.logger.Debug().Url(baseURL).Msg("starting");
|
863
|
+
await SysContainer.start();
|
864
|
+
this.db = await connectIdb(baseURL, this.logger);
|
865
|
+
this.logger.Debug().Url(baseURL).Msg("started");
|
1639
866
|
});
|
1640
867
|
}
|
1641
|
-
close(
|
1642
|
-
return
|
1643
|
-
}
|
1644
|
-
destroy(baseUrl) {
|
1645
|
-
return this.walSQLStore.destroy(baseUrl);
|
868
|
+
async close() {
|
869
|
+
return import_cement7.Result.Ok(void 0);
|
1646
870
|
}
|
1647
|
-
async
|
871
|
+
async destroy(baseUrl) {
|
1648
872
|
return exception2Result(async () => {
|
1649
|
-
const
|
1650
|
-
const
|
1651
|
-
|
1652
|
-
|
1653
|
-
|
1654
|
-
|
1655
|
-
|
1656
|
-
}
|
873
|
+
const type = getStore(baseUrl, this.logger, joinDBName);
|
874
|
+
const idb = this.db;
|
875
|
+
const trans = idb.transaction(type, "readwrite");
|
876
|
+
const object_store = trans.objectStore(type);
|
877
|
+
const toDelete = [];
|
878
|
+
for (let cursor = await object_store.openCursor(); cursor; cursor = await cursor.continue()) {
|
879
|
+
toDelete.push(cursor.primaryKey);
|
880
|
+
}
|
881
|
+
for (const key of toDelete) {
|
882
|
+
await trans.db.delete(type, key);
|
883
|
+
}
|
884
|
+
await trans.done;
|
1657
885
|
});
|
1658
886
|
}
|
1659
|
-
async get(
|
887
|
+
async get(url2) {
|
1660
888
|
return exceptionWrapper(async () => {
|
1661
|
-
const
|
1662
|
-
const
|
1663
|
-
|
1664
|
-
|
1665
|
-
|
889
|
+
const key = getKey(url2, this.logger);
|
890
|
+
const store = getStore(url2, this.logger, joinDBName);
|
891
|
+
this.logger.Debug().Url(url2).Str("key", key).Str("store", store).Msg("getting");
|
892
|
+
const tx = this.db.transaction([store], "readonly");
|
893
|
+
const bytes = await tx.objectStore(store).get(sanitzeKey(key));
|
894
|
+
await tx.done;
|
895
|
+
if (!bytes) {
|
896
|
+
return import_cement7.Result.Err(new NotFoundError(`missing ${key}`));
|
1666
897
|
}
|
1667
|
-
return
|
1668
|
-
});
|
1669
|
-
}
|
1670
|
-
async delete(url) {
|
1671
|
-
return exception2Result(async () => {
|
1672
|
-
const branch = getKey(url, this.logger);
|
1673
|
-
const name = getName(url, this.logger);
|
1674
|
-
await this.walSQLStore.delete(url, { name, branch });
|
898
|
+
return import_cement7.Result.Ok(bytes);
|
1675
899
|
});
|
1676
900
|
}
|
1677
|
-
|
1678
|
-
SQLMetaGateway = class {
|
1679
|
-
constructor(logger) {
|
1680
|
-
this.metaSQLStore = {};
|
1681
|
-
this.logger = ensureLogger(logger, "SQLMetaGateway");
|
1682
|
-
}
|
1683
|
-
buildUrl(baseUrl, key) {
|
1684
|
-
const url = new URL(baseUrl.toString());
|
1685
|
-
url.searchParams.set("key", key);
|
1686
|
-
return Promise.resolve(import_cement13.Result.Ok(url));
|
1687
|
-
}
|
1688
|
-
async start(baseUrl) {
|
901
|
+
async put(url2, value) {
|
1689
902
|
return exception2Result(async () => {
|
1690
|
-
this.logger
|
1691
|
-
const
|
1692
|
-
|
1693
|
-
|
1694
|
-
|
1695
|
-
|
1696
|
-
});
|
1697
|
-
}
|
1698
|
-
close(baseUrl) {
|
1699
|
-
return this.metaSQLStore.close(baseUrl);
|
1700
|
-
}
|
1701
|
-
destroy(baseUrl) {
|
1702
|
-
return this.metaSQLStore.destroy(baseUrl);
|
1703
|
-
}
|
1704
|
-
async put(url, body) {
|
1705
|
-
return exception2Result(async () => {
|
1706
|
-
const branch = getKey(url, this.logger);
|
1707
|
-
const name = getName(url, this.logger);
|
1708
|
-
await this.metaSQLStore.insert(url, {
|
1709
|
-
meta: body,
|
1710
|
-
updated_at: /* @__PURE__ */ new Date(),
|
1711
|
-
name,
|
1712
|
-
branch
|
1713
|
-
});
|
1714
|
-
});
|
1715
|
-
}
|
1716
|
-
async get(url) {
|
1717
|
-
return exceptionWrapper(async () => {
|
1718
|
-
const branch = getKey(url, this.logger);
|
1719
|
-
const name = getName(url, this.logger);
|
1720
|
-
const record = await this.metaSQLStore.select(url, {
|
1721
|
-
name,
|
1722
|
-
branch
|
1723
|
-
});
|
1724
|
-
if (record.length === 0) {
|
1725
|
-
return import_cement13.Result.Err(new NotFoundError(`not found ${name} ${branch}`));
|
1726
|
-
}
|
1727
|
-
return import_cement13.Result.Ok(record[0].meta);
|
903
|
+
const key = getKey(url2, this.logger);
|
904
|
+
const store = getStore(url2, this.logger, joinDBName);
|
905
|
+
this.logger.Debug().Url(url2).Str("key", key).Str("store", store).Msg("putting");
|
906
|
+
const tx = this.db.transaction([store], "readwrite");
|
907
|
+
await tx.objectStore(store).put(value, sanitzeKey(key));
|
908
|
+
await tx.done;
|
1728
909
|
});
|
1729
910
|
}
|
1730
|
-
async delete(
|
911
|
+
async delete(url2) {
|
1731
912
|
return exception2Result(async () => {
|
1732
|
-
const
|
1733
|
-
const
|
1734
|
-
|
1735
|
-
|
1736
|
-
|
1737
|
-
|
913
|
+
const key = getKey(url2, this.logger);
|
914
|
+
const store = getStore(url2, this.logger, joinDBName);
|
915
|
+
this.logger.Debug().Url(url2).Str("key", key).Str("store", store).Msg("deleting");
|
916
|
+
const tx = this.db.transaction([store], "readwrite");
|
917
|
+
await tx.objectStore(store).delete(sanitzeKey(key));
|
918
|
+
await tx.done;
|
919
|
+
return import_cement7.Result.Ok(void 0);
|
1738
920
|
});
|
1739
921
|
}
|
1740
922
|
};
|
1741
|
-
|
923
|
+
IndexDBDataGateway = class extends IndexDBGateway {
|
1742
924
|
constructor(logger) {
|
1743
|
-
|
1744
|
-
this.logger = ensureLogger(logger, "SQLDataGateway");
|
925
|
+
super(ensureLogger(logger, "IndexDBDataGateway", {}));
|
1745
926
|
}
|
1746
927
|
buildUrl(baseUrl, key) {
|
1747
|
-
const
|
1748
|
-
|
1749
|
-
return Promise.resolve(
|
1750
|
-
}
|
1751
|
-
async start(baseUrl) {
|
1752
|
-
return exception2Result(async () => {
|
1753
|
-
this.logger.Debug().Url(baseUrl).Msg("pre-sql-connection");
|
1754
|
-
const conn = SQLConnectionFactory(baseUrl);
|
1755
|
-
this.logger.Debug().Url(baseUrl).Msg("post-sql-connection");
|
1756
|
-
const ws = await DataStoreFactory(conn);
|
1757
|
-
this.logger.Debug().Url(baseUrl).Msg("post-data-store-factory");
|
1758
|
-
await ws.start(baseUrl);
|
1759
|
-
this.dataSQLStore = ws;
|
1760
|
-
this.logger.Debug().Url(baseUrl).Msg("started");
|
1761
|
-
});
|
928
|
+
const url2 = new URL(baseUrl.toString());
|
929
|
+
url2.searchParams.set("key", key);
|
930
|
+
return Promise.resolve(import_cement7.Result.Ok(url2));
|
1762
931
|
}
|
1763
|
-
|
1764
|
-
|
1765
|
-
|
1766
|
-
|
1767
|
-
return this.dataSQLStore.destroy(baseUrl);
|
932
|
+
};
|
933
|
+
IndexDBWalGateway = class extends IndexDBGateway {
|
934
|
+
constructor(logger) {
|
935
|
+
super(ensureLogger(logger, "IndexDBWalGateway", {}));
|
1768
936
|
}
|
1769
|
-
|
1770
|
-
|
1771
|
-
|
1772
|
-
|
1773
|
-
await this.dataSQLStore.insert(url, {
|
1774
|
-
data: body,
|
1775
|
-
updated_at: /* @__PURE__ */ new Date(),
|
1776
|
-
name,
|
1777
|
-
car: cid
|
1778
|
-
});
|
1779
|
-
});
|
937
|
+
buildUrl(baseUrl, key) {
|
938
|
+
const url2 = new URL(baseUrl.toString());
|
939
|
+
url2.searchParams.set("key", key);
|
940
|
+
return Promise.resolve(import_cement7.Result.Ok(url2));
|
1780
941
|
}
|
1781
|
-
|
1782
|
-
|
1783
|
-
|
1784
|
-
|
1785
|
-
|
1786
|
-
return import_cement13.Result.Err(new NotFoundError(`not found ${branch}`));
|
1787
|
-
}
|
1788
|
-
return import_cement13.Result.Ok(record[0].data);
|
1789
|
-
});
|
942
|
+
};
|
943
|
+
IndexDBMetaGateway = class extends IndexDBGateway {
|
944
|
+
constructor(logger) {
|
945
|
+
super(ensureLogger(logger, "IndexDBDataGateway", {}));
|
946
|
+
this.branches = /* @__PURE__ */ new Set();
|
1790
947
|
}
|
1791
|
-
async
|
1792
|
-
|
1793
|
-
|
1794
|
-
|
1795
|
-
|
1796
|
-
});
|
948
|
+
async buildUrl(baseUrl, key) {
|
949
|
+
const url2 = new URL(baseUrl.toString());
|
950
|
+
this.branches.add(key);
|
951
|
+
url2.searchParams.set("key", key);
|
952
|
+
return import_cement7.Result.Ok(url2);
|
1797
953
|
}
|
1798
954
|
};
|
1799
|
-
|
1800
|
-
|
1801
|
-
|
1802
|
-
this.logger = logger;
|
955
|
+
txtEncoder = new TextEncoder();
|
956
|
+
IndexDBTestStore = class {
|
957
|
+
constructor(logger) {
|
958
|
+
this.logger = ensureLogger(logger, "IndexDBTestStore", {});
|
1803
959
|
}
|
1804
|
-
async get(
|
1805
|
-
const
|
1806
|
-
const
|
1807
|
-
|
1808
|
-
|
1809
|
-
|
1810
|
-
|
1811
|
-
|
1812
|
-
name,
|
1813
|
-
branch: key
|
1814
|
-
});
|
1815
|
-
return records[0].state;
|
1816
|
-
}
|
1817
|
-
case "meta": {
|
1818
|
-
const sqlStore = await MetaStoreFactory(conn);
|
1819
|
-
await sqlStore.start(url);
|
1820
|
-
const records = await sqlStore.select(url, {
|
1821
|
-
name,
|
1822
|
-
branch: key
|
1823
|
-
});
|
1824
|
-
return records[0].meta;
|
1825
|
-
}
|
1826
|
-
case "data": {
|
1827
|
-
const sqlStore = await DataStoreFactory(conn);
|
1828
|
-
await sqlStore.start(url);
|
1829
|
-
const records = await sqlStore.select(url, key);
|
1830
|
-
return records[0].data;
|
1831
|
-
}
|
1832
|
-
default:
|
1833
|
-
throw this.logger.Error().Str("key", key).Msg(`Method not implemented`);
|
960
|
+
async get(url2, key) {
|
961
|
+
const db = await connectIdb(url2, this.logger);
|
962
|
+
const store = getStore(url2, this.logger, joinDBName);
|
963
|
+
this.logger.Debug().Str("key", key).Str("store", store).Msg("getting");
|
964
|
+
let bytes = await db.get(store, sanitzeKey(key));
|
965
|
+
this.logger.Debug().Str("key", key).Str("store", store).Int("len", bytes.length).Msg("got");
|
966
|
+
if (typeof bytes === "string") {
|
967
|
+
bytes = txtEncoder.encode(bytes);
|
1834
968
|
}
|
969
|
+
return bytes;
|
1835
970
|
}
|
1836
971
|
};
|
1837
972
|
}
|
@@ -1844,6 +979,7 @@ __export(src_exports, {
|
|
1844
979
|
Database: () => Database,
|
1845
980
|
Index: () => Index,
|
1846
981
|
PACKAGE_VERSION: () => PACKAGE_VERSION,
|
982
|
+
Result: () => import_cement2.Result,
|
1847
983
|
blockstore: () => blockstore_exports,
|
1848
984
|
bs: () => blockstore_exports,
|
1849
985
|
ensureLogger: () => ensureLogger,
|
@@ -1864,7 +1000,7 @@ module.exports = __toCommonJS(src_exports);
|
|
1864
1000
|
|
1865
1001
|
// src/database.ts
|
1866
1002
|
var import_uuidv73 = require("uuidv7");
|
1867
|
-
var
|
1003
|
+
var import_cement11 = require("@adviser/cement");
|
1868
1004
|
|
1869
1005
|
// src/write-queue.ts
|
1870
1006
|
function writeQueue(worker, payload = Infinity, unbounded = false) {
|
@@ -1907,7 +1043,7 @@ function writeQueue(worker, payload = Infinity, unbounded = false) {
|
|
1907
1043
|
}
|
1908
1044
|
|
1909
1045
|
// src/crdt.ts
|
1910
|
-
var
|
1046
|
+
var import_cement10 = require("@adviser/cement");
|
1911
1047
|
|
1912
1048
|
// src/crdt-helpers.ts
|
1913
1049
|
var import_block6 = require("multiformats/block");
|
@@ -2115,23 +1251,22 @@ var ConnectREST = class extends ConnectionBase {
|
|
2115
1251
|
};
|
2116
1252
|
|
2117
1253
|
// src/blockstore/store-factory.ts
|
2118
|
-
var
|
1254
|
+
var import_cement8 = require("@adviser/cement");
|
2119
1255
|
init_data_dir();
|
2120
1256
|
init_files();
|
2121
1257
|
|
2122
1258
|
// src/blockstore/store.ts
|
2123
1259
|
var import_p_limit2 = __toESM(require("p-limit"), 1);
|
2124
1260
|
var import_dag_json = require("@ipld/dag-json");
|
2125
|
-
var
|
1261
|
+
var import_cement5 = require("@adviser/cement");
|
2126
1262
|
init_types();
|
2127
1263
|
init_gateway();
|
2128
1264
|
init_utils();
|
2129
|
-
init_store_indexdb();
|
2130
1265
|
|
2131
1266
|
// src/blockstore/loader.ts
|
2132
1267
|
var import_p_limit = __toESM(require("p-limit"), 1);
|
2133
1268
|
var import_car = require("@ipld/car");
|
2134
|
-
var
|
1269
|
+
var import_cement4 = require("@adviser/cement");
|
2135
1270
|
|
2136
1271
|
// src/blockstore/types.ts
|
2137
1272
|
function toCIDBlock(block) {
|
@@ -2187,7 +1322,7 @@ var import_multiformats2 = require("multiformats");
|
|
2187
1322
|
var import_block3 = require("multiformats/block");
|
2188
1323
|
var dagcbor = __toESM(require("@ipld/dag-cbor"), 1);
|
2189
1324
|
var import_block4 = require("@web3-storage/pail/block");
|
2190
|
-
var
|
1325
|
+
var import_utils6 = require("prolly-trees/utils");
|
2191
1326
|
var import_cache = require("prolly-trees/cache");
|
2192
1327
|
var import_cid_set = require("prolly-trees/cid-set");
|
2193
1328
|
|
@@ -2375,7 +1510,7 @@ function makeEncDec(logger, crypto2, randomBytes2) {
|
|
2375
1510
|
};
|
2376
1511
|
return { encrypt, decrypt };
|
2377
1512
|
}
|
2378
|
-
var chunker = (0,
|
1513
|
+
var chunker = (0, import_utils6.bf)(30);
|
2379
1514
|
function hexStringToUint8Array(hexString) {
|
2380
1515
|
const length = hexString.length;
|
2381
1516
|
const uint8Array = new Uint8Array(length / 2);
|
@@ -2699,7 +1834,7 @@ var Loader = class {
|
|
2699
1834
|
this.getBlockCache = /* @__PURE__ */ new Map();
|
2700
1835
|
this.seenMeta = /* @__PURE__ */ new Set();
|
2701
1836
|
this.writeLimit = (0, import_p_limit.default)(1);
|
2702
|
-
this.onceReady = new
|
1837
|
+
this.onceReady = new import_cement4.ResolveOnce();
|
2703
1838
|
this.name = name;
|
2704
1839
|
this.ebOpts = defaultedBlockstoreRuntime(
|
2705
1840
|
{
|
@@ -3093,12 +2228,18 @@ var Loader = class {
|
|
3093
2228
|
};
|
3094
2229
|
|
3095
2230
|
// src/blockstore/store.ts
|
2231
|
+
function guardVersion(url2) {
|
2232
|
+
if (!url2.searchParams.has("version")) {
|
2233
|
+
return import_cement5.Result.Err(`missing version: ${url2.toString()}`);
|
2234
|
+
}
|
2235
|
+
return import_cement5.Result.Ok(url2);
|
2236
|
+
}
|
3096
2237
|
var VersionedStore = class {
|
3097
|
-
constructor(name,
|
2238
|
+
constructor(name, url2, logger) {
|
3098
2239
|
this._onStarted = [];
|
3099
2240
|
this._onClosed = [];
|
3100
2241
|
this.name = name;
|
3101
|
-
this.url =
|
2242
|
+
this.url = url2;
|
3102
2243
|
this.logger = logger;
|
3103
2244
|
}
|
3104
2245
|
onStarted(fn) {
|
@@ -3108,11 +2249,11 @@ var VersionedStore = class {
|
|
3108
2249
|
this._onClosed.push(fn);
|
3109
2250
|
}
|
3110
2251
|
};
|
3111
|
-
var
|
3112
|
-
var
|
2252
|
+
var textEncoder = new TextEncoder();
|
2253
|
+
var textDecoder = new TextDecoder();
|
3113
2254
|
var MetaStore = class extends VersionedStore {
|
3114
|
-
constructor(name,
|
3115
|
-
super(name,
|
2255
|
+
constructor(name, url2, logger, gateway) {
|
2256
|
+
super(name, url2, ensureLogger(logger, "MetaStore", {}));
|
3116
2257
|
this.tag = "header-base";
|
3117
2258
|
this.gateway = gateway;
|
3118
2259
|
}
|
@@ -3136,19 +2277,19 @@ var MetaStore = class extends VersionedStore {
|
|
3136
2277
|
}
|
3137
2278
|
async load(branch) {
|
3138
2279
|
this.logger.Debug().Str("branch", branch || "").Msg("loading");
|
3139
|
-
const
|
3140
|
-
if (
|
3141
|
-
throw this.logger.Error().
|
2280
|
+
const url2 = await this.gateway.buildUrl(this.url, branch || "main");
|
2281
|
+
if (url2.isErr()) {
|
2282
|
+
throw this.logger.Error().Result("buidUrl", url2).Str("branch", branch || "").Url(this.url).Msg("got error from gateway.buildUrl").AsError();
|
3142
2283
|
}
|
3143
|
-
const bytes = await this.gateway.get(
|
2284
|
+
const bytes = await this.gateway.get(url2.Ok());
|
3144
2285
|
if (bytes.isErr()) {
|
3145
2286
|
if (isNotFoundError(bytes)) {
|
3146
2287
|
return void 0;
|
3147
2288
|
}
|
3148
|
-
throw this.logger.Error().
|
2289
|
+
throw this.logger.Error().Url(url2.Ok()).Result("bytes:", bytes).Msg("gateway get").AsError();
|
3149
2290
|
}
|
3150
2291
|
try {
|
3151
|
-
return [this.parseHeader(
|
2292
|
+
return [this.parseHeader(textDecoder.decode(bytes.Ok()))];
|
3152
2293
|
} catch (e) {
|
3153
2294
|
throw this.logger.Error().Err(e).Msg("parseHeader").AsError();
|
3154
2295
|
}
|
@@ -3156,11 +2297,11 @@ var MetaStore = class extends VersionedStore {
|
|
3156
2297
|
async save(meta, branch = "main") {
|
3157
2298
|
this.logger.Debug().Str("branch", branch).Any("meta", meta).Msg("saving meta");
|
3158
2299
|
const bytes = this.makeHeader(meta);
|
3159
|
-
const
|
3160
|
-
if (
|
3161
|
-
throw this.logger.Error().Err(
|
2300
|
+
const url2 = await this.gateway.buildUrl(this.url, branch);
|
2301
|
+
if (url2.isErr()) {
|
2302
|
+
throw this.logger.Error().Err(url2.Err()).Str("branch", branch).Url(this.url).Msg("got error from gateway.buildUrl").AsError();
|
3162
2303
|
}
|
3163
|
-
const res = await this.gateway.put(
|
2304
|
+
const res = await this.gateway.put(url2.Ok(), textEncoder.encode(bytes));
|
3164
2305
|
if (res.isErr()) {
|
3165
2306
|
throw this.logger.Error().Err(res.Err()).Msg("got error from gateway.put").AsError();
|
3166
2307
|
}
|
@@ -3169,19 +2310,19 @@ var MetaStore = class extends VersionedStore {
|
|
3169
2310
|
async close() {
|
3170
2311
|
await this.gateway.close(this.url);
|
3171
2312
|
this._onClosed.forEach((fn) => fn());
|
3172
|
-
return
|
2313
|
+
return import_cement5.Result.Ok(void 0);
|
3173
2314
|
}
|
3174
2315
|
async destroy() {
|
3175
2316
|
return this.gateway.destroy(this.url);
|
3176
2317
|
}
|
3177
2318
|
};
|
3178
2319
|
var DataStore = class extends VersionedStore {
|
3179
|
-
constructor(name,
|
2320
|
+
constructor(name, url2, logger, gateway) {
|
3180
2321
|
super(
|
3181
2322
|
name,
|
3182
|
-
|
2323
|
+
url2,
|
3183
2324
|
ensureLogger(logger, "DataStore", {
|
3184
|
-
url: () =>
|
2325
|
+
url: () => url2.toString()
|
3185
2326
|
})
|
3186
2327
|
);
|
3187
2328
|
this.tag = "car-base";
|
@@ -3191,13 +2332,13 @@ var DataStore = class extends VersionedStore {
|
|
3191
2332
|
this.logger.Debug().Msg("starting-gateway");
|
3192
2333
|
const res = await this.gateway.start(this.url);
|
3193
2334
|
if (res.isErr()) {
|
3194
|
-
this.logger.Error().
|
2335
|
+
this.logger.Error().Result("gw-start", res).Msg("started-gateway");
|
3195
2336
|
return res;
|
3196
2337
|
}
|
3197
2338
|
this._onStarted.forEach((fn) => fn());
|
3198
2339
|
const version = guardVersion(this.url);
|
3199
2340
|
if (version.isErr()) {
|
3200
|
-
this.logger.Error().
|
2341
|
+
this.logger.Error().Result("version", version).Msg("guardVersion");
|
3201
2342
|
await this.close();
|
3202
2343
|
return version;
|
3203
2344
|
}
|
@@ -3206,11 +2347,11 @@ var DataStore = class extends VersionedStore {
|
|
3206
2347
|
}
|
3207
2348
|
async load(cid) {
|
3208
2349
|
this.logger.Debug().Any("cid", cid).Msg("loading");
|
3209
|
-
const
|
3210
|
-
if (
|
3211
|
-
throw this.logger.Error().Err(
|
2350
|
+
const url2 = await this.gateway.buildUrl(this.url, cid.toString());
|
2351
|
+
if (url2.isErr()) {
|
2352
|
+
throw this.logger.Error().Err(url2.Err()).Str("cid", cid.toString()).Msg("got error from gateway.buildUrl").AsError();
|
3212
2353
|
}
|
3213
|
-
const res = await this.gateway.get(
|
2354
|
+
const res = await this.gateway.get(url2.Ok());
|
3214
2355
|
if (res.isErr()) {
|
3215
2356
|
throw res.Err();
|
3216
2357
|
}
|
@@ -3219,37 +2360,37 @@ var DataStore = class extends VersionedStore {
|
|
3219
2360
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
3220
2361
|
async save(car, opts) {
|
3221
2362
|
this.logger.Debug().Any("cid", car.cid.toString()).Msg("saving");
|
3222
|
-
const
|
3223
|
-
if (
|
3224
|
-
throw this.logger.Error().Err(
|
2363
|
+
const url2 = await this.gateway.buildUrl(this.url, car.cid.toString());
|
2364
|
+
if (url2.isErr()) {
|
2365
|
+
throw this.logger.Error().Err(url2.Err()).Ref("cid", car.cid).Msg("got error from gateway.buildUrl").AsError();
|
3225
2366
|
}
|
3226
|
-
const res = await this.gateway.put(
|
2367
|
+
const res = await this.gateway.put(url2.Ok(), car.bytes);
|
3227
2368
|
if (res.isErr()) {
|
3228
2369
|
throw this.logger.Error().Err(res.Err()).Msg("got error from gateway.put").AsError();
|
3229
2370
|
}
|
3230
2371
|
return res.Ok();
|
3231
2372
|
}
|
3232
2373
|
async remove(cid) {
|
3233
|
-
const
|
3234
|
-
if (
|
3235
|
-
return
|
2374
|
+
const url2 = await this.gateway.buildUrl(this.url, cid.toString());
|
2375
|
+
if (url2.isErr()) {
|
2376
|
+
return url2;
|
3236
2377
|
}
|
3237
|
-
return this.gateway.delete(
|
2378
|
+
return this.gateway.delete(url2.Ok());
|
3238
2379
|
}
|
3239
2380
|
async close() {
|
3240
2381
|
await this.gateway.close(this.url);
|
3241
2382
|
this._onClosed.forEach((fn) => fn());
|
3242
|
-
return
|
2383
|
+
return import_cement5.Result.Ok(void 0);
|
3243
2384
|
}
|
3244
2385
|
destroy() {
|
3245
2386
|
return this.gateway.destroy(this.url);
|
3246
2387
|
}
|
3247
2388
|
};
|
3248
2389
|
var RemoteWAL = class extends VersionedStore {
|
3249
|
-
constructor(loader,
|
3250
|
-
super(loader.name,
|
2390
|
+
constructor(loader, url2, logger, gateway) {
|
2391
|
+
super(loader.name, url2, ensureLogger(logger, "RemoteWAL"));
|
3251
2392
|
this.tag = "rwal-base";
|
3252
|
-
this._ready = new
|
2393
|
+
this._ready = new import_cement5.ResolveOnce();
|
3253
2394
|
this.walState = { operations: [], noLoaderOps: [], fileOperations: [] };
|
3254
2395
|
this.processing = void 0;
|
3255
2396
|
this.processQueue = new CommitQueue();
|
@@ -3400,7 +2541,7 @@ var RemoteWAL = class extends VersionedStore {
|
|
3400
2541
|
throw this.logger.Error().Err(bytes.Err()).Msg("error get").AsError();
|
3401
2542
|
}
|
3402
2543
|
try {
|
3403
|
-
return bytes && (0, import_dag_json.parse)(
|
2544
|
+
return bytes && (0, import_dag_json.parse)(textDecoder.decode(bytes.Ok()));
|
3404
2545
|
} catch (e) {
|
3405
2546
|
throw this.logger.Error().Err(e).Msg("error parse").AsError();
|
3406
2547
|
}
|
@@ -3416,7 +2557,7 @@ var RemoteWAL = class extends VersionedStore {
|
|
3416
2557
|
} catch (e) {
|
3417
2558
|
throw this.logger.Error().Err(e).Any("state", state).Msg("error format").AsError();
|
3418
2559
|
}
|
3419
|
-
const res = await this.gateway.put(filepath.Ok(),
|
2560
|
+
const res = await this.gateway.put(filepath.Ok(), textEncoder.encode(encoded));
|
3420
2561
|
if (res.isErr()) {
|
3421
2562
|
throw this.logger.Error().Err(res.Err()).Str("filePath", filepath.Ok().toString()).Msg("error saving").AsError();
|
3422
2563
|
}
|
@@ -3424,7 +2565,7 @@ var RemoteWAL = class extends VersionedStore {
|
|
3424
2565
|
async close() {
|
3425
2566
|
await this.gateway.close(this.url);
|
3426
2567
|
this._onClosed.forEach((fn) => fn());
|
3427
|
-
return
|
2568
|
+
return import_cement5.Result.Ok(void 0);
|
3428
2569
|
}
|
3429
2570
|
destroy() {
|
3430
2571
|
return this.gateway.destroy(this.url);
|
@@ -3433,29 +2574,29 @@ var RemoteWAL = class extends VersionedStore {
|
|
3433
2574
|
|
3434
2575
|
// src/blockstore/store-factory.ts
|
3435
2576
|
init_utils();
|
3436
|
-
function ensureIsIndex(
|
2577
|
+
function ensureIsIndex(url2, isIndex) {
|
3437
2578
|
if (isIndex) {
|
3438
|
-
|
3439
|
-
return
|
2579
|
+
url2.searchParams.set("index", isIndex);
|
2580
|
+
return url2;
|
3440
2581
|
} else {
|
3441
|
-
|
3442
|
-
return
|
2582
|
+
url2.searchParams.delete("index");
|
2583
|
+
return url2;
|
3443
2584
|
}
|
3444
2585
|
}
|
3445
2586
|
function toURL(pathOrUrl, isIndex) {
|
3446
2587
|
if (pathOrUrl instanceof URL) return ensureIsIndex(pathOrUrl, isIndex);
|
3447
2588
|
try {
|
3448
|
-
const
|
3449
|
-
return ensureIsIndex(
|
2589
|
+
const url2 = new URL(pathOrUrl);
|
2590
|
+
return ensureIsIndex(url2, isIndex);
|
3450
2591
|
} catch (e) {
|
3451
|
-
const
|
3452
|
-
return ensureIsIndex(
|
2592
|
+
const url2 = new URL(`file://${pathOrUrl}`);
|
2593
|
+
return ensureIsIndex(url2, isIndex);
|
3453
2594
|
}
|
3454
2595
|
}
|
3455
2596
|
var storeFactory = /* @__PURE__ */ new Map();
|
3456
|
-
function ensureName(name,
|
3457
|
-
if (!
|
3458
|
-
|
2597
|
+
function ensureName(name, url2) {
|
2598
|
+
if (!url2.searchParams.has("name")) {
|
2599
|
+
url2.searchParams.set("name", name);
|
3459
2600
|
}
|
3460
2601
|
}
|
3461
2602
|
function buildURL(optURL, loader) {
|
@@ -3468,95 +2609,113 @@ function buildURL(optURL, loader) {
|
|
3468
2609
|
return toURL(optURL || obuUrl || dataDir(loader.name, storeOpts.stores?.base), storeOpts.isIndex);
|
3469
2610
|
}
|
3470
2611
|
function registerStoreProtocol(item) {
|
3471
|
-
|
3472
|
-
|
2612
|
+
let protocol = item.protocol;
|
2613
|
+
if (!protocol.endsWith(":")) {
|
2614
|
+
protocol += ":";
|
2615
|
+
}
|
2616
|
+
if (storeFactory.has(protocol)) {
|
2617
|
+
if (!item.overrideBaseURL && storeFactory.get(protocol) !== item) {
|
2618
|
+
const logger = ensureLogger({}, "registerStoreProtocol", { protocol });
|
2619
|
+
logger.Warn().Msg(`protocol ${protocol} already registered`);
|
2620
|
+
return () => {
|
2621
|
+
};
|
2622
|
+
}
|
3473
2623
|
}
|
3474
2624
|
if (item.overrideBaseURL) {
|
3475
2625
|
Array.from(storeFactory.values()).forEach((items) => {
|
3476
2626
|
items.overrideBaseURL = void 0;
|
3477
2627
|
});
|
3478
2628
|
}
|
3479
|
-
storeFactory.set(
|
2629
|
+
storeFactory.set(protocol, item);
|
3480
2630
|
return () => {
|
3481
|
-
storeFactory.delete(
|
2631
|
+
storeFactory.delete(protocol);
|
3482
2632
|
};
|
3483
2633
|
}
|
3484
|
-
function runStoreFactory(
|
3485
|
-
const item = storeFactory.get(
|
2634
|
+
function runStoreFactory(url2, logger, run) {
|
2635
|
+
const item = storeFactory.get(url2.protocol);
|
3486
2636
|
if (!item) {
|
3487
|
-
throw logger.Error().Url(
|
2637
|
+
throw logger.Error().Url(url2).Str("protocol", url2.protocol).Any("keys", Array(storeFactory.keys())).Msg(`unsupported protocol`).AsError();
|
3488
2638
|
}
|
3489
|
-
logger.Debug().Str("protocol",
|
2639
|
+
logger.Debug().Str("protocol", url2.protocol).Msg("run");
|
3490
2640
|
return run(item);
|
3491
2641
|
}
|
3492
|
-
var onceLoadDataGateway = new
|
3493
|
-
function loadDataGateway(
|
3494
|
-
return onceLoadDataGateway.get(
|
3495
|
-
return runStoreFactory(
|
2642
|
+
var onceLoadDataGateway = new import_cement8.KeyedResolvOnce();
|
2643
|
+
function loadDataGateway(url2, logger) {
|
2644
|
+
return onceLoadDataGateway.get(url2.protocol).once(async () => {
|
2645
|
+
return runStoreFactory(url2, logger, async (item) => item.data(logger));
|
3496
2646
|
});
|
3497
2647
|
}
|
3498
|
-
var onceDataStoreFactory = new
|
2648
|
+
var onceDataStoreFactory = new import_cement8.KeyedResolvOnce();
|
3499
2649
|
async function dataStoreFactory(loader) {
|
3500
|
-
const
|
3501
|
-
ensureName(loader.name,
|
3502
|
-
const logger = ensureLogger(loader.logger, "dataStoreFactory", { url:
|
3503
|
-
|
3504
|
-
return onceDataStoreFactory.get(
|
3505
|
-
const gateway = await loadDataGateway(
|
3506
|
-
const store = new DataStore(loader.name,
|
3507
|
-
await store.start();
|
2650
|
+
const url2 = buildURL(loader.ebOpts.store.stores?.data, loader);
|
2651
|
+
ensureName(loader.name, url2);
|
2652
|
+
const logger = ensureLogger(loader.logger, "dataStoreFactory", { url: url2.toString() });
|
2653
|
+
url2.searchParams.set("store", "data");
|
2654
|
+
return onceDataStoreFactory.get(url2.toString()).once(async () => {
|
2655
|
+
const gateway = await loadDataGateway(url2, logger);
|
2656
|
+
const store = new DataStore(loader.name, url2, loader.logger, gateway);
|
2657
|
+
const ret = await store.start();
|
2658
|
+
if (ret.isErr()) {
|
2659
|
+
throw logger.Error().Result("start", ret).Msg("start failed").AsError();
|
2660
|
+
}
|
3508
2661
|
logger.Debug().Str("prepared", store.url.toString()).Msg("produced");
|
3509
2662
|
return store;
|
3510
2663
|
});
|
3511
2664
|
}
|
3512
|
-
var onceLoadMetaGateway = new
|
3513
|
-
function loadMetaGateway(
|
3514
|
-
return onceLoadMetaGateway.get(
|
3515
|
-
return runStoreFactory(
|
2665
|
+
var onceLoadMetaGateway = new import_cement8.KeyedResolvOnce();
|
2666
|
+
function loadMetaGateway(url2, logger) {
|
2667
|
+
return onceLoadMetaGateway.get(url2.protocol).once(async () => {
|
2668
|
+
return runStoreFactory(url2, logger, async (item) => item.meta(logger));
|
3516
2669
|
});
|
3517
2670
|
}
|
3518
|
-
var onceMetaStoreFactory = new
|
2671
|
+
var onceMetaStoreFactory = new import_cement8.KeyedResolvOnce();
|
3519
2672
|
async function metaStoreFactory(loader) {
|
3520
|
-
const
|
3521
|
-
ensureName(loader.name,
|
3522
|
-
const logger = ensureLogger(loader.logger, "metaStoreFactory", { url: () =>
|
3523
|
-
|
3524
|
-
return onceMetaStoreFactory.get(
|
3525
|
-
logger.Debug().Str("protocol",
|
3526
|
-
const gateway = await loadMetaGateway(
|
3527
|
-
const store = new MetaStore(loader.name,
|
3528
|
-
await store.start();
|
2673
|
+
const url2 = buildURL(loader.ebOpts.store.stores?.meta, loader);
|
2674
|
+
ensureName(loader.name, url2);
|
2675
|
+
const logger = ensureLogger(loader.logger, "metaStoreFactory", { url: () => url2.toString() });
|
2676
|
+
url2.searchParams.set("store", "meta");
|
2677
|
+
return onceMetaStoreFactory.get(url2.toString()).once(async () => {
|
2678
|
+
logger.Debug().Str("protocol", url2.protocol).Msg("pre-protocol switch");
|
2679
|
+
const gateway = await loadMetaGateway(url2, logger);
|
2680
|
+
const store = new MetaStore(loader.name, url2, loader.logger, gateway);
|
2681
|
+
const ret = await store.start();
|
2682
|
+
if (ret.isErr()) {
|
2683
|
+
throw logger.Error().Result("start", ret).Msg("start failed").AsError();
|
2684
|
+
}
|
3529
2685
|
return store;
|
3530
2686
|
});
|
3531
2687
|
}
|
3532
|
-
var onceWalGateway = new
|
3533
|
-
function loadWalGateway(
|
3534
|
-
return onceWalGateway.get(
|
3535
|
-
return runStoreFactory(
|
2688
|
+
var onceWalGateway = new import_cement8.KeyedResolvOnce();
|
2689
|
+
function loadWalGateway(url2, logger) {
|
2690
|
+
return onceWalGateway.get(url2.protocol).once(async () => {
|
2691
|
+
return runStoreFactory(url2, logger, async (item) => item.wal(logger));
|
3536
2692
|
});
|
3537
2693
|
}
|
3538
|
-
var onceRemoteWalFactory = new
|
2694
|
+
var onceRemoteWalFactory = new import_cement8.KeyedResolvOnce();
|
3539
2695
|
async function remoteWalFactory(loader) {
|
3540
|
-
const
|
3541
|
-
ensureName(loader.name,
|
3542
|
-
const logger = ensureLogger(loader.logger, "remoteWalFactory", { url:
|
3543
|
-
|
3544
|
-
return onceRemoteWalFactory.get(
|
3545
|
-
const gateway = await loadWalGateway(
|
3546
|
-
logger.Debug().Str("prepared",
|
3547
|
-
const store = new RemoteWAL(loader,
|
3548
|
-
await store.start();
|
2696
|
+
const url2 = buildURL(loader.ebOpts.store.stores?.meta, loader);
|
2697
|
+
ensureName(loader.name, url2);
|
2698
|
+
const logger = ensureLogger(loader.logger, "remoteWalFactory", { url: url2.toString() });
|
2699
|
+
url2.searchParams.set("store", "wal");
|
2700
|
+
return onceRemoteWalFactory.get(url2.toString()).once(async () => {
|
2701
|
+
const gateway = await loadWalGateway(url2, logger);
|
2702
|
+
logger.Debug().Str("prepared", url2.toString()).Msg("produced");
|
2703
|
+
const store = new RemoteWAL(loader, url2, loader.logger, gateway);
|
2704
|
+
const ret = await store.start();
|
2705
|
+
if (ret.isErr()) {
|
2706
|
+
throw logger.Error().Result("start", ret).Msg("start failed").AsError();
|
2707
|
+
}
|
3549
2708
|
return store;
|
3550
2709
|
});
|
3551
2710
|
}
|
3552
|
-
async function testStoreFactory(
|
2711
|
+
async function testStoreFactory(url2, ilogger) {
|
3553
2712
|
const logger = ensureLogger(
|
3554
2713
|
{
|
3555
2714
|
logger: ilogger
|
3556
2715
|
},
|
3557
2716
|
"testStoreFactory"
|
3558
2717
|
);
|
3559
|
-
return runStoreFactory(
|
2718
|
+
return runStoreFactory(url2, logger, async (item) => item.test(logger));
|
3560
2719
|
}
|
3561
2720
|
function toStoreRuntime(opts, ilogger) {
|
3562
2721
|
const logger = ensureLogger(ilogger, "toStoreRuntime", {});
|
@@ -3615,25 +2774,6 @@ registerStoreProtocol({
|
|
3615
2774
|
return new IndexDBTestStore2(logger);
|
3616
2775
|
}
|
3617
2776
|
});
|
3618
|
-
registerStoreProtocol({
|
3619
|
-
protocol: "sqlite:",
|
3620
|
-
data: async (logger) => {
|
3621
|
-
const { SQLDataGateway: SQLDataGateway2 } = await Promise.resolve().then(() => (init_store_sql2(), store_sql_exports2));
|
3622
|
-
return new SQLDataGateway2(logger);
|
3623
|
-
},
|
3624
|
-
meta: async (logger) => {
|
3625
|
-
const { SQLMetaGateway: SQLMetaGateway2 } = await Promise.resolve().then(() => (init_store_sql2(), store_sql_exports2));
|
3626
|
-
return new SQLMetaGateway2(logger);
|
3627
|
-
},
|
3628
|
-
wal: async (logger) => {
|
3629
|
-
const { SQLWalGateway: SQLWalGateway2 } = await Promise.resolve().then(() => (init_store_sql2(), store_sql_exports2));
|
3630
|
-
return new SQLWalGateway2(logger);
|
3631
|
-
},
|
3632
|
-
test: async (logger) => {
|
3633
|
-
const { SQLTestStore: SQLTestStore2 } = await Promise.resolve().then(() => (init_store_sql2(), store_sql_exports2));
|
3634
|
-
return new SQLTestStore2(logger);
|
3635
|
-
}
|
3636
|
-
});
|
3637
2777
|
|
3638
2778
|
// src/blockstore/index.ts
|
3639
2779
|
init_gateway();
|
@@ -3901,7 +3041,7 @@ var import_sha24 = require("multiformats/hashes/sha2");
|
|
3901
3041
|
var codec3 = __toESM(require("@ipld/dag-cbor"), 1);
|
3902
3042
|
var import_charwise = __toESM(require("charwise"), 1);
|
3903
3043
|
var DbIndex = __toESM(require("prolly-trees/db-index"), 1);
|
3904
|
-
var
|
3044
|
+
var import_utils12 = require("prolly-trees/utils");
|
3905
3045
|
var import_cache2 = require("prolly-trees/cache");
|
3906
3046
|
var IndexTree = class {
|
3907
3047
|
};
|
@@ -3909,17 +3049,17 @@ function refCompare(aRef, bRef) {
|
|
3909
3049
|
if (Number.isNaN(aRef)) return -1;
|
3910
3050
|
if (Number.isNaN(bRef)) throw new Error("ref may not be Infinity or NaN");
|
3911
3051
|
if (aRef === Infinity) return 1;
|
3912
|
-
return (0,
|
3052
|
+
return (0, import_utils12.simpleCompare)(aRef, bRef);
|
3913
3053
|
}
|
3914
3054
|
function compare(a, b) {
|
3915
3055
|
const [aKey, aRef] = a;
|
3916
3056
|
const [bKey, bRef] = b;
|
3917
|
-
const comp = (0,
|
3057
|
+
const comp = (0, import_utils12.simpleCompare)(aKey, bKey);
|
3918
3058
|
if (comp !== 0) return comp;
|
3919
3059
|
return refCompare(aRef, bRef);
|
3920
3060
|
}
|
3921
|
-
var byKeyOpts = { cache: import_cache2.nocache, chunker: (0,
|
3922
|
-
var byIdOpts = { cache: import_cache2.nocache, chunker: (0,
|
3061
|
+
var byKeyOpts = { cache: import_cache2.nocache, chunker: (0, import_utils12.bf)(30), codec: codec3, hasher: import_sha24.sha256, compare };
|
3062
|
+
var byIdOpts = { cache: import_cache2.nocache, chunker: (0, import_utils12.bf)(30), codec: codec3, hasher: import_sha24.sha256, compare: import_utils12.simpleCompare };
|
3923
3063
|
function indexEntriesForChanges(changes, mapFn) {
|
3924
3064
|
const indexEntries = [];
|
3925
3065
|
changes.forEach(({ id: key, value, del }) => {
|
@@ -4227,7 +3367,7 @@ var Index = class {
|
|
4227
3367
|
// src/crdt-clock.ts
|
4228
3368
|
var import_clock3 = require("@web3-storage/pail/clock");
|
4229
3369
|
var import_crdt2 = require("@web3-storage/pail/crdt");
|
4230
|
-
var
|
3370
|
+
var import_cement9 = require("@adviser/cement");
|
4231
3371
|
init_types();
|
4232
3372
|
|
4233
3373
|
// src/apply-head-queue.ts
|
@@ -4286,7 +3426,7 @@ var CRDTClock = class {
|
|
4286
3426
|
this.zoomers = /* @__PURE__ */ new Set();
|
4287
3427
|
this.watchers = /* @__PURE__ */ new Set();
|
4288
3428
|
this.emptyWatchers = /* @__PURE__ */ new Set();
|
4289
|
-
this._ready = new
|
3429
|
+
this._ready = new import_cement9.ResolveOnce();
|
4290
3430
|
this.blockstore = blockstore;
|
4291
3431
|
this.logger = ensureLogger(blockstore.logger, "CRDTClock");
|
4292
3432
|
this.applyHeadQueue = applyHeadQueue(this.int_applyHead.bind(this), this.logger);
|
@@ -4397,7 +3537,7 @@ async function advanceBlocks(logger, newHead, tblocks, head) {
|
|
4397
3537
|
init_utils();
|
4398
3538
|
var CRDT = class {
|
4399
3539
|
constructor(name, opts = {}) {
|
4400
|
-
this.onceReady = new
|
3540
|
+
this.onceReady = new import_cement10.ResolveOnce();
|
4401
3541
|
this.indexers = /* @__PURE__ */ new Map();
|
4402
3542
|
this.name = name;
|
4403
3543
|
this.logger = ensureLogger(opts, "CRDT");
|
@@ -4518,7 +3658,7 @@ var Database = class {
|
|
4518
3658
|
this._listening = false;
|
4519
3659
|
this._listeners = /* @__PURE__ */ new Set();
|
4520
3660
|
this._noupdate_listeners = /* @__PURE__ */ new Set();
|
4521
|
-
this._ready = new
|
3661
|
+
this._ready = new import_cement11.ResolveOnce();
|
4522
3662
|
this.name = name;
|
4523
3663
|
this.opts = opts || this.opts;
|
4524
3664
|
this.logger = ensureLogger(this.opts, "Database");
|
@@ -4552,9 +3692,8 @@ var Database = class {
|
|
4552
3692
|
});
|
4553
3693
|
}
|
4554
3694
|
async get(id) {
|
4555
|
-
this.logger.Debug().Str("id", id).Msg("get-pre-ready");
|
4556
3695
|
await this.ready();
|
4557
|
-
this.logger.Debug().Str("id", id).Msg("get
|
3696
|
+
this.logger.Debug().Str("id", id).Msg("get");
|
4558
3697
|
const got = await this._crdt.get(id).catch((e) => {
|
4559
3698
|
throw new NotFoundError(`Not found: ${id} - ${e.message}`);
|
4560
3699
|
});
|
@@ -4563,9 +3702,8 @@ var Database = class {
|
|
4563
3702
|
return { ...doc, _id: id };
|
4564
3703
|
}
|
4565
3704
|
async put(doc) {
|
4566
|
-
this.logger.Debug().Str("id", doc._id).Msg("put-pre-ready");
|
4567
3705
|
await this.ready();
|
4568
|
-
this.logger.Debug().Str("id", doc._id).Msg("put
|
3706
|
+
this.logger.Debug().Str("id", doc._id).Msg("put");
|
4569
3707
|
const { _id, ...value } = doc;
|
4570
3708
|
const docId = _id || (0, import_uuidv73.uuidv7)();
|
4571
3709
|
const result = await this._writeQueue.push({
|
@@ -4575,36 +3713,40 @@ var Database = class {
|
|
4575
3713
|
_id: docId
|
4576
3714
|
}
|
4577
3715
|
});
|
4578
|
-
return { id: docId, clock: result?.head };
|
3716
|
+
return { id: docId, clock: result?.head, name: this.name };
|
4579
3717
|
}
|
4580
3718
|
async del(id) {
|
4581
3719
|
await this.ready();
|
3720
|
+
this.logger.Debug().Str("id", id).Msg("del");
|
4582
3721
|
const result = await this._writeQueue.push({ id, del: true });
|
4583
|
-
return { id, clock: result?.head };
|
3722
|
+
return { id, clock: result?.head, name: this.name };
|
4584
3723
|
}
|
4585
3724
|
async changes(since = [], opts = {}) {
|
4586
3725
|
await this.ready();
|
3726
|
+
this.logger.Debug().Any("since", since).Any("opts", opts).Msg("changes");
|
4587
3727
|
const { result, head } = await this._crdt.changes(since, opts);
|
4588
3728
|
const rows = result.map(({ id: key, value, del, clock }) => ({
|
4589
3729
|
key,
|
4590
3730
|
value: del ? { _id: key, _deleted: true } : { _id: key, ...value },
|
4591
3731
|
clock
|
4592
3732
|
}));
|
4593
|
-
return { rows, clock: head };
|
3733
|
+
return { rows, clock: head, name: this.name };
|
4594
3734
|
}
|
4595
3735
|
async allDocs(opts = {}) {
|
4596
3736
|
await this.ready();
|
3737
|
+
this.logger.Debug().Msg("allDocs");
|
4597
3738
|
const { result, head } = await this._crdt.allDocs();
|
4598
3739
|
const rows = result.map(({ id: key, value, del }) => ({
|
4599
3740
|
key,
|
4600
3741
|
value: del ? { _id: key, _deleted: true } : { _id: key, ...value }
|
4601
3742
|
}));
|
4602
|
-
return { rows, clock: head };
|
3743
|
+
return { rows, clock: head, name: this.name };
|
4603
3744
|
}
|
4604
3745
|
async allDocuments() {
|
4605
3746
|
return this.allDocs();
|
4606
3747
|
}
|
4607
3748
|
subscribe(listener, updates) {
|
3749
|
+
this.logger.Debug().Bool("updates", updates).Msg("subscribe");
|
4608
3750
|
if (updates) {
|
4609
3751
|
if (!this._listening) {
|
4610
3752
|
this._listening = true;
|
@@ -4626,6 +3768,7 @@ var Database = class {
|
|
4626
3768
|
// todo if we add this onto dbs in fireproof.ts then we can make index.ts a separate package
|
4627
3769
|
async query(field, opts = {}) {
|
4628
3770
|
await this.ready();
|
3771
|
+
this.logger.Debug().Any("field", field).Any("opts", opts).Msg("query");
|
4629
3772
|
const _crdt = this._crdt;
|
4630
3773
|
const idx = typeof field === "string" ? index({ _crdt }, field) : index({ _crdt }, makeName(field.toString()), field);
|
4631
3774
|
return await idx.query(opts);
|
@@ -4701,6 +3844,6 @@ init_utils();
|
|
4701
3844
|
|
4702
3845
|
// src/version.ts
|
4703
3846
|
var PACKAGE_VERSION = Object.keys({
|
4704
|
-
"0.
|
3847
|
+
"0.19.8-dev-cra": "xxxx"
|
4705
3848
|
})[0];
|
4706
3849
|
//# sourceMappingURL=index.cjs.map
|