@fireproof/core-test 0.22.0-keybag → 0.23.1-dev-issue-1057

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.
Files changed (101) hide show
  1. package/LICENSE.md +197 -228
  2. package/README.md +269 -0
  3. package/blockstore/interceptor-gateway.test.js.map +1 -1
  4. package/blockstore/keyed-crypto-indexeddb-file.test.js +1 -0
  5. package/blockstore/keyed-crypto-indexeddb-file.test.js.map +1 -1
  6. package/blockstore/keyed-crypto.test.js +1 -0
  7. package/blockstore/keyed-crypto.test.js.map +1 -1
  8. package/blockstore/loader.test.js.map +1 -1
  9. package/blockstore/standalone.test.js.map +1 -1
  10. package/blockstore/store.test.js.map +1 -1
  11. package/blockstore/transaction.test.js.map +1 -1
  12. package/fireproof/all-gateway.test.js.map +1 -1
  13. package/fireproof/attachable.test.js.map +1 -1
  14. package/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.js.map +1 -1
  15. package/fireproof/charwise-boolean.test.js.map +1 -1
  16. package/fireproof/compact-strategy.test.js.map +1 -1
  17. package/fireproof/concurrent.test.js +1 -1
  18. package/fireproof/concurrent.test.js.map +1 -1
  19. package/fireproof/crdt.test.js +1 -0
  20. package/fireproof/crdt.test.js.map +1 -1
  21. package/fireproof/database.test.js.map +1 -1
  22. package/fireproof/deleted-docs-handling.test.js.map +1 -1
  23. package/fireproof/fireproof.test.fixture.d.ts +3 -3
  24. package/fireproof/fireproof.test.fixture.js.map +1 -1
  25. package/fireproof/fireproof.test.js +1 -0
  26. package/fireproof/fireproof.test.js.map +1 -1
  27. package/fireproof/hello.test.js.map +1 -1
  28. package/fireproof/indexer.test.js.map +1 -1
  29. package/fireproof/multiple-ledger.test.js.map +1 -1
  30. package/fireproof/query-docs.test.js.map +1 -1
  31. package/fireproof/query-limit-issue.test.js.map +1 -1
  32. package/fireproof/query-property-inconsistency.test.js.map +1 -1
  33. package/fireproof/query-result-properties.test.js.map +1 -1
  34. package/fireproof/stable-cid.test.js.map +1 -1
  35. package/fireproof/utils.test.js.map +1 -1
  36. package/gateway/file/loader-config.test.js +2 -2
  37. package/gateway/file/loader-config.test.js.map +1 -1
  38. package/gateway/indexeddb/create-db-on-write.test.d.ts +1 -0
  39. package/gateway/indexeddb/create-db-on-write.test.js +145 -0
  40. package/gateway/indexeddb/create-db-on-write.test.js.map +1 -0
  41. package/gateway/indexeddb/loader-config.test.js.map +1 -1
  42. package/global-setup.js.map +1 -1
  43. package/helpers.js.map +1 -1
  44. package/package.json +21 -22
  45. package/protocols/cloud/msger.test.js.map +1 -1
  46. package/runtime/fp-envelope-serialize.test.js.map +1 -1
  47. package/runtime/key-bag.test.js.map +1 -1
  48. package/runtime/meta-key-hack.test.js.map +1 -1
  49. package/setup.file.js.map +1 -1
  50. package/setup.indexeddb.js.map +1 -1
  51. package/setup.memory.js.map +1 -1
  52. package/vitest.config.js.map +1 -1
  53. package/vitest.file.config.js.map +1 -1
  54. package/vitest.indexeddb.config.js.map +1 -1
  55. package/vitest.memory.config.js.map +1 -1
  56. package/blockstore/fp-envelope.test.ts-off +0 -65
  57. package/blockstore/fragment-gateway.test.ts-off +0 -106
  58. package/blockstore/interceptor-gateway.test.ts +0 -259
  59. package/blockstore/keyed-crypto-indexeddb-file.test.ts +0 -134
  60. package/blockstore/keyed-crypto.test.ts +0 -381
  61. package/blockstore/loader.test.ts +0 -313
  62. package/blockstore/standalone.test.ts +0 -156
  63. package/blockstore/store.test.ts +0 -199
  64. package/blockstore/transaction.test.ts +0 -132
  65. package/fireproof/all-gateway.test.ts +0 -477
  66. package/fireproof/attachable.test.ts +0 -677
  67. package/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.car +0 -0
  68. package/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.ts +0 -324
  69. package/fireproof/charwise-boolean.test.ts +0 -68
  70. package/fireproof/compact-strategy.test.ts +0 -40
  71. package/fireproof/concurrent.test.ts +0 -38
  72. package/fireproof/crdt.test.ts +0 -572
  73. package/fireproof/database.test.ts +0 -772
  74. package/fireproof/deleted-docs-handling.test.ts +0 -112
  75. package/fireproof/fireproof.test.fixture.ts +0 -133
  76. package/fireproof/fireproof.test.ts +0 -767
  77. package/fireproof/hello.test.ts +0 -75
  78. package/fireproof/indexer.test.ts +0 -459
  79. package/fireproof/multiple-ledger.test.ts +0 -67
  80. package/fireproof/query-docs.test.ts +0 -117
  81. package/fireproof/query-limit-issue.test.ts +0 -147
  82. package/fireproof/query-property-inconsistency.test.ts +0 -90
  83. package/fireproof/query-result-properties.test.ts +0 -43
  84. package/fireproof/stable-cid.test.ts +0 -72
  85. package/fireproof/utils.test.ts +0 -137
  86. package/gateway/file/loader-config.test.ts +0 -309
  87. package/gateway/indexeddb/loader-config.test.ts +0 -80
  88. package/global-setup.ts +0 -11
  89. package/helpers.ts +0 -177
  90. package/protocols/cloud/msger.test.ts +0 -559
  91. package/runtime/fp-envelope-serialize.test.ts +0 -266
  92. package/runtime/key-bag.test.ts +0 -243
  93. package/runtime/meta-key-hack.test.ts +0 -103
  94. package/setup.file.ts +0 -1
  95. package/setup.indexeddb.ts +0 -0
  96. package/setup.memory.ts +0 -2
  97. package/tsconfig.json +0 -18
  98. package/vitest.config.ts +0 -8
  99. package/vitest.file.config.ts +0 -11
  100. package/vitest.indexeddb.config.ts +0 -34
  101. package/vitest.memory.config.ts +0 -24
@@ -1,266 +0,0 @@
1
- import { createDbMetaEvent } from "@fireproof/core-blockstore";
2
- import { mockSuperThis, simpleCID } from "../helpers.js";
3
- import { BuildURI, Result } from "@adviser/cement";
4
- import { fpDeserialize, fpSerialize } from "@fireproof/core-gateways-base";
5
- import {
6
- DbMetaEvent,
7
- FPEnvelopeCar,
8
- FPEnvelopeFile,
9
- FPEnvelopeMeta,
10
- FPEnvelopeTypes,
11
- FPEnvelopeWAL,
12
- SerializedMeta,
13
- WALState,
14
- } from "@fireproof/core-types-blockstore";
15
- import { toJSON } from "multiformats/link";
16
- import { describe, expect, it } from "vitest";
17
-
18
- describe("storage-content", () => {
19
- const sthis = mockSuperThis();
20
- it("car", async () => {
21
- const raw = new Uint8Array([55, 56, 57]);
22
- const res = await fpDeserialize(sthis, BuildURI.from("http://x.com?store=car&suffix=.car").URI(), Result.Ok(raw));
23
- expect(res.isOk()).toBeTruthy();
24
- expect(res.unwrap().type).toEqual(FPEnvelopeTypes.CAR);
25
- expect(res.unwrap().payload).toEqual(raw);
26
- });
27
-
28
- it("file", async () => {
29
- const raw = new Uint8Array([55, 56, 57]);
30
- const res = await fpDeserialize(sthis, BuildURI.from("http://x.com?store=file").URI(), Result.Ok(raw));
31
- expect(res.isOk()).toBeTruthy();
32
- expect(res.unwrap().type).toEqual(FPEnvelopeTypes.FILE);
33
- expect(res.unwrap().payload).toEqual(raw);
34
- });
35
-
36
- it("meta", async () => {
37
- const ref = [
38
- {
39
- cid: "bafyreiaqmtw5jfudn6r6dq7mcmytc2z5z3ggohcj3gco3omjsp3hr73fpy",
40
- data: "MomRkYXRhoWZkYk1ldGFYU3siY2FycyI6W3siLyI6ImJhZzR5dnFhYmNpcWNod29zeXQ3dTJqMmxtcHpyM2w3aWRlaTU1YzNmNnJ2Z3U3cXRmYXRoMnl2NnZuaWtjeXEifV19Z3BhcmVudHOA",
41
- parents: [(await simpleCID(sthis)).toString(), (await simpleCID(sthis)).toString()],
42
- },
43
- ];
44
- const raw = sthis.txt.encode(JSON.stringify(ref));
45
- const res = await fpDeserialize(sthis, BuildURI.from("http://x.com?store=meta").URI(), Result.Ok(raw));
46
- expect(res.isOk()).toBeTruthy();
47
- expect(res.unwrap().type).toEqual(FPEnvelopeTypes.META);
48
- const dbMetas = res.unwrap().payload as DbMetaEvent[];
49
- expect(dbMetas.length).toBe(1);
50
- const dbMeta = dbMetas[0];
51
- expect(dbMeta.parents.map((i) => i.toString())).toStrictEqual(ref[0].parents);
52
- expect(dbMeta.eventCid.toString()).toEqual("bafyreiaqmtw5jfudn6r6dq7mcmytc2z5z3ggohcj3gco3omjsp3hr73fpy");
53
- expect(dbMeta.dbMeta.cars.map((i) => i.toString())).toEqual([
54
- "bag4yvqabciqchwosyt7u2j2lmpzr3l7idei55c3f6rvgu7qtfath2yv6vnikcyq",
55
- ]);
56
- });
57
-
58
- it("wal", async () => {
59
- const ref = {
60
- fileOperations: [
61
- {
62
- cid: "bafyreiaqmtw5jfudn6r6dq7mcmytc2z5z3ggohcj3gco3omjsp3hr73fpy",
63
- public: false,
64
- },
65
- ],
66
- noLoaderOps: [
67
- {
68
- cars: [
69
- {
70
- "/": "bag4yvqabciqchwosyt7u2j2lmpzr3l7idei55c3f6rvgu7qtfath2yv6vnikcyq",
71
- },
72
- ],
73
- },
74
- ],
75
- operations: [
76
- {
77
- cars: [{ "/": "bag4yvqabciqchwosyt7u2j2lmpzr3l7idei55c3f6rvgu7qtfath2yv6vnikcyq" }],
78
- },
79
- ],
80
- };
81
- const raw = sthis.txt.encode(JSON.stringify(ref));
82
- const res = await fpDeserialize(sthis, BuildURI.from("http://x.com?store=wal").URI(), Result.Ok(raw));
83
- expect(res.isOk()).toBeTruthy();
84
- expect(res.unwrap().type).toEqual(FPEnvelopeTypes.WAL);
85
- const walstate = res.unwrap().payload as WALState;
86
- expect(
87
- walstate.fileOperations.map((i) => ({
88
- ...i,
89
- cid: i.cid.toString(),
90
- })),
91
- ).toEqual(ref.fileOperations);
92
- expect(
93
- walstate.noLoaderOps.map((i) => ({
94
- cars: i.cars.map((i) => toJSON(i)),
95
- })),
96
- ).toEqual(ref.noLoaderOps);
97
- expect(
98
- walstate.operations.map((i) => ({
99
- cars: i.cars.map((i) => toJSON(i)),
100
- })),
101
- ).toEqual(ref.operations);
102
- });
103
- });
104
-
105
- describe("de-serialize", () => {
106
- const sthis = mockSuperThis();
107
- it("car", async () => {
108
- const msg = {
109
- type: FPEnvelopeTypes.CAR,
110
- payload: new Uint8Array([55, 56, 57]),
111
- } satisfies FPEnvelopeCar;
112
- const res = await fpSerialize(sthis, msg);
113
- expect(res.Ok()).toEqual(msg.payload);
114
- });
115
-
116
- it("file", async () => {
117
- const msg = {
118
- type: FPEnvelopeTypes.FILE,
119
- payload: new Uint8Array([55, 56, 57]),
120
- } satisfies FPEnvelopeFile;
121
- const res = await fpSerialize(sthis, msg);
122
- expect(res.Ok()).toEqual(msg.payload);
123
- });
124
-
125
- it("meta", async () => {
126
- const msg = {
127
- type: FPEnvelopeTypes.META,
128
- payload: [
129
- await createDbMetaEvent(
130
- sthis,
131
- {
132
- cars: [await simpleCID(sthis)],
133
- },
134
- [await simpleCID(sthis), await simpleCID(sthis)],
135
- ),
136
- ],
137
- } satisfies FPEnvelopeMeta;
138
- const ser = await fpSerialize(sthis, msg);
139
- const res = await fpDeserialize(sthis, BuildURI.from("http://x.com?store=meta").URI(), ser);
140
- const dbMetas = res.unwrap().payload as DbMetaEvent[];
141
- expect(dbMetas.length).toBe(1);
142
- const dbMeta = dbMetas[0];
143
- expect(dbMeta.parents).toEqual(msg.payload[0].parents);
144
- expect(dbMeta.dbMeta).toEqual(msg.payload[0].dbMeta);
145
- expect(dbMeta.eventCid).toEqual(msg.payload[0].eventCid);
146
- });
147
-
148
- it("wal", async () => {
149
- const msg = {
150
- type: FPEnvelopeTypes.WAL,
151
- payload: {
152
- fileOperations: [
153
- {
154
- cid: await simpleCID(sthis),
155
- public: false,
156
- },
157
- ],
158
- noLoaderOps: [
159
- {
160
- cars: [await simpleCID(sthis)],
161
- },
162
- ],
163
- operations: [
164
- {
165
- cars: [await simpleCID(sthis)],
166
- },
167
- ],
168
- },
169
- } satisfies FPEnvelopeWAL;
170
- const ser = await fpSerialize(sthis, msg);
171
- const res = await fpDeserialize(sthis, BuildURI.from("http://x.com?store=wal").URI(), ser);
172
- expect(res.isOk()).toBeTruthy();
173
- expect(res.unwrap().type).toEqual("wal");
174
- const walstate = res.unwrap().payload as WALState;
175
- expect(walstate.fileOperations).toEqual(msg.payload.fileOperations);
176
- expect(walstate.noLoaderOps).toEqual(msg.payload.noLoaderOps);
177
- expect(walstate.operations).toEqual(msg.payload.operations);
178
- });
179
-
180
- it("coerce into fpDeserialize Result", async () => {
181
- const raw = new Uint8Array([55, 56, 57]);
182
- const res = await fpDeserialize(sthis, BuildURI.from("http://x.com?store=car&suffix=.car").URI(), Result.Ok(raw));
183
- expect(res.isOk()).toBeTruthy();
184
- expect(res.unwrap().type).toEqual(FPEnvelopeTypes.CAR);
185
- expect(res.unwrap().payload).toEqual(raw);
186
- });
187
-
188
- it("coerce into fpDeserialize Promise", async () => {
189
- const raw = new Uint8Array([55, 56, 57]);
190
- const res = await fpDeserialize(sthis, BuildURI.from("http://x.com?store=car&suffix=.car").URI(), Promise.resolve(raw));
191
- expect(res.isOk()).toBeTruthy();
192
- expect(res.unwrap().type).toEqual(FPEnvelopeTypes.CAR);
193
- expect(res.unwrap().payload).toEqual(raw);
194
- });
195
-
196
- it("coerce into fpDeserialize Promise Result", async () => {
197
- const raw = new Uint8Array([55, 56, 57]);
198
- const res = await fpDeserialize(
199
- sthis,
200
- BuildURI.from("http://x.com?store=car&suffix=.car").URI(),
201
- Promise.resolve(Result.Ok(raw)),
202
- );
203
- expect(res.isOk()).toBeTruthy();
204
- expect(res.unwrap().type).toEqual(FPEnvelopeTypes.CAR);
205
- expect(res.unwrap().payload).toEqual(raw);
206
- });
207
-
208
- it("coerce into fpDeserialize Promise Result.Err", async () => {
209
- const raw = Promise.resolve(Result.Err<Uint8Array>("error"));
210
- const res = await fpDeserialize(sthis, BuildURI.from("http://x.com?store=car&suffix=.car").URI(), raw);
211
- expect(res.isErr()).toBeTruthy();
212
- expect(res.unwrap_err().message).toEqual("error");
213
- });
214
-
215
- it("coerce into fpDeserialize Promise.reject", async () => {
216
- const raw = Promise.reject(new Error("error"));
217
- const res = await fpDeserialize(sthis, BuildURI.from("http://x.com?store=car&suffix=.car").URI(), raw);
218
- expect(res.isErr()).toBeTruthy();
219
- expect(res.unwrap_err().message).toEqual("error");
220
- });
221
-
222
- it("coerce into fpDeserialize Result.Err", async () => {
223
- const raw = Result.Err<Uint8Array>("error");
224
- const res = await fpDeserialize(sthis, BuildURI.from("http://x.com?store=car&suffix=.car").URI(), raw);
225
- expect(res.isErr()).toBeTruthy();
226
- expect(res.unwrap_err().message).toEqual("error");
227
- });
228
-
229
- it("attach Key to Meta", async () => {
230
- const msg = {
231
- type: FPEnvelopeTypes.META,
232
- payload: [
233
- await createDbMetaEvent(
234
- sthis,
235
- {
236
- cars: [await simpleCID(sthis)],
237
- },
238
- [await simpleCID(sthis), await simpleCID(sthis)],
239
- ),
240
- ],
241
- } satisfies FPEnvelopeMeta;
242
- const ser = await fpSerialize(sthis, msg, {
243
- meta: async (sthis, payload) => {
244
- return Result.Ok(sthis.txt.encode(JSON.stringify(payload.map((i) => ({ ...i, key: "key" })))));
245
- },
246
- });
247
- let key = "";
248
- const res = await fpDeserialize(sthis, BuildURI.from("http://x.com?store=meta").URI(), ser, {
249
- meta: async (sthis, payload) => {
250
- const json = JSON.parse(sthis.txt.decode(payload));
251
- key = json[0].key;
252
- return Result.Ok(
253
- json.map((i: { key?: string }) => {
254
- delete i.key;
255
- return i;
256
- }) as SerializedMeta[],
257
- );
258
- },
259
- });
260
- expect(res.isOk()).toBeTruthy();
261
- const meta = res.unwrap() as FPEnvelopeMeta;
262
- expect(meta.type).toEqual("meta");
263
- expect(Object.keys(meta.payload).includes("key")).toBeFalsy();
264
- expect(key).toEqual("key");
265
- });
266
- });
@@ -1,243 +0,0 @@
1
- import { Result, URI } from "@adviser/cement";
2
- import { getKeyBag, KeyBagProviderMemory } from "@fireproof/core-keybag";
3
- import { ensureSuperThis } from "@fireproof/core-runtime";
4
- import { KeyBagIf, V2KeysItem, V2StorageKeyItem } from "@fireproof/core-types-base";
5
- import { isKeyUpsertResultModified, KeysByFingerprint } from "@fireproof/core-types-blockstore";
6
- import { base58btc } from "multiformats/bases/base58";
7
- import { assert, describe, expect, it } from "vitest";
8
-
9
- // const v2Keybag = {
10
- // name: "@test-v1-keys-wal@",
11
- // keys: {
12
- // z7oNYUrGpALe6U5ePvhdD3ufHdLerw4wPWHJERE3383zJ: {
13
- // default: true,
14
- // fingerPrint: "z7oNYUrGpALe6U5ePvhdD3ufHdLerw4wPWHJERE3383zJ",
15
- // key: "zL89nmBmogeRptW9b7e9j7L",
16
- // },
17
- // },
18
- // };
19
-
20
- const v1Keybag = {
21
- name: "@test-v1-keys-wal@",
22
- key: "zL89nmBmogeRptW9b7e9j7L",
23
- };
24
-
25
- async function keyExtracted(
26
- rKbf: Result<KeysByFingerprint>,
27
- fingerPrint?: string,
28
- ): Promise<{ fingerPrint: string; key: string } | undefined> {
29
- const kbf = await rKbf.Ok().get(fingerPrint);
30
- if (!kbf) {
31
- return undefined;
32
- }
33
- return {
34
- fingerPrint: kbf.fingerPrint,
35
- key: (await kbf.extract()).keyStr,
36
- };
37
- }
38
-
39
- async function calculateFingerprint(rKbf: Result<KeysByFingerprint>, kb: KeyBagIf): Promise<string> {
40
- const item = await rKbf.Ok().get();
41
- const v2Item = await (
42
- item as unknown as {
43
- asV2StorageKeyItem: () => Promise<V2StorageKeyItem>;
44
- }
45
- ).asV2StorageKeyItem();
46
- const keyBytes = base58btc.decode(v2Item.key);
47
- const hash = await kb.rt.crypto.digestSHA256(keyBytes);
48
- return base58btc.encode(new Uint8Array(hash));
49
- }
50
-
51
- describe("KeyBag", () => {
52
- it("v1 migration", async () => {
53
- const sthis = ensureSuperThis();
54
- await sthis.start();
55
-
56
- const kp = new KeyBagProviderMemory(URI.from("memory://./dist/tests/"), sthis);
57
- kp.set(v1Keybag as unknown as V2KeysItem);
58
-
59
- const kb = await getKeyBag(sthis, {
60
- url: "memory://./dist/tests/?extractKey=_deprecated_internal_api",
61
- });
62
- const rKbf = await kb.getNamedKey("@test-v1-keys-wal@");
63
- expect(rKbf.isOk()).toBeTruthy();
64
-
65
- const fpr = await calculateFingerprint(rKbf, kb);
66
-
67
- expect(await rKbf.Ok().asV2KeysItem()).toEqual({
68
- keys: {
69
- z7oNYUrGpALe6U5ePvhdD3ufHdLerw4wPWHJERE3383zJ: {
70
- default: true,
71
- fingerPrint: fpr,
72
- key: "zL89nmBmogeRptW9b7e9j7L",
73
- },
74
- },
75
- name: "@test-v1-keys-wal@",
76
- });
77
-
78
- const kb2 = await getKeyBag(sthis, {
79
- url: "memory://./dist/tests/?extractKey=_deprecated_internal_api",
80
- });
81
- for (const rkbf of [rKbf, await kb2.getNamedKey("@test-v1-keys-wal@")]) {
82
- expect(await keyExtracted(rkbf)).toEqual({
83
- fingerPrint: "z7oNYUrGpALe6U5ePvhdD3ufHdLerw4wPWHJERE3383zJ",
84
- key: "zL89nmBmogeRptW9b7e9j7L",
85
- });
86
- expect(await keyExtracted(rkbf, "z7oNYUrGpALe6U5ePvhdD3ufHdLerw4wPWHJERE3383zJ")).toEqual({
87
- fingerPrint: "z7oNYUrGpALe6U5ePvhdD3ufHdLerw4wPWHJERE3383zJ",
88
- key: "zL89nmBmogeRptW9b7e9j7L",
89
- });
90
- expect(await keyExtracted(rkbf, "kaputt-x")).toBeUndefined();
91
- }
92
- expect(await kp.get(v1Keybag.name)).toEqual({
93
- keys: {
94
- z7oNYUrGpALe6U5ePvhdD3ufHdLerw4wPWHJERE3383zJ: {
95
- default: true,
96
- fingerPrint: "z7oNYUrGpALe6U5ePvhdD3ufHdLerw4wPWHJERE3383zJ",
97
- key: "zL89nmBmogeRptW9b7e9j7L",
98
- },
99
- },
100
- name: "@test-v1-keys-wal@",
101
- });
102
- });
103
-
104
- it("implicit creation", async () => {
105
- const sthis = ensureSuperThis();
106
- await sthis.start();
107
-
108
- const kp = new KeyBagProviderMemory(URI.from("memory://./dist/tests/"), sthis);
109
- kp.set(v1Keybag as unknown as V2KeysItem);
110
-
111
- const kb = await getKeyBag(sthis, {
112
- url: "memory://./dist/tests/?extractKey=_deprecated_internal_api",
113
- });
114
- const key1Material = kb.rt.crypto.randomBytes(kb.rt.keyLength);
115
- const rKbf = await kb.getNamedKey("kaputt", false, key1Material);
116
- expect(rKbf.isOk()).toBeTruthy();
117
- const one = await rKbf.Ok().asV2KeysItem();
118
- expect(Object.keys(one.keys).length).toBe(1);
119
- const key1Fpr = (await rKbf.Ok().get())?.fingerPrint;
120
- expect(await keyExtracted(rKbf)).toEqual({
121
- fingerPrint: key1Fpr,
122
- key: base58btc.encode(key1Material),
123
- });
124
-
125
- const key2Material = kb.rt.crypto.randomBytes(kb.rt.keyLength);
126
- const rKey2 = await rKbf.Ok().upsert(key2Material);
127
- const key2 = rKey2.Ok();
128
- if (!isKeyUpsertResultModified(key2)) {
129
- assert("key2 not modified");
130
- return;
131
- }
132
-
133
- const keys2 = await rKbf.Ok().asV2KeysItem();
134
- expect(Object.keys(keys2.keys).length).toBe(2);
135
-
136
- expect(await kp.get("kaputt")).toEqual(keys2);
137
-
138
- const rKbf2 = await kb.getNamedKey("kaputt");
139
-
140
- expect(Object.keys(await rKbf2.Ok().asV2KeysItem()).length).toBe(2);
141
-
142
- expect((await rKbf2.Ok().get())?.fingerPrint).toEqual(key1Fpr);
143
-
144
- const asKeysItem = await rKbf.Ok().asV2KeysItem();
145
- expect(asKeysItem.name).toEqual("kaputt");
146
- expect(Array.from(Object.values(asKeysItem.keys))).toEqual([
147
- {
148
- default: true,
149
- fingerPrint: key1Fpr,
150
- key: base58btc.encode(key1Material),
151
- },
152
- {
153
- default: false,
154
- fingerPrint: key2.kfp.fingerPrint,
155
- key: base58btc.encode(key2Material),
156
- },
157
- ]);
158
-
159
- const key3Material = kb.rt.crypto.randomBytes(kb.rt.keyLength);
160
- const rKey3 = await rKbf2.Ok().upsert(key3Material, true);
161
- const key3 = rKey3.Ok();
162
- if (!isKeyUpsertResultModified(key3)) {
163
- assert("key3 not modified");
164
- return;
165
- }
166
-
167
- expect(
168
- Object.keys(
169
- await rKbf2
170
- .Ok()
171
- .asV2KeysItem()
172
- .then((i) => i.keys),
173
- ).length,
174
- ).toBe(3);
175
- const v2Key3 = await (key3.kfp as unknown as { asV2StorageKeyItem: () => Promise<V2StorageKeyItem> }).asV2StorageKeyItem();
176
-
177
- expect(await kp.get("kaputt")).toEqual({
178
- keys: {
179
- ...resetDefault(one.keys),
180
- ...resetDefault(keys2.keys),
181
- [v2Key3.fingerPrint]: v2Key3,
182
- },
183
- name: "kaputt",
184
- });
185
- });
186
-
187
- it("simple default", async () => {
188
- const sthis = ensureSuperThis();
189
- await sthis.start();
190
-
191
- const kb = await getKeyBag(sthis);
192
-
193
- const keyName = "simple" + sthis.nextId().str;
194
-
195
- const rKbf1 = await kb.getNamedKey(keyName);
196
- const kfp1 = await rKbf1
197
- .Ok()
198
- .get()
199
- .then((i) => (i as unknown as { asV2StorageKeyItem: () => Promise<V2StorageKeyItem> }).asV2StorageKeyItem());
200
- expect(kfp1?.fingerPrint).toBeTypeOf("string");
201
-
202
- const rKbf2 = await kb.getNamedKey(keyName);
203
- expect(await rKbf2.Ok().get()).toBeDefined();
204
- const kfp2 = await rKbf2.Ok().get();
205
- expect(kfp1?.fingerPrint).toBe(kfp2?.fingerPrint);
206
-
207
- expect(await kb.rt.getBagProvider().then((i) => i.get(keyName))).toEqual({
208
- keys: {
209
- [kfp1?.fingerPrint as string]: {
210
- default: true,
211
- fingerPrint: kfp1?.fingerPrint,
212
- key: kfp1?.key,
213
- },
214
- },
215
- name: keyName,
216
- });
217
- });
218
- it("test stable id", async () => {
219
- const sthis = ensureSuperThis();
220
- await sthis.start();
221
-
222
- const kp = new KeyBagProviderMemory(URI.from("memory://./dist/tests/"), sthis);
223
- kp.set(v1Keybag as unknown as V2KeysItem);
224
-
225
- const kb = await getKeyBag(sthis, {
226
- url: "memory://./dist/tests/?extractKey=_deprecated_internal_api",
227
- });
228
-
229
- const name = "default-key" + Math.random();
230
- const rMyKey = await kb.getNamedKey(name);
231
-
232
- for (let i = 0; i < 10; ++i) {
233
- expect(await kb.getNamedKey(name).then((i) => i.Ok().id)).toEqual(rMyKey.Ok().id);
234
- }
235
- });
236
- });
237
-
238
- function resetDefault(keys: Record<string, V2StorageKeyItem>) {
239
- return Array.from(Object.values(keys)).reduce(
240
- (acc, i) => ({ ...acc, [i.fingerPrint]: { ...i, default: false } }),
241
- {} as Record<string, V2StorageKeyItem>,
242
- );
243
- }
@@ -1,103 +0,0 @@
1
- import { BuildURI, URI } from "@adviser/cement";
2
- import { fireproof } from "@fireproof/core-base";
3
- import { registerStoreProtocol } from "@fireproof/core-blockstore";
4
- import { MemoryGateway } from "@fireproof/core-gateways-memory";
5
- import { DbMetaEvent, Loadable, V2SerializedMetaKey } from "@fireproof/core-types-blockstore";
6
- import { AddKeyToDbMetaGateway } from "@fireproof/core-gateways-base";
7
- import { beforeAll, describe, expect, it, vitest } from "vitest";
8
- import { KeyBag } from "@fireproof/core-keybag";
9
- import { ensureSuperThis } from "@fireproof/core-runtime";
10
- import { Database, PARAM } from "@fireproof/core-types-base";
11
-
12
- describe("MetaKeyHack", () => {
13
- const storageMap = new Map();
14
-
15
- const sthis = ensureSuperThis();
16
- const memGw = new MemoryGateway(sthis, storageMap);
17
- registerStoreProtocol({
18
- protocol: "hack:",
19
- defaultURI: () => URI.from(`hack://localhost?version=hack`),
20
- serdegateway: async () => {
21
- return new AddKeyToDbMetaGateway(memGw, "v2");
22
- },
23
- });
24
-
25
- let db: Database;
26
- let ctx: { loader: Loadable };
27
- beforeAll(async () => {
28
- db = fireproof("test", {
29
- storeUrls: {
30
- base: BuildURI.from("hack://localhost").setParam(PARAM.SELF_REFLECT, "x"),
31
- },
32
- keyBag: {
33
- url: "memory://./dist/kb-dir-partykit?extractKey=_deprecated_internal_api",
34
- },
35
- });
36
- await db.ready();
37
- ctx = { loader: db.ledger.crdt.blockstore.loader };
38
- });
39
-
40
- it("inject key into meta", async () => {
41
- const loader = db.ledger.crdt.blockstore.loader;
42
- const metaStore = loader.attachedStores.local().active.meta;
43
- const subscribeFn = vitest.fn();
44
- const unreg = await metaStore.realGateway.subscribe(
45
- ctx,
46
- metaStore.url(),
47
- // metaStore.url().build().setParam(PARAM.SELF_REFLECT, "x").URI(),
48
- subscribeFn,
49
- );
50
- expect(unreg.isOk()).toBeTruthy();
51
- await db.put({ val: "test" });
52
-
53
- const dataStore = loader.attachedStores.local().active.car;
54
- const kb = new KeyBag(db.ledger.opts.keyBag);
55
- const rDataStoreKeyItem = await kb.getNamedKey(dataStore.url().getParam(PARAM.STORE_KEY) ?? "");
56
-
57
- await rDataStoreKeyItem.Ok().upsert("zBUFMmu5c3VdCa4r2DZTzhR", false);
58
- await rDataStoreKeyItem.Ok().upsert("zH1fyizirAiYVxoaQ2XZ3Xj", false);
59
-
60
- expect(rDataStoreKeyItem.isOk()).toBeTruthy();
61
- const rUrl = await memGw.buildUrl(metaStore.url(), "main");
62
- // console.log(">>>>", rUrl.Ok().toString())
63
- const rGet = await memGw.get(rUrl.Ok(), sthis);
64
- const metas = JSON.parse(ctx.loader.sthis.txt.decode(rGet.Ok())) as V2SerializedMetaKey;
65
- const keyMaterials = metas.keys;
66
- const dataStoreKeyMaterial = await rDataStoreKeyItem.Ok().asV2KeysItem();
67
- expect(keyMaterials.length).toBeGreaterThan(0);
68
- expect(dataStoreKeyMaterial).toEqual({
69
- keys: {
70
- ...(await rDataStoreKeyItem
71
- .Ok()
72
- .get()
73
- .then(async (r) => ({
74
- [r?.fingerPrint as string]: {
75
- default: true,
76
- fingerPrint: r?.fingerPrint,
77
- key: await r?.extract().then((i) => i.keyStr),
78
- },
79
- }))),
80
- z3boMcLEQxjZAMrVo2j3k9bZJzmSqXkQmh6q7bLZ2nRuo: {
81
- default: false,
82
- fingerPrint: "z3boMcLEQxjZAMrVo2j3k9bZJzmSqXkQmh6q7bLZ2nRuo",
83
- key: "zH1fyizirAiYVxoaQ2XZ3Xj",
84
- },
85
- zG5F2VWVAs3uAFyLE5rty5WWo7zJ1oBmYTdnraxfhaHG5: {
86
- default: false,
87
- fingerPrint: "zG5F2VWVAs3uAFyLE5rty5WWo7zJ1oBmYTdnraxfhaHG5",
88
- key: "zBUFMmu5c3VdCa4r2DZTzhR",
89
- },
90
- },
91
- name: "@test-data@",
92
- });
93
-
94
- // expect(keyMaterials.every((k) => k === dataStoreKeyMaterial.keyStr)).toBeTruthy()
95
- // expect(subscribeFn.mock.calls).toEqual([]);
96
- expect(subscribeFn).toHaveBeenCalledTimes(2);
97
- const addKeyToDbMetaGateway = metaStore.realGateway as AddKeyToDbMetaGateway;
98
- expect(
99
- subscribeFn.mock.calls.map((i) => i.map((i) => i.payload.map((i: DbMetaEvent) => i.eventCid.toString()))).flat(2),
100
- ).toEqual(Array.from(new Set(addKeyToDbMetaGateway.lastDecodedMetas.map((i) => i.metas.map((i) => i.cid)).flat(2))));
101
- unreg.Ok()();
102
- });
103
- });
package/setup.file.ts DELETED
@@ -1 +0,0 @@
1
- process.env.FP_STORAGE_URL = "./dist/fp-dir-file";
File without changes
package/setup.memory.ts DELETED
@@ -1,2 +0,0 @@
1
- process.env.FP_STORAGE_URL = "memory://test";
2
- process.env.FP_KEYBAG_URL = "memory://keybag";
package/tsconfig.json DELETED
@@ -1,18 +0,0 @@
1
- {
2
- "extends": [
3
- "/home/runner/work/fireproof/fireproof/tsconfig.dist.json"
4
- ],
5
- "compilerOptions": {
6
- "noEmit": false,
7
- "outDir": "./"
8
- },
9
- "include": [
10
- "**/*"
11
- ],
12
- "exclude": [
13
- "node_modules",
14
- "dist",
15
- ".git",
16
- ".vscode"
17
- ]
18
- }
package/vitest.config.ts DELETED
@@ -1,8 +0,0 @@
1
- import { defineConfig } from "vitest/config";
2
-
3
- export default defineConfig({
4
- test: {
5
- projects: ["vitest.file.config.ts", "vitest.memory.config.ts", "vitest.indexeddb.config.ts"],
6
- globalSetup: "global-setup.ts",
7
- },
8
- });
@@ -1,11 +0,0 @@
1
- import { defineConfig } from "vitest/config";
2
-
3
- export default defineConfig({
4
- test: {
5
- name: "core:file",
6
- exclude: ["dist/**", "node_modules/**", "react/**", "examples/**", "gateway/indexeddb"],
7
- include: ["**/*test.?(c|m)[jt]s?(x)"],
8
- globals: true,
9
- setupFiles: "./setup.file.ts",
10
- },
11
- });
@@ -1,34 +0,0 @@
1
- /// <reference types="@vitest/browser/providers/playwright" />
2
- /// <reference types="@vitest/browser/providers/webdriverio" />
3
-
4
- import { defineConfig } from "vitest/config";
5
-
6
- export default defineConfig({
7
- test: {
8
- name: "indexeddb",
9
- exclude: ["dist/**", "node_modules/**", "examples/**", "gateway/file"],
10
- include: ["**/*test.?(c|m)[jt]s?(x)"],
11
- browser: {
12
- enabled: true,
13
- headless: true,
14
- provider: "playwright",
15
- // provider: "webdriverio",
16
- // name: "chrome",
17
- instances: [
18
- {
19
- browser: "chromium",
20
- //setupFile: './chromium-setup.js',
21
- },
22
- ],
23
-
24
- // name: process.env.FP_BROWSER || "chrome", // browser name is required
25
- // instances: [
26
- // {
27
- // browser: process.env.FP_BROWSER || "chrome", // browser name is required
28
- // },
29
- // ],
30
- },
31
- globals: true,
32
- setupFiles: "./setup.indexeddb.ts",
33
- },
34
- });