@fireproof/core 0.19.121-dev → 0.20.0-dev-preview-05
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -12
- package/deno/index.d.ts +7 -0
- package/deno/index.js +66 -0
- package/deno/index.js.map +1 -0
- package/deno/metafile-esm.json +1 -0
- package/deno.json +3 -4
- package/index.cjs +1797 -1431
- package/index.cjs.map +1 -1
- package/index.d.cts +760 -381
- package/index.d.ts +760 -381
- package/index.js +1976 -913
- package/index.js.map +1 -1
- package/metafile-cjs.json +1 -1
- package/metafile-esm.json +1 -1
- package/node/{node-filesystem.cjs → index.cjs} +17 -6
- package/node/index.cjs.map +1 -0
- package/node/index.d.cts +7 -0
- package/node/index.d.ts +7 -0
- package/node/{node-filesystem.js → index.js} +25 -5
- package/node/index.js.map +1 -0
- package/node/metafile-cjs.json +1 -1
- package/node/metafile-esm.json +1 -1
- package/package.json +27 -17
- package/react/index.cjs +22 -22
- package/react/index.cjs.map +1 -1
- package/react/index.d.cts +7 -7
- package/react/index.d.ts +7 -7
- package/react/index.js +22 -22
- package/react/index.js.map +1 -1
- package/react/metafile-cjs.json +1 -1
- package/react/metafile-esm.json +1 -1
- package/tests/blockstore/fp-envelope.test.ts-off +65 -0
- package/tests/blockstore/interceptor-gateway.test.ts +122 -0
- package/tests/blockstore/keyed-crypto-indexdb-file.test.ts +130 -0
- package/tests/blockstore/keyed-crypto.test.ts +75 -118
- package/tests/blockstore/loader.test.ts +18 -9
- package/tests/blockstore/store.test.ts +40 -31
- package/tests/blockstore/transaction.test.ts +14 -13
- package/tests/fireproof/all-gateway.test.ts +286 -216
- package/tests/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.ts +324 -316
- package/tests/fireproof/crdt.test.ts +78 -19
- package/tests/fireproof/fireproof.test.ts +111 -92
- package/tests/fireproof/hello.test.ts +21 -17
- package/tests/fireproof/indexer.test.ts +74 -50
- package/tests/fireproof/{database.test.ts → ledger.test.ts} +241 -45
- package/tests/fireproof/multiple-ledger.test.ts +2 -2
- package/tests/fireproof/utils.test.ts +47 -6
- package/tests/gateway/file/loader-config.test.ts +307 -0
- package/tests/gateway/fp-envelope-serialize.test.ts +256 -0
- package/tests/gateway/indexdb/loader-config.test.ts +79 -0
- package/tests/helpers.ts +44 -17
- package/tests/react/useFireproof.test.tsx +2 -2
- package/tests/www/gallery.html +2 -2
- package/tests/www/todo-aws.html +1 -1
- package/tests/www/todo-ipfs.html +1 -1
- package/tests/www/todo-local.html +1 -1
- package/tests/www/todo.html +25 -4
- package/web/index.cjs +218 -0
- package/web/index.cjs.map +1 -0
- package/web/index.d.cts +30 -0
- package/web/index.d.ts +30 -0
- package/web/index.js +195 -0
- package/web/index.js.map +1 -0
- package/web/metafile-cjs.json +1 -1
- package/web/metafile-esm.json +1 -1
- package/chunk-7EWIAXTM.js +0 -7
- package/chunk-7EWIAXTM.js.map +0 -1
- package/chunk-F4FC6B2T.js +0 -63
- package/chunk-F4FC6B2T.js.map +0 -1
- package/chunk-PZ5AY32C.js +0 -10
- package/chunk-PZ5AY32C.js.map +0 -1
- package/chunk-RXC4JGJT.js +0 -301
- package/chunk-RXC4JGJT.js.map +0 -1
- package/gateway-C62S56GY.js +0 -66
- package/gateway-C62S56GY.js.map +0 -1
- package/gateway-VVS4QWDA.js +0 -145
- package/gateway-VVS4QWDA.js.map +0 -1
- package/key-bag-file-PWZ3QE7B.js +0 -55
- package/key-bag-file-PWZ3QE7B.js.map +0 -1
- package/key-bag-indexdb-SYG3YD4D.js +0 -51
- package/key-bag-indexdb-SYG3YD4D.js.map +0 -1
- package/node/chunk-4A4RAVNS.js +0 -17
- package/node/chunk-4A4RAVNS.js.map +0 -1
- package/node/mem-filesystem.cjs +0 -72
- package/node/mem-filesystem.cjs.map +0 -1
- package/node/mem-filesystem.d.cts +0 -25
- package/node/mem-filesystem.d.ts +0 -25
- package/node/mem-filesystem.js +0 -40
- package/node/mem-filesystem.js.map +0 -1
- package/node/node-filesystem.cjs.map +0 -1
- package/node/node-filesystem.d.cts +0 -35
- package/node/node-filesystem.d.ts +0 -35
- package/node/node-filesystem.js.map +0 -1
- package/tests/fireproof/config.test.ts +0 -172
- package/utils-ZVVGAXFE.js +0 -13
- package/utils-ZVVGAXFE.js.map +0 -1
- package/web/gateway-impl.cjs +0 -183
- package/web/gateway-impl.cjs.map +0 -1
- package/web/gateway-impl.d.cts +0 -31
- package/web/gateway-impl.d.ts +0 -31
- package/web/gateway-impl.js +0 -162
- package/web/gateway-impl.js.map +0 -1
- /package/tests/blockstore/{fragment-gateway.test.ts → fragment-gateway.test.ts-off} +0 -0
@@ -1,16 +1,31 @@
|
|
1
|
-
import {
|
2
|
-
import {
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
import { URI } from "@adviser/cement";
|
2
|
+
import { buildBlobFiles, FileWithCid, mockSuperThis } from "../helpers.js";
|
3
|
+
import {
|
4
|
+
bs,
|
5
|
+
Ledger,
|
6
|
+
DocResponse,
|
7
|
+
DocFileMeta,
|
8
|
+
DocWithId,
|
9
|
+
DocFiles,
|
10
|
+
toStoreURIRuntime,
|
11
|
+
keyConfigOpts,
|
12
|
+
LedgerFactory,
|
13
|
+
LedgerShell,
|
14
|
+
ensureSuperThis,
|
15
|
+
} from "@fireproof/core";
|
16
|
+
|
17
|
+
describe("basic Ledger", () => {
|
18
|
+
let db: Ledger;
|
19
|
+
const sthis = mockSuperThis();
|
7
20
|
afterEach(async () => {
|
8
21
|
await db.close();
|
9
22
|
await db.destroy();
|
10
23
|
});
|
11
24
|
beforeEach(async () => {
|
12
25
|
await sthis.start();
|
13
|
-
db =
|
26
|
+
db = LedgerFactory(undefined, {
|
27
|
+
logger: sthis.logger,
|
28
|
+
});
|
14
29
|
});
|
15
30
|
it("should put", async () => {
|
16
31
|
/** @type {Doc} */
|
@@ -34,11 +49,11 @@ describe("basic Database", () => {
|
|
34
49
|
});
|
35
50
|
});
|
36
51
|
|
37
|
-
describe("basic
|
52
|
+
describe("basic Ledger with record", function () {
|
38
53
|
interface Doc {
|
39
54
|
readonly value: string;
|
40
55
|
}
|
41
|
-
let db:
|
56
|
+
let db: LedgerShell;
|
42
57
|
const sthis = ensureSuperThis();
|
43
58
|
afterEach(async () => {
|
44
59
|
await db.close();
|
@@ -46,7 +61,7 @@ describe("basic Database with record", function () {
|
|
46
61
|
});
|
47
62
|
beforeEach(async function () {
|
48
63
|
await sthis.start();
|
49
|
-
db =
|
64
|
+
db = LedgerFactory("factory-name") as LedgerShell;
|
50
65
|
const ok = await db.put<Doc>({ _id: "hello", value: "world" });
|
51
66
|
expect(ok.id).toBe("hello");
|
52
67
|
});
|
@@ -78,21 +93,21 @@ describe("basic Database with record", function () {
|
|
78
93
|
expect(rows[0].value._id).toBe("hello");
|
79
94
|
});
|
80
95
|
it("is not persisted", async function () {
|
81
|
-
const db2 =
|
96
|
+
const db2 = LedgerFactory("factory-name") as LedgerShell;
|
82
97
|
const { rows } = await db2.changes([]);
|
83
|
-
expect(rows.length).toBe(
|
84
|
-
|
85
|
-
|
98
|
+
expect(rows.length).toBe(1);
|
99
|
+
expect(db2.ref).toBe(db.ref);
|
100
|
+
const doc = await db2.get<Doc>("hello").catch((e) => e);
|
101
|
+
expect(doc.value).toBe("world");
|
86
102
|
await db2.close();
|
87
|
-
await db2.destroy();
|
88
103
|
});
|
89
104
|
});
|
90
105
|
|
91
|
-
describe("named
|
106
|
+
describe("named Ledger with record", function () {
|
92
107
|
interface Doc {
|
93
108
|
readonly value: string;
|
94
109
|
}
|
95
|
-
let db:
|
110
|
+
let db: Ledger;
|
96
111
|
const sthis = ensureSuperThis();
|
97
112
|
afterEach(async () => {
|
98
113
|
await db.close();
|
@@ -100,7 +115,7 @@ describe("named Database with record", function () {
|
|
100
115
|
});
|
101
116
|
beforeEach(async function () {
|
102
117
|
await sthis.start();
|
103
|
-
db =
|
118
|
+
db = LedgerFactory("test-db-name");
|
104
119
|
/** @type {Doc} */
|
105
120
|
const doc = { _id: "hello", value: "world" };
|
106
121
|
const ok = await db.put(doc);
|
@@ -136,7 +151,7 @@ describe("named Database with record", function () {
|
|
136
151
|
it("should have a key", async function () {
|
137
152
|
const { rows } = await db.changes([]);
|
138
153
|
expect(rows.length).toBe(1);
|
139
|
-
const blocks = db.
|
154
|
+
const blocks = db.crdt.blockstore as bs.EncryptedBlockstore;
|
140
155
|
const loader = blocks.loader;
|
141
156
|
expect(loader).toBeTruthy();
|
142
157
|
await loader.ready();
|
@@ -202,13 +217,13 @@ describe("named Database with record", function () {
|
|
202
217
|
});
|
203
218
|
});
|
204
219
|
|
205
|
-
// describe('basic
|
206
|
-
// /** @type {
|
220
|
+
// describe('basic Ledger parallel writes / public', function () {
|
221
|
+
// /** @type {Ledger} */
|
207
222
|
// let db
|
208
223
|
// const writes = []
|
209
224
|
// beforeEach(async function () {
|
210
225
|
// await resetDirectory(dataDir, 'test-parallel-writes')
|
211
|
-
// db = new
|
226
|
+
// db = new Ledger('test-parallel-writes', { public: true })
|
212
227
|
// /** @type {Doc} */
|
213
228
|
// for (let i = 0; i < 10; i++) {
|
214
229
|
// const doc = { _id: `id-${i}`, hello: 'world' }
|
@@ -217,28 +232,64 @@ describe("named Database with record", function () {
|
|
217
232
|
// await Promise.all(writes)
|
218
233
|
// })
|
219
234
|
|
220
|
-
describe("basic
|
221
|
-
let db:
|
235
|
+
describe("basic Ledger parallel writes / public ordered", () => {
|
236
|
+
let db: Ledger;
|
237
|
+
const writes: Promise<DocResponse>[] = [];
|
238
|
+
const sthis = mockSuperThis();
|
239
|
+
afterEach(async () => {
|
240
|
+
await db.close();
|
241
|
+
await db.destroy();
|
242
|
+
});
|
243
|
+
beforeEach(async () => {
|
244
|
+
await sthis.start();
|
245
|
+
db = LedgerFactory("test-parallel-writes-ordered", { writeQueue: { chunkSize: 1 } });
|
246
|
+
for (let i = 0; i < 10; i++) {
|
247
|
+
const doc = { _id: `id-${i}`, hello: "world" };
|
248
|
+
writes.push(db.put(doc));
|
249
|
+
}
|
250
|
+
await Promise.all(writes);
|
251
|
+
});
|
252
|
+
|
253
|
+
it("should have one head", () => {
|
254
|
+
const crdt = db.crdt;
|
255
|
+
expect(crdt.clock.head.length).toBe(1);
|
256
|
+
});
|
257
|
+
|
258
|
+
it("has changes ordered", async function () {
|
259
|
+
const { rows, clock } = await db.changes([]);
|
260
|
+
expect(clock[0]).toBe(db.crdt.clock.head[0]);
|
261
|
+
expect(rows.length).toBe(10);
|
262
|
+
for (let i = 0; i < 10; i++) {
|
263
|
+
expect(rows[i].key).toBe("id-" + i);
|
264
|
+
expect(rows[i].clock).toBeTruthy();
|
265
|
+
}
|
266
|
+
});
|
267
|
+
});
|
268
|
+
|
269
|
+
describe("basic Ledger parallel writes / public", () => {
|
270
|
+
let db: Ledger;
|
222
271
|
const writes: Promise<DocResponse>[] = [];
|
223
272
|
const sthis = ensureSuperThis();
|
224
273
|
afterEach(async () => {
|
225
274
|
await db.close();
|
226
275
|
await db.destroy();
|
227
276
|
});
|
228
|
-
beforeEach(async
|
277
|
+
beforeEach(async () => {
|
229
278
|
await sthis.start();
|
230
|
-
db =
|
279
|
+
db = LedgerFactory("test-parallel-writes", { writeQueue: { chunkSize: 32 } });
|
231
280
|
for (let i = 0; i < 10; i++) {
|
232
281
|
const doc = { _id: `id-${i}`, hello: "world" };
|
233
282
|
writes.push(db.put(doc));
|
234
283
|
}
|
235
284
|
await Promise.all(writes);
|
236
285
|
});
|
237
|
-
it("should
|
238
|
-
const crdt = db.
|
286
|
+
it("should resolve to one head", async () => {
|
287
|
+
const crdt = db.crdt;
|
288
|
+
expect(crdt.clock.head.length).toBe(9);
|
289
|
+
await db.put({ _id: "id-10", hello: "world" });
|
239
290
|
expect(crdt.clock.head.length).toBe(1);
|
240
291
|
});
|
241
|
-
it("should write all", async
|
292
|
+
it("should write all", async () => {
|
242
293
|
for (let i = 0; i < 10; i++) {
|
243
294
|
const id = `id-${i}`;
|
244
295
|
const doc = await db.get<{ hello: string }>(id);
|
@@ -270,11 +321,12 @@ describe("basic Database parallel writes / public", function () {
|
|
270
321
|
expect(e.message).toMatch(/Not found/);
|
271
322
|
}
|
272
323
|
});
|
273
|
-
it("has changes", async function () {
|
324
|
+
it("has changes not ordered", async function () {
|
274
325
|
const { rows, clock } = await db.changes([]);
|
275
|
-
expect(clock[0]).toBe(db.
|
326
|
+
expect(clock[0]).toBe(db.crdt.clock.head[0]);
|
276
327
|
expect(rows.length).toBe(10);
|
277
|
-
|
328
|
+
rows.sort((a, b) => a.key.localeCompare(b.key));
|
329
|
+
// console.log(rows);
|
278
330
|
for (let i = 0; i < 10; i++) {
|
279
331
|
expect(rows[i].key).toBe("id-" + i);
|
280
332
|
expect(rows[i].clock).toBeTruthy();
|
@@ -283,9 +335,9 @@ describe("basic Database parallel writes / public", function () {
|
|
283
335
|
it("should not have a key", async function () {
|
284
336
|
const { rows } = await db.changes([]);
|
285
337
|
expect(rows.length).toBe(10);
|
286
|
-
expect(db.opts.public).toBeTruthy();
|
287
|
-
expect(db._crdt.opts.public).toBeTruthy();
|
288
|
-
const blocks = db.
|
338
|
+
// expect(db.opts.public).toBeTruthy();
|
339
|
+
// expect(db._crdt.opts.public).toBeTruthy();
|
340
|
+
const blocks = db.crdt.blockstore as bs.EncryptedBlockstore;
|
289
341
|
const loader = blocks.loader;
|
290
342
|
expect(loader).toBeTruthy();
|
291
343
|
await loader.ready();
|
@@ -294,8 +346,8 @@ describe("basic Database parallel writes / public", function () {
|
|
294
346
|
});
|
295
347
|
});
|
296
348
|
|
297
|
-
describe("basic
|
298
|
-
let db:
|
349
|
+
describe("basic Ledger with subscription", function () {
|
350
|
+
let db: Ledger;
|
299
351
|
let didRun: number;
|
300
352
|
let unsubscribe: () => void;
|
301
353
|
let lastDoc: DocWithId<NonNullable<unknown>>;
|
@@ -307,7 +359,7 @@ describe("basic Database with subscription", function () {
|
|
307
359
|
});
|
308
360
|
beforeEach(async function () {
|
309
361
|
await sthis.start();
|
310
|
-
db =
|
362
|
+
db = LedgerFactory("factory-name");
|
311
363
|
didRun = 0;
|
312
364
|
waitForSub = new Promise((resolve) => {
|
313
365
|
unsubscribe = db.subscribe((docs) => {
|
@@ -340,8 +392,8 @@ describe("basic Database with subscription", function () {
|
|
340
392
|
});
|
341
393
|
});
|
342
394
|
|
343
|
-
describe("basic
|
344
|
-
let db:
|
395
|
+
describe("basic Ledger with no update subscription", function () {
|
396
|
+
let db: Ledger;
|
345
397
|
let didRun: number;
|
346
398
|
let unsubscribe: () => void;
|
347
399
|
const sthis = ensureSuperThis();
|
@@ -351,9 +403,8 @@ describe("basic Database with no update subscription", function () {
|
|
351
403
|
});
|
352
404
|
beforeEach(async function () {
|
353
405
|
await sthis.start();
|
354
|
-
db =
|
406
|
+
db = LedgerFactory("factory-name");
|
355
407
|
didRun = 0;
|
356
|
-
|
357
408
|
unsubscribe = db.subscribe(() => {
|
358
409
|
didRun++;
|
359
410
|
});
|
@@ -377,8 +428,8 @@ describe("basic Database with no update subscription", function () {
|
|
377
428
|
});
|
378
429
|
});
|
379
430
|
|
380
|
-
describe("
|
381
|
-
let db:
|
431
|
+
describe("ledger with files input", () => {
|
432
|
+
let db: Ledger;
|
382
433
|
let imagefiles: FileWithCid[] = [];
|
383
434
|
let result: DocResponse;
|
384
435
|
const sthis = ensureSuperThis();
|
@@ -390,7 +441,7 @@ describe("database with files input", () => {
|
|
390
441
|
beforeEach(async function () {
|
391
442
|
await sthis.start();
|
392
443
|
imagefiles = await buildBlobFiles();
|
393
|
-
db =
|
444
|
+
db = LedgerFactory("fireproof-with-images");
|
394
445
|
const doc = {
|
395
446
|
_id: "images-main",
|
396
447
|
type: "files",
|
@@ -472,3 +523,148 @@ describe("database with files input", () => {
|
|
472
523
|
expect(file.size).toBe(imagefiles[0].file.size);
|
473
524
|
});
|
474
525
|
});
|
526
|
+
|
527
|
+
describe("StoreURIRuntime", () => {
|
528
|
+
const sthis = mockSuperThis();
|
529
|
+
let safeEnv: string | undefined;
|
530
|
+
let unreg: () => void;
|
531
|
+
beforeEach(async () => {
|
532
|
+
await sthis.start();
|
533
|
+
safeEnv = sthis.env.get("FP_STORAGE_URL");
|
534
|
+
sthis.env.set("FP_STORAGE_URL", "my://bla/storage");
|
535
|
+
unreg = bs.registerStoreProtocol({
|
536
|
+
protocol: "murks",
|
537
|
+
isDefault: true,
|
538
|
+
defaultURI: function (): URI {
|
539
|
+
return URI.from("murks://fp");
|
540
|
+
},
|
541
|
+
gateway: function (): Promise<bs.Gateway> {
|
542
|
+
throw new Error("Function not implemented.");
|
543
|
+
},
|
544
|
+
});
|
545
|
+
});
|
546
|
+
afterEach(() => {
|
547
|
+
sthis.env.set("FP_STORAGE_URL", safeEnv);
|
548
|
+
unreg();
|
549
|
+
});
|
550
|
+
it("default toStoreURIRuntime", () => {
|
551
|
+
expect(JSON.parse(JSON.stringify(toStoreURIRuntime(sthis, "test")))).toEqual({
|
552
|
+
data: {
|
553
|
+
data: "my://bla/storage?name=test&store=data&storekey=%40test-data%40&suffix=.car&urlGen=fromEnv",
|
554
|
+
file: "my://bla/storage?name=test&store=data&storekey=%40test-data%40&urlGen=fromEnv",
|
555
|
+
meta: "my://bla/storage?name=test&store=meta&storekey=%40test-meta%40&urlGen=fromEnv",
|
556
|
+
wal: "my://bla/storage?name=test&store=wal&storekey=%40test-wal%40&urlGen=fromEnv",
|
557
|
+
},
|
558
|
+
idx: {
|
559
|
+
data: "my://bla/storage?index=idx&name=test&store=data&storekey=%40test-data-idx%40&suffix=.car&urlGen=fromEnv",
|
560
|
+
file: "my://bla/storage?index=idx&name=test&store=data&storekey=%40test-data-idx%40&urlGen=fromEnv",
|
561
|
+
meta: "my://bla/storage?index=idx&name=test&store=meta&storekey=%40test-meta-idx%40&urlGen=fromEnv",
|
562
|
+
wal: "my://bla/storage?index=idx&name=test&store=wal&storekey=%40test-wal-idx%40&urlGen=fromEnv",
|
563
|
+
},
|
564
|
+
});
|
565
|
+
// keyConfigOpts(sthis: SuperThis, name: string, opts?: ConfigOpts): string {
|
566
|
+
});
|
567
|
+
it("no name toStoreURIRuntime", () => {
|
568
|
+
expect(JSON.parse(JSON.stringify(toStoreURIRuntime(sthis)))).toEqual({
|
569
|
+
data: {
|
570
|
+
data: "my://bla/storage?name=storage&store=data&storekey=%40storage-data%40&suffix=.car&urlGen=fromEnv",
|
571
|
+
file: "my://bla/storage?name=storage&store=data&storekey=%40storage-data%40&urlGen=fromEnv",
|
572
|
+
meta: "my://bla/storage?name=storage&store=meta&storekey=%40storage-meta%40&urlGen=fromEnv",
|
573
|
+
wal: "my://bla/storage?name=storage&store=wal&storekey=%40storage-wal%40&urlGen=fromEnv",
|
574
|
+
},
|
575
|
+
idx: {
|
576
|
+
data: "my://bla/storage?index=idx&name=storage&store=data&storekey=%40storage-data-idx%40&suffix=.car&urlGen=fromEnv",
|
577
|
+
file: "my://bla/storage?index=idx&name=storage&store=data&storekey=%40storage-data-idx%40&urlGen=fromEnv",
|
578
|
+
meta: "my://bla/storage?index=idx&name=storage&store=meta&storekey=%40storage-meta-idx%40&urlGen=fromEnv",
|
579
|
+
wal: "my://bla/storage?index=idx&name=storage&store=wal&storekey=%40storage-wal-idx%40&urlGen=fromEnv",
|
580
|
+
},
|
581
|
+
});
|
582
|
+
});
|
583
|
+
|
584
|
+
it("set toStoreURIRuntime", () => {
|
585
|
+
expect(
|
586
|
+
JSON.parse(
|
587
|
+
JSON.stringify(
|
588
|
+
toStoreURIRuntime(sthis, "xxx", {
|
589
|
+
base: "my://storage-base",
|
590
|
+
data: {
|
591
|
+
data: "my://storage-data?name=yyy",
|
592
|
+
meta: "my://storage-meta",
|
593
|
+
},
|
594
|
+
idx: {
|
595
|
+
data: "my://storage-idx-data?name=yyy&index=bla",
|
596
|
+
meta: "my://storage-idx-meta",
|
597
|
+
},
|
598
|
+
}),
|
599
|
+
),
|
600
|
+
),
|
601
|
+
).toEqual({
|
602
|
+
data: {
|
603
|
+
data: "my://storage-data?name=yyy&store=data&storekey=%40yyy-data%40&suffix=.car",
|
604
|
+
file: "my://storage-data?name=yyy&store=data&storekey=%40yyy-data%40",
|
605
|
+
meta: "my://storage-meta?name=storage-meta&store=meta&storekey=%40storage-meta-meta%40",
|
606
|
+
wal: "my://storage-base?name=xxx&store=wal&storekey=%40xxx-wal%40",
|
607
|
+
},
|
608
|
+
idx: {
|
609
|
+
data: "my://storage-idx-data?index=bla&name=yyy&store=data&storekey=%40yyy-data-idx%40&suffix=.car",
|
610
|
+
file: "my://storage-idx-data?index=bla&name=yyy&store=data&storekey=%40yyy-data-idx%40",
|
611
|
+
meta: "my://storage-idx-meta?index=idx&name=storage-idx-meta&store=meta&storekey=%40storage-idx-meta-meta-idx%40",
|
612
|
+
wal: "my://storage-base?index=idx&name=xxx&store=wal&storekey=%40xxx-wal-idx%40",
|
613
|
+
},
|
614
|
+
});
|
615
|
+
});
|
616
|
+
|
617
|
+
it("default-reg toStoreURIRuntime", () => {
|
618
|
+
sthis.env.delete("FP_STORAGE_URL");
|
619
|
+
expect(JSON.parse(JSON.stringify(toStoreURIRuntime(sthis, "maxi")))).toEqual({
|
620
|
+
data: {
|
621
|
+
data: "murks://fp?name=maxi&store=data&storekey=%40maxi-data%40&suffix=.car&urlGen=default",
|
622
|
+
file: "murks://fp?name=maxi&store=data&storekey=%40maxi-data%40&urlGen=default",
|
623
|
+
meta: "murks://fp?name=maxi&store=meta&storekey=%40maxi-meta%40&urlGen=default",
|
624
|
+
wal: "murks://fp?name=maxi&store=wal&storekey=%40maxi-wal%40&urlGen=default",
|
625
|
+
},
|
626
|
+
idx: {
|
627
|
+
data: "murks://fp?index=idx&name=maxi&store=data&storekey=%40maxi-data-idx%40&suffix=.car&urlGen=default",
|
628
|
+
file: "murks://fp?index=idx&name=maxi&store=data&storekey=%40maxi-data-idx%40&urlGen=default",
|
629
|
+
meta: "murks://fp?index=idx&name=maxi&store=meta&storekey=%40maxi-meta-idx%40&urlGen=default",
|
630
|
+
wal: "murks://fp?index=idx&name=maxi&store=wal&storekey=%40maxi-wal-idx%40&urlGen=default",
|
631
|
+
},
|
632
|
+
});
|
633
|
+
});
|
634
|
+
|
635
|
+
it("keyConfigOpts", () => {
|
636
|
+
expect(JSON.parse(keyConfigOpts(sthis, "test"))).toEqual([
|
637
|
+
{
|
638
|
+
name: "test",
|
639
|
+
},
|
640
|
+
{
|
641
|
+
stores: [
|
642
|
+
{
|
643
|
+
data: {
|
644
|
+
data: "my://bla/storage?name=test&store=data&storekey=%40test-data%40&suffix=.car&urlGen=fromEnv",
|
645
|
+
file: "my://bla/storage?name=test&store=data&storekey=%40test-data%40&urlGen=fromEnv",
|
646
|
+
meta: "my://bla/storage?name=test&store=meta&storekey=%40test-meta%40&urlGen=fromEnv",
|
647
|
+
wal: "my://bla/storage?name=test&store=wal&storekey=%40test-wal%40&urlGen=fromEnv",
|
648
|
+
},
|
649
|
+
},
|
650
|
+
{
|
651
|
+
idx: {
|
652
|
+
data: "my://bla/storage?index=idx&name=test&store=data&storekey=%40test-data-idx%40&suffix=.car&urlGen=fromEnv",
|
653
|
+
file: "my://bla/storage?index=idx&name=test&store=data&storekey=%40test-data-idx%40&urlGen=fromEnv",
|
654
|
+
meta: "my://bla/storage?index=idx&name=test&store=meta&storekey=%40test-meta-idx%40&urlGen=fromEnv",
|
655
|
+
wal: "my://bla/storage?index=idx&name=test&store=wal&storekey=%40test-wal-idx%40&urlGen=fromEnv",
|
656
|
+
},
|
657
|
+
},
|
658
|
+
],
|
659
|
+
},
|
660
|
+
]);
|
661
|
+
});
|
662
|
+
|
663
|
+
it("check file protocol defaultURI", () => {
|
664
|
+
const gw = bs.defaultGatewayFactoryItem();
|
665
|
+
expect(gw.defaultURI(sthis).toString()).toBe(
|
666
|
+
"murks://fp",
|
667
|
+
// `file://${sthis.env.get("HOME")}/.fireproof/${FILESTORE_VERSION.replace(/-.*$/, "")}`,
|
668
|
+
);
|
669
|
+
});
|
670
|
+
});
|
@@ -1,7 +1,5 @@
|
|
1
|
-
import { URI } from "@adviser/cement";
|
2
|
-
import { rt, getStore,
|
3
|
-
|
4
|
-
// only for test
|
1
|
+
import { runtimeFn, URI } from "@adviser/cement";
|
2
|
+
import { rt, getStore, inplaceFilter, ensureSuperThis, ensureSuperLog } from "@fireproof/core";
|
5
3
|
import { UUID } from "uuidv7";
|
6
4
|
|
7
5
|
describe("utils", () => {
|
@@ -33,14 +31,16 @@ describe("utils", () => {
|
|
33
31
|
];
|
34
32
|
it("getfilename plain", () => {
|
35
33
|
for (const store of storeOpts) {
|
36
|
-
const url = URI.from(`file://./x/path?store=${store.type}&name=name&key=key&version=version`);
|
34
|
+
const url = URI.from(`file://./x/path?store=${store.type}&name=name&key=key&version=version&suffix=${store.suffix}`);
|
37
35
|
expect(rt.getFileName(url, logger)).toEqual(`${store.type}/key${store.suffix}`);
|
38
36
|
}
|
39
37
|
});
|
40
38
|
|
41
39
|
it("getfilename index", () => {
|
42
40
|
for (const store of storeOpts) {
|
43
|
-
const url = URI.from(
|
41
|
+
const url = URI.from(
|
42
|
+
`file://./x/path?index=idx&store=${store.type}&name=name&key=key&version=version&suffix=${store.suffix}`,
|
43
|
+
);
|
44
44
|
expect(rt.getFileName(url, logger)).toEqual(`idx-${store.type}/key${store.suffix}`);
|
45
45
|
}
|
46
46
|
});
|
@@ -80,4 +80,45 @@ describe("utils", () => {
|
|
80
80
|
const id = sthis.timeOrderedNextId(0xcafebabebeef).str;
|
81
81
|
expect(id.slice(0, 15)).toBe("cafebabe-beef-7");
|
82
82
|
});
|
83
|
+
|
84
|
+
it("inplaceFilter empty", () => {
|
85
|
+
const s: string[] = [];
|
86
|
+
expect(inplaceFilter(s, () => false)).toEqual([]);
|
87
|
+
expect(inplaceFilter(s, () => true)).toEqual([]);
|
88
|
+
});
|
89
|
+
|
90
|
+
it("inplaceFilter sized filtered", () => {
|
91
|
+
const s = new Array(100).fill("a").map((a, i) => `${a}${i.toString()}`);
|
92
|
+
expect(inplaceFilter(s, () => false)).toEqual([]);
|
93
|
+
});
|
94
|
+
it("inplaceFilter sized unfiltered", () => {
|
95
|
+
const s = new Array(100).fill("a").map((a, i) => `${a}${i.toString()}`);
|
96
|
+
const ref = [...s];
|
97
|
+
expect(inplaceFilter(s, () => true)).toEqual(ref);
|
98
|
+
});
|
99
|
+
|
100
|
+
it("inplaceFilter sized mod 7", () => {
|
101
|
+
const s = new Array(100).fill("a").map((a, i) => `${a}${i.toString()}`);
|
102
|
+
const ref = [...s];
|
103
|
+
for (let i = 99; i >= 0; i--) {
|
104
|
+
if (!(i % 7)) {
|
105
|
+
ref.splice(i, 1);
|
106
|
+
}
|
107
|
+
}
|
108
|
+
expect(inplaceFilter(s, (_, j) => !!(j % 7))).toEqual(ref);
|
109
|
+
expect(s.length).toBe(85);
|
110
|
+
});
|
111
|
+
});
|
112
|
+
|
113
|
+
describe("runtime", () => {
|
114
|
+
it("runtime", () => {
|
115
|
+
const isNode = !!(typeof process === "object" && process.versions?.node);
|
116
|
+
expect(runtimeFn()).toEqual({
|
117
|
+
isBrowser: !isNode,
|
118
|
+
isCFWorker: false,
|
119
|
+
isDeno: false,
|
120
|
+
isNodeIsh: isNode,
|
121
|
+
isReactNative: false,
|
122
|
+
});
|
123
|
+
});
|
83
124
|
});
|