@fireproof/core 0.19.8-dev-alldocs → 0.19.8-dev-cra
Sign up to get free protection for your applications and to get access to all the features.
- 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
|