@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.
Files changed (162) hide show
  1. package/LICENSE.md +232 -0
  2. package/blockstore/fp-envelope.test.ts-off +65 -0
  3. package/blockstore/fragment-gateway.test.ts-off +106 -0
  4. package/blockstore/interceptor-gateway.test.d.ts +19 -0
  5. package/blockstore/interceptor-gateway.test.js +217 -0
  6. package/blockstore/interceptor-gateway.test.js.map +1 -0
  7. package/blockstore/interceptor-gateway.test.ts +259 -0
  8. package/blockstore/keyed-crypto-indexeddb-file.test.d.ts +1 -0
  9. package/blockstore/keyed-crypto-indexeddb-file.test.js +114 -0
  10. package/blockstore/keyed-crypto-indexeddb-file.test.js.map +1 -0
  11. package/blockstore/keyed-crypto-indexeddb-file.test.ts +134 -0
  12. package/blockstore/keyed-crypto.test.d.ts +1 -0
  13. package/blockstore/keyed-crypto.test.js +310 -0
  14. package/blockstore/keyed-crypto.test.js.map +1 -0
  15. package/blockstore/keyed-crypto.test.ts +382 -0
  16. package/blockstore/loader.test.d.ts +1 -0
  17. package/blockstore/loader.test.js +241 -0
  18. package/blockstore/loader.test.js.map +1 -0
  19. package/blockstore/loader.test.ts +313 -0
  20. package/blockstore/standalone.test.d.ts +1 -0
  21. package/blockstore/standalone.test.js +112 -0
  22. package/blockstore/standalone.test.js.map +1 -0
  23. package/blockstore/standalone.test.ts +156 -0
  24. package/blockstore/store.test.d.ts +1 -0
  25. package/blockstore/store.test.js +152 -0
  26. package/blockstore/store.test.js.map +1 -0
  27. package/blockstore/store.test.ts +199 -0
  28. package/blockstore/transaction.test.d.ts +1 -0
  29. package/blockstore/transaction.test.js +109 -0
  30. package/blockstore/transaction.test.js.map +1 -0
  31. package/blockstore/transaction.test.ts +132 -0
  32. package/fireproof/all-gateway.test.d.ts +1 -0
  33. package/fireproof/all-gateway.test.js +333 -0
  34. package/fireproof/all-gateway.test.js.map +1 -0
  35. package/fireproof/all-gateway.test.ts +477 -0
  36. package/fireproof/attachable.test.d.ts +1 -0
  37. package/fireproof/attachable.test.js +438 -0
  38. package/fireproof/attachable.test.js.map +1 -0
  39. package/fireproof/attachable.test.ts +677 -0
  40. package/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.car +0 -0
  41. package/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.d.ts +4 -0
  42. package/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.js +325 -0
  43. package/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.js.map +1 -0
  44. package/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.ts +324 -0
  45. package/fireproof/charwise-boolean.test.d.ts +1 -0
  46. package/fireproof/charwise-boolean.test.js +43 -0
  47. package/fireproof/charwise-boolean.test.js.map +1 -0
  48. package/fireproof/charwise-boolean.test.ts +68 -0
  49. package/fireproof/crdt.test.d.ts +1 -0
  50. package/fireproof/crdt.test.js +509 -0
  51. package/fireproof/crdt.test.js.map +1 -0
  52. package/fireproof/crdt.test.ts +572 -0
  53. package/fireproof/database.test.d.ts +1 -0
  54. package/fireproof/database.test.js +658 -0
  55. package/fireproof/database.test.js.map +1 -0
  56. package/fireproof/database.test.ts +772 -0
  57. package/fireproof/deleted-docs-handling.test.d.ts +1 -0
  58. package/fireproof/deleted-docs-handling.test.js +69 -0
  59. package/fireproof/deleted-docs-handling.test.js.map +1 -0
  60. package/fireproof/deleted-docs-handling.test.ts +112 -0
  61. package/fireproof/fireproof.test.d.ts +3 -0
  62. package/fireproof/fireproof.test.fixture.d.ts +15 -0
  63. package/fireproof/fireproof.test.fixture.js +134 -0
  64. package/fireproof/fireproof.test.fixture.js.map +1 -0
  65. package/fireproof/fireproof.test.fixture.ts +133 -0
  66. package/fireproof/fireproof.test.js +574 -0
  67. package/fireproof/fireproof.test.js.map +1 -0
  68. package/fireproof/fireproof.test.ts +767 -0
  69. package/fireproof/hello.test.d.ts +1 -0
  70. package/fireproof/hello.test.js +67 -0
  71. package/fireproof/hello.test.js.map +1 -0
  72. package/fireproof/hello.test.ts +75 -0
  73. package/fireproof/indexer.test.d.ts +1 -0
  74. package/fireproof/indexer.test.js +408 -0
  75. package/fireproof/indexer.test.js.map +1 -0
  76. package/fireproof/indexer.test.ts +459 -0
  77. package/fireproof/multiple-ledger.test.d.ts +1 -0
  78. package/fireproof/multiple-ledger.test.js +51 -0
  79. package/fireproof/multiple-ledger.test.js.map +1 -0
  80. package/fireproof/multiple-ledger.test.ts +67 -0
  81. package/fireproof/query-docs.test.d.ts +1 -0
  82. package/fireproof/query-docs.test.js +69 -0
  83. package/fireproof/query-docs.test.js.map +1 -0
  84. package/fireproof/query-docs.test.ts +117 -0
  85. package/fireproof/query-limit-issue.test.d.ts +1 -0
  86. package/fireproof/query-limit-issue.test.js +89 -0
  87. package/fireproof/query-limit-issue.test.js.map +1 -0
  88. package/fireproof/query-limit-issue.test.ts +147 -0
  89. package/fireproof/query-property-inconsistency.test.d.ts +1 -0
  90. package/fireproof/query-property-inconsistency.test.js +52 -0
  91. package/fireproof/query-property-inconsistency.test.js.map +1 -0
  92. package/fireproof/query-property-inconsistency.test.ts +90 -0
  93. package/fireproof/query-result-properties.test.d.ts +1 -0
  94. package/fireproof/query-result-properties.test.js +25 -0
  95. package/fireproof/query-result-properties.test.js.map +1 -0
  96. package/fireproof/query-result-properties.test.ts +43 -0
  97. package/fireproof/stable-cid.test.d.ts +1 -0
  98. package/fireproof/stable-cid.test.js +52 -0
  99. package/fireproof/stable-cid.test.js.map +1 -0
  100. package/fireproof/stable-cid.test.ts +72 -0
  101. package/fireproof/utils.test.d.ts +1 -0
  102. package/fireproof/utils.test.js +124 -0
  103. package/fireproof/utils.test.js.map +1 -0
  104. package/fireproof/utils.test.ts +137 -0
  105. package/gateway/file/loader-config.test.d.ts +1 -0
  106. package/gateway/file/loader-config.test.js +255 -0
  107. package/gateway/file/loader-config.test.js.map +1 -0
  108. package/gateway/file/loader-config.test.ts +309 -0
  109. package/gateway/indexeddb/loader-config.test.d.ts +1 -0
  110. package/gateway/indexeddb/loader-config.test.js +77 -0
  111. package/gateway/indexeddb/loader-config.test.js.map +1 -0
  112. package/gateway/indexeddb/loader-config.test.ts +80 -0
  113. package/global-setup.d.ts +2 -0
  114. package/global-setup.js +9 -0
  115. package/global-setup.js.map +1 -0
  116. package/global-setup.ts +11 -0
  117. package/helpers.d.ts +31 -0
  118. package/helpers.js +140 -0
  119. package/helpers.js.map +1 -0
  120. package/helpers.ts +177 -0
  121. package/package.json +75 -0
  122. package/protocols/cloud/msger.test.d.ts +1 -0
  123. package/protocols/cloud/msger.test.js +464 -0
  124. package/protocols/cloud/msger.test.js.map +1 -0
  125. package/protocols/cloud/msger.test.ts +559 -0
  126. package/runtime/fp-envelope-serialize.test.d.ts +1 -0
  127. package/runtime/fp-envelope-serialize.test.js +223 -0
  128. package/runtime/fp-envelope-serialize.test.js.map +1 -0
  129. package/runtime/fp-envelope-serialize.test.ts +266 -0
  130. package/runtime/meta-key-hack.test.d.ts +1 -0
  131. package/runtime/meta-key-hack.test.js +85 -0
  132. package/runtime/meta-key-hack.test.js.map +1 -0
  133. package/runtime/meta-key-hack.test.ts +103 -0
  134. package/setup.file.d.ts +1 -0
  135. package/setup.file.js +3 -0
  136. package/setup.file.js.map +1 -0
  137. package/setup.file.ts +1 -0
  138. package/setup.indexeddb.d.ts +1 -0
  139. package/setup.indexeddb.js +2 -0
  140. package/setup.indexeddb.js.map +1 -0
  141. package/setup.indexeddb.ts +0 -0
  142. package/setup.memory.d.ts +1 -0
  143. package/setup.memory.js +4 -0
  144. package/setup.memory.js.map +1 -0
  145. package/setup.memory.ts +2 -0
  146. package/tsconfig.json +18 -0
  147. package/vitest.config.d.ts +2 -0
  148. package/vitest.config.js +8 -0
  149. package/vitest.config.js.map +1 -0
  150. package/vitest.config.ts +8 -0
  151. package/vitest.file.config.d.ts +2 -0
  152. package/vitest.file.config.js +11 -0
  153. package/vitest.file.config.js.map +1 -0
  154. package/vitest.file.config.ts +11 -0
  155. package/vitest.indexeddb.config.d.ts +2 -0
  156. package/vitest.indexeddb.config.js +21 -0
  157. package/vitest.indexeddb.config.js.map +1 -0
  158. package/vitest.indexeddb.config.ts +34 -0
  159. package/vitest.memory.config.d.ts +2 -0
  160. package/vitest.memory.config.js +24 -0
  161. package/vitest.memory.config.js.map +1 -0
  162. 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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"}