@fireproof/core-test 0.0.0-smoke-1b31059-1752074105
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/LICENSE.md +232 -0
- package/blockstore/fp-envelope.test.ts-off +65 -0
- package/blockstore/fragment-gateway.test.ts-off +106 -0
- package/blockstore/interceptor-gateway.test.d.ts +19 -0
- package/blockstore/interceptor-gateway.test.js +217 -0
- package/blockstore/interceptor-gateway.test.js.map +1 -0
- package/blockstore/interceptor-gateway.test.ts +259 -0
- package/blockstore/keyed-crypto-indexeddb-file.test.d.ts +1 -0
- package/blockstore/keyed-crypto-indexeddb-file.test.js +114 -0
- package/blockstore/keyed-crypto-indexeddb-file.test.js.map +1 -0
- package/blockstore/keyed-crypto-indexeddb-file.test.ts +134 -0
- package/blockstore/keyed-crypto.test.d.ts +1 -0
- package/blockstore/keyed-crypto.test.js +310 -0
- package/blockstore/keyed-crypto.test.js.map +1 -0
- package/blockstore/keyed-crypto.test.ts +382 -0
- package/blockstore/loader.test.d.ts +1 -0
- package/blockstore/loader.test.js +241 -0
- package/blockstore/loader.test.js.map +1 -0
- package/blockstore/loader.test.ts +313 -0
- package/blockstore/standalone.test.d.ts +1 -0
- package/blockstore/standalone.test.js +112 -0
- package/blockstore/standalone.test.js.map +1 -0
- package/blockstore/standalone.test.ts +156 -0
- package/blockstore/store.test.d.ts +1 -0
- package/blockstore/store.test.js +152 -0
- package/blockstore/store.test.js.map +1 -0
- package/blockstore/store.test.ts +199 -0
- package/blockstore/transaction.test.d.ts +1 -0
- package/blockstore/transaction.test.js +109 -0
- package/blockstore/transaction.test.js.map +1 -0
- package/blockstore/transaction.test.ts +132 -0
- package/fireproof/all-gateway.test.d.ts +1 -0
- package/fireproof/all-gateway.test.js +333 -0
- package/fireproof/all-gateway.test.js.map +1 -0
- package/fireproof/all-gateway.test.ts +477 -0
- package/fireproof/attachable.test.d.ts +1 -0
- package/fireproof/attachable.test.js +438 -0
- package/fireproof/attachable.test.js.map +1 -0
- package/fireproof/attachable.test.ts +677 -0
- package/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.car +0 -0
- package/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.d.ts +4 -0
- package/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.js +325 -0
- package/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.js.map +1 -0
- package/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.ts +324 -0
- package/fireproof/charwise-boolean.test.d.ts +1 -0
- package/fireproof/charwise-boolean.test.js +43 -0
- package/fireproof/charwise-boolean.test.js.map +1 -0
- package/fireproof/charwise-boolean.test.ts +68 -0
- package/fireproof/crdt.test.d.ts +1 -0
- package/fireproof/crdt.test.js +509 -0
- package/fireproof/crdt.test.js.map +1 -0
- package/fireproof/crdt.test.ts +572 -0
- package/fireproof/database.test.d.ts +1 -0
- package/fireproof/database.test.js +658 -0
- package/fireproof/database.test.js.map +1 -0
- package/fireproof/database.test.ts +772 -0
- package/fireproof/deleted-docs-handling.test.d.ts +1 -0
- package/fireproof/deleted-docs-handling.test.js +69 -0
- package/fireproof/deleted-docs-handling.test.js.map +1 -0
- package/fireproof/deleted-docs-handling.test.ts +112 -0
- package/fireproof/fireproof.test.d.ts +3 -0
- package/fireproof/fireproof.test.fixture.d.ts +15 -0
- package/fireproof/fireproof.test.fixture.js +134 -0
- package/fireproof/fireproof.test.fixture.js.map +1 -0
- package/fireproof/fireproof.test.fixture.ts +133 -0
- package/fireproof/fireproof.test.js +574 -0
- package/fireproof/fireproof.test.js.map +1 -0
- package/fireproof/fireproof.test.ts +767 -0
- package/fireproof/hello.test.d.ts +1 -0
- package/fireproof/hello.test.js +67 -0
- package/fireproof/hello.test.js.map +1 -0
- package/fireproof/hello.test.ts +75 -0
- package/fireproof/indexer.test.d.ts +1 -0
- package/fireproof/indexer.test.js +408 -0
- package/fireproof/indexer.test.js.map +1 -0
- package/fireproof/indexer.test.ts +459 -0
- package/fireproof/multiple-ledger.test.d.ts +1 -0
- package/fireproof/multiple-ledger.test.js +51 -0
- package/fireproof/multiple-ledger.test.js.map +1 -0
- package/fireproof/multiple-ledger.test.ts +67 -0
- package/fireproof/query-docs.test.d.ts +1 -0
- package/fireproof/query-docs.test.js +69 -0
- package/fireproof/query-docs.test.js.map +1 -0
- package/fireproof/query-docs.test.ts +117 -0
- package/fireproof/query-limit-issue.test.d.ts +1 -0
- package/fireproof/query-limit-issue.test.js +89 -0
- package/fireproof/query-limit-issue.test.js.map +1 -0
- package/fireproof/query-limit-issue.test.ts +147 -0
- package/fireproof/query-property-inconsistency.test.d.ts +1 -0
- package/fireproof/query-property-inconsistency.test.js +52 -0
- package/fireproof/query-property-inconsistency.test.js.map +1 -0
- package/fireproof/query-property-inconsistency.test.ts +90 -0
- package/fireproof/query-result-properties.test.d.ts +1 -0
- package/fireproof/query-result-properties.test.js +25 -0
- package/fireproof/query-result-properties.test.js.map +1 -0
- package/fireproof/query-result-properties.test.ts +43 -0
- package/fireproof/stable-cid.test.d.ts +1 -0
- package/fireproof/stable-cid.test.js +52 -0
- package/fireproof/stable-cid.test.js.map +1 -0
- package/fireproof/stable-cid.test.ts +72 -0
- package/fireproof/utils.test.d.ts +1 -0
- package/fireproof/utils.test.js +124 -0
- package/fireproof/utils.test.js.map +1 -0
- package/fireproof/utils.test.ts +137 -0
- package/gateway/file/loader-config.test.d.ts +1 -0
- package/gateway/file/loader-config.test.js +255 -0
- package/gateway/file/loader-config.test.js.map +1 -0
- package/gateway/file/loader-config.test.ts +309 -0
- package/gateway/indexeddb/loader-config.test.d.ts +1 -0
- package/gateway/indexeddb/loader-config.test.js +77 -0
- package/gateway/indexeddb/loader-config.test.js.map +1 -0
- package/gateway/indexeddb/loader-config.test.ts +80 -0
- package/global-setup.d.ts +2 -0
- package/global-setup.js +9 -0
- package/global-setup.js.map +1 -0
- package/global-setup.ts +11 -0
- package/helpers.d.ts +31 -0
- package/helpers.js +140 -0
- package/helpers.js.map +1 -0
- package/helpers.ts +177 -0
- package/package.json +75 -0
- package/protocols/cloud/msger.test.d.ts +1 -0
- package/protocols/cloud/msger.test.js +464 -0
- package/protocols/cloud/msger.test.js.map +1 -0
- package/protocols/cloud/msger.test.ts +559 -0
- package/runtime/fp-envelope-serialize.test.d.ts +1 -0
- package/runtime/fp-envelope-serialize.test.js +223 -0
- package/runtime/fp-envelope-serialize.test.js.map +1 -0
- package/runtime/fp-envelope-serialize.test.ts +266 -0
- package/runtime/meta-key-hack.test.d.ts +1 -0
- package/runtime/meta-key-hack.test.js +85 -0
- package/runtime/meta-key-hack.test.js.map +1 -0
- package/runtime/meta-key-hack.test.ts +103 -0
- package/setup.file.d.ts +1 -0
- package/setup.file.js +3 -0
- package/setup.file.js.map +1 -0
- package/setup.file.ts +1 -0
- package/setup.indexeddb.d.ts +1 -0
- package/setup.indexeddb.js +2 -0
- package/setup.indexeddb.js.map +1 -0
- package/setup.indexeddb.ts +0 -0
- package/setup.memory.d.ts +1 -0
- package/setup.memory.js +4 -0
- package/setup.memory.js.map +1 -0
- package/setup.memory.ts +2 -0
- package/tsconfig.json +18 -0
- package/vitest.config.d.ts +2 -0
- package/vitest.config.js +8 -0
- package/vitest.config.js.map +1 -0
- package/vitest.config.ts +8 -0
- package/vitest.file.config.d.ts +2 -0
- package/vitest.file.config.js +11 -0
- package/vitest.file.config.js.map +1 -0
- package/vitest.file.config.ts +11 -0
- package/vitest.indexeddb.config.d.ts +2 -0
- package/vitest.indexeddb.config.js +21 -0
- package/vitest.indexeddb.config.js.map +1 -0
- package/vitest.indexeddb.config.ts +34 -0
- package/vitest.memory.config.d.ts +2 -0
- package/vitest.memory.config.js +24 -0
- package/vitest.memory.config.js.map +1 -0
- package/vitest.memory.config.ts +24 -0
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
import { AppContext, BuildURI, URI } from "@adviser/cement";
|
|
2
|
+
import { stripper } from "@adviser/cement/utils";
|
|
3
|
+
import { fireproof, PARAM } from "@fireproof/core";
|
|
4
|
+
import { CarReader } from "@ipld/car/reader";
|
|
5
|
+
import * as dagCbor from "@ipld/dag-cbor";
|
|
6
|
+
import { mockLoader } from "../helpers.js";
|
|
7
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
8
|
+
import { ensureSuperThis, sleep } from "@fireproof/core-runtime";
|
|
9
|
+
import { AttachedRemotesImpl } from "@fireproof/core-blockstore";
|
|
10
|
+
const ROWS = 1;
|
|
11
|
+
class AJoinable {
|
|
12
|
+
name;
|
|
13
|
+
db;
|
|
14
|
+
constructor(name, db) {
|
|
15
|
+
this.name = name;
|
|
16
|
+
this.db = db;
|
|
17
|
+
}
|
|
18
|
+
async configHash() {
|
|
19
|
+
return `joinable-${this.name}`;
|
|
20
|
+
}
|
|
21
|
+
prepare() {
|
|
22
|
+
return Promise.resolve({
|
|
23
|
+
car: {
|
|
24
|
+
url: BuildURI.from(`memory://car/${this.name}`)
|
|
25
|
+
.setParam(PARAM.STORE_KEY, this.db.ledger.opts.storeUrls.data.car.getParam(PARAM.STORE_KEY, "@fireproof:attach@"))
|
|
26
|
+
.setParam(PARAM.SELF_REFLECT, "x"),
|
|
27
|
+
},
|
|
28
|
+
meta: {
|
|
29
|
+
url: BuildURI.from(`memory://meta/${this.name}`)
|
|
30
|
+
.setParam(PARAM.STORE_KEY, this.db.ledger.opts.storeUrls.data.meta.getParam(PARAM.STORE_KEY, "@fireproof:attach@"))
|
|
31
|
+
.setParam(PARAM.SELF_REFLECT, "x"),
|
|
32
|
+
},
|
|
33
|
+
file: {
|
|
34
|
+
url: BuildURI.from(`memory://file/${this.name}`)
|
|
35
|
+
.setParam(PARAM.STORE_KEY, this.db.ledger.opts.storeUrls.data.file.getParam(PARAM.STORE_KEY, "@fireproof:attach@"))
|
|
36
|
+
.setParam(PARAM.SELF_REFLECT, "x"),
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function aJoinable(name, db) {
|
|
42
|
+
return new AJoinable(name, db);
|
|
43
|
+
}
|
|
44
|
+
function attachableStoreUrls(name, db) {
|
|
45
|
+
return {
|
|
46
|
+
data: {
|
|
47
|
+
car: BuildURI.from(`memory://car/${name}?`)
|
|
48
|
+
.setParam(PARAM.STORE_KEY, db.ledger.opts.storeUrls.data.car.getParam(PARAM.STORE_KEY, ""))
|
|
49
|
+
.URI(),
|
|
50
|
+
meta: BuildURI.from(`memory://meta/${name}`)
|
|
51
|
+
.setParam(PARAM.STORE_KEY, db.ledger.opts.storeUrls.data.meta.getParam(PARAM.STORE_KEY, ""))
|
|
52
|
+
.URI(),
|
|
53
|
+
file: BuildURI.from(`memory://file/${name}`)
|
|
54
|
+
.setParam(PARAM.STORE_KEY, db.ledger.opts.storeUrls.data.file.getParam(PARAM.STORE_KEY, ""))
|
|
55
|
+
.URI(),
|
|
56
|
+
wal: BuildURI.from(`memory://wal/${name}`)
|
|
57
|
+
.setParam(PARAM.STORE_KEY, db.ledger.opts.storeUrls.data.wal.getParam(PARAM.STORE_KEY, ""))
|
|
58
|
+
.URI(),
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
describe("meta check", () => {
|
|
63
|
+
const sthis = ensureSuperThis();
|
|
64
|
+
it("empty Database", async () => {
|
|
65
|
+
const name = `remote-db-${sthis.nextId().str}`;
|
|
66
|
+
const db = fireproof(name, {
|
|
67
|
+
storeUrls: {
|
|
68
|
+
base: `memory://${name}`,
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
await db.ready();
|
|
72
|
+
const gws = db.ledger.crdt.blockstore.loader.attachedStores.local();
|
|
73
|
+
await db.close();
|
|
74
|
+
expect(Array.from(gws.active.car.realGateway.gw.memories.entries()).filter(([k]) => k.startsWith(`memory://${name}`))).toEqual([]);
|
|
75
|
+
});
|
|
76
|
+
it("one record Database", async () => {
|
|
77
|
+
const name = `remote-db-${sthis.nextId().str}`;
|
|
78
|
+
const db = fireproof(name, {
|
|
79
|
+
storeUrls: {
|
|
80
|
+
base: `memory://${name}`,
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
await db.put({ _id: `id-${0}`, value: `value-${0}` });
|
|
84
|
+
await db.close();
|
|
85
|
+
const db1 = fireproof(name, {
|
|
86
|
+
storeUrls: {
|
|
87
|
+
base: `memory://${name}`,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
await db1.close();
|
|
91
|
+
});
|
|
92
|
+
it("multiple record Database", async () => {
|
|
93
|
+
const name = `remote-db-${sthis.nextId().str}`;
|
|
94
|
+
const base = `memory://${name}?storekey=insecure`;
|
|
95
|
+
const db = fireproof(name, {
|
|
96
|
+
storeUrls: {
|
|
97
|
+
base,
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
await db.ready();
|
|
101
|
+
await db.put({ _id: `id-${0}`, value: `value-${0}` });
|
|
102
|
+
const gws = db.ledger.crdt.blockstore.loader.attachedStores.local();
|
|
103
|
+
expect(db.ledger.crdt.blockstore.loader.carLog.asArray().map((i) => i.map((i) => i.toString()))).toEqual([
|
|
104
|
+
["baembeieldbalgnyxqp7rmj4cbrot75gweavqy3aw22km43zsfufrihfn7e"],
|
|
105
|
+
["baembeig2is4vdgz4gyiadfh5uutxxeiuqtacnesnytrnilpwcu7q5m5tmu"],
|
|
106
|
+
]);
|
|
107
|
+
await db.close();
|
|
108
|
+
expect(Array.from(gws.active.car.realGateway.gw.memories.entries())
|
|
109
|
+
.filter(([k]) => k.startsWith(`memory://${name}`))
|
|
110
|
+
.map(([k]) => stripper(["name", "storekey", "version"], Array.from(URI.from(k).getParams).reduce((acc, [k, v]) => ({ ...acc, [k]: v }), {})))).toEqual([
|
|
111
|
+
{
|
|
112
|
+
key: "baembeig2is4vdgz4gyiadfh5uutxxeiuqtacnesnytrnilpwcu7q5m5tmu",
|
|
113
|
+
store: "car",
|
|
114
|
+
suffix: ".car",
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
key: "main",
|
|
118
|
+
store: "wal",
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
key: "main",
|
|
122
|
+
store: "meta",
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
key: "baembeieldbalgnyxqp7rmj4cbrot75gweavqy3aw22km43zsfufrihfn7e",
|
|
126
|
+
store: "car",
|
|
127
|
+
suffix: ".car",
|
|
128
|
+
},
|
|
129
|
+
]);
|
|
130
|
+
const db1 = fireproof(name, {
|
|
131
|
+
storeUrls: {
|
|
132
|
+
base,
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
expect(db1.ledger).not.equal(db.ledger);
|
|
136
|
+
await db1.ready();
|
|
137
|
+
expect(db1.ledger.crdt.blockstore.loader.carLog.asArray().map((i) => i.map((i) => i.toString()))).toEqual([
|
|
138
|
+
["baembeieldbalgnyxqp7rmj4cbrot75gweavqy3aw22km43zsfufrihfn7e"],
|
|
139
|
+
["baembeig2is4vdgz4gyiadfh5uutxxeiuqtacnesnytrnilpwcu7q5m5tmu"],
|
|
140
|
+
]);
|
|
141
|
+
const gensis = await db1.get(PARAM.GENESIS_CID);
|
|
142
|
+
expect(gensis).toEqual({ _id: PARAM.GENESIS_CID });
|
|
143
|
+
const val = await db1.allDocs();
|
|
144
|
+
expect(val.rows).toEqual([
|
|
145
|
+
{
|
|
146
|
+
key: "id-0",
|
|
147
|
+
value: {
|
|
148
|
+
_id: "id-0",
|
|
149
|
+
value: "value-0",
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
]);
|
|
153
|
+
const car = Array.from(gws.active.car.realGateway.gw.memories.entries())
|
|
154
|
+
.filter(([k]) => k.startsWith(`memory://${name}`))
|
|
155
|
+
.map(([k, v]) => [URI.from(k).getParam(PARAM.KEY), v])
|
|
156
|
+
.find(([k]) => k === "baembeig2is4vdgz4gyiadfh5uutxxeiuqtacnesnytrnilpwcu7q5m5tmu");
|
|
157
|
+
const rawReader = await CarReader.fromBytes(car[1]);
|
|
158
|
+
const blocks = [];
|
|
159
|
+
for await (const block of rawReader.blocks()) {
|
|
160
|
+
blocks.push(block);
|
|
161
|
+
}
|
|
162
|
+
expect(dagCbor.decode(blocks[1].bytes)).toEqual({
|
|
163
|
+
doc: {
|
|
164
|
+
_id: "baembeiarootfireproofgenesisblockaaaafireproofgenesisblocka",
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
expect(blocks.map((i) => i.cid.toString())).toEqual([
|
|
168
|
+
"bafyreibxibqhi6wh5klrje7ne4htffeqyyqfd6y7x2no6wnhid4nixizau",
|
|
169
|
+
"bafyreidnvv4mwvweup5w52ddre2sl4syhvczm6ejqsmuekajowdl2cf2q4",
|
|
170
|
+
"bafyreihh6nbfbhgkf5lz7hhsscjgiquw426rxzr3fprbgonekzmyvirrhe",
|
|
171
|
+
"bafyreiejg3twlaxr7gfvvhtxrhvwaydytdv4guidmtvaz5dskm6gp73ryi",
|
|
172
|
+
"bafyreiblui55o25dopc5faol3umsnuohb5carto7tot4kicnkfc37he4h4",
|
|
173
|
+
]);
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
describe("activate store", () => {
|
|
177
|
+
const sthis = ensureSuperThis();
|
|
178
|
+
let attach;
|
|
179
|
+
let firstAttached;
|
|
180
|
+
let secondAttached;
|
|
181
|
+
beforeEach(async () => {
|
|
182
|
+
attach = new AttachedRemotesImpl(mockLoader(sthis));
|
|
183
|
+
firstAttached = await attach.attach({
|
|
184
|
+
name: "first",
|
|
185
|
+
configHash: async () => "first",
|
|
186
|
+
prepare: async () => ({
|
|
187
|
+
car: { url: "memory://first?store=car" },
|
|
188
|
+
meta: { url: "memory://first?store=meta" },
|
|
189
|
+
file: { url: "memory://first" },
|
|
190
|
+
wal: { url: "memory://first?store=wal" },
|
|
191
|
+
}),
|
|
192
|
+
}, (at) => Promise.resolve(at));
|
|
193
|
+
secondAttached = await attach.attach({
|
|
194
|
+
name: "second",
|
|
195
|
+
configHash: async () => "second",
|
|
196
|
+
prepare: async () => ({
|
|
197
|
+
car: { url: "memory://second?store=car" },
|
|
198
|
+
meta: { url: "memory://second?store=meta" },
|
|
199
|
+
file: { url: "memory://second?store=file" },
|
|
200
|
+
}),
|
|
201
|
+
}, (at) => Promise.resolve(at));
|
|
202
|
+
});
|
|
203
|
+
it("activate by store", async () => {
|
|
204
|
+
expect(attach.activate(secondAttached.stores).active.car.url().toString()).toBe("memory://second?localName=first&name=second&store=car&storekey=%40first-data%40&suffix=.car&version=v0.19-memory");
|
|
205
|
+
expect(attach.activate(firstAttached.stores).local().active.car.url().toString()).toBe("memory://first?name=first&store=car&storekey=%40first-data%40&suffix=.car&version=v0.19-memory");
|
|
206
|
+
expect(attach.activate(firstAttached.stores).active.meta.url().toString()).toBe("memory://first?name=first&store=meta&storekey=%40first-meta%40&version=v0.19-memory");
|
|
207
|
+
});
|
|
208
|
+
it("activate by store", async () => {
|
|
209
|
+
expect(attach.activate("memory://second").active.car.url().toString()).toBe("memory://second?localName=first&name=second&store=car&storekey=%40first-data%40&suffix=.car&version=v0.19-memory");
|
|
210
|
+
expect(attach.activate("memory://second").remotes()[0].active.car.url().toString()).toEqual("memory://second?localName=first&name=second&store=car&storekey=%40first-data%40&suffix=.car&version=v0.19-memory");
|
|
211
|
+
expect(attach.activate("memory://first?store=meta").active.car.url().toString()).toBe("memory://first?name=first&store=car&storekey=%40first-data%40&suffix=.car&version=v0.19-memory");
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
describe("join function", () => {
|
|
215
|
+
const sthis = ensureSuperThis();
|
|
216
|
+
let db;
|
|
217
|
+
let joinableDBs = [];
|
|
218
|
+
beforeEach(async () => {
|
|
219
|
+
const set = sthis.nextId().str;
|
|
220
|
+
db = fireproof(`db-${set}`, {
|
|
221
|
+
storeUrls: {
|
|
222
|
+
base: `memory://db-${set}`,
|
|
223
|
+
},
|
|
224
|
+
});
|
|
225
|
+
for (let j = 0; j < ROWS; j++) {
|
|
226
|
+
await db.put({ _id: `db-${j}`, value: `db-${set}` });
|
|
227
|
+
}
|
|
228
|
+
joinableDBs = await Promise.all(new Array(1).fill(1).map(async (_, i) => {
|
|
229
|
+
const name = `remote-db-${i}-${set}`;
|
|
230
|
+
const jdb = fireproof(name, {
|
|
231
|
+
storeUrls: attachableStoreUrls(name, db),
|
|
232
|
+
});
|
|
233
|
+
for (let j = 0; j < ROWS; j++) {
|
|
234
|
+
await jdb.put({ _id: `${i}-${j}`, value: `${i}-${j}` });
|
|
235
|
+
}
|
|
236
|
+
expect(await jdb.get(PARAM.GENESIS_CID)).toEqual({ _id: PARAM.GENESIS_CID });
|
|
237
|
+
await jdb.close();
|
|
238
|
+
return name;
|
|
239
|
+
}));
|
|
240
|
+
expect(await db.get(PARAM.GENESIS_CID)).toEqual({ _id: PARAM.GENESIS_CID });
|
|
241
|
+
});
|
|
242
|
+
afterEach(async () => {
|
|
243
|
+
await db.close();
|
|
244
|
+
});
|
|
245
|
+
it("it is joinable detachable", async () => {
|
|
246
|
+
const my = fireproof("my", {
|
|
247
|
+
storeUrls: {
|
|
248
|
+
base: BuildURI.from("memory://it-is-joinable-detachable").setParam(PARAM.STORE_KEY, db.ledger.opts.storeUrls.data.car.getParam(PARAM.STORE_KEY, "")),
|
|
249
|
+
},
|
|
250
|
+
});
|
|
251
|
+
await my.put({ _id: "genesis", value: "genesis" });
|
|
252
|
+
await Promise.all(joinableDBs.map(async (name) => {
|
|
253
|
+
const tmp = fireproof(name, {
|
|
254
|
+
storeUrls: attachableStoreUrls(name, my),
|
|
255
|
+
});
|
|
256
|
+
const res = await tmp.allDocs();
|
|
257
|
+
expect(res.rows.length).toBe(ROWS);
|
|
258
|
+
await tmp.close();
|
|
259
|
+
const attached = await my.attach(aJoinable(name, my));
|
|
260
|
+
expect(attached).toBeDefined();
|
|
261
|
+
}));
|
|
262
|
+
expect(my.ledger.crdt.blockstore.loader.attachedStores.remotes().length).toBe(joinableDBs.length);
|
|
263
|
+
await my.close();
|
|
264
|
+
expect(my.ledger.crdt.blockstore.loader.attachedStores.remotes().length).toBe(0);
|
|
265
|
+
});
|
|
266
|
+
it("it is inbound syncing", async () => {
|
|
267
|
+
await Promise.all(joinableDBs.map(async (name) => {
|
|
268
|
+
const attached = await db.attach(aJoinable(name, db));
|
|
269
|
+
expect(attached).toBeDefined();
|
|
270
|
+
}));
|
|
271
|
+
await sleep(100);
|
|
272
|
+
expect(db.ledger.crdt.blockstore.loader.attachedStores.remotes().length).toBe(joinableDBs.length);
|
|
273
|
+
const res = await db.allDocs();
|
|
274
|
+
expect(res.rows.length).toBe(ROWS + ROWS * joinableDBs.length);
|
|
275
|
+
});
|
|
276
|
+
it("it empty inbound syncing", async () => {
|
|
277
|
+
const name = `empty-db-${sthis.nextId().str}`;
|
|
278
|
+
const mydb = fireproof(name, {
|
|
279
|
+
storeUrls: attachableStoreUrls(name, db),
|
|
280
|
+
});
|
|
281
|
+
await Promise.all(joinableDBs.map(async (name) => {
|
|
282
|
+
const attached = await mydb.attach(aJoinable(name, mydb));
|
|
283
|
+
expect(attached).toBeDefined();
|
|
284
|
+
}));
|
|
285
|
+
await sleep(100);
|
|
286
|
+
expect(mydb.ledger.crdt.blockstore.loader.attachedStores.remotes().length).toBe(joinableDBs.length);
|
|
287
|
+
const res = await mydb.allDocs();
|
|
288
|
+
expect(res.rows.length).toBe(ROWS * joinableDBs.length);
|
|
289
|
+
});
|
|
290
|
+
it("prepare only once", async () => {
|
|
291
|
+
const db = fireproof(`db-${sthis.nextId().str}`, {
|
|
292
|
+
storeUrls: {
|
|
293
|
+
base: `memory://prepare`,
|
|
294
|
+
},
|
|
295
|
+
});
|
|
296
|
+
const mocked = aJoinable("test", db);
|
|
297
|
+
const originalPrepare = mocked.prepare;
|
|
298
|
+
mocked.prepare = vi.fn(() => originalPrepare.apply(mocked));
|
|
299
|
+
expect(mocked.prepare).not.toHaveBeenCalled();
|
|
300
|
+
for (let i = 0; i < 10; i++) {
|
|
301
|
+
await db.attach(mocked);
|
|
302
|
+
expect(mocked.prepare).toHaveBeenCalled();
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
it("offline sync", async () => {
|
|
306
|
+
const id = sthis.nextId().str;
|
|
307
|
+
const poutbound = await prepareDb(`outbound-db-${id}`, "memory://sync-outbound");
|
|
308
|
+
await poutbound.db.attach(aJoinable(`sync-${id}`, poutbound.db));
|
|
309
|
+
await poutbound.db.close();
|
|
310
|
+
const outRows = await readDb(`outbound-db-${id}`, "memory://sync-outbound");
|
|
311
|
+
expect(outRows.length).toBe(ROWS);
|
|
312
|
+
const pinbound = await prepareDb(`inbound-db-${id}`, `memory://sync-inbound`);
|
|
313
|
+
await pinbound.db.close();
|
|
314
|
+
const inRows = await readDb(`inbound-db-${id}`, "memory://sync-inbound");
|
|
315
|
+
expect(inRows.length).toBe(ROWS);
|
|
316
|
+
const inbound = await syncDb(`inbound-db-${id}`, `memory://sync-inbound`);
|
|
317
|
+
await inbound.attach(aJoinable(`sync-${id}`, inbound));
|
|
318
|
+
await inbound.close();
|
|
319
|
+
const resultRows = await readDb(`inbound-db-${id}`, "memory://sync-inbound");
|
|
320
|
+
expect(resultRows.length).toBe(ROWS * 2);
|
|
321
|
+
expect(resultRows).toEqual(outRows.concat(inRows).sort((a, b) => a.key.localeCompare(b.key)));
|
|
322
|
+
const joined = { db: await syncDb(`joined-db-${id}`, "memory://sync-joined") };
|
|
323
|
+
await joined.db.attach(aJoinable(`sync-${id}`, joined.db));
|
|
324
|
+
await joined.db.close();
|
|
325
|
+
const joinedRows = await readDb(`joined-db-${id}`, "memory://sync-joined");
|
|
326
|
+
expect(resultRows).toEqual(joinedRows);
|
|
327
|
+
}, 100_000);
|
|
328
|
+
});
|
|
329
|
+
describe("sync", () => {
|
|
330
|
+
const sthis = ensureSuperThis();
|
|
331
|
+
it("online sync", async () => {
|
|
332
|
+
const id = sthis.nextId().str;
|
|
333
|
+
const dbs = await Promise.all(Array(3)
|
|
334
|
+
.fill(0)
|
|
335
|
+
.map(async (_, i) => {
|
|
336
|
+
const tdb = await prepareDb(`online-db-${id}-${i}`, `memory://local-${id}-${i}`);
|
|
337
|
+
await tdb.db.attach(aJoinable(`sync-${id}`, tdb.db));
|
|
338
|
+
return tdb;
|
|
339
|
+
}));
|
|
340
|
+
await sleep(1000);
|
|
341
|
+
await Promise.all(dbs.map(async (tdb) => {
|
|
342
|
+
const rows = await tdb.db.allDocs();
|
|
343
|
+
expect(rows.rows.length).toBe(ROWS * dbs.length);
|
|
344
|
+
}));
|
|
345
|
+
const keys = (await Promise.all(dbs.map(async (db) => {
|
|
346
|
+
await sleep(100 * Math.random());
|
|
347
|
+
return writeRow(db, "add-online");
|
|
348
|
+
}))).flat();
|
|
349
|
+
await sleep(1000);
|
|
350
|
+
await Promise.all(dbs.map(async (db) => {
|
|
351
|
+
for (const key of keys) {
|
|
352
|
+
const rows = await db.db.get(key);
|
|
353
|
+
expect(rows).toEqual({ _id: key, value: key });
|
|
354
|
+
}
|
|
355
|
+
}));
|
|
356
|
+
const toCloseDbs = [dbs.shift(), dbs.pop()];
|
|
357
|
+
await Promise.all(toCloseDbs.map((tdb) => tdb.db.close()));
|
|
358
|
+
await Promise.all(dbs.map(async (db) => {
|
|
359
|
+
return writeRow(db, "mid-dbs");
|
|
360
|
+
}));
|
|
361
|
+
const reOpenedWithoutAttach = await Promise.all(toCloseDbs.map(async (tdb) => {
|
|
362
|
+
const db = await syncDb(tdb.db.name, tdb.db.ledger.ctx.get("base"));
|
|
363
|
+
return { db, dbId: tdb.dbId };
|
|
364
|
+
}));
|
|
365
|
+
await Promise.all(dbs.map(async (db) => {
|
|
366
|
+
return writeRow(db, "reOpenKeys");
|
|
367
|
+
}));
|
|
368
|
+
await Promise.all(reOpenedWithoutAttach.map(async (tdb) => {
|
|
369
|
+
await tdb.db.attach(aJoinable(`sync-${id}`, tdb.db));
|
|
370
|
+
}));
|
|
371
|
+
await sleep(500);
|
|
372
|
+
await Promise.all(dbs.map(async (tdb) => {
|
|
373
|
+
const rows = await tdb.db.allDocs();
|
|
374
|
+
expect(rows.rows.length).toBe(8 * ROWS * dbs.length);
|
|
375
|
+
}));
|
|
376
|
+
await Promise.all(dbs.map((tdb) => tdb.db.close()));
|
|
377
|
+
await Promise.all(reOpenedWithoutAttach.map((tdb) => tdb.db.close()));
|
|
378
|
+
}, 100_000);
|
|
379
|
+
it.skip("sync outbound", async () => {
|
|
380
|
+
const id = sthis.nextId().str;
|
|
381
|
+
const outbound = await prepareDb(`outbound-db-${id}`, `memory://sync-outbound-${id}`);
|
|
382
|
+
await outbound.db.attach(aJoinable(`sync-${id}`, outbound.db));
|
|
383
|
+
await writeRow(outbound, "outbound");
|
|
384
|
+
const inbound = await prepareDb(`inbound-db-${id}`, `memory://sync-inbound-${id}`);
|
|
385
|
+
await inbound.db.attach(aJoinable(`sync-${id}`, inbound.db));
|
|
386
|
+
await writeRow(inbound, "both-inbound");
|
|
387
|
+
await writeRow(outbound, "both-outbound");
|
|
388
|
+
await sleep(1000);
|
|
389
|
+
await inbound.db.close();
|
|
390
|
+
await outbound.db.close();
|
|
391
|
+
const inRows = await readDb(`inbound-db-${id}`, `memory://sync-inbound-${id}`);
|
|
392
|
+
const outRows = await readDb(`outbound-db-${id}`, `memory://sync-outbound-${id}`);
|
|
393
|
+
console.log("out", outRows.map((row) => row.key));
|
|
394
|
+
console.log("in", inRows.map((row) => row.key));
|
|
395
|
+
expect(inRows).toEqual(outRows);
|
|
396
|
+
}, 100_000);
|
|
397
|
+
});
|
|
398
|
+
async function syncDb(name, base, tracer) {
|
|
399
|
+
const db = fireproof(name, {
|
|
400
|
+
storeUrls: {
|
|
401
|
+
base: BuildURI.from(base).setParam(PARAM.STORE_KEY, "@fireproof:attach@"),
|
|
402
|
+
},
|
|
403
|
+
ctx: AppContext.merge({ base }),
|
|
404
|
+
tracer,
|
|
405
|
+
});
|
|
406
|
+
await db.ready();
|
|
407
|
+
return db;
|
|
408
|
+
}
|
|
409
|
+
async function prepareDb(name, base, tracer) {
|
|
410
|
+
{
|
|
411
|
+
const db = await syncDb(name, base, tracer);
|
|
412
|
+
await db.ready();
|
|
413
|
+
const dbId = await db.ledger.crdt.blockstore.loader.attachedStores.local().active.car.id();
|
|
414
|
+
const ret = { db, dbId };
|
|
415
|
+
await writeRow(ret, `initial`);
|
|
416
|
+
await db.close();
|
|
417
|
+
}
|
|
418
|
+
const db = await syncDb(name, base);
|
|
419
|
+
await db.ready();
|
|
420
|
+
const dbId = await db.ledger.crdt.blockstore.loader.attachedStores.local().active.car.id();
|
|
421
|
+
return { db, dbId };
|
|
422
|
+
}
|
|
423
|
+
async function readDb(name, base) {
|
|
424
|
+
const db = await syncDb(name, base);
|
|
425
|
+
const rows = await db.allDocs();
|
|
426
|
+
await db.close();
|
|
427
|
+
return rows.rows.sort((a, b) => a.key.localeCompare(b.key));
|
|
428
|
+
}
|
|
429
|
+
async function writeRow(pdb, style) {
|
|
430
|
+
return await Promise.all(Array(ROWS)
|
|
431
|
+
.fill(0)
|
|
432
|
+
.map(async (_, i) => {
|
|
433
|
+
const key = `${pdb.dbId}-${pdb.db.name}-${style}-${i}`;
|
|
434
|
+
await pdb.db.put({ _id: key, value: key });
|
|
435
|
+
return key;
|
|
436
|
+
}));
|
|
437
|
+
}
|
|
438
|
+
//# sourceMappingURL=attachable.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachable.test.js","sourceRoot":"","sources":["attachable.test.ts"],"names":[],"mappings":"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"}
|