@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,313 @@
1
+ import * as codec from "@ipld/dag-cbor";
2
+ import { sha256 as hasher } from "multiformats/hashes/sha2";
3
+ import { CID } from "multiformats/cid";
4
+ import { CRDTMeta, CarTransaction, IndexTransactionMeta, SuperThis } from "@fireproof/core";
5
+ import { simpleBlockOpts } from "../helpers.js";
6
+ import {
7
+ EncryptedBlockstore,
8
+ Loader,
9
+ CompactionFetcher,
10
+ CarTransactionImpl,
11
+ anyBlock2FPBlock,
12
+ parseCarFile,
13
+ } from "@fireproof/core-blockstore";
14
+ import { asyncBlockEncode, ensureSuperThis } from "@fireproof/core-runtime";
15
+ import {
16
+ FPBlock,
17
+ TransactionMeta,
18
+ isCarBlockItemReady,
19
+ CarGroup,
20
+ isCarBlockItemStale,
21
+ AnyLink,
22
+ } from "@fireproof/core-types-blockstore";
23
+ import { describe, afterEach, beforeEach, it, expect, assert } from "vitest";
24
+
25
+ class MyMemoryBlockStore extends EncryptedBlockstore {
26
+ readonly memblock = new Map<string, FPBlock>();
27
+ loader: Loader;
28
+ constructor(sthis: SuperThis) {
29
+ const ebOpts = simpleBlockOpts(sthis, "MyMemoryBlockStore"); //, "MyMemoryBlockStore");
30
+ // const ebOpts = {
31
+ // name: "MyMemoryBlockStore",
32
+ // } as BlockstoreOpts;
33
+ super(sthis, ebOpts);
34
+ this.loader = new Loader(sthis, ebOpts);
35
+ }
36
+ ready(): Promise<void> {
37
+ return Promise.resolve();
38
+ }
39
+ close(): Promise<void> {
40
+ return this.loader.close();
41
+ }
42
+ readonly transactions = new Set<CarTransaction>();
43
+ // readonly lastTxMeta?: TransactionMeta;
44
+ readonly compacting: boolean = false;
45
+
46
+ override async put(fp: FPBlock): Promise<void> {
47
+ this.memblock.set(fp.cid.toString(), fp);
48
+ }
49
+
50
+ // transaction<M ext(fn: (t: CarTransaction) => Promise<MetaType>, opts?: { noLoader: boolean }): Promise<MetaType> {
51
+ // throw new Error("Method not implemented.");
52
+ // }
53
+
54
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
55
+ getFile(car: AnyLink, cid: AnyLink, isPublic?: boolean): Promise<Uint8Array> {
56
+ throw new Error("Method not implemented.");
57
+ }
58
+ compact(): Promise<void> {
59
+ throw new Error("Method not implemented.");
60
+ }
61
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
62
+ defaultCompact(blocks: CompactionFetcher): Promise<TransactionMeta> {
63
+ throw new Error("Method not implemented.");
64
+ }
65
+ }
66
+
67
+ describe("basic Loader simple", function () {
68
+ let loader: Loader;
69
+ let block: FPBlock;
70
+ let t: CarTransaction;
71
+ const sthis = ensureSuperThis();
72
+
73
+ afterEach(async () => {
74
+ await loader.close();
75
+ await loader.destroy();
76
+ });
77
+
78
+ beforeEach(async () => {
79
+ const testDbName = "test-loader-commit";
80
+ await sthis.start();
81
+ const mockM = new MyMemoryBlockStore(sthis);
82
+ t = new CarTransactionImpl(mockM as EncryptedBlockstore);
83
+ loader = new Loader(sthis, {
84
+ ...simpleBlockOpts(sthis, testDbName),
85
+ public: true,
86
+ });
87
+ await loader.ready();
88
+ block = await anyBlock2FPBlock(
89
+ await asyncBlockEncode({
90
+ value: { hello: "world" },
91
+ hasher,
92
+ codec,
93
+ }),
94
+ );
95
+ await t.put(block);
96
+ await mockM.put(block);
97
+ });
98
+ it("should have an empty car log", function () {
99
+ expect(loader.carLog.length).toBe(0);
100
+ });
101
+ it("should commit", async () => {
102
+ const carGroup = await loader.commit(t, { head: [block.cid] });
103
+ expect(loader.carLog.length).toBe(1);
104
+ const reader = await loader.loadCar(carGroup[0], loader.attachedStores.local());
105
+ assert(isCarBlockItemReady(reader));
106
+ expect(reader).toBeTruthy();
107
+ const parsed = await parseCarFile<CRDTMeta>(reader, loader.logger);
108
+ expect(parsed.cars).toBeTruthy();
109
+ expect(parsed.cars.length).toBe(0);
110
+ expect(parsed.meta).toBeTruthy();
111
+ expect(parsed.meta.head).toBeTruthy();
112
+ });
113
+ });
114
+
115
+ describe("basic Loader with two commits", function () {
116
+ let loader: Loader;
117
+ let block: FPBlock;
118
+ let block2: FPBlock;
119
+ let block3: FPBlock;
120
+ let block4: FPBlock;
121
+ let t: CarTransaction;
122
+ let carCid: CarGroup;
123
+ let carCid0: CarGroup;
124
+
125
+ const sthis = ensureSuperThis();
126
+
127
+ afterEach(async () => {
128
+ await loader.close();
129
+ await loader.destroy();
130
+ });
131
+
132
+ beforeEach(async () => {
133
+ await sthis.start();
134
+ const mockM = new MyMemoryBlockStore(sthis);
135
+ t = new CarTransactionImpl(mockM);
136
+ loader = new Loader(sthis, {
137
+ ...simpleBlockOpts(sthis, "test-loader-two-commit"),
138
+ public: true,
139
+ });
140
+ await loader.ready();
141
+
142
+ block = await anyBlock2FPBlock(
143
+ await asyncBlockEncode({
144
+ value: { hello: "world" },
145
+ hasher,
146
+ codec,
147
+ }),
148
+ );
149
+ await t.put(block);
150
+ carCid0 = await loader.commit(t, { head: [block.cid] });
151
+
152
+ block2 = await anyBlock2FPBlock(
153
+ await asyncBlockEncode({
154
+ value: { hello: "universe" },
155
+ hasher,
156
+ codec,
157
+ }),
158
+ );
159
+ await t.put(block2);
160
+ carCid = await loader.commit(t, { head: [block2.cid] });
161
+
162
+ block3 = await anyBlock2FPBlock(
163
+ await asyncBlockEncode({
164
+ value: { hello: "multiverse" },
165
+ hasher,
166
+ codec,
167
+ }),
168
+ );
169
+ await t.put(block3);
170
+
171
+ block4 = await anyBlock2FPBlock(
172
+ await asyncBlockEncode({
173
+ value: { hello: "megaverse" },
174
+ hasher,
175
+ codec,
176
+ }),
177
+ );
178
+
179
+ await t.put(block4);
180
+ });
181
+
182
+ it("should have a car log", function () {
183
+ expect(loader.carLog.length).toBe(2);
184
+ expect(loader.carLog.asArray()[0].toString()).toBe(carCid.toString());
185
+ expect(loader.carLog.asArray()[1].toString()).toBe(carCid0.toString());
186
+ });
187
+
188
+ it("should commit", async () => {
189
+ const reader = await loader.loadCar(carCid[0], loader.attachedStores.local());
190
+ expect(reader).toBeTruthy();
191
+ assert(isCarBlockItemReady(reader));
192
+ const parsed = await parseCarFile<CRDTMeta>(reader, loader.logger);
193
+ expect(parsed.cars).toBeTruthy();
194
+ expect(parsed.compact.length).toBe(0);
195
+ expect(parsed.cars.length).toBe(1);
196
+ expect(parsed.meta).toBeTruthy();
197
+ expect(parsed.meta.head).toBeTruthy();
198
+ });
199
+
200
+ it("should compact", async () => {
201
+ const compactCid = await loader.commit(t, { head: [block2.cid] }, { compact: true });
202
+ expect(loader.carLog.length).toBe(1);
203
+
204
+ const reader = await loader.loadCar(compactCid[0], loader.attachedStores.local());
205
+ expect(reader).toBeTruthy();
206
+ assert(isCarBlockItemReady(reader));
207
+ const parsed = await parseCarFile<CRDTMeta>(reader, loader.logger);
208
+ expect(parsed.cars).toBeTruthy();
209
+ expect(parsed.compact.length).toBe(2);
210
+ expect(parsed.cars.length).toBe(0);
211
+ expect(parsed.meta).toBeTruthy();
212
+ expect(parsed.meta.head).toBeTruthy();
213
+ });
214
+
215
+ it("compact should erase old files", async () => {
216
+ const cs = await loader.attachedStores.local().active.car;
217
+ await loader.commit(t, { head: [block2.cid] }, { compact: true });
218
+ expect(loader.carLog.length).toBe(1);
219
+ await loader.commit(t, { head: [block3.cid] }, { compact: false });
220
+ expect(loader.carLog.length).toBe(2);
221
+ expect(await cs.load(carCid[0])).toBeTruthy();
222
+ await loader.commit(t, { head: [block3.cid] }, { compact: true });
223
+ expect(loader.carLog.length).toBe(1);
224
+ const e0 = await cs.load(carCid[0]).catch((e) => e);
225
+ expect(e0 instanceof Error).toBeTruthy();
226
+ await loader.commit(t, { head: [block4.cid] }, { compact: false });
227
+ expect(loader.carLog.length).toBe(2);
228
+
229
+ const e = await loader.loadCar(carCid[0], loader.attachedStores.local());
230
+ expect(e).toBeTruthy();
231
+ assert(isCarBlockItemStale(e));
232
+ expect(e.item.status).toBe("stale");
233
+ expect(e.item.statusCause.message).toMatch(/(missing car file)|(not found)/);
234
+ }, 10000);
235
+ });
236
+
237
+ describe("basic Loader with index commits", function () {
238
+ let block: FPBlock;
239
+ let ib: EncryptedBlockstore;
240
+ let indexerResult: IndexTransactionMeta;
241
+ let cid: CID;
242
+ // let indexMap: Map<string, CID>;
243
+ const sthis = ensureSuperThis();
244
+
245
+ afterEach(async () => {
246
+ await ib.close();
247
+ await ib.destroy();
248
+ });
249
+
250
+ beforeEach(async () => {
251
+ const name = "test-loader-index" + Math.random();
252
+ await sthis.start();
253
+ // t = new CarTransaction()
254
+ ib = new EncryptedBlockstore(sthis, simpleBlockOpts(sthis, name));
255
+ await ib.ready();
256
+ block = await anyBlock2FPBlock(
257
+ await asyncBlockEncode({
258
+ value: { hello: "world" },
259
+ hasher,
260
+ codec,
261
+ }),
262
+ );
263
+ // console.log('block', block.cid)
264
+
265
+ cid = CID.parse("bafybeia4luuns6dgymy5kau5rm7r4qzrrzg6cglpzpogussprpy42cmcn4");
266
+ indexerResult = {
267
+ indexes: {
268
+ hello: {
269
+ byId: cid,
270
+ byKey: cid,
271
+ head: [cid as CID<unknown, number, number, 1>],
272
+ name: "hello",
273
+ map: "(doc) => doc.hello",
274
+ },
275
+ },
276
+ };
277
+ // indexMap = new Map();
278
+ });
279
+
280
+ it("should start with an empty car log", function () {
281
+ expect(ib.loader).toBeTruthy();
282
+ expect(ib.loader.carLog.length).toBe(0);
283
+ });
284
+
285
+ it("should commit the index metadata", async () => {
286
+ const { cars: carCid } = await ib.transaction<IndexTransactionMeta>(
287
+ async (t) => {
288
+ await t.put(block);
289
+ return indexerResult;
290
+ } /* , indexMap */,
291
+ );
292
+
293
+ expect(carCid).toBeTruthy();
294
+ expect(ib.loader).toBeTruthy();
295
+ const carLog = ib.loader.carLog;
296
+
297
+ expect(carLog.length).toBe(1);
298
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
299
+ const reader = await ib.loader.loadCar(carCid![0], ib.loader.attachedStores.local());
300
+ expect(reader).toBeTruthy();
301
+ assert(isCarBlockItemReady(reader));
302
+ const parsed = await parseCarFile<IndexTransactionMeta>(reader, sthis.logger);
303
+ expect(parsed.cars).toBeTruthy();
304
+ expect(parsed.cars.length).toBe(0);
305
+ expect(parsed.meta).toBeTruthy();
306
+ expect(parsed.meta.indexes).toBeTruthy();
307
+ const indexes = parsed.meta.indexes;
308
+ expect(indexes).toBeTruthy();
309
+ expect(indexes.hello).toBeTruthy();
310
+ expect(indexes.hello.map).toBe("(doc) => doc.hello");
311
+ expect(indexes.hello.name).toBe("hello");
312
+ });
313
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,112 @@
1
+ import { BuildURI, runtimeFn } from "@adviser/cement";
2
+ import { stripper } from "@adviser/cement/utils";
3
+ import pLimit from "@fireproof/vendor/p-limit";
4
+ import { ensureSuperThis, sleep } from "@fireproof/core-runtime";
5
+ import { PARAM } from "@fireproof/core-types-base";
6
+ import { describe, it, vi, expect, beforeEach, afterEach } from "vitest";
7
+ import { CRDTImpl, fireproof } from "@fireproof/core-base";
8
+ describe("standalone", () => {
9
+ const sthis = ensureSuperThis();
10
+ describe("howto-loader", () => {
11
+ it("understand the writer", async () => {
12
+ const db = fireproof("howto-writer", {
13
+ storeUrls: {
14
+ base: "memory://how-to-writer",
15
+ },
16
+ });
17
+ await db.put({ _id: "test-1", value: { cid: "test-1", peer: "peer-1" } });
18
+ await db.close();
19
+ });
20
+ it.skip("understand loader", async () => {
21
+ const db = fireproof("howto-loader", {
22
+ storeUrls: {
23
+ base: "file://dist/how-to-loader?store-key=insecure",
24
+ },
25
+ });
26
+ const fn = vi.fn();
27
+ const loader = db.ledger.crdt.blockstore.loader;
28
+ loader.cidCache.onSet(fn);
29
+ expect(fn).toHaveBeenCalledTimes(0);
30
+ await db.ready();
31
+ expect(loader.cidCache.values().map((i) => {
32
+ const v = i.value.Ok();
33
+ return {
34
+ type: v.item.type,
35
+ cid: v.cid,
36
+ value: stripper(/(type|cid)/, v.item),
37
+ };
38
+ })).toEqual([]);
39
+ const ret = await db.allDocs();
40
+ expect(ret.rows.length).toBe(100);
41
+ expect(fn).toHaveBeenCalledTimes(109393);
42
+ await db.close();
43
+ });
44
+ });
45
+ describe("test-plimit", () => {
46
+ it("should work with plimit", async () => {
47
+ const limiter = pLimit(2);
48
+ let concurrent = 0;
49
+ const ret = await Promise.all(Array(10)
50
+ .fill(0)
51
+ .map((_, i) => {
52
+ return limiter(async () => {
53
+ concurrent++;
54
+ expect(concurrent).toBeLessThanOrEqual(2);
55
+ await sleep(100);
56
+ concurrent--;
57
+ return i;
58
+ });
59
+ }));
60
+ expect(ret).toEqual(Array.from(Array(10).keys()));
61
+ });
62
+ });
63
+ describe.skip("crdt-stack", () => {
64
+ let crdt;
65
+ beforeEach(async () => {
66
+ let uri;
67
+ switch (true) {
68
+ case runtimeFn().isBrowser:
69
+ uri = BuildURI.from("indexeddb://standalone-peer-log").setParam(PARAM.NAME, "peer-log").URI();
70
+ break;
71
+ default:
72
+ uri = BuildURI.from("file://dist/standalone")
73
+ .setParam(PARAM.NAME, "peer-log")
74
+ .setParam(PARAM.STORE_KEY, "insecure")
75
+ .URI();
76
+ break;
77
+ }
78
+ crdt = new CRDTImpl(sthis, {
79
+ name: "peer-log",
80
+ writeQueue: { chunkSize: 32 },
81
+ storeUrls: {
82
+ data: {
83
+ meta: uri.build().setParam(PARAM.STORE, "meta").setParam(PARAM.STORE_KEY, "insecure").URI(),
84
+ car: uri.build().setParam(PARAM.STORE, "car").setParam(PARAM.STORE_KEY, "insecure").URI(),
85
+ file: uri.build().setParam(PARAM.STORE, "file").setParam(PARAM.STORE_KEY, "insecure").URI(),
86
+ wal: uri.build().setParam(PARAM.STORE, "wal").setParam(PARAM.STORE_KEY, "insecure").URI(),
87
+ },
88
+ },
89
+ });
90
+ await crdt.ready();
91
+ });
92
+ afterEach(async () => {
93
+ await crdt.close();
94
+ });
95
+ it.each(new Array(10).fill(0).map((_, i) => ({ cid: i })))("write:$cid", async ({ cid }) => {
96
+ const peers = new Array(10).fill(0).map((_, peer) => {
97
+ return { id: `test-${cid}:peer-${peer}`, value: { cid: `test-${cid}`, peer: `peer-${peer}` } };
98
+ });
99
+ await crdt.bulk(peers);
100
+ });
101
+ it("read", async () => {
102
+ for (let cid = 0; cid < 10; cid++) {
103
+ for (let peer = 0; peer < 10; peer++) {
104
+ const id = `test-${cid}:peer-${peer}`;
105
+ const res = (await crdt.get(id));
106
+ expect(res.doc).toEqual({ cid: `test-${cid}`, peer: `peer-${peer}` });
107
+ }
108
+ }
109
+ });
110
+ });
111
+ });
112
+ //# sourceMappingURL=standalone.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standalone.test.js","sourceRoot":"","sources":["standalone.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAO,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,MAAM,MAAM,2BAA2B,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAQ,KAAK,EAAc,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEzE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAE3D,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAEhC,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAiB5B,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;YACrC,MAAM,EAAE,GAAG,SAAS,CAAC,cAAc,EAAE;gBACnC,SAAS,EAAE;oBACT,IAAI,EAAE,wBAAwB;iBAC/B;aACF,CAAC,CAAC;YACH,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC1E,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;YACtC,MAAM,EAAE,GAAG,SAAS,CAAC,cAAc,EAAE;gBACnC,SAAS,EAAE;oBACT,IAAI,EAAE,8CAA8C;iBACrD;aACF,CAAC,CAAC;YACH,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAgB,CAAC;YAC1D,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1B,MAAM,CAAC,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,CACJ,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACjC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;gBACvB,OAAO;oBACL,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI;oBACjB,GAAG,EAAE,CAAC,CAAC,GAAG;oBACV,KAAK,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC;iBACtC,CAAC;YACJ,CAAC,CAAC,CACH,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YASd,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,CAAC,EAAE,CAAC,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;YACzC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;YACvC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAC3B,KAAK,CAAC,EAAE,CAAC;iBACN,IAAI,CAAC,CAAC,CAAC;iBACP,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACZ,OAAO,OAAO,CAAC,KAAK,IAAI,EAAE;oBACxB,UAAU,EAAE,CAAC;oBACb,MAAM,CAAC,UAAU,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;oBAC1C,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;oBACjB,UAAU,EAAE,CAAC;oBACb,OAAO,CAAC,CAAC;gBACX,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CACL,CAAC;YACF,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE;QAC/B,IAAI,IAAU,CAAC;QACf,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,IAAI,GAAQ,CAAC;YACb,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,SAAS,EAAE,CAAC,SAAS;oBACxB,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;oBAC9F,MAAM;gBACR;oBACE,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,wBAAwB,CAAC;yBAC1C,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC;yBAChC,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC;yBACrC,GAAG,EAAE,CAAC;oBACT,MAAM;YACV,CAAC;YAED,IAAI,GAAG,IAAI,QAAQ,CAAC,KAAK,EAAE;gBACzB,IAAI,EAAE,UAAU;gBAChB,UAAU,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;gBAC7B,SAAS,EAAE;oBACT,IAAI,EAAE;wBACJ,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,GAAG,EAAE;wBAC3F,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,GAAG,EAAE;wBACzF,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,GAAG,EAAE;wBAC3F,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,GAAG,EAAE;qBAC1F;iBACF;aACY,CAAC,CAAC;YACjB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;QACH,SAAS,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;YACzF,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE;gBAClD,OAAO,EAAE,EAAE,EAAE,QAAQ,GAAG,SAAS,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,QAAQ,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,IAAI,EAAE,EAAE,EAAE,CAAC;YACjG,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;YACpB,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC;gBAClC,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;oBACrC,MAAM,EAAE,GAAG,QAAQ,GAAG,SAAS,IAAI,EAAE,CAAC;oBACtC,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAiE,CAAC;oBACjG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,QAAQ,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC;gBACxE,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IASL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,156 @@
1
+ import { BuildURI, runtimeFn, URI } from "@adviser/cement";
2
+ import { Link } from "multiformats";
3
+ import { stripper } from "@adviser/cement/utils";
4
+ import pLimit from "@fireproof/vendor/p-limit";
5
+ import { ensureSuperThis, sleep } from "@fireproof/core-runtime";
6
+ import { CRDT, PARAM, LedgerOpts } from "@fireproof/core-types-base";
7
+ import { describe, it, vi, expect, beforeEach, afterEach } from "vitest";
8
+ import { Loader } from "@fireproof/core-blockstore";
9
+ import { CRDTImpl, fireproof } from "@fireproof/core-base";
10
+
11
+ describe("standalone", () => {
12
+ const sthis = ensureSuperThis();
13
+
14
+ describe("howto-loader", () => {
15
+ // beforeAll(async () => {
16
+ // const db = fireproof("howto-loader", {
17
+ // storeUrls: {
18
+ // base: "file://dist/how-to-loader?store-key=insecure",
19
+ // },
20
+ // });
21
+ // for (let cid = 0; cid < 1; cid++) {
22
+ // const blk = new Array(3)
23
+ // .fill(0)
24
+ // .map((_, peer) => ({ _id: `test-${cid}:peer-${peer}`, value: { cid: `test-${cid}`, peer: `peer-${peer}` } }));
25
+ // await db.bulk(blk);
26
+ // }
27
+ // // await db.compact()
28
+ // await db.close();
29
+ // });
30
+
31
+ it("understand the writer", async () => {
32
+ const db = fireproof("howto-writer", {
33
+ storeUrls: {
34
+ base: "memory://how-to-writer",
35
+ },
36
+ });
37
+ await db.put({ _id: "test-1", value: { cid: "test-1", peer: "peer-1" } });
38
+ await db.close();
39
+ });
40
+
41
+ it.skip("understand loader", async () => {
42
+ const db = fireproof("howto-loader", {
43
+ storeUrls: {
44
+ base: "file://dist/how-to-loader?store-key=insecure",
45
+ },
46
+ });
47
+ const fn = vi.fn();
48
+ const loader = db.ledger.crdt.blockstore.loader as Loader;
49
+ loader.cidCache.onSet(fn);
50
+ expect(fn).toHaveBeenCalledTimes(0);
51
+ await db.ready();
52
+ expect(
53
+ loader.cidCache.values().map((i) => {
54
+ const v = i.value.Ok();
55
+ return {
56
+ type: v.item.type,
57
+ cid: v.cid,
58
+ value: stripper(/(type|cid)/, v.item),
59
+ };
60
+ }),
61
+ ).toEqual([]);
62
+ // let last = 0
63
+ // for (let i = 0; i < 100; i++) {
64
+ // if (last !== fn.mock.calls.length) {
65
+ // console.log("fn", i, fn.mock.calls.length);
66
+ // last = fn.mock.calls.length
67
+ // }
68
+ // await sleep(10);
69
+ // }
70
+ const ret = await db.allDocs();
71
+ expect(ret.rows.length).toBe(100);
72
+ expect(fn).toHaveBeenCalledTimes(109393);
73
+ await db.close();
74
+ });
75
+ });
76
+
77
+ describe("test-plimit", () => {
78
+ it("should work with plimit", async () => {
79
+ const limiter = pLimit(2);
80
+ let concurrent = 0;
81
+ const ret = await Promise.all(
82
+ Array(10)
83
+ .fill(0)
84
+ .map((_, i) => {
85
+ return limiter(async () => {
86
+ concurrent++;
87
+ expect(concurrent).toBeLessThanOrEqual(2);
88
+ await sleep(100);
89
+ concurrent--;
90
+ return i;
91
+ });
92
+ }),
93
+ );
94
+ expect(ret).toEqual(Array.from(Array(10).keys()));
95
+ });
96
+ });
97
+
98
+ describe.skip("crdt-stack", () => {
99
+ let crdt: CRDT;
100
+ beforeEach(async () => {
101
+ let uri: URI;
102
+ switch (true) {
103
+ case runtimeFn().isBrowser:
104
+ uri = BuildURI.from("indexeddb://standalone-peer-log").setParam(PARAM.NAME, "peer-log").URI();
105
+ break;
106
+ default:
107
+ uri = BuildURI.from("file://dist/standalone")
108
+ .setParam(PARAM.NAME, "peer-log")
109
+ .setParam(PARAM.STORE_KEY, "insecure")
110
+ .URI();
111
+ break;
112
+ }
113
+ // console.log("uri", uri.toString());
114
+ crdt = new CRDTImpl(sthis, {
115
+ name: "peer-log",
116
+ writeQueue: { chunkSize: 32 },
117
+ storeUrls: {
118
+ data: {
119
+ meta: uri.build().setParam(PARAM.STORE, "meta").setParam(PARAM.STORE_KEY, "insecure").URI(),
120
+ car: uri.build().setParam(PARAM.STORE, "car").setParam(PARAM.STORE_KEY, "insecure").URI(),
121
+ file: uri.build().setParam(PARAM.STORE, "file").setParam(PARAM.STORE_KEY, "insecure").URI(),
122
+ wal: uri.build().setParam(PARAM.STORE, "wal").setParam(PARAM.STORE_KEY, "insecure").URI(),
123
+ },
124
+ },
125
+ } as LedgerOpts);
126
+ await crdt.ready();
127
+ });
128
+ afterEach(async () => {
129
+ await crdt.close();
130
+ });
131
+
132
+ it.each(new Array(10).fill(0).map((_, i) => ({ cid: i })))("write:$cid", async ({ cid }) => {
133
+ const peers = new Array(10).fill(0).map((_, peer) => {
134
+ return { id: `test-${cid}:peer-${peer}`, value: { cid: `test-${cid}`, peer: `peer-${peer}` } };
135
+ });
136
+ await crdt.bulk(peers);
137
+ });
138
+ it("read", async () => {
139
+ for (let cid = 0; cid < 10; cid++) {
140
+ for (let peer = 0; peer < 10; peer++) {
141
+ const id = `test-${cid}:peer-${peer}`;
142
+ const res = (await crdt.get(id)) as unknown as { cid: Link; doc: { cid: string; peer: string } };
143
+ expect(res.doc).toEqual({ cid: `test-${cid}`, peer: `peer-${peer}` });
144
+ }
145
+ }
146
+ });
147
+ // for (let cid = 0; cid < 10; cid++) {
148
+ // const gte = `test-${cid}`;
149
+ // const ret = [];
150
+ // for await (const [key, link] of entries(blk, root, { gte })) {
151
+ // ret.push([key, link]);
152
+ // }
153
+ // expect(ret.length).toEqual(10);
154
+ // }
155
+ });
156
+ });
@@ -0,0 +1 @@
1
+ export {};