@fireproof/core 0.19.121 → 0.20.0-dev-preview-05
Sign up to get free protection for your applications and to get access to all the features.
- 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 +2 -3
- package/index.cjs +1827 -1059
- package/index.cjs.map +1 -1
- package/index.d.cts +747 -334
- package/index.d.ts +747 -334
- package/index.js +1800 -1034
- package/index.js.map +1 -1
- package/metafile-cjs.json +1 -1
- package/metafile-esm.json +1 -1
- package/node/index.cjs +16 -293
- package/node/index.cjs.map +1 -1
- package/node/index.d.cts +4 -40
- package/node/index.d.ts +4 -40
- package/node/index.js +22 -237
- package/node/index.js.map +1 -1
- package/node/metafile-cjs.json +1 -1
- package/node/metafile-esm.json +1 -1
- package/package.json +14 -6
- 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 +73 -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 +102 -116
- package/web/index.cjs.map +1 -1
- package/web/index.d.cts +15 -29
- package/web/index.d.ts +15 -29
- package/web/index.js +91 -105
- package/web/index.js.map +1 -1
- package/web/metafile-cjs.json +1 -1
- package/web/metafile-esm.json +1 -1
- package/node/chunk-4A4RAVNS.js +0 -17
- package/node/chunk-4A4RAVNS.js.map +0 -1
- package/node/mem-filesystem-LPPT7QV5.js +0 -40
- package/node/mem-filesystem-LPPT7QV5.js.map +0 -1
- package/tests/fireproof/config.test.ts +0 -163
- /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
|
});
|