@fireproof/core 0.19.8-dev-global → 0.19.8-dev-series-2
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +34 -0
- package/chunk-7EWIAXTM.js +7 -0
- package/chunk-7EWIAXTM.js.map +1 -0
- package/chunk-OFGPKRCM.js +290 -0
- package/chunk-OFGPKRCM.js.map +1 -0
- package/chunk-PB4BKL4O.js +7 -0
- package/chunk-PB4BKL4O.js.map +1 -0
- package/chunk-WS3YRPIA.js +75 -0
- package/chunk-WS3YRPIA.js.map +1 -0
- package/deno.json +22 -0
- package/gateway-5FCWPX5W.js +144 -0
- package/gateway-5FCWPX5W.js.map +1 -0
- package/{store-indexdb-WLRSICCB.js → gateway-H7UD6TNB.js} +49 -82
- package/gateway-H7UD6TNB.js.map +1 -0
- package/index.cjs +2365 -1875
- package/index.cjs.map +1 -1
- package/index.d.cts +663 -535
- package/index.d.ts +663 -535
- package/index.global.js +26742 -20717
- package/index.global.js.map +1 -1
- package/index.js +1691 -1094
- package/index.js.map +1 -1
- package/key-bag-file-WADZBHYG.js +54 -0
- package/key-bag-file-WADZBHYG.js.map +1 -0
- package/key-bag-indexdb-PGVAI3FJ.js +50 -0
- package/key-bag-indexdb-PGVAI3FJ.js.map +1 -0
- 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-INX4ZTHE.js +45 -0
- package/node-filesystem-INX4ZTHE.js.map +1 -0
- package/package.json +14 -8
- package/tests/blockstore/fragment-gateway.test.ts +107 -0
- package/tests/blockstore/keyed-crypto.test.ts +332 -0
- package/tests/blockstore/loader.test.ts +24 -19
- package/tests/blockstore/store.test.ts +51 -40
- package/tests/blockstore/transaction.test.ts +19 -15
- package/tests/fireproof/all-gateway.test.ts +394 -0
- package/tests/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.car +0 -0
- package/tests/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.ts +316 -0
- package/tests/fireproof/config.test.ts +94 -78
- package/tests/fireproof/crdt.test.ts +34 -28
- package/tests/fireproof/database.test.ts +22 -14
- package/tests/fireproof/fireproof.test.fixture.ts +133 -0
- package/tests/fireproof/fireproof.test.ts +331 -219
- package/tests/fireproof/hello.test.ts +34 -18
- package/tests/fireproof/indexer.test.ts +34 -27
- package/tests/fireproof/utils.test.ts +84 -0
- package/tests/helpers.ts +28 -57
- package/tests/www/todo-local.html +1 -1
- package/tests/www/todo.html +12 -15
- package/utils-QO2HIWGI.js +14 -0
- package/utils-QO2HIWGI.js.map +1 -0
- package/chunk-BNL4PVBF.js +0 -314
- package/chunk-BNL4PVBF.js.map +0 -1
- package/chunk-JW2QT6BF.js +0 -184
- package/chunk-JW2QT6BF.js.map +0 -1
- package/node-sys-container-MIEX6ELJ.js +0 -29
- package/node-sys-container-MIEX6ELJ.js.map +0 -1
- package/store-file-VJ6BI4II.js +0 -191
- package/store-file-VJ6BI4II.js.map +0 -1
- package/store-indexdb-WLRSICCB.js.map +0 -1
@@ -1,16 +1,16 @@
|
|
1
1
|
import { CID } from "multiformats";
|
2
|
-
import {
|
3
|
-
import {
|
4
|
-
import { NotFoundError } from "../../src/blockstore/gateway";
|
2
|
+
import { bs, NotFoundError, SuperThis } from "@fireproof/core";
|
3
|
+
import { mockSuperThis } from "../helpers";
|
5
4
|
|
6
5
|
const decoder = new TextDecoder("utf-8");
|
7
6
|
|
8
|
-
function runtime() {
|
9
|
-
return bs.toStoreRuntime({},
|
7
|
+
function runtime(sthis: SuperThis) {
|
8
|
+
return bs.toStoreRuntime({}, sthis);
|
10
9
|
}
|
11
10
|
|
12
|
-
function mockLoader(name: string): bs.Loadable {
|
11
|
+
function mockLoader(sthis: SuperThis, name: string): bs.Loadable {
|
13
12
|
return {
|
13
|
+
sthis,
|
14
14
|
name,
|
15
15
|
ebOpts: {
|
16
16
|
store: {},
|
@@ -20,18 +20,19 @@ function mockLoader(name: string): bs.Loadable {
|
|
20
20
|
|
21
21
|
describe("DataStore", function () {
|
22
22
|
let store: bs.DataStore;
|
23
|
-
let raw: bs.
|
23
|
+
let raw: bs.TestGateway;
|
24
24
|
|
25
|
+
const sthis = mockSuperThis();
|
25
26
|
afterEach(async () => {
|
26
27
|
await store.close();
|
27
28
|
await store.destroy();
|
28
29
|
});
|
29
30
|
|
30
31
|
beforeEach(async () => {
|
31
|
-
await
|
32
|
-
store = await runtime().makeDataStore(mockLoader("test"));
|
32
|
+
await sthis.start();
|
33
|
+
store = await runtime(sthis).makeDataStore(mockLoader(sthis, "test"));
|
33
34
|
await store.start();
|
34
|
-
raw = await bs.testStoreFactory(store.url);
|
35
|
+
raw = await bs.testStoreFactory(store.url(), sthis);
|
35
36
|
});
|
36
37
|
|
37
38
|
it("should have a name", function () {
|
@@ -44,26 +45,28 @@ describe("DataStore", function () {
|
|
44
45
|
bytes: new Uint8Array([55, 56, 57]),
|
45
46
|
};
|
46
47
|
await store.save(car);
|
47
|
-
const data = await raw.get(store.url, car.cid.toString());
|
48
|
+
const data = await raw.get(store.url(), car.cid.toString());
|
48
49
|
expect(decoder.decode(data)).toEqual(decoder.decode(car.bytes));
|
49
50
|
});
|
50
51
|
});
|
51
52
|
|
52
53
|
describe("DataStore with a saved car", function () {
|
53
54
|
let store: bs.DataStore;
|
54
|
-
let raw: bs.
|
55
|
+
let raw: bs.TestGateway;
|
55
56
|
let car: bs.AnyBlock;
|
56
57
|
|
58
|
+
const sthis = mockSuperThis();
|
59
|
+
|
57
60
|
afterEach(async () => {
|
58
61
|
await store.close();
|
59
62
|
await store.destroy();
|
60
63
|
});
|
61
64
|
|
62
65
|
beforeEach(async function () {
|
63
|
-
await
|
64
|
-
store = await runtime().makeDataStore(mockLoader("test2"));
|
66
|
+
await sthis.start();
|
67
|
+
store = await runtime(sthis).makeDataStore(mockLoader(sthis, "test2"));
|
65
68
|
await store.start();
|
66
|
-
raw = await bs.testStoreFactory(store.url);
|
69
|
+
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]),
|
@@ -72,7 +75,7 @@ describe("DataStore with a saved car", function () {
|
|
72
75
|
});
|
73
76
|
|
74
77
|
it("should have a car", async function () {
|
75
|
-
const data = await raw.get(store.url, car.cid.toString());
|
78
|
+
const data = await raw.get(store.url(), car.cid.toString());
|
76
79
|
expect(decoder.decode(data)).toEqual(decoder.decode(car.bytes));
|
77
80
|
});
|
78
81
|
|
@@ -85,15 +88,16 @@ describe("DataStore with a saved car", function () {
|
|
85
88
|
|
86
89
|
it("should remove a car", async function () {
|
87
90
|
await store.remove(car.cid);
|
88
|
-
const error = (await store.load(car.cid).catch((e: Error) => e)) as NotFoundError;
|
89
|
-
expect(error
|
90
|
-
// matches(error.message, "ENOENT");
|
91
|
+
const { e: error } = (await store.load(car.cid).catch((e: Error) => ({ e }))) as { e: NotFoundError };
|
92
|
+
expect(error).toBeTruthy();
|
91
93
|
});
|
92
94
|
});
|
93
95
|
|
94
96
|
describe("MetaStore", function () {
|
95
97
|
let store: bs.MetaStore;
|
96
|
-
let raw: bs.
|
98
|
+
let raw: bs.TestGateway;
|
99
|
+
|
100
|
+
const sthis = mockSuperThis();
|
97
101
|
|
98
102
|
afterEach(async () => {
|
99
103
|
await store.close();
|
@@ -101,10 +105,10 @@ describe("MetaStore", function () {
|
|
101
105
|
});
|
102
106
|
|
103
107
|
beforeEach(async function () {
|
104
|
-
await
|
105
|
-
store = await runtime().makeMetaStore(mockLoader("test"));
|
108
|
+
await sthis.start();
|
109
|
+
store = await runtime(sthis).makeMetaStore(mockLoader(sthis, "test"));
|
106
110
|
await store.start();
|
107
|
-
raw = await bs.testStoreFactory(store.url);
|
111
|
+
raw = await bs.testStoreFactory(store.url(), sthis);
|
108
112
|
});
|
109
113
|
|
110
114
|
it("should have a name", function () {
|
@@ -115,21 +119,23 @@ describe("MetaStore", function () {
|
|
115
119
|
const cid = CID.parse("bafybeia4luuns6dgymy5kau5rm7r4qzrrzg6cglpzpogussprpy42cmcn4");
|
116
120
|
const h: bs.DbMeta = {
|
117
121
|
cars: [cid],
|
118
|
-
key: undefined,
|
122
|
+
// key: undefined,
|
119
123
|
};
|
120
124
|
await store.save(h);
|
121
|
-
const file = await raw.get(store.url, "main");
|
122
|
-
const
|
123
|
-
|
124
|
-
expect(
|
125
|
-
expect(
|
125
|
+
const file = await raw.get(store.url(), "main");
|
126
|
+
const [blockMeta] = await store.handleByteHeads(file);
|
127
|
+
const decodedHeader = blockMeta.dbMeta;
|
128
|
+
expect(decodedHeader).toBeTruthy();
|
129
|
+
expect(decodedHeader.cars).toBeTruthy();
|
130
|
+
expect(decodedHeader.cars[0].toString()).toEqual(cid.toString());
|
126
131
|
});
|
127
132
|
});
|
128
133
|
|
129
134
|
describe("MetaStore with a saved header", function () {
|
130
135
|
let store: bs.MetaStore;
|
131
|
-
let raw: bs.
|
136
|
+
let raw: bs.TestGateway;
|
132
137
|
let cid: CID;
|
138
|
+
const sthis = mockSuperThis();
|
133
139
|
|
134
140
|
afterEach(async () => {
|
135
141
|
await store.close();
|
@@ -137,21 +143,26 @@ describe("MetaStore with a saved header", function () {
|
|
137
143
|
});
|
138
144
|
|
139
145
|
beforeEach(async function () {
|
140
|
-
await
|
141
|
-
store = await runtime().makeMetaStore(mockLoader("test-saved-header"));
|
146
|
+
await sthis.start();
|
147
|
+
store = await runtime(sthis).makeMetaStore(mockLoader(sthis, "test-saved-header"));
|
142
148
|
await store.start();
|
143
|
-
raw = await bs.testStoreFactory(store.url);
|
149
|
+
raw = await bs.testStoreFactory(store.url(), sthis);
|
144
150
|
cid = CID.parse("bafybeia4luuns6dgymy5kau5rm7r4qzrrzg6cglpzpogussprpy42cmcn4");
|
145
|
-
await store.save({ cars: [cid]
|
151
|
+
await store.save({ cars: [cid] /*, key: undefined */ });
|
146
152
|
});
|
147
153
|
|
148
154
|
it("should have a header", async function () {
|
149
|
-
const
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
expect(header
|
154
|
-
expect(header.
|
155
|
+
const bytes = await raw.get(store.url(), "main");
|
156
|
+
const data = decoder.decode(bytes);
|
157
|
+
expect(data).toMatch(/parents/);
|
158
|
+
const header = JSON.parse(data)[0];
|
159
|
+
expect(header).toBeDefined();
|
160
|
+
expect(header.parents).toBeDefined();
|
161
|
+
const [blockMeta] = await store.handleByteHeads(bytes);
|
162
|
+
const decodedHeader = blockMeta.dbMeta;
|
163
|
+
expect(decodedHeader).toBeDefined();
|
164
|
+
expect(decodedHeader.cars).toBeDefined();
|
165
|
+
expect(decodedHeader.cars[0].toString()).toEqual(cid.toString());
|
155
166
|
});
|
156
167
|
|
157
168
|
it("should load a header", async function () {
|
@@ -1,9 +1,10 @@
|
|
1
1
|
import { CID } from "multiformats";
|
2
|
-
|
3
|
-
import {
|
2
|
+
import { bs, SuperThis } from "@fireproof/core";
|
3
|
+
import { mockSuperThis } from "../helpers";
|
4
4
|
|
5
5
|
describe("Fresh TransactionBlockstore", function () {
|
6
6
|
let blocks: bs.BaseBlockstore;
|
7
|
+
const sthis = mockSuperThis();
|
7
8
|
beforeEach(function () {
|
8
9
|
blocks = new bs.BaseBlockstore();
|
9
10
|
});
|
@@ -14,7 +15,7 @@ describe("Fresh TransactionBlockstore", function () {
|
|
14
15
|
expect(blocks.loader).toBeFalsy();
|
15
16
|
});
|
16
17
|
it("should not put", async function () {
|
17
|
-
const value =
|
18
|
+
const value = sthis.txt.encode("value");
|
18
19
|
const e = await blocks.put("key" as unknown as bs.AnyLink, value).catch((e) => e);
|
19
20
|
expect(e.message).toMatch(/transaction/g);
|
20
21
|
});
|
@@ -32,8 +33,9 @@ describe("Fresh TransactionBlockstore", function () {
|
|
32
33
|
|
33
34
|
describe("TransactionBlockstore with name", function () {
|
34
35
|
let blocks: bs.EncryptedBlockstore;
|
36
|
+
const sthis = mockSuperThis();
|
35
37
|
beforeEach(function () {
|
36
|
-
blocks = new bs.EncryptedBlockstore({ name: "test" });
|
38
|
+
blocks = new bs.EncryptedBlockstore(sthis, { name: "test" });
|
37
39
|
});
|
38
40
|
it("should have a name", function () {
|
39
41
|
expect(blocks.name).toEqual("test");
|
@@ -42,7 +44,7 @@ describe("TransactionBlockstore with name", function () {
|
|
42
44
|
expect(blocks.loader).toBeTruthy();
|
43
45
|
});
|
44
46
|
it("should get from loader", async function () {
|
45
|
-
const bytes =
|
47
|
+
const bytes = sthis.txt.encode("bytes");
|
46
48
|
expect(blocks.loader).toBeTruthy();
|
47
49
|
blocks.loader.getBlock = async (cid) => {
|
48
50
|
return { cid, bytes };
|
@@ -55,14 +57,15 @@ describe("TransactionBlockstore with name", function () {
|
|
55
57
|
describe("A transaction", function () {
|
56
58
|
let tblocks: bs.CarTransaction;
|
57
59
|
let blocks: bs.EncryptedBlockstore;
|
60
|
+
const sthis = mockSuperThis();
|
58
61
|
beforeEach(async function () {
|
59
|
-
blocks = new bs.EncryptedBlockstore({ name: "test" });
|
62
|
+
blocks = new bs.EncryptedBlockstore(sthis, { name: "test" });
|
60
63
|
tblocks = new bs.CarTransaction(blocks);
|
61
64
|
blocks.transactions.add(tblocks);
|
62
65
|
});
|
63
66
|
it("should put and get", async function () {
|
64
67
|
const cid = CID.parse("bafybeia4luuns6dgymy5kau5rm7r4qzrrzg6cglpzpogussprpy42cmcn4");
|
65
|
-
const bytes =
|
68
|
+
const bytes = sthis.txt.encode("bytes");
|
66
69
|
await tblocks.put(cid, bytes);
|
67
70
|
expect(blocks.transactions.has(tblocks)).toBeTruthy();
|
68
71
|
const got = await tblocks.get(cid);
|
@@ -72,14 +75,15 @@ describe("A transaction", function () {
|
|
72
75
|
});
|
73
76
|
});
|
74
77
|
|
75
|
-
function asUInt8Array(str: string) {
|
76
|
-
return
|
78
|
+
function asUInt8Array(str: string, sthis: SuperThis) {
|
79
|
+
return sthis.txt.encode(str);
|
77
80
|
}
|
78
81
|
|
79
82
|
describe("TransactionBlockstore with a completed transaction", function () {
|
80
83
|
let blocks: bs.BaseBlockstore;
|
81
84
|
let cid: CID;
|
82
85
|
let cid2: CID;
|
86
|
+
const sthis = mockSuperThis();
|
83
87
|
|
84
88
|
beforeEach(async function () {
|
85
89
|
cid = CID.parse("bafybeia4luuns6dgymy5kau5rm7r4qzrrzg6cglpzpogussprpy42cmcn4");
|
@@ -87,13 +91,13 @@ describe("TransactionBlockstore with a completed transaction", function () {
|
|
87
91
|
|
88
92
|
blocks = new bs.BaseBlockstore();
|
89
93
|
await blocks.transaction(async (tblocks) => {
|
90
|
-
await tblocks.put(cid, asUInt8Array("value"));
|
91
|
-
await tblocks.put(
|
94
|
+
await tblocks.put(cid, asUInt8Array("value", sthis));
|
95
|
+
await tblocks.put(cid, asUInt8Array("value", sthis));
|
92
96
|
return { head: [] };
|
93
97
|
});
|
94
98
|
await blocks.transaction(async (tblocks) => {
|
95
|
-
await tblocks.put(cid, asUInt8Array("value"));
|
96
|
-
await tblocks.put(cid2, asUInt8Array("value2"));
|
99
|
+
await tblocks.put(cid, asUInt8Array("value", sthis));
|
100
|
+
await tblocks.put(cid2, asUInt8Array("value2", sthis));
|
97
101
|
return { head: [] };
|
98
102
|
});
|
99
103
|
});
|
@@ -104,10 +108,10 @@ describe("TransactionBlockstore with a completed transaction", function () {
|
|
104
108
|
it("should get", async function () {
|
105
109
|
const value = (await blocks.get(cid)) as bs.AnyBlock;
|
106
110
|
expect(value.cid).toEqual(cid);
|
107
|
-
expect(value.bytes.toString()).toEqual(asUInt8Array("value").toString());
|
111
|
+
expect(value.bytes.toString()).toEqual(asUInt8Array("value", sthis).toString());
|
108
112
|
|
109
113
|
const value2 = (await blocks.get(cid2)) as bs.AnyBlock;
|
110
|
-
expect(value2.bytes.toString()).toEqual(asUInt8Array("value2").toString());
|
114
|
+
expect(value2.bytes.toString()).toEqual(asUInt8Array("value2", sthis).toString());
|
111
115
|
});
|
112
116
|
it("should yield entries", async function () {
|
113
117
|
const blz = [];
|
@@ -0,0 +1,394 @@
|
|
1
|
+
import { Database, bs } from "@fireproof/core";
|
2
|
+
import { URI } from "@adviser/cement";
|
3
|
+
|
4
|
+
import { fileContent } from "./cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.js";
|
5
|
+
|
6
|
+
function customExpect(value: unknown, matcher: (val: unknown) => void, message: string): void {
|
7
|
+
try {
|
8
|
+
matcher(value);
|
9
|
+
} catch (error) {
|
10
|
+
void error;
|
11
|
+
// console.error(error);
|
12
|
+
throw new Error(message);
|
13
|
+
}
|
14
|
+
}
|
15
|
+
|
16
|
+
interface ExtendedGateway extends bs.Gateway {
|
17
|
+
logger: { _attributes: { module: string; url?: string } };
|
18
|
+
headerSize: number;
|
19
|
+
fidLength: number;
|
20
|
+
}
|
21
|
+
|
22
|
+
interface ExtendedStore {
|
23
|
+
gateway: ExtendedGateway;
|
24
|
+
_url: URI;
|
25
|
+
name: string;
|
26
|
+
}
|
27
|
+
|
28
|
+
describe("noop Gateway", function () {
|
29
|
+
let db: Database;
|
30
|
+
let carStore: ExtendedStore;
|
31
|
+
let metaStore: ExtendedStore;
|
32
|
+
let fileStore: ExtendedStore;
|
33
|
+
let walStore: ExtendedStore;
|
34
|
+
let carGateway: ExtendedGateway;
|
35
|
+
let metaGateway: ExtendedGateway;
|
36
|
+
let fileGateway: ExtendedGateway;
|
37
|
+
let walGateway: ExtendedGateway;
|
38
|
+
|
39
|
+
afterEach(async function () {
|
40
|
+
await db.close();
|
41
|
+
await db.destroy();
|
42
|
+
});
|
43
|
+
beforeEach(async function () {
|
44
|
+
db = new Database("test-gateway-" + Math.random().toString(36).substring(7));
|
45
|
+
|
46
|
+
// Extract stores from the loader
|
47
|
+
carStore = (await db.blockstore.loader?.carStore()) as unknown as ExtendedStore;
|
48
|
+
metaStore = (await db.blockstore.loader?.metaStore()) as unknown as ExtendedStore;
|
49
|
+
fileStore = (await db.blockstore.loader?.fileStore()) as unknown as ExtendedStore;
|
50
|
+
walStore = (await db.blockstore.loader?.WALStore()) as unknown as ExtendedStore;
|
51
|
+
|
52
|
+
// Extract and log gateways
|
53
|
+
carGateway = carStore?.gateway;
|
54
|
+
metaGateway = metaStore?.gateway;
|
55
|
+
fileGateway = fileStore?.gateway;
|
56
|
+
walGateway = walStore?.gateway;
|
57
|
+
});
|
58
|
+
|
59
|
+
it("should have valid stores and gateways", async function () {
|
60
|
+
// Add assertions
|
61
|
+
expect(carStore).toBeTruthy();
|
62
|
+
expect(metaStore).toBeTruthy();
|
63
|
+
expect(fileStore).toBeTruthy();
|
64
|
+
expect(walStore).toBeTruthy();
|
65
|
+
|
66
|
+
expect(carGateway).toBeTruthy();
|
67
|
+
expect(metaGateway).toBeTruthy();
|
68
|
+
expect(fileGateway).toBeTruthy();
|
69
|
+
expect(walGateway).toBeTruthy();
|
70
|
+
});
|
71
|
+
|
72
|
+
it("should have correct store names", async function () {
|
73
|
+
// Check that all stores have the correct name
|
74
|
+
expect(carStore?.name).toContain("test-gateway");
|
75
|
+
expect(metaStore?.name).toContain("test-gateway");
|
76
|
+
expect(fileStore?.name).toContain("test-gateway");
|
77
|
+
expect(walStore?.name).toContain("test-gateway");
|
78
|
+
});
|
79
|
+
|
80
|
+
it("should have correct store types in URLs", async function () {
|
81
|
+
// Check that all stores have the correct store type in their URL
|
82
|
+
expect(carStore?._url.toString()).toContain("store=data");
|
83
|
+
expect(metaStore?._url.toString()).toContain("store=meta");
|
84
|
+
expect(fileStore?._url.toString()).toContain("store=data");
|
85
|
+
expect(walStore?._url.toString()).toContain("store=wal");
|
86
|
+
});
|
87
|
+
|
88
|
+
it("should have version specified in URLs", async function () {
|
89
|
+
// Verify that all stores have a version specified
|
90
|
+
expect(carStore?._url.toString()).toContain("version=");
|
91
|
+
expect(metaStore?._url.toString()).toContain("version=");
|
92
|
+
expect(fileStore?._url.toString()).toContain("version=");
|
93
|
+
expect(walStore?._url.toString()).toContain("version=");
|
94
|
+
});
|
95
|
+
|
96
|
+
it("should have correct gateway types", async function () {
|
97
|
+
// Check that all gateways are instances of the expected gateway class
|
98
|
+
expect(typeof carGateway).toBe("object");
|
99
|
+
expect(typeof metaGateway).toBe("object");
|
100
|
+
expect(typeof fileGateway).toBe("object");
|
101
|
+
expect(typeof walGateway).toBe("object");
|
102
|
+
});
|
103
|
+
|
104
|
+
it("should build CAR Gateway URL", async function () {
|
105
|
+
const testKey = "bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i";
|
106
|
+
const carUrl = await carGateway?.buildUrl(carStore?._url, testKey);
|
107
|
+
expect(carUrl?.Ok()).toBeTruthy();
|
108
|
+
});
|
109
|
+
|
110
|
+
it("should start CAR Gateway", async function () {
|
111
|
+
await carGateway?.start(carStore?._url);
|
112
|
+
});
|
113
|
+
|
114
|
+
it("should put data in CAR Gateway", async function () {
|
115
|
+
const testKey = "bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i";
|
116
|
+
const testData = fileContent;
|
117
|
+
const carUrl = await carGateway?.buildUrl(carStore?._url, testKey);
|
118
|
+
await carGateway?.start(carStore?._url);
|
119
|
+
const carPutResult = await carGateway?.put(carUrl?.Ok(), testData);
|
120
|
+
expect(carPutResult?.Ok()).toBeFalsy();
|
121
|
+
});
|
122
|
+
|
123
|
+
it("should get data from CAR Gateway", async function () {
|
124
|
+
const testKey = "bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i";
|
125
|
+
const testData = fileContent;
|
126
|
+
const carUrl = await carGateway?.buildUrl(carStore?._url, testKey);
|
127
|
+
await carGateway?.start(carStore?._url);
|
128
|
+
await carGateway?.put(carUrl?.Ok(), testData);
|
129
|
+
const carGetResult = await carGateway?.get(carUrl?.Ok());
|
130
|
+
customExpect(carGetResult?.Ok(), (v) => expect(v).toEqual(testData), "carGetResult should match testData");
|
131
|
+
});
|
132
|
+
|
133
|
+
it("should delete data from CAR Gateway", async function () {
|
134
|
+
const testKey = "bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i";
|
135
|
+
const testData = fileContent;
|
136
|
+
const carUrl = await carGateway?.buildUrl(carStore?._url, testKey);
|
137
|
+
await carGateway?.start(carStore?._url);
|
138
|
+
await carGateway?.put(carUrl?.Ok(), testData);
|
139
|
+
const carDeleteResult = await carGateway?.delete(carUrl?.Ok());
|
140
|
+
expect(carDeleteResult?.Ok()).toBeFalsy();
|
141
|
+
});
|
142
|
+
|
143
|
+
it("should close CAR Gateway", async function () {
|
144
|
+
await carGateway?.close(carStore?._url);
|
145
|
+
});
|
146
|
+
it("should build Meta Gateway URL", async function () {
|
147
|
+
const metaUrl = await metaGateway?.buildUrl(metaStore?._url, "main");
|
148
|
+
expect(metaUrl?.Ok()).toBeTruthy();
|
149
|
+
});
|
150
|
+
|
151
|
+
it("should start Meta Gateway", async function () {
|
152
|
+
await metaGateway?.start(metaStore?._url);
|
153
|
+
});
|
154
|
+
|
155
|
+
it("should close Meta Gateway", async function () {
|
156
|
+
await metaGateway?.start(metaStore?._url);
|
157
|
+
await metaGateway?.close(metaStore?._url);
|
158
|
+
});
|
159
|
+
|
160
|
+
it("should build File Gateway URL", async function () {
|
161
|
+
const testKey = "bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i";
|
162
|
+
const fileUrl = await fileGateway?.buildUrl(fileStore?._url, testKey);
|
163
|
+
expect(fileUrl?.Ok()).toBeTruthy();
|
164
|
+
});
|
165
|
+
|
166
|
+
it("should start File Gateway", async function () {
|
167
|
+
await fileGateway?.start(fileStore?._url);
|
168
|
+
});
|
169
|
+
|
170
|
+
it("should put data to File Gateway", async function () {
|
171
|
+
const testKey = "bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i";
|
172
|
+
const testData = fileContent;
|
173
|
+
const fileUrl = await fileGateway?.buildUrl(fileStore?._url, testKey);
|
174
|
+
await fileGateway?.start(fileStore?._url);
|
175
|
+
const filePutResult = await fileGateway?.put(fileUrl?.Ok(), testData);
|
176
|
+
expect(filePutResult?.Ok()).toBeFalsy();
|
177
|
+
});
|
178
|
+
|
179
|
+
it("should get data from File Gateway", async function () {
|
180
|
+
const testKey = "bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i";
|
181
|
+
const testData = fileContent;
|
182
|
+
const fileUrl = await fileGateway?.buildUrl(fileStore?._url, testKey);
|
183
|
+
await fileGateway?.start(fileStore?._url);
|
184
|
+
await fileGateway?.put(fileUrl?.Ok(), testData);
|
185
|
+
const fileGetResult = await fileGateway?.get(fileUrl?.Ok());
|
186
|
+
customExpect(fileGetResult?.Ok(), (v) => expect(v).toEqual(testData), "fileGetResult should match testData");
|
187
|
+
});
|
188
|
+
|
189
|
+
it("should delete data from File Gateway", async function () {
|
190
|
+
const testKey = "bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i";
|
191
|
+
const testData = fileContent;
|
192
|
+
const fileUrl = await fileGateway?.buildUrl(fileStore?._url, testKey);
|
193
|
+
await fileGateway?.start(fileStore?._url);
|
194
|
+
await fileGateway?.put(fileUrl?.Ok(), testData);
|
195
|
+
const fileDeleteResult = await fileGateway?.delete(fileUrl?.Ok());
|
196
|
+
expect(fileDeleteResult?.Ok()).toBeFalsy();
|
197
|
+
});
|
198
|
+
|
199
|
+
it("should close File Gateway", async function () {
|
200
|
+
await fileGateway?.close(fileStore?._url);
|
201
|
+
});
|
202
|
+
it("should build WAL Gateway URL", async function () {
|
203
|
+
const testKey = "bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i";
|
204
|
+
const walUrl = await walGateway?.buildUrl(walStore?._url, testKey);
|
205
|
+
expect(walUrl?.Ok()).toBeTruthy();
|
206
|
+
});
|
207
|
+
|
208
|
+
it("should start WAL Gateway", async function () {
|
209
|
+
await walGateway?.start(walStore?._url);
|
210
|
+
});
|
211
|
+
|
212
|
+
it("should put data to WAL Gateway", async function () {
|
213
|
+
const testKey = "bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i";
|
214
|
+
const walUrl = await walGateway?.buildUrl(walStore?._url, testKey);
|
215
|
+
await walGateway?.start(walStore?._url);
|
216
|
+
const walTestDataString = JSON.stringify({
|
217
|
+
operations: [],
|
218
|
+
noLoaderOps: [],
|
219
|
+
fileOperations: [],
|
220
|
+
});
|
221
|
+
const walEncoder = new TextEncoder();
|
222
|
+
const walTestData = walEncoder.encode(walTestDataString);
|
223
|
+
const walPutResult = await walGateway?.put(walUrl?.Ok(), walTestData);
|
224
|
+
expect(walPutResult?.Ok()).toBeFalsy();
|
225
|
+
});
|
226
|
+
|
227
|
+
it("should get data from WAL Gateway", async function () {
|
228
|
+
const testKey = "bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i";
|
229
|
+
const walUrl = await walGateway?.buildUrl(walStore?._url, testKey);
|
230
|
+
await walGateway?.start(walStore?._url);
|
231
|
+
const walTestDataString = JSON.stringify({
|
232
|
+
operations: [],
|
233
|
+
noLoaderOps: [],
|
234
|
+
fileOperations: [],
|
235
|
+
});
|
236
|
+
const walEncoder = new TextEncoder();
|
237
|
+
const walTestData = walEncoder.encode(walTestDataString);
|
238
|
+
await walGateway?.put(walUrl?.Ok(), walTestData);
|
239
|
+
const walGetResult = await walGateway?.get(walUrl?.Ok());
|
240
|
+
const okResult = walGetResult?.Ok();
|
241
|
+
const decodedResult = new TextDecoder().decode(okResult);
|
242
|
+
expect(decodedResult).toEqual(walTestDataString);
|
243
|
+
});
|
244
|
+
|
245
|
+
it("should delete data from WAL Gateway", async function () {
|
246
|
+
const testKey = "bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i";
|
247
|
+
const walUrl = await walGateway?.buildUrl(walStore?._url, testKey);
|
248
|
+
await walGateway?.start(walStore?._url);
|
249
|
+
const walTestDataString = JSON.stringify({
|
250
|
+
operations: [],
|
251
|
+
noLoaderOps: [],
|
252
|
+
fileOperations: [],
|
253
|
+
});
|
254
|
+
const walEncoder = new TextEncoder();
|
255
|
+
const walTestData = walEncoder.encode(walTestDataString);
|
256
|
+
await walGateway?.put(walUrl?.Ok(), walTestData);
|
257
|
+
const walDeleteResult = await walGateway?.delete(walUrl?.Ok());
|
258
|
+
expect(walDeleteResult?.Ok()).toBeFalsy();
|
259
|
+
});
|
260
|
+
|
261
|
+
it("should close WAL Gateway", async function () {
|
262
|
+
await walGateway?.start(walStore?._url);
|
263
|
+
await walGateway?.close(walStore?._url);
|
264
|
+
});
|
265
|
+
|
266
|
+
it("should have correct CAR Gateway properties", async function () {
|
267
|
+
// CAR Gateway assertions
|
268
|
+
expect(carGateway?.fidLength).toBe(4);
|
269
|
+
expect(carGateway?.headerSize).toBe(36);
|
270
|
+
expect(carGateway?.logger._attributes).toHaveProperty("module");
|
271
|
+
expect(carGateway?.logger._attributes).toHaveProperty("url");
|
272
|
+
});
|
273
|
+
|
274
|
+
it("should have correct Meta Gateway properties", async function () {
|
275
|
+
// Meta Gateway assertions
|
276
|
+
expect(metaGateway?.fidLength).toBe(4);
|
277
|
+
expect(metaGateway?.headerSize).toBe(36);
|
278
|
+
expect(metaGateway?.logger._attributes).toHaveProperty("module");
|
279
|
+
expect(metaGateway?.logger._attributes).not.toHaveProperty("url");
|
280
|
+
});
|
281
|
+
|
282
|
+
it("should have correct File Gateway properties", async function () {
|
283
|
+
// File Gateway assertions
|
284
|
+
expect(fileGateway?.fidLength).toBe(4);
|
285
|
+
expect(fileGateway?.headerSize).toBe(36);
|
286
|
+
expect(fileGateway?.logger._attributes).toHaveProperty("module");
|
287
|
+
expect(fileGateway?.logger._attributes).toHaveProperty("url");
|
288
|
+
});
|
289
|
+
|
290
|
+
it("should have correct WAL Gateway properties", async function () {
|
291
|
+
// WAL Gateway assertions
|
292
|
+
expect(walGateway?.fidLength).toBe(4);
|
293
|
+
expect(walGateway?.headerSize).toBe(36);
|
294
|
+
expect(walGateway?.logger._attributes).toHaveProperty("module");
|
295
|
+
expect(walGateway?.logger._attributes).not.toHaveProperty("url");
|
296
|
+
});
|
297
|
+
});
|
298
|
+
|
299
|
+
describe("noop Gateway subscribe", function () {
|
300
|
+
let db: Database;
|
301
|
+
|
302
|
+
let metaStore: ExtendedStore;
|
303
|
+
|
304
|
+
let metaGateway: ExtendedGateway;
|
305
|
+
|
306
|
+
afterEach(async function () {
|
307
|
+
await db.close();
|
308
|
+
await db.destroy();
|
309
|
+
});
|
310
|
+
beforeEach(async function () {
|
311
|
+
db = new Database("test-gateway-" + Math.random().toString(36).substring(7));
|
312
|
+
|
313
|
+
// Extract stores from the loader
|
314
|
+
metaStore = (await db.blockstore.loader?.metaStore()) as unknown as ExtendedStore;
|
315
|
+
|
316
|
+
metaGateway = metaStore?.gateway;
|
317
|
+
});
|
318
|
+
it("should subscribe to meta Gateway", async function () {
|
319
|
+
const metaUrl = await metaGateway?.buildUrl(metaStore?._url, "main");
|
320
|
+
await metaGateway?.start(metaStore?._url);
|
321
|
+
|
322
|
+
let resolve: () => void;
|
323
|
+
let didCall = false;
|
324
|
+
const p = new Promise<void>((r) => {
|
325
|
+
resolve = r;
|
326
|
+
});
|
327
|
+
const metaSubscribeResult = await metaGateway?.subscribe?.(metaUrl?.Ok(), async (data: Uint8Array) => {
|
328
|
+
const decodedData = new TextDecoder().decode(data);
|
329
|
+
expect(decodedData).toContain("[]");
|
330
|
+
didCall = true;
|
331
|
+
resolve();
|
332
|
+
});
|
333
|
+
if (!metaSubscribeResult?.isErr()) {
|
334
|
+
expect(metaSubscribeResult?.Ok()).toBeTruthy();
|
335
|
+
const ok = await db.put({ _id: "key1", hello: "world1" });
|
336
|
+
expect(ok).toBeTruthy();
|
337
|
+
expect(ok.id).toBe("key1");
|
338
|
+
await p;
|
339
|
+
expect(didCall).toBeTruthy();
|
340
|
+
}
|
341
|
+
});
|
342
|
+
});
|
343
|
+
|
344
|
+
describe("Gateway", function () {
|
345
|
+
let db: Database;
|
346
|
+
// let carStore: ExtendedStore;
|
347
|
+
let metaStore: ExtendedStore;
|
348
|
+
// let fileStore: ExtendedStore;
|
349
|
+
// let walStore: ExtendedStore;
|
350
|
+
// let carGateway: ExtendedGateway;
|
351
|
+
let metaGateway: ExtendedGateway;
|
352
|
+
// let fileGateway: ExtendedGateway;
|
353
|
+
// let walGateway: ExtendedGateway;
|
354
|
+
|
355
|
+
afterEach(async function () {
|
356
|
+
await db.close();
|
357
|
+
await db.destroy();
|
358
|
+
});
|
359
|
+
beforeEach(async function () {
|
360
|
+
db = new Database("test-gateway-" + Math.random().toString(36).substring(7));
|
361
|
+
const ok = await db.put({ _id: "test", foo: "bar" });
|
362
|
+
expect(ok).toBeTruthy();
|
363
|
+
expect(ok.id).toBe("test");
|
364
|
+
|
365
|
+
// Extract stores from the loader
|
366
|
+
// carStore = (await db.blockstore.loader?.carStore()) as unknown as ExtendedStore;
|
367
|
+
metaStore = (await db.blockstore.loader?.metaStore()) as unknown as ExtendedStore;
|
368
|
+
// fileStore = (await db.blockstore.loader?.fileStore()) as unknown as ExtendedStore;
|
369
|
+
// walStore = (await db.blockstore.loader?.WALStore()) as unknown as ExtendedStore;
|
370
|
+
|
371
|
+
// Extract and log gateways
|
372
|
+
// carGateway = carStore?.gateway;
|
373
|
+
metaGateway = metaStore?.gateway;
|
374
|
+
// fileGateway = fileStore?.gateway;
|
375
|
+
// walGateway = walStore?.gateway;
|
376
|
+
});
|
377
|
+
|
378
|
+
it("should get data from Meta Gateway", async function () {
|
379
|
+
const metaUrl = await metaGateway?.buildUrl(metaStore?._url, "main");
|
380
|
+
await metaGateway?.start(metaStore?._url);
|
381
|
+
const metaGetResult = await metaGateway?.get(metaUrl?.Ok());
|
382
|
+
const metaGetResultOk = metaGetResult?.Ok();
|
383
|
+
const decodedMetaGetResultOk = new TextDecoder().decode(metaGetResultOk);
|
384
|
+
expect(decodedMetaGetResultOk).toContain("parents");
|
385
|
+
});
|
386
|
+
|
387
|
+
it("should delete data from Meta Gateway", async function () {
|
388
|
+
const metaUrl = await metaGateway?.buildUrl(metaStore?._url, "main");
|
389
|
+
await metaGateway?.start(metaStore?._url);
|
390
|
+
// should we be testing .destroy() instead?
|
391
|
+
const metaDeleteResult = await metaGateway?.delete(metaUrl?.Ok());
|
392
|
+
expect(metaDeleteResult?.Ok()).toBeFalsy();
|
393
|
+
});
|
394
|
+
});
|