@fireproof/core 0.19.121-dev → 0.20.0-dev-preview-05

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. package/README.md +13 -12
  2. package/deno/index.d.ts +7 -0
  3. package/deno/index.js +66 -0
  4. package/deno/index.js.map +1 -0
  5. package/deno/metafile-esm.json +1 -0
  6. package/deno.json +3 -4
  7. package/index.cjs +1797 -1431
  8. package/index.cjs.map +1 -1
  9. package/index.d.cts +760 -381
  10. package/index.d.ts +760 -381
  11. package/index.js +1976 -913
  12. package/index.js.map +1 -1
  13. package/metafile-cjs.json +1 -1
  14. package/metafile-esm.json +1 -1
  15. package/node/{node-filesystem.cjs → index.cjs} +17 -6
  16. package/node/index.cjs.map +1 -0
  17. package/node/index.d.cts +7 -0
  18. package/node/index.d.ts +7 -0
  19. package/node/{node-filesystem.js → index.js} +25 -5
  20. package/node/index.js.map +1 -0
  21. package/node/metafile-cjs.json +1 -1
  22. package/node/metafile-esm.json +1 -1
  23. package/package.json +27 -17
  24. package/react/index.cjs +22 -22
  25. package/react/index.cjs.map +1 -1
  26. package/react/index.d.cts +7 -7
  27. package/react/index.d.ts +7 -7
  28. package/react/index.js +22 -22
  29. package/react/index.js.map +1 -1
  30. package/react/metafile-cjs.json +1 -1
  31. package/react/metafile-esm.json +1 -1
  32. package/tests/blockstore/fp-envelope.test.ts-off +65 -0
  33. package/tests/blockstore/interceptor-gateway.test.ts +122 -0
  34. package/tests/blockstore/keyed-crypto-indexdb-file.test.ts +130 -0
  35. package/tests/blockstore/keyed-crypto.test.ts +75 -118
  36. package/tests/blockstore/loader.test.ts +18 -9
  37. package/tests/blockstore/store.test.ts +40 -31
  38. package/tests/blockstore/transaction.test.ts +14 -13
  39. package/tests/fireproof/all-gateway.test.ts +286 -216
  40. package/tests/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.ts +324 -316
  41. package/tests/fireproof/crdt.test.ts +78 -19
  42. package/tests/fireproof/fireproof.test.ts +111 -92
  43. package/tests/fireproof/hello.test.ts +21 -17
  44. package/tests/fireproof/indexer.test.ts +74 -50
  45. package/tests/fireproof/{database.test.ts → ledger.test.ts} +241 -45
  46. package/tests/fireproof/multiple-ledger.test.ts +2 -2
  47. package/tests/fireproof/utils.test.ts +47 -6
  48. package/tests/gateway/file/loader-config.test.ts +307 -0
  49. package/tests/gateway/fp-envelope-serialize.test.ts +256 -0
  50. package/tests/gateway/indexdb/loader-config.test.ts +79 -0
  51. package/tests/helpers.ts +44 -17
  52. package/tests/react/useFireproof.test.tsx +2 -2
  53. package/tests/www/gallery.html +2 -2
  54. package/tests/www/todo-aws.html +1 -1
  55. package/tests/www/todo-ipfs.html +1 -1
  56. package/tests/www/todo-local.html +1 -1
  57. package/tests/www/todo.html +25 -4
  58. package/web/index.cjs +218 -0
  59. package/web/index.cjs.map +1 -0
  60. package/web/index.d.cts +30 -0
  61. package/web/index.d.ts +30 -0
  62. package/web/index.js +195 -0
  63. package/web/index.js.map +1 -0
  64. package/web/metafile-cjs.json +1 -1
  65. package/web/metafile-esm.json +1 -1
  66. package/chunk-7EWIAXTM.js +0 -7
  67. package/chunk-7EWIAXTM.js.map +0 -1
  68. package/chunk-F4FC6B2T.js +0 -63
  69. package/chunk-F4FC6B2T.js.map +0 -1
  70. package/chunk-PZ5AY32C.js +0 -10
  71. package/chunk-PZ5AY32C.js.map +0 -1
  72. package/chunk-RXC4JGJT.js +0 -301
  73. package/chunk-RXC4JGJT.js.map +0 -1
  74. package/gateway-C62S56GY.js +0 -66
  75. package/gateway-C62S56GY.js.map +0 -1
  76. package/gateway-VVS4QWDA.js +0 -145
  77. package/gateway-VVS4QWDA.js.map +0 -1
  78. package/key-bag-file-PWZ3QE7B.js +0 -55
  79. package/key-bag-file-PWZ3QE7B.js.map +0 -1
  80. package/key-bag-indexdb-SYG3YD4D.js +0 -51
  81. package/key-bag-indexdb-SYG3YD4D.js.map +0 -1
  82. package/node/chunk-4A4RAVNS.js +0 -17
  83. package/node/chunk-4A4RAVNS.js.map +0 -1
  84. package/node/mem-filesystem.cjs +0 -72
  85. package/node/mem-filesystem.cjs.map +0 -1
  86. package/node/mem-filesystem.d.cts +0 -25
  87. package/node/mem-filesystem.d.ts +0 -25
  88. package/node/mem-filesystem.js +0 -40
  89. package/node/mem-filesystem.js.map +0 -1
  90. package/node/node-filesystem.cjs.map +0 -1
  91. package/node/node-filesystem.d.cts +0 -35
  92. package/node/node-filesystem.d.ts +0 -35
  93. package/node/node-filesystem.js.map +0 -1
  94. package/tests/fireproof/config.test.ts +0 -172
  95. package/utils-ZVVGAXFE.js +0 -13
  96. package/utils-ZVVGAXFE.js.map +0 -1
  97. package/web/gateway-impl.cjs +0 -183
  98. package/web/gateway-impl.cjs.map +0 -1
  99. package/web/gateway-impl.d.cts +0 -31
  100. package/web/gateway-impl.d.ts +0 -31
  101. package/web/gateway-impl.js +0 -162
  102. package/web/gateway-impl.js.map +0 -1
  103. /package/tests/blockstore/{fragment-gateway.test.ts → fragment-gateway.test.ts-off} +0 -0
@@ -0,0 +1,307 @@
1
+ import { BuildURI, CoerceURI, URI } from "@adviser/cement";
2
+ import { fireproof, PARAM, rt, SuperThis } from "@fireproof/core";
3
+ import { mockSuperThis } from "../../helpers.js";
4
+
5
+ function dataDir(sthis: SuperThis, name?: string, base?: CoerceURI): URI {
6
+ if (!base) {
7
+ const home = sthis.env.get("HOME") || "./";
8
+ base =
9
+ sthis.env.get("FP_STORAGE_URL") ||
10
+ `file://${sthis.pathOps.join(home, ".fireproof", rt.FILESTORE_VERSION.replace(/-.*$/, ""))}?${PARAM.URL_GEN}=default`;
11
+ }
12
+ return URI.from(base.toString())
13
+ .build()
14
+ .setParam(PARAM.NAME, name || "")
15
+ .URI();
16
+ }
17
+
18
+ const _my_app = "my-app";
19
+ function my_app() {
20
+ return _my_app;
21
+ }
22
+
23
+ describe("config file gateway", () => {
24
+ const sthis = mockSuperThis();
25
+ // const isMemFS: { fs?: string } = {};
26
+
27
+ beforeAll(async () => {
28
+ await sthis.start();
29
+ // const url = URI.from(sthis.env.get("FP_STORAGE_URL"));
30
+ // if (url.getParam("fs") === "mem") {
31
+ // isMemFS.fs = "mem";
32
+ // }
33
+ });
34
+
35
+ it("loader", async () => {
36
+ const db = fireproof(my_app());
37
+ await db.put({ name: "my-app" });
38
+ expect(db.name).toBe(my_app());
39
+
40
+ const fileStore = await db.crdt.blockstore.loader?.fileStore();
41
+ expect(fileStore?.url().asObj()).toEqual({
42
+ pathname: "./dist/fp-dir-file",
43
+ protocol: "file:",
44
+ searchParams: {
45
+ // ...isMemFS,
46
+ name: "my-app",
47
+ store: "data",
48
+ storekey: "@my-app-data@",
49
+ urlGen: "fromEnv",
50
+ version: "v0.19-file",
51
+ },
52
+ style: "path",
53
+ });
54
+
55
+ const dataStore = await db.crdt.blockstore.loader?.carStore();
56
+ expect(dataStore?.url().asObj()).toEqual({
57
+ pathname: "./dist/fp-dir-file",
58
+ protocol: "file:",
59
+ searchParams: {
60
+ // ...isMemFS,
61
+ name: "my-app",
62
+ store: "data",
63
+ suffix: ".car",
64
+ storekey: "@my-app-data@",
65
+ urlGen: "fromEnv",
66
+ version: "v0.19-file",
67
+ },
68
+ style: "path",
69
+ });
70
+ const metaStore = await db.crdt.blockstore.loader?.metaStore();
71
+ expect(metaStore?.url().asObj()).toEqual({
72
+ pathname: "./dist/fp-dir-file",
73
+ protocol: "file:",
74
+ searchParams: {
75
+ // ...isMemFS,
76
+ name: "my-app",
77
+ store: "meta",
78
+ storekey: "@my-app-meta@",
79
+ urlGen: "fromEnv",
80
+ version: "v0.19-file",
81
+ },
82
+ style: "path",
83
+ });
84
+ const WALStore = await db.crdt.blockstore.loader?.WALStore();
85
+ expect(WALStore?.url().asObj()).toEqual({
86
+ pathname: "./dist/fp-dir-file",
87
+ protocol: "file:",
88
+ searchParams: {
89
+ // ...isMemFS,
90
+ name: "my-app",
91
+ store: "wal",
92
+ storekey: "@my-app-wal@",
93
+ urlGen: "fromEnv",
94
+ version: "v0.19-file",
95
+ },
96
+ style: "path",
97
+ });
98
+ await db.close();
99
+ });
100
+
101
+ it("file path", async () => {
102
+ let baseDir = "./dist/data".replace(/\?.*$/, "").replace(/^file:\/\//, "");
103
+ baseDir = sthis.pathOps.join(baseDir, /* testCfg(sthis, "data").version, */ my_app());
104
+ const base = BuildURI.from("./dist/data");
105
+ // if (isMemFS.fs) {
106
+ // base.setParam("fs", isMemFS.fs);
107
+ // }
108
+ const sysfs = await rt.gw.file.sysFileSystemFactory(base.URI());
109
+ await sysfs.rm(baseDir, { recursive: true }).catch(() => {
110
+ /* */
111
+ });
112
+
113
+ const db = fireproof(my_app(), { storeUrls: { base } });
114
+ // console.log(`>>>>>>>>>>>>>>>file-path`)
115
+ await db.put({ name: "my-app" });
116
+ expect(db.name).toBe(my_app());
117
+ const carStore = await db.crdt.blockstore.loader?.carStore();
118
+ expect(carStore?.url().asObj()).toEqual({
119
+ pathname: "./dist/data",
120
+ protocol: "file:",
121
+ searchParams: {
122
+ // ...isMemFS,
123
+ name: "my-app",
124
+ store: "data",
125
+ storekey: "@my-app-data@",
126
+ suffix: ".car",
127
+ version: "v0.19-file",
128
+ },
129
+ style: "path",
130
+ });
131
+ const fileStore = await db.crdt.blockstore.loader?.fileStore();
132
+ expect(fileStore?.url().asObj()).toEqual({
133
+ pathname: "./dist/data",
134
+ protocol: "file:",
135
+ searchParams: {
136
+ // ...isMemFS,
137
+ name: "my-app",
138
+ store: "data",
139
+ storekey: "@my-app-data@",
140
+ version: "v0.19-file",
141
+ },
142
+ style: "path",
143
+ });
144
+ expect((await sysfs.stat(sthis.pathOps.join(baseDir, "data"))).isDirectory()).toBeTruthy();
145
+ const metaStore = await db.crdt.blockstore.loader?.metaStore();
146
+ expect(metaStore?.url().asObj()).toEqual({
147
+ pathname: "./dist/data",
148
+ protocol: "file:",
149
+ searchParams: {
150
+ // ...isMemFS,
151
+ name: "my-app",
152
+ store: "meta",
153
+ storekey: "@my-app-meta@",
154
+ version: "v0.19-file",
155
+ },
156
+ style: "path",
157
+ });
158
+ expect((await sysfs.stat(sthis.pathOps.join(baseDir, "meta"))).isDirectory()).toBeTruthy();
159
+ await db.close();
160
+ });
161
+
162
+ it("homedir default", async () => {
163
+ const old = sthis.env.get("FP_STORAGE_URL");
164
+ sthis.env.delete("FP_STORAGE_URL");
165
+ // this switches file: protocol not memory:
166
+ let baseDir = dataDir(sthis, my_app()).pathname;
167
+ baseDir = sthis.pathOps.join(baseDir, my_app());
168
+
169
+ const base = BuildURI.from(baseDir);
170
+ // if (isMemFS.fs) {
171
+ // base.setParam("fs", isMemFS.fs);
172
+ // }
173
+ const sysfs = await rt.gw.file.sysFileSystemFactory(base.URI());
174
+ await sysfs.rm(baseDir, { recursive: true }).catch(() => {
175
+ /* */
176
+ });
177
+
178
+ expect(baseDir).toMatch(new RegExp(`/\\.fireproof/${rt.FILESTORE_VERSION.replace(/-file/, "")}/${my_app()}`));
179
+
180
+ const db = fireproof(my_app());
181
+ await db.put({ name: "my-app" });
182
+ expect(db.name).toBe(my_app());
183
+ const carStore = await db.crdt.blockstore.loader?.carStore();
184
+
185
+ expect(carStore?.url().asObj()).toEqual({
186
+ pathname: `${sthis.env.get("HOME")}/.fireproof/v0.19`,
187
+ protocol: "file:",
188
+ style: "path",
189
+ searchParams: {
190
+ // ...isMemFS,
191
+ suffix: ".car",
192
+ runtime: "node",
193
+ urlGen: "default",
194
+ store: "data",
195
+ name: my_app(),
196
+ storekey: `@${my_app()}-data@`,
197
+ version: rt.FILESTORE_VERSION,
198
+ },
199
+ });
200
+
201
+ expect((await sysfs.stat(sthis.pathOps.join(baseDir, "data"))).isDirectory()).toBeTruthy();
202
+
203
+ const fileStore = await db.crdt.blockstore.loader?.fileStore();
204
+ expect(fileStore?.url().asObj()).toEqual({
205
+ pathname: `${sthis.env.get("HOME")}/.fireproof/v0.19`,
206
+ protocol: "file:",
207
+ style: "path",
208
+ searchParams: {
209
+ // ...isMemFS,
210
+ runtime: "node",
211
+ urlGen: "default",
212
+ store: "data",
213
+ name: my_app(),
214
+ storekey: `@${my_app()}-data@`,
215
+ version: rt.FILESTORE_VERSION,
216
+ },
217
+ });
218
+ const metaStore = await db.crdt.blockstore.loader?.metaStore();
219
+ expect(metaStore?.url().asObj()).toEqual({
220
+ pathname: `${sthis.env.get("HOME")}/.fireproof/v0.19`,
221
+ protocol: "file:",
222
+ style: "path",
223
+ searchParams: {
224
+ // ...isMemFS,
225
+ runtime: "node",
226
+ urlGen: "default",
227
+ store: "meta",
228
+ name: my_app(),
229
+ storekey: `@${my_app()}-meta@`,
230
+ version: rt.FILESTORE_VERSION,
231
+ },
232
+ });
233
+
234
+ expect((await sysfs.stat(sthis.pathOps.join(baseDir, "meta"))).isDirectory()).toBeTruthy();
235
+ sthis.env.set("FP_STORAGE_URL", old);
236
+ await db.close();
237
+ });
238
+
239
+ it("set by env", async () => {
240
+ const old = sthis.env.get("FP_STORAGE_URL");
241
+ // assert(!old, "FP_STORAGE_URL must set")
242
+ const testUrl = BuildURI.from(old);
243
+ // sthis.env.set("FP_STORAGE_URL", testUrl.toString());
244
+
245
+ let baseDir = dataDir(sthis, my_app()).pathname;
246
+ baseDir = sthis.pathOps.join(baseDir, /* testCfg(sthis, "data").version, */ my_app());
247
+
248
+ const sysfs = await rt.gw.file.sysFileSystemFactory(testUrl.URI());
249
+ await sysfs.rm(baseDir, { recursive: true }).catch(() => {
250
+ /* */
251
+ });
252
+
253
+ const db = fireproof(my_app());
254
+ await db.put({ name: "my-app" });
255
+ expect(db.name).toBe(my_app());
256
+ const carStore = await db.crdt.blockstore.loader.carStore();
257
+ expect(carStore?.url().asObj()).toEqual({
258
+ pathname: "./dist/fp-dir-file",
259
+ protocol: "file:",
260
+ style: "path",
261
+ searchParams: {
262
+ // ...isMemFS,
263
+ urlGen: "fromEnv",
264
+ store: "data",
265
+ // runtime: "node",
266
+ suffix: ".car",
267
+ name: my_app(),
268
+ storekey: `@${my_app()}-data@`,
269
+ version: rt.FILESTORE_VERSION,
270
+ },
271
+ });
272
+
273
+ expect((await sysfs.stat(sthis.pathOps.join(baseDir, "data"))).isDirectory()).toBeTruthy();
274
+ const fileStore = await db.crdt.blockstore.loader?.fileStore();
275
+ expect(fileStore?.url().asObj()).toEqual({
276
+ pathname: `./dist/fp-dir-file`,
277
+ protocol: "file:",
278
+ style: "path",
279
+ searchParams: {
280
+ // ...isMemFS,
281
+ urlGen: "fromEnv",
282
+ store: "data",
283
+ name: my_app(),
284
+ storekey: `@${my_app()}-data@`,
285
+ version: rt.FILESTORE_VERSION,
286
+ },
287
+ });
288
+
289
+ const metaStore = await db.crdt.blockstore.loader?.metaStore();
290
+ expect(metaStore?.url().asObj()).toEqual({
291
+ pathname: `./dist/fp-dir-file`,
292
+ protocol: "file:",
293
+ style: "path",
294
+ searchParams: {
295
+ // ...isMemFS,
296
+ urlGen: "fromEnv",
297
+ store: "meta",
298
+ name: my_app(),
299
+ storekey: `@${my_app()}-meta@`,
300
+ version: rt.FILESTORE_VERSION,
301
+ },
302
+ });
303
+ expect((await sysfs.stat(sthis.pathOps.join(baseDir, "meta"))).isDirectory()).toBeTruthy();
304
+ await db.close();
305
+ sthis.env.set("FP_STORAGE_URL", old);
306
+ });
307
+ });
@@ -0,0 +1,256 @@
1
+ import { rt, bs } from "@fireproof/core";
2
+ import { mockSuperThis, simpleCID } from "../helpers.js";
3
+ import { BuildURI, Result } from "@adviser/cement";
4
+ import { toJSON } from "multiformats/link";
5
+
6
+ const FPEnvelopeType = bs.FPEnvelopeType;
7
+
8
+ describe("storage-content", () => {
9
+ const sthis = mockSuperThis();
10
+ it("car", async () => {
11
+ const raw = new Uint8Array([55, 56, 57]);
12
+ const res = await rt.gw.fpDeserialize(sthis, BuildURI.from("http://x.com?store=data&suffix=.car").URI(), Result.Ok(raw));
13
+ expect(res.isOk()).toBeTruthy();
14
+ expect(res.unwrap().type).toEqual(FPEnvelopeType.CAR);
15
+ expect(res.unwrap().payload).toEqual(raw);
16
+ });
17
+
18
+ it("file", async () => {
19
+ const raw = new Uint8Array([55, 56, 57]);
20
+ const res = await rt.gw.fpDeserialize(sthis, BuildURI.from("http://x.com?store=data").URI(), Result.Ok(raw));
21
+ expect(res.isOk()).toBeTruthy();
22
+ expect(res.unwrap().type).toEqual(FPEnvelopeType.FILE);
23
+ expect(res.unwrap().payload).toEqual(raw);
24
+ });
25
+
26
+ it("meta", async () => {
27
+ const ref = [
28
+ {
29
+ cid: "bafyreiaqmtw5jfudn6r6dq7mcmytc2z5z3ggohcj3gco3omjsp3hr73fpy",
30
+ data: "MomRkYXRhoWZkYk1ldGFYU3siY2FycyI6W3siLyI6ImJhZzR5dnFhYmNpcWNod29zeXQ3dTJqMmxtcHpyM2w3aWRlaTU1YzNmNnJ2Z3U3cXRmYXRoMnl2NnZuaWtjeXEifV19Z3BhcmVudHOA",
31
+ parents: [(await simpleCID(sthis)).toString(), (await simpleCID(sthis)).toString()],
32
+ },
33
+ ];
34
+ const raw = sthis.txt.encode(JSON.stringify(ref));
35
+ const res = await rt.gw.fpDeserialize(sthis, BuildURI.from("http://x.com?store=meta").URI(), Result.Ok(raw));
36
+ expect(res.isOk()).toBeTruthy();
37
+ expect(res.unwrap().type).toEqual(FPEnvelopeType.META);
38
+ const dbMetas = res.unwrap().payload as bs.DbMetaEvent[];
39
+ expect(dbMetas.length).toBe(1);
40
+ const dbMeta = dbMetas[0];
41
+ expect(dbMeta.parents.map((i) => i.toString())).toStrictEqual(ref[0].parents);
42
+ expect(dbMeta.eventCid.toString()).toEqual("bafyreiaqmtw5jfudn6r6dq7mcmytc2z5z3ggohcj3gco3omjsp3hr73fpy");
43
+ expect(dbMeta.dbMeta.cars.map((i) => i.toString())).toEqual([
44
+ "bag4yvqabciqchwosyt7u2j2lmpzr3l7idei55c3f6rvgu7qtfath2yv6vnikcyq",
45
+ ]);
46
+ });
47
+
48
+ it("wal", async () => {
49
+ const ref = {
50
+ fileOperations: [
51
+ {
52
+ cid: "bafyreiaqmtw5jfudn6r6dq7mcmytc2z5z3ggohcj3gco3omjsp3hr73fpy",
53
+ public: false,
54
+ },
55
+ ],
56
+ noLoaderOps: [
57
+ {
58
+ cars: [
59
+ {
60
+ "/": "bag4yvqabciqchwosyt7u2j2lmpzr3l7idei55c3f6rvgu7qtfath2yv6vnikcyq",
61
+ },
62
+ ],
63
+ },
64
+ ],
65
+ operations: [
66
+ {
67
+ cars: [{ "/": "bag4yvqabciqchwosyt7u2j2lmpzr3l7idei55c3f6rvgu7qtfath2yv6vnikcyq" }],
68
+ },
69
+ ],
70
+ };
71
+ const raw = sthis.txt.encode(JSON.stringify(ref));
72
+ const res = await rt.gw.fpDeserialize(sthis, BuildURI.from("http://x.com?store=wal").URI(), Result.Ok(raw));
73
+ expect(res.isOk()).toBeTruthy();
74
+ expect(res.unwrap().type).toEqual(FPEnvelopeType.WAL);
75
+ const walstate = res.unwrap().payload as bs.WALState;
76
+ expect(
77
+ walstate.fileOperations.map((i) => ({
78
+ ...i,
79
+ cid: i.cid.toString(),
80
+ })),
81
+ ).toEqual(ref.fileOperations);
82
+ expect(
83
+ walstate.noLoaderOps.map((i) => ({
84
+ cars: i.cars.map((i) => toJSON(i)),
85
+ })),
86
+ ).toEqual(ref.noLoaderOps);
87
+ expect(
88
+ walstate.operations.map((i) => ({
89
+ cars: i.cars.map((i) => toJSON(i)),
90
+ })),
91
+ ).toEqual(ref.operations);
92
+ });
93
+ });
94
+
95
+ describe("de-serialize", () => {
96
+ const sthis = mockSuperThis();
97
+ it("car", async () => {
98
+ const msg = {
99
+ type: FPEnvelopeType.CAR,
100
+ payload: new Uint8Array([55, 56, 57]),
101
+ } satisfies bs.FPEnvelopeCar;
102
+ const res = await rt.gw.fpSerialize(sthis, msg);
103
+ expect(res.Ok()).toEqual(msg.payload);
104
+ });
105
+
106
+ it("file", async () => {
107
+ const msg = {
108
+ type: FPEnvelopeType.FILE,
109
+ payload: new Uint8Array([55, 56, 57]),
110
+ } satisfies bs.FPEnvelopeFile;
111
+ const res = await rt.gw.fpSerialize(sthis, msg);
112
+ expect(res.Ok()).toEqual(msg.payload);
113
+ });
114
+
115
+ it("meta", async () => {
116
+ const msg = {
117
+ type: FPEnvelopeType.META,
118
+ payload: [
119
+ await bs.createDbMetaEvent(
120
+ sthis,
121
+ {
122
+ cars: [await simpleCID(sthis)],
123
+ },
124
+ [await simpleCID(sthis), await simpleCID(sthis)],
125
+ ),
126
+ ],
127
+ } satisfies bs.FPEnvelopeMeta;
128
+ const ser = await rt.gw.fpSerialize(sthis, msg);
129
+ const res = await rt.gw.fpDeserialize(sthis, BuildURI.from("http://x.com?store=meta").URI(), ser);
130
+ const dbMetas = res.unwrap().payload as bs.DbMetaEvent[];
131
+ expect(dbMetas.length).toBe(1);
132
+ const dbMeta = dbMetas[0];
133
+ expect(dbMeta.parents).toEqual(msg.payload[0].parents);
134
+ expect(dbMeta.dbMeta).toEqual(msg.payload[0].dbMeta);
135
+ expect(dbMeta.eventCid).toEqual(msg.payload[0].eventCid);
136
+ });
137
+
138
+ it("wal", async () => {
139
+ const msg = {
140
+ type: FPEnvelopeType.WAL,
141
+ payload: {
142
+ fileOperations: [
143
+ {
144
+ cid: await simpleCID(sthis),
145
+ public: false,
146
+ },
147
+ ],
148
+ noLoaderOps: [
149
+ {
150
+ cars: [await simpleCID(sthis)],
151
+ },
152
+ ],
153
+ operations: [
154
+ {
155
+ cars: [await simpleCID(sthis)],
156
+ },
157
+ ],
158
+ },
159
+ } satisfies bs.FPEnvelopeWAL;
160
+ const ser = await rt.gw.fpSerialize(sthis, msg);
161
+ const res = await rt.gw.fpDeserialize(sthis, BuildURI.from("http://x.com?store=wal").URI(), ser);
162
+ expect(res.isOk()).toBeTruthy();
163
+ expect(res.unwrap().type).toEqual("wal");
164
+ const walstate = res.unwrap().payload as bs.WALState;
165
+ expect(walstate.fileOperations).toEqual(msg.payload.fileOperations);
166
+ expect(walstate.noLoaderOps).toEqual(msg.payload.noLoaderOps);
167
+ expect(walstate.operations).toEqual(msg.payload.operations);
168
+ });
169
+
170
+ it("coerce into fpDeserialize Result", async () => {
171
+ const raw = new Uint8Array([55, 56, 57]);
172
+ const res = await rt.gw.fpDeserialize(sthis, BuildURI.from("http://x.com?store=data&suffix=.car").URI(), Result.Ok(raw));
173
+ expect(res.isOk()).toBeTruthy();
174
+ expect(res.unwrap().type).toEqual(FPEnvelopeType.CAR);
175
+ expect(res.unwrap().payload).toEqual(raw);
176
+ });
177
+
178
+ it("coerce into fpDeserialize Promise", async () => {
179
+ const raw = new Uint8Array([55, 56, 57]);
180
+ const res = await rt.gw.fpDeserialize(sthis, BuildURI.from("http://x.com?store=data&suffix=.car").URI(), Promise.resolve(raw));
181
+ expect(res.isOk()).toBeTruthy();
182
+ expect(res.unwrap().type).toEqual(FPEnvelopeType.CAR);
183
+ expect(res.unwrap().payload).toEqual(raw);
184
+ });
185
+
186
+ it("coerce into fpDeserialize Promise Result", async () => {
187
+ const raw = new Uint8Array([55, 56, 57]);
188
+ const res = await rt.gw.fpDeserialize(
189
+ sthis,
190
+ BuildURI.from("http://x.com?store=data&suffix=.car").URI(),
191
+ Promise.resolve(Result.Ok(raw)),
192
+ );
193
+ expect(res.isOk()).toBeTruthy();
194
+ expect(res.unwrap().type).toEqual(FPEnvelopeType.CAR);
195
+ expect(res.unwrap().payload).toEqual(raw);
196
+ });
197
+
198
+ it("coerce into fpDeserialize Promise Result.Err", async () => {
199
+ const raw = Promise.resolve(Result.Err<Uint8Array>("error"));
200
+ const res = await rt.gw.fpDeserialize(sthis, BuildURI.from("http://x.com?store=data&suffix=.car").URI(), raw);
201
+ expect(res.isErr()).toBeTruthy();
202
+ expect(res.unwrap_err().message).toEqual("error");
203
+ });
204
+
205
+ it("coerce into fpDeserialize Promise.reject", async () => {
206
+ const raw = Promise.reject(new Error("error"));
207
+ const res = await rt.gw.fpDeserialize(sthis, BuildURI.from("http://x.com?store=data&suffix=.car").URI(), raw);
208
+ expect(res.isErr()).toBeTruthy();
209
+ expect(res.unwrap_err().message).toEqual("error");
210
+ });
211
+
212
+ it("coerce into fpDeserialize Result.Err", async () => {
213
+ const raw = Result.Err<Uint8Array>("error");
214
+ const res = await rt.gw.fpDeserialize(sthis, BuildURI.from("http://x.com?store=data&suffix=.car").URI(), raw);
215
+ expect(res.isErr()).toBeTruthy();
216
+ expect(res.unwrap_err().message).toEqual("error");
217
+ });
218
+
219
+ it("attach Key to Meta", async () => {
220
+ const msg = {
221
+ type: FPEnvelopeType.META,
222
+ payload: [
223
+ await bs.createDbMetaEvent(
224
+ sthis,
225
+ {
226
+ cars: [await simpleCID(sthis)],
227
+ },
228
+ [await simpleCID(sthis), await simpleCID(sthis)],
229
+ ),
230
+ ],
231
+ } satisfies bs.FPEnvelopeMeta;
232
+ const ser = await rt.gw.fpSerialize(sthis, msg, {
233
+ meta: async (sthis, payload) => {
234
+ return Result.Ok(sthis.txt.encode(JSON.stringify(payload.map((i) => ({ ...i, key: "key" })))));
235
+ },
236
+ });
237
+ let key = "";
238
+ const res = await rt.gw.fpDeserialize(sthis, BuildURI.from("http://x.com?store=meta").URI(), ser, {
239
+ meta: async (sthis, payload) => {
240
+ const json = JSON.parse(sthis.txt.decode(payload));
241
+ key = json[0].key;
242
+ return Result.Ok(
243
+ json.map((i: { key?: string }) => {
244
+ delete i.key;
245
+ return i;
246
+ }) as rt.gw.SerializedMeta[],
247
+ );
248
+ },
249
+ });
250
+ expect(res.isOk()).toBeTruthy();
251
+ const meta = res.unwrap() as bs.FPEnvelopeMeta;
252
+ expect(meta.type).toEqual("meta");
253
+ expect(Object.keys(meta.payload).includes("key")).toBeFalsy();
254
+ expect(key).toEqual("key");
255
+ });
256
+ });
@@ -0,0 +1,79 @@
1
+ import { fireproof } from "@fireproof/core";
2
+ import { mockSuperThis } from "../../helpers.js";
3
+
4
+ describe("fireproof config indexdb", () => {
5
+ const _my_app = "my-app";
6
+ function my_app() {
7
+ return _my_app;
8
+ }
9
+ const sthis = mockSuperThis();
10
+ beforeAll(async () => {
11
+ await sthis.start();
12
+ });
13
+
14
+ it("indexdb-loader", async () => {
15
+ const db = fireproof(my_app());
16
+ await db.put({ name: "my-app" });
17
+ expect(db.name).toBe(my_app());
18
+
19
+ const fileStore = await db.crdt.blockstore.loader.fileStore();
20
+ expect(fileStore?.url().asObj()).toEqual({
21
+ pathname: "fp",
22
+ protocol: "indexdb:",
23
+ searchParams: {
24
+ name: "my-app",
25
+ store: "data",
26
+ runtime: "browser",
27
+ storekey: "@my-app-data@",
28
+ urlGen: "default",
29
+ version: "v0.19-indexdb",
30
+ },
31
+ style: "path",
32
+ });
33
+
34
+ const dataStore = await db.crdt.blockstore.loader.carStore();
35
+ expect(dataStore?.url().asObj()).toEqual({
36
+ pathname: "fp",
37
+ protocol: "indexdb:",
38
+ searchParams: {
39
+ name: "my-app",
40
+ store: "data",
41
+ runtime: "browser",
42
+ storekey: "@my-app-data@",
43
+ suffix: ".car",
44
+ urlGen: "default",
45
+ version: "v0.19-indexdb",
46
+ },
47
+ style: "path",
48
+ });
49
+ const metaStore = await db.crdt.blockstore.loader.metaStore();
50
+ expect(metaStore?.url().asObj()).toEqual({
51
+ pathname: "fp",
52
+ protocol: "indexdb:",
53
+ searchParams: {
54
+ name: "my-app",
55
+ store: "meta",
56
+ runtime: "browser",
57
+ storekey: "@my-app-meta@",
58
+ urlGen: "default",
59
+ version: "v0.19-indexdb",
60
+ },
61
+ style: "path",
62
+ });
63
+ const WALStore = await db.crdt.blockstore.loader.WALStore();
64
+ expect(WALStore?.url().asObj()).toEqual({
65
+ pathname: "fp",
66
+ protocol: "indexdb:",
67
+ searchParams: {
68
+ name: "my-app",
69
+ store: "wal",
70
+ runtime: "browser",
71
+ storekey: "@my-app-wal@",
72
+ urlGen: "default",
73
+ version: "v0.19-indexdb",
74
+ },
75
+ style: "path",
76
+ });
77
+ await db.close();
78
+ });
79
+ });