@fireproof/core 0.19.101 → 0.19.103
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{chunk-3EB3ENHT.js → chunk-OFGPKRCM.js} +25 -54
- package/chunk-OFGPKRCM.js.map +1 -0
- package/chunk-WS3YRPIA.js +75 -0
- package/chunk-WS3YRPIA.js.map +1 -0
- package/{gateway-GK5QZ6KP.js → gateway-5FCWPX5W.js} +12 -13
- package/gateway-5FCWPX5W.js.map +1 -0
- package/{gateway-TQTGDRCN.js → gateway-H7UD6TNB.js} +8 -9
- package/gateway-H7UD6TNB.js.map +1 -0
- package/index.cjs +1571 -1992
- package/index.cjs.map +1 -1
- package/index.d.cts +117 -257
- package/index.d.ts +117 -257
- package/index.global.js +12280 -12741
- package/index.global.js.map +1 -1
- package/index.js +1463 -1790
- package/index.js.map +1 -1
- package/{key-bag-file-VOSSK46F.js → key-bag-file-WADZBHYG.js} +3 -4
- package/{key-bag-file-VOSSK46F.js.map → key-bag-file-WADZBHYG.js.map} +1 -1
- package/{key-bag-indexdb-AXTQOSMC.js → key-bag-indexdb-PGVAI3FJ.js} +3 -4
- package/{key-bag-indexdb-AXTQOSMC.js.map → key-bag-indexdb-PGVAI3FJ.js.map} +1 -1
- package/mem-filesystem-YPPJV7Q2.js +41 -0
- package/mem-filesystem-YPPJV7Q2.js.map +1 -0
- package/metafile-cjs.json +1 -1
- package/metafile-esm.json +1 -1
- package/metafile-iife.json +1 -1
- package/{node-filesystem-CFRXFSO7.js → node-filesystem-INX4ZTHE.js} +9 -6
- package/node-filesystem-INX4ZTHE.js.map +1 -0
- package/package.json +1 -1
- package/tests/blockstore/keyed-crypto.test.ts +227 -63
- package/tests/blockstore/loader.test.ts +11 -19
- package/tests/blockstore/store.test.ts +19 -23
- package/tests/blockstore/transaction.test.ts +12 -12
- package/tests/fireproof/all-gateway.test.ts +193 -201
- package/tests/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.ts +316 -324
- package/tests/fireproof/config.test.ts +172 -0
- package/tests/fireproof/crdt.test.ts +16 -67
- package/tests/fireproof/database.test.ts +21 -183
- package/tests/fireproof/fireproof.test.ts +74 -83
- package/tests/fireproof/hello.test.ts +14 -18
- package/tests/fireproof/indexer.test.ts +43 -53
- package/tests/fireproof/utils.test.ts +6 -18
- package/tests/helpers.ts +9 -27
- package/tests/react/useFireproof.test.tsx +1 -1
- package/{utils-STA2C35G.js → utils-QO2HIWGI.js} +3 -4
- package/chunk-3EB3ENHT.js.map +0 -1
- package/chunk-HQ7D3PEU.js +0 -61
- package/chunk-HQ7D3PEU.js.map +0 -1
- package/chunk-PZ5AY32C.js +0 -10
- package/deno-filesystem-Q2IJ7YDR.js +0 -57
- package/deno-filesystem-Q2IJ7YDR.js.map +0 -1
- package/gateway-GK5QZ6KP.js.map +0 -1
- package/gateway-TQTGDRCN.js.map +0 -1
- package/key-bag-memory-LWE6ARPX.js +0 -29
- package/key-bag-memory-LWE6ARPX.js.map +0 -1
- package/node-filesystem-CFRXFSO7.js.map +0 -1
- package/tests/blockstore/keyed-crypto-indexdb-file.test.ts +0 -129
- package/tests/gateway/file/loader-config.test.ts +0 -303
- package/tests/gateway/indexdb/loader-config.test.ts +0 -75
- package/utils-STA2C35G.js.map +0 -1
- /package/tests/fireproof/{fireproof.fixture.ts → fireproof.test.fixture.ts} +0 -0
- /package/{chunk-PZ5AY32C.js.map → utils-QO2HIWGI.js.map} +0 -0
@@ -1,13 +1,13 @@
|
|
1
1
|
import {
|
2
2
|
toArrayBuffer
|
3
|
-
} from "./chunk-
|
4
|
-
import "./chunk-
|
5
|
-
import "./chunk-PZ5AY32C.js";
|
3
|
+
} from "./chunk-WS3YRPIA.js";
|
4
|
+
import "./chunk-OFGPKRCM.js";
|
6
5
|
|
7
6
|
// src/runtime/gateways/file/node-filesystem.ts
|
7
|
+
import { runtimeFn } from "@adviser/cement";
|
8
8
|
var NodeFileSystem = class {
|
9
9
|
async start() {
|
10
|
-
this.fs = await import("fs/promises");
|
10
|
+
this.fs = await import("node:fs/promises");
|
11
11
|
return this;
|
12
12
|
}
|
13
13
|
async mkdir(path, options) {
|
@@ -27,16 +27,19 @@ var NodeFileSystem = class {
|
|
27
27
|
return toArrayBuffer(ret);
|
28
28
|
}
|
29
29
|
stat(path) {
|
30
|
-
return this.fs
|
30
|
+
return this.fs?.stat(path);
|
31
31
|
}
|
32
32
|
async unlink(path) {
|
33
33
|
return this.fs?.unlink(path);
|
34
34
|
}
|
35
35
|
async writefile(path, data) {
|
36
|
+
if (runtimeFn().isDeno) {
|
37
|
+
return this.fs?.writeFile(path, data);
|
38
|
+
}
|
36
39
|
return this.fs?.writeFile(path, Buffer.from(data));
|
37
40
|
}
|
38
41
|
};
|
39
42
|
export {
|
40
43
|
NodeFileSystem
|
41
44
|
};
|
42
|
-
//# sourceMappingURL=node-filesystem-
|
45
|
+
//# sourceMappingURL=node-filesystem-INX4ZTHE.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/gateways/file/node-filesystem.ts"],"sourcesContent":["import type { PathLike, MakeDirectoryOptions, Stats, ObjectEncodingOptions } from \"node:fs\";\nimport type { mkdir, readdir, rm, copyFile, readFile, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { toArrayBuffer } from \"./utils.js\";\nimport { SysFileSystem } from \"../../../types.js\";\nimport { runtimeFn } from \"@adviser/cement\";\n\nexport class NodeFileSystem implements SysFileSystem {\n fs?: {\n mkdir: typeof mkdir;\n readdir: typeof readdir;\n rm: typeof rm;\n copyFile: typeof copyFile;\n readFile: typeof readFile;\n stat: typeof stat;\n unlink: typeof unlink;\n writeFile: typeof writeFile;\n };\n\n async start(): Promise<SysFileSystem> {\n this.fs = await import(\"node:fs/promises\");\n return this;\n }\n async mkdir(path: PathLike, options?: { recursive: boolean }): Promise<string | undefined> {\n return this.fs?.mkdir(path, options);\n }\n async readdir(path: PathLike, options?: ObjectEncodingOptions): Promise<string[]> {\n return this.fs?.readdir(path, options) as Promise<string[]>;\n }\n async rm(path: PathLike, options?: MakeDirectoryOptions & { recursive: boolean }): Promise<void> {\n return this.fs?.rm(path, options);\n }\n async copyFile(source: PathLike, destination: PathLike): Promise<void> {\n return this.fs?.copyFile(source, destination);\n }\n async readfile(path: PathLike, options?: { encoding: BufferEncoding; flag?: string }): Promise<Uint8Array> {\n const ret = (await this.fs?.readFile(path, options)) as Buffer;\n return toArrayBuffer(ret);\n }\n stat(path: PathLike): Promise<Stats> {\n return this.fs?.stat(path) as Promise<Stats>;\n }\n async unlink(path: PathLike): Promise<void> {\n return this.fs?.unlink(path);\n }\n async writefile(path: PathLike, data: Uint8Array | string): Promise<void> {\n if (runtimeFn().isDeno) {\n return this.fs?.writeFile(path, data);\n }\n return this.fs?.writeFile(path, Buffer.from(data));\n }\n}\n\n// import { type NodeMap, join } from \"../../sys-container.js\";\n// import type { ObjectEncodingOptions, PathLike } from \"fs\";\n// import * as fs from \"fs/promises\";\n// import * as path from \"path\";\n// import * as os from \"os\";\n// import * as url from \"url\";\n// import { toArrayBuffer } from \"./utils.js\";\n\n// export async function createNodeSysContainer(): Promise<NodeMap> {\n// // const nodePath = \"node:path\";\n// // const nodeOS = \"node:os\";\n// // const nodeURL = \"node:url\";\n// // const nodeFS = \"node:fs\";\n// // const fs = (await import(\"node:fs\")).promises;\n// // const assert = \"assert\";\n// // const path = await import(\"node:path\");\n// return {\n// state: \"node\",\n// ...path,\n// // ...(await import(\"node:os\")),\n// // ...(await import(\"node:url\")),\n// ...os,\n// ...url,\n// ...fs,\n// join,\n// stat: fs.stat as NodeMap[\"stat\"],\n// readdir: fs.readdir as NodeMap[\"readdir\"],\n// readfile: async (path: PathLike, options?: ObjectEncodingOptions): Promise<Uint8Array> => {\n// const rs = await fs.readFile(path, options);\n// return toArrayBuffer(rs);\n// },\n// writefile: fs.writeFile as NodeMap[\"writefile\"],\n// };\n// }\n"],"mappings":";;;;;;AAIA,SAAS,iBAAiB;AAEnB,IAAM,iBAAN,MAA8C;AAAA,EAYnD,MAAM,QAAgC;AACpC,SAAK,KAAK,MAAM,OAAO,kBAAkB;AACzC,WAAO;AAAA,EACT;AAAA,EACA,MAAM,MAAM,MAAgB,SAA+D;AACzF,WAAO,KAAK,IAAI,MAAM,MAAM,OAAO;AAAA,EACrC;AAAA,EACA,MAAM,QAAQ,MAAgB,SAAoD;AAChF,WAAO,KAAK,IAAI,QAAQ,MAAM,OAAO;AAAA,EACvC;AAAA,EACA,MAAM,GAAG,MAAgB,SAAwE;AAC/F,WAAO,KAAK,IAAI,GAAG,MAAM,OAAO;AAAA,EAClC;AAAA,EACA,MAAM,SAAS,QAAkB,aAAsC;AACrE,WAAO,KAAK,IAAI,SAAS,QAAQ,WAAW;AAAA,EAC9C;AAAA,EACA,MAAM,SAAS,MAAgB,SAA4E;AACzG,UAAM,MAAO,MAAM,KAAK,IAAI,SAAS,MAAM,OAAO;AAClD,WAAO,cAAc,GAAG;AAAA,EAC1B;AAAA,EACA,KAAK,MAAgC;AACnC,WAAO,KAAK,IAAI,KAAK,IAAI;AAAA,EAC3B;AAAA,EACA,MAAM,OAAO,MAA+B;AAC1C,WAAO,KAAK,IAAI,OAAO,IAAI;AAAA,EAC7B;AAAA,EACA,MAAM,UAAU,MAAgB,MAA0C;AACxE,QAAI,UAAU,EAAE,QAAQ;AACtB,aAAO,KAAK,IAAI,UAAU,MAAM,IAAI;AAAA,IACtC;AACA,WAAO,KAAK,IAAI,UAAU,MAAM,OAAO,KAAK,IAAI,CAAC;AAAA,EACnD;AACF;","names":[]}
|
package/package.json
CHANGED
@@ -1,86 +1,219 @@
|
|
1
|
-
import { bs,
|
2
|
-
import { URI } from "@adviser/cement";
|
1
|
+
import { bs, rt } from "@fireproof/core";
|
2
|
+
import { BuildURI, Logger, MockLogger, runtimeFn, toCryptoRuntime, URI } from "@adviser/cement";
|
3
3
|
import { base58btc } from "multiformats/bases/base58";
|
4
4
|
import { sha256 as hasher } from "multiformats/hashes/sha2";
|
5
5
|
import * as dagCodec from "@ipld/dag-cbor";
|
6
|
-
import { mockSuperThis } from "../helpers";
|
6
|
+
import { MockSuperThis, mockSuperThis } from "../helpers";
|
7
|
+
|
8
|
+
describe("KeyBag", () => {
|
9
|
+
let url: URI;
|
10
|
+
let sthis: MockSuperThis;
|
11
|
+
|
12
|
+
beforeEach(async () => {
|
13
|
+
sthis = mockSuperThis();
|
14
|
+
await sthis.start();
|
15
|
+
if (runtimeFn().isBrowser) {
|
16
|
+
url = URI.from("indexdb://fp-keybag");
|
17
|
+
} else {
|
18
|
+
url = URI.merge(`file://./dist/tests/key.bag`, sthis.env.get("FP_KEYBAG_URL"));
|
19
|
+
}
|
20
|
+
});
|
21
|
+
it("default-path", async () => {
|
22
|
+
const old = sthis.env.get("FP_KEYBAG_URL");
|
23
|
+
sthis.env.delete("FP_KEYBAG_URL");
|
24
|
+
const kb = await rt.kb.getKeyBag(sthis);
|
25
|
+
if (runtimeFn().isBrowser) {
|
26
|
+
expect(kb.rt.url.toString()).toBe(`indexdb://fp-keybag`);
|
27
|
+
} else {
|
28
|
+
expect(kb.rt.url.toString()).toBe(`file://${sthis.env.get("HOME")}/.fireproof/keybag`);
|
29
|
+
}
|
30
|
+
sthis.env.set("FP_KEYBAG_URL", old);
|
31
|
+
});
|
32
|
+
it("from env", async () => {
|
33
|
+
const old = sthis.env.get("FP_KEYBAG_URL");
|
34
|
+
sthis.env.set("FP_KEYBAG_URL", url.toString());
|
35
|
+
const kb = await rt.kb.getKeyBag(sthis);
|
36
|
+
expect(kb.rt.url.toString()).toBe(url.toString());
|
37
|
+
sthis.env.set("FP_KEYBAG_URL", old);
|
38
|
+
});
|
39
|
+
|
40
|
+
it("extract keyMaterial", async () => {
|
41
|
+
const dkb = await rt.kb.getKeyBag(sthis);
|
42
|
+
const old = sthis.env.get("FP_KEYBAG_URL");
|
43
|
+
sthis.env.set("FP_KEYBAG_URL", BuildURI.from(dkb.rt.url).setParam("extractKey", "_deprecated_internal_api").toString());
|
44
|
+
const kb = await rt.kb.getKeyBag(sthis);
|
45
|
+
const key = kb.rt.crypto.randomBytes(kb.rt.keyLength);
|
46
|
+
const keyStr = base58btc.encode(key);
|
47
|
+
const res = await kb.setNamedKey("extract.test", keyStr);
|
48
|
+
expect(res.isOk()).toBeTruthy();
|
49
|
+
const gkb = await kb.getNamedExtractableKey("extract.test", true);
|
50
|
+
expect(gkb.isOk()).toBeTruthy();
|
51
|
+
expect(await gkb.Ok().extract()).toEqual({
|
52
|
+
key,
|
53
|
+
keyStr,
|
54
|
+
});
|
55
|
+
sthis.env.set("FP_KEYBAG_URL", old);
|
56
|
+
await sthis.logger.Flush();
|
57
|
+
expect(sthis.logCollector.Logs()).toEqual([
|
58
|
+
{
|
59
|
+
level: "warn",
|
60
|
+
module: "KeyBag",
|
61
|
+
msg: "extractKey is enabled via _deprecated_internal_api --- handle keys safely!!!",
|
62
|
+
},
|
63
|
+
]);
|
64
|
+
});
|
65
|
+
|
66
|
+
it("simple add", async () => {
|
67
|
+
const kb = await rt.kb.getKeyBag(sthis, {
|
68
|
+
url: url.toString(),
|
69
|
+
crypto: toCryptoRuntime({
|
70
|
+
randomBytes: (size) => new Uint8Array(size).map((_, i) => i),
|
71
|
+
}),
|
72
|
+
});
|
73
|
+
const name = "setkey" + Math.random();
|
74
|
+
expect((await kb.getNamedKey(name, true)).isErr()).toBeTruthy();
|
75
|
+
|
76
|
+
const key = base58btc.encode(kb.rt.crypto.randomBytes(kb.rt.keyLength));
|
77
|
+
const res = await kb.setNamedKey(name, key);
|
78
|
+
expect(res.isOk()).toBeTruthy();
|
79
|
+
expect((await kb.getNamedKey(name, true)).Ok()).toEqual(res.Ok());
|
80
|
+
|
81
|
+
const name2 = "implicit";
|
82
|
+
const created = await kb.getNamedKey(name2);
|
83
|
+
expect(created.isOk()).toBeTruthy();
|
84
|
+
|
85
|
+
expect((await kb.getNamedKey(name2)).Ok()).toEqual(created.Ok());
|
86
|
+
|
87
|
+
let diskBag: rt.kb.KeyItem;
|
88
|
+
let diskBag2: rt.kb.KeyItem;
|
89
|
+
const provider = await kb.rt.getBag();
|
90
|
+
if (runtimeFn().isBrowser) {
|
91
|
+
const p = provider as rt.kb.KeyBagProviderIndexDB;
|
92
|
+
diskBag = await p._prepare().then((db) => db.get("bag", name));
|
93
|
+
diskBag2 = await p._prepare().then((db) => db.get("bag", name2));
|
94
|
+
} else {
|
95
|
+
const p = provider as rt.kb.KeyBagProviderFile;
|
96
|
+
const { sysFS } = await p._prepare(name);
|
97
|
+
|
98
|
+
diskBag = await sysFS.readfile((await p._prepare(name)).fName).then((data) => {
|
99
|
+
return JSON.parse(new TextDecoder().decode(data)) as rt.kb.KeyItem;
|
100
|
+
});
|
101
|
+
diskBag2 = await sysFS.readfile((await p._prepare(name2)).fName).then((data) => {
|
102
|
+
return JSON.parse(new TextDecoder().decode(data)) as rt.kb.KeyItem;
|
103
|
+
});
|
104
|
+
}
|
105
|
+
expect(await kb.toKeyWithFingerPrint(diskBag.key)).toEqual(res);
|
106
|
+
expect(await kb.toKeyWithFingerPrint(diskBag2.key)).toEqual(created);
|
107
|
+
const algo = {
|
108
|
+
name: "AES-GCM",
|
109
|
+
iv: kb.rt.crypto.randomBytes(12),
|
110
|
+
tagLength: 128,
|
111
|
+
};
|
112
|
+
const data = kb.rt.crypto.randomBytes(122);
|
113
|
+
expect(await kb.rt.crypto.encrypt(algo, res.Ok().key, data)).toEqual(await kb.rt.crypto.encrypt(algo, created.Ok().key, data));
|
114
|
+
expect(await kb.rt.crypto.encrypt(algo, await kb.subtleKey(diskBag.key), data)).toEqual(
|
115
|
+
await kb.rt.crypto.encrypt(algo, created.Ok().key, data),
|
116
|
+
);
|
117
|
+
expect(await kb.rt.crypto.encrypt(algo, await kb.subtleKey(diskBag2.key), data)).toEqual(
|
118
|
+
await kb.rt.crypto.encrypt(algo, created.Ok().key, data),
|
119
|
+
);
|
120
|
+
});
|
121
|
+
});
|
7
122
|
|
8
123
|
describe("KeyedCryptoStore", () => {
|
9
124
|
let kb: rt.kb.KeyBag;
|
10
|
-
|
125
|
+
let logger: Logger;
|
11
126
|
let baseUrl: URI;
|
12
127
|
const sthis = mockSuperThis();
|
13
128
|
beforeEach(async () => {
|
14
129
|
await sthis.start();
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
// } else {
|
21
|
-
// kbUrl = URI.merge(`file://./dist/tests/key.bag`, sthis.env.get("FP_KEYBAG_URL"));
|
22
|
-
// baseUrl = URI.merge("file://./dist/tests/keyed-crypto-store", sthis.env.get("FP_STORAGE_URL"));
|
23
|
-
// }
|
24
|
-
// baseUrl = baseUrl.build().defParam(PARAM.NAME, "test").URI();
|
25
|
-
|
26
|
-
const envURL = sthis.env.get("FP_KEYBAG_URL");
|
27
|
-
if (envURL) {
|
28
|
-
baseUrl = bs.getDefaultURI(sthis, URI.from(envURL).protocol);
|
130
|
+
logger = MockLogger().logger;
|
131
|
+
let kbUrl: URI;
|
132
|
+
if (runtimeFn().isBrowser) {
|
133
|
+
kbUrl = URI.from("indexdb://fp-keybag");
|
134
|
+
baseUrl = URI.from("indexdb://fp-keyed-crypto-store");
|
29
135
|
} else {
|
30
|
-
|
136
|
+
kbUrl = URI.merge(`file://./dist/tests/key.bag`, sthis.env.get("FP_KEYBAG_URL"));
|
137
|
+
// baseUrl = URI.merge("file://./dist/tests/keyed-crypto-store", sthis.env.get("FP_STORAGE_URL"));
|
138
|
+
baseUrl = URI.from(sthis.env.get("FP_STORAGE_URL"));
|
31
139
|
}
|
32
|
-
baseUrl = baseUrl.build().setParam(PARAM.NAME, "test").URI();
|
33
140
|
kb = await rt.kb.getKeyBag(sthis, {
|
34
|
-
|
141
|
+
url: kbUrl,
|
35
142
|
});
|
36
143
|
});
|
37
144
|
it("no crypto", async () => {
|
38
|
-
const
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
145
|
+
const loader = {
|
146
|
+
sthis,
|
147
|
+
name: "test",
|
148
|
+
ebOpts: {
|
149
|
+
keyBag: {
|
150
|
+
keyRuntime: kb.rt,
|
151
|
+
},
|
152
|
+
store: {
|
153
|
+
stores: {
|
154
|
+
base: baseUrl.build().setParam("storekey", "insecure"),
|
155
|
+
},
|
156
|
+
},
|
157
|
+
},
|
158
|
+
} as unknown as bs.Loadable;
|
159
|
+
const strt = bs.toStoreRuntime({}, sthis);
|
160
|
+
|
161
|
+
for (const pstore of [strt.makeDataStore(loader), strt.makeMetaStore(loader), strt.makeWALStore(loader)]) {
|
46
162
|
const store = await pstore;
|
47
163
|
// await store.start();
|
48
164
|
const kc = await store.keyedCrypto();
|
49
165
|
expect(kc.constructor.name).toBe("noCrypto");
|
50
166
|
// expect(kc.isEncrypting).toBe(false);
|
51
|
-
expect(kc.constructor.name).toBe("noCrypto");
|
52
|
-
// expect(kc.isEncrypting).toBe(false);
|
53
167
|
}
|
54
168
|
});
|
55
169
|
|
56
170
|
it("create key", async () => {
|
57
|
-
const
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
171
|
+
const loader = {
|
172
|
+
sthis,
|
173
|
+
name: "test",
|
174
|
+
ebOpts: {
|
175
|
+
keyBag: {
|
176
|
+
keyRuntime: kb.rt,
|
177
|
+
},
|
178
|
+
store: {
|
179
|
+
stores: {
|
180
|
+
base: baseUrl,
|
181
|
+
},
|
182
|
+
},
|
183
|
+
},
|
184
|
+
} as unknown as bs.Loadable;
|
185
|
+
const strt = bs.toStoreRuntime({}, sthis);
|
186
|
+
for (const pstore of [strt.makeDataStore(loader), strt.makeMetaStore(loader), strt.makeWALStore(loader)]) {
|
187
|
+
const store = await bs.ensureStart(await pstore, logger);
|
64
188
|
const kc = await store.keyedCrypto();
|
65
189
|
expect(kc.constructor.name).toBe("keyedCrypto");
|
66
190
|
// expect(kc.isEncrypting).toBe(true);
|
67
|
-
expect(store.url().getParam(
|
191
|
+
expect(store.url().getParam("storekey")).toBe(`@test:${store.url().getParam("store")}@`);
|
68
192
|
}
|
69
193
|
});
|
70
194
|
|
71
195
|
it("key ref keybag", async () => {
|
72
196
|
const key = base58btc.encode(kb.rt.crypto.randomBytes(kb.rt.keyLength));
|
73
197
|
const genKey = await kb.setNamedKey("@heute@", key);
|
74
|
-
const
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
198
|
+
const loader = {
|
199
|
+
sthis,
|
200
|
+
name: "test",
|
201
|
+
ebOpts: {
|
202
|
+
keyBag: {
|
203
|
+
keyRuntime: kb.rt,
|
204
|
+
},
|
205
|
+
store: {
|
206
|
+
stores: {
|
207
|
+
base: baseUrl.build().setParam("storekey", "@heute@").URI(),
|
208
|
+
},
|
209
|
+
},
|
210
|
+
},
|
211
|
+
} as unknown as bs.Loadable;
|
212
|
+
const strt = bs.toStoreRuntime({}, sthis);
|
213
|
+
for (const pstore of [strt.makeDataStore(loader), strt.makeMetaStore(loader), strt.makeWALStore(loader)]) {
|
81
214
|
const store = await pstore;
|
82
215
|
// await store.start();
|
83
|
-
expect(store.url().getParam(
|
216
|
+
expect(store.url().getParam("storekey")).toBe(`@heute@`);
|
84
217
|
const kc = await store.keyedCrypto();
|
85
218
|
expect(kc.constructor.name).toBe("keyedCrypto");
|
86
219
|
const testData = kb.rt.crypto.randomBytes(1024);
|
@@ -96,17 +229,25 @@ describe("KeyedCryptoStore", () => {
|
|
96
229
|
|
97
230
|
it("key", async () => {
|
98
231
|
const key = base58btc.encode(kb.rt.crypto.randomBytes(kb.rt.keyLength));
|
99
|
-
const
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
232
|
+
const loader = {
|
233
|
+
sthis,
|
234
|
+
name: "test",
|
235
|
+
ebOpts: {
|
236
|
+
keyBag: {
|
237
|
+
keyRuntime: kb.rt,
|
238
|
+
},
|
239
|
+
store: {
|
240
|
+
stores: {
|
241
|
+
base: BuildURI.from(baseUrl).setParam("storekey", key),
|
242
|
+
},
|
243
|
+
},
|
244
|
+
},
|
245
|
+
} as unknown as bs.Loadable;
|
246
|
+
const strt = bs.toStoreRuntime({}, sthis);
|
247
|
+
for (const pstore of [strt.makeDataStore(loader), strt.makeMetaStore(loader), strt.makeWALStore(loader)]) {
|
107
248
|
const store = await pstore;
|
108
249
|
// await store.start();
|
109
|
-
expect(store.url().getParam(
|
250
|
+
expect(store.url().getParam("storekey")).toBe(key);
|
110
251
|
const kc = await store.keyedCrypto();
|
111
252
|
expect(kc.constructor.name).toBe("keyedCrypto");
|
112
253
|
const testData = kb.rt.crypto.randomBytes(1024);
|
@@ -125,14 +266,14 @@ describe("KeyedCrypto", () => {
|
|
125
266
|
let keyStr: string;
|
126
267
|
const sthis = mockSuperThis();
|
127
268
|
beforeEach(async () => {
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
269
|
+
let url: URI;
|
270
|
+
if (runtimeFn().isBrowser) {
|
271
|
+
url = URI.from("indexdb://fp-keybag");
|
272
|
+
} else {
|
273
|
+
url = URI.merge(`file://./dist/tests/key.bag`, sthis.env.get("FP_KEYBAG_URL"));
|
274
|
+
}
|
134
275
|
kb = await rt.kb.getKeyBag(sthis, {
|
135
|
-
|
276
|
+
url,
|
136
277
|
});
|
137
278
|
keyStr = base58btc.encode(kb.rt.crypto.randomBytes(kb.rt.keyLength));
|
138
279
|
kycr = await rt.kc.keyedCryptoFactory(URI.from(`test://bla?storekey=${keyStr}`), kb, sthis);
|
@@ -166,3 +307,26 @@ describe("KeyedCrypto", () => {
|
|
166
307
|
expect(blk).toEqual(blk2);
|
167
308
|
});
|
168
309
|
});
|
310
|
+
|
311
|
+
// describe("KeyedCryptoStore RunLength", () => {
|
312
|
+
// const logger = MockLogger().logger;
|
313
|
+
// it("de/encode", () => {
|
314
|
+
// for (const data of [
|
315
|
+
// new Uint8Array(),
|
316
|
+
// new Uint8Array(10).fill(10),
|
317
|
+
// new Uint8Array(127).fill(127),
|
318
|
+
// new Uint8Array(128).fill(128),
|
319
|
+
// new Uint8Array(1024).fill(17),
|
320
|
+
// ]) {
|
321
|
+
// const res = rt.kc.encodeRunLength(data, logger);
|
322
|
+
// expect(res.length).toBeLessThanOrEqual(data.length + (data.length > 127 ? 4 : 1));
|
323
|
+
// for (let ofs = 0; ofs < 1024; ofs += 61) {
|
324
|
+
// const ofsRes = new Uint8Array([...new Uint8Array(ofs).fill(23), ...res]);
|
325
|
+
// const dec = rt.kc.decodeRunLength(ofsRes, ofs, logger);
|
326
|
+
// expect(dec.data).toEqual(data);
|
327
|
+
// expect(dec.data.length).toBe(data.length);
|
328
|
+
// expect(dec.next).toBe(ofs + data.length + (data.length > 127 ? 4 : 1));
|
329
|
+
// }
|
330
|
+
// }
|
331
|
+
// });
|
332
|
+
// });
|
@@ -4,18 +4,17 @@ import { BlockView } from "multiformats";
|
|
4
4
|
import { CID } from "multiformats/cid";
|
5
5
|
import { MemoryBlockstore } from "@web3-storage/pail/block";
|
6
6
|
import { CRDTMeta, IndexTransactionMeta, SuperThis, bs, rt } from "@fireproof/core";
|
7
|
-
import { mockSuperThis
|
7
|
+
import { mockSuperThis } from "../helpers";
|
8
8
|
|
9
9
|
class MyMemoryBlockStore extends bs.EncryptedBlockstore {
|
10
10
|
readonly memblock = new MemoryBlockstore();
|
11
11
|
loader: bs.Loader;
|
12
12
|
constructor(sthis: SuperThis) {
|
13
|
-
const ebOpts =
|
14
|
-
|
15
|
-
|
16
|
-
// } as bs.BlockstoreOpts;
|
13
|
+
const ebOpts = {
|
14
|
+
name: "MyMemoryBlockStore",
|
15
|
+
};
|
17
16
|
super(sthis, ebOpts);
|
18
|
-
this.loader = new bs.Loader(
|
17
|
+
this.loader = new bs.Loader("MyMemoryBlockStore", {}, sthis);
|
19
18
|
}
|
20
19
|
ready(): Promise<void> {
|
21
20
|
return Promise.resolve();
|
@@ -64,10 +63,7 @@ describe("basic Loader simple", function () {
|
|
64
63
|
await sthis.start();
|
65
64
|
const mockM = new MyMemoryBlockStore(sthis);
|
66
65
|
t = new bs.CarTransaction(mockM as bs.EncryptedBlockstore);
|
67
|
-
loader = new bs.Loader(
|
68
|
-
...simpleBlockOpts(sthis, testDbName),
|
69
|
-
public: true,
|
70
|
-
});
|
66
|
+
loader = new bs.Loader(testDbName, { public: true }, sthis);
|
71
67
|
await loader.ready();
|
72
68
|
block = await rt.mf.block.encode({
|
73
69
|
value: { hello: "world" },
|
@@ -104,20 +100,17 @@ describe("basic Loader with two commits", function () {
|
|
104
100
|
let carCid0: bs.CarGroup;
|
105
101
|
|
106
102
|
const sthis = mockSuperThis();
|
107
|
-
|
103
|
+
|
104
|
+
afterEach(async function () {
|
108
105
|
await loader.close();
|
109
106
|
await loader.destroy();
|
110
107
|
});
|
111
108
|
|
112
|
-
beforeEach(async ()
|
109
|
+
beforeEach(async function () {
|
113
110
|
await sthis.start();
|
114
111
|
const mockM = new MyMemoryBlockStore(sthis);
|
115
112
|
t = new bs.CarTransaction(mockM);
|
116
|
-
loader = new bs.Loader(
|
117
|
-
...simpleBlockOpts(sthis, "test-loader-two-commit"),
|
118
|
-
public: true,
|
119
|
-
});
|
120
|
-
|
113
|
+
loader = new bs.Loader("test-loader-two-commit", { public: true }, sthis);
|
121
114
|
block = await rt.mf.block.encode({
|
122
115
|
value: { hello: "world" },
|
123
116
|
hasher,
|
@@ -218,9 +211,8 @@ describe("basic Loader with index commits", function () {
|
|
218
211
|
beforeEach(async function () {
|
219
212
|
const name = "test-loader-index" + Math.random();
|
220
213
|
await sthis.start();
|
221
|
-
await sthis.start();
|
222
214
|
// t = new CarTransaction()
|
223
|
-
ib = new bs.EncryptedBlockstore(sthis,
|
215
|
+
ib = new bs.EncryptedBlockstore(sthis, { name });
|
224
216
|
block = await rt.mf.block.encode({
|
225
217
|
value: { hello: "world" },
|
226
218
|
hasher,
|
@@ -1,18 +1,21 @@
|
|
1
1
|
import { CID } from "multiformats";
|
2
|
-
import { bs, NotFoundError, SuperThis
|
3
|
-
import { mockSuperThis
|
2
|
+
import { bs, NotFoundError, SuperThis } from "@fireproof/core";
|
3
|
+
import { mockSuperThis } from "../helpers";
|
4
|
+
|
5
|
+
const decoder = new TextDecoder("utf-8");
|
4
6
|
|
5
7
|
function runtime(sthis: SuperThis) {
|
6
|
-
return bs.toStoreRuntime(sthis);
|
8
|
+
return bs.toStoreRuntime({}, sthis);
|
7
9
|
}
|
8
10
|
|
9
|
-
|
10
|
-
const url = noopUrl(name);
|
11
|
+
function mockLoader(sthis: SuperThis, name: string): bs.Loadable {
|
11
12
|
return {
|
12
13
|
sthis,
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
name,
|
15
|
+
ebOpts: {
|
16
|
+
store: {},
|
17
|
+
},
|
18
|
+
} as bs.Loadable;
|
16
19
|
}
|
17
20
|
|
18
21
|
describe("DataStore", function () {
|
@@ -27,7 +30,7 @@ describe("DataStore", function () {
|
|
27
30
|
|
28
31
|
beforeEach(async () => {
|
29
32
|
await sthis.start();
|
30
|
-
store = await runtime(sthis).makeDataStore(
|
33
|
+
store = await runtime(sthis).makeDataStore(mockLoader(sthis, "test"));
|
31
34
|
await store.start();
|
32
35
|
raw = await bs.testStoreFactory(store.url(), sthis);
|
33
36
|
});
|
@@ -43,7 +46,7 @@ describe("DataStore", function () {
|
|
43
46
|
};
|
44
47
|
await store.save(car);
|
45
48
|
const data = await raw.get(store.url(), car.cid.toString());
|
46
|
-
expect(
|
49
|
+
expect(decoder.decode(data)).toEqual(decoder.decode(car.bytes));
|
47
50
|
});
|
48
51
|
});
|
49
52
|
|
@@ -51,6 +54,7 @@ describe("DataStore with a saved car", function () {
|
|
51
54
|
let store: bs.DataStore;
|
52
55
|
let raw: bs.TestGateway;
|
53
56
|
let car: bs.AnyBlock;
|
57
|
+
|
54
58
|
const sthis = mockSuperThis();
|
55
59
|
|
56
60
|
afterEach(async () => {
|
@@ -60,10 +64,9 @@ describe("DataStore with a saved car", function () {
|
|
60
64
|
|
61
65
|
beforeEach(async function () {
|
62
66
|
await sthis.start();
|
63
|
-
store = await runtime(sthis).makeDataStore(
|
67
|
+
store = await runtime(sthis).makeDataStore(mockLoader(sthis, "test2"));
|
64
68
|
await store.start();
|
65
69
|
raw = await bs.testStoreFactory(store.url(), sthis);
|
66
|
-
raw = await bs.testStoreFactory(store.url(), sthis);
|
67
70
|
car = {
|
68
71
|
cid: "cid" as unknown as CID,
|
69
72
|
bytes: new Uint8Array([55, 56, 57, 80]),
|
@@ -73,7 +76,7 @@ describe("DataStore with a saved car", function () {
|
|
73
76
|
|
74
77
|
it("should have a car", async function () {
|
75
78
|
const data = await raw.get(store.url(), car.cid.toString());
|
76
|
-
expect(
|
79
|
+
expect(decoder.decode(data)).toEqual(decoder.decode(car.bytes));
|
77
80
|
});
|
78
81
|
|
79
82
|
it("should load a car", async function () {
|
@@ -103,7 +106,7 @@ describe("MetaStore", function () {
|
|
103
106
|
|
104
107
|
beforeEach(async function () {
|
105
108
|
await sthis.start();
|
106
|
-
store = await runtime(sthis).makeMetaStore(
|
109
|
+
store = await runtime(sthis).makeMetaStore(mockLoader(sthis, "test"));
|
107
110
|
await store.start();
|
108
111
|
raw = await bs.testStoreFactory(store.url(), sthis);
|
109
112
|
});
|
@@ -133,7 +136,6 @@ describe("MetaStore with a saved header", function () {
|
|
133
136
|
let raw: bs.TestGateway;
|
134
137
|
let cid: CID;
|
135
138
|
const sthis = mockSuperThis();
|
136
|
-
// let onload: bs.DbMeta[];
|
137
139
|
|
138
140
|
afterEach(async () => {
|
139
141
|
await store.close();
|
@@ -142,22 +144,16 @@ describe("MetaStore with a saved header", function () {
|
|
142
144
|
|
143
145
|
beforeEach(async function () {
|
144
146
|
await sthis.start();
|
145
|
-
store = await runtime(sthis).makeMetaStore(
|
147
|
+
store = await runtime(sthis).makeMetaStore(mockLoader(sthis, "test-saved-header"));
|
146
148
|
await store.start();
|
147
149
|
raw = await bs.testStoreFactory(store.url(), sthis);
|
148
150
|
cid = CID.parse("bafybeia4luuns6dgymy5kau5rm7r4qzrrzg6cglpzpogussprpy42cmcn4");
|
149
151
|
await store.save({ cars: [cid] /*, key: undefined */ });
|
150
152
|
});
|
151
153
|
|
152
|
-
// it("should load", async function () {
|
153
|
-
// expect(onload).toBeTruthy();
|
154
|
-
// expect(onload?.length).toEqual(1);
|
155
|
-
// expect(onload?.[0].cars.toString()).toEqual(cid.toString());
|
156
|
-
// });
|
157
|
-
|
158
154
|
it("should have a header", async function () {
|
159
155
|
const bytes = await raw.get(store.url(), "main");
|
160
|
-
const data =
|
156
|
+
const data = decoder.decode(bytes);
|
161
157
|
expect(data).toMatch(/parents/);
|
162
158
|
const header = JSON.parse(data)[0];
|
163
159
|
expect(header).toBeDefined();
|
@@ -1,16 +1,16 @@
|
|
1
1
|
import { CID } from "multiformats";
|
2
2
|
import { bs, SuperThis } from "@fireproof/core";
|
3
|
-
import { mockSuperThis
|
3
|
+
import { mockSuperThis } from "../helpers";
|
4
4
|
|
5
5
|
describe("Fresh TransactionBlockstore", function () {
|
6
6
|
let blocks: bs.BaseBlockstore;
|
7
7
|
const sthis = mockSuperThis();
|
8
8
|
beforeEach(function () {
|
9
|
-
blocks = new bs.BaseBlockstore(
|
9
|
+
blocks = new bs.BaseBlockstore();
|
10
|
+
});
|
11
|
+
it("should not have a name", function () {
|
12
|
+
expect(blocks.name).toBeFalsy();
|
10
13
|
});
|
11
|
-
// it("should not have a name", function () {
|
12
|
-
// expect(blocks.name).toBeFalsy();
|
13
|
-
// });
|
14
14
|
it("should not have a loader", function () {
|
15
15
|
expect(blocks.loader).toBeFalsy();
|
16
16
|
});
|
@@ -34,12 +34,12 @@ describe("Fresh TransactionBlockstore", function () {
|
|
34
34
|
describe("TransactionBlockstore with name", function () {
|
35
35
|
let blocks: bs.EncryptedBlockstore;
|
36
36
|
const sthis = mockSuperThis();
|
37
|
-
beforeEach(
|
38
|
-
blocks = new bs.EncryptedBlockstore(sthis,
|
37
|
+
beforeEach(function () {
|
38
|
+
blocks = new bs.EncryptedBlockstore(sthis, { name: "test" });
|
39
|
+
});
|
40
|
+
it("should have a name", function () {
|
41
|
+
expect(blocks.name).toEqual("test");
|
39
42
|
});
|
40
|
-
// it("should have a name", function () {
|
41
|
-
// expect(blocks.name).toEqual("test");
|
42
|
-
// });
|
43
43
|
it("should have a loader", function () {
|
44
44
|
expect(blocks.loader).toBeTruthy();
|
45
45
|
});
|
@@ -59,7 +59,7 @@ describe("A transaction", function () {
|
|
59
59
|
let blocks: bs.EncryptedBlockstore;
|
60
60
|
const sthis = mockSuperThis();
|
61
61
|
beforeEach(async function () {
|
62
|
-
blocks = new bs.EncryptedBlockstore(sthis,
|
62
|
+
blocks = new bs.EncryptedBlockstore(sthis, { name: "test" });
|
63
63
|
tblocks = new bs.CarTransaction(blocks);
|
64
64
|
blocks.transactions.add(tblocks);
|
65
65
|
});
|
@@ -89,7 +89,7 @@ describe("TransactionBlockstore with a completed transaction", function () {
|
|
89
89
|
cid = CID.parse("bafybeia4luuns6dgymy5kau5rm7r4qzrrzg6cglpzpogussprpy42cmcn4");
|
90
90
|
cid2 = CID.parse("bafybeibgouhn5ktecpjuovt52zamzvm4dlve5ak7x6d5smms3itkhplnhm");
|
91
91
|
|
92
|
-
blocks = new bs.BaseBlockstore(
|
92
|
+
blocks = new bs.BaseBlockstore();
|
93
93
|
await blocks.transaction(async (tblocks) => {
|
94
94
|
await tblocks.put(cid, asUInt8Array("value", sthis));
|
95
95
|
await tblocks.put(cid, asUInt8Array("value", sthis));
|