@fireproof/core 0.3.2 → 0.3.3

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 (51) hide show
  1. package/README.md +1 -1
  2. package/dist/src/blockstore.d.ts +115 -0
  3. package/dist/src/blockstore.d.ts.map +1 -0
  4. package/dist/src/clock.d.ts +98 -0
  5. package/dist/src/clock.d.ts.map +1 -0
  6. package/dist/src/crypto.d.ts +18 -0
  7. package/dist/src/crypto.d.ts.map +1 -0
  8. package/dist/src/db-index.d.ts +116 -0
  9. package/dist/src/db-index.d.ts.map +1 -0
  10. package/dist/src/fireproof.d.ts +167 -0
  11. package/dist/src/fireproof.d.ts.map +1 -0
  12. package/dist/src/hydrator.d.ts +6 -0
  13. package/dist/src/hydrator.d.ts.map +1 -0
  14. package/dist/src/index.d.ts +6 -0
  15. package/dist/src/index.d.ts.map +1 -0
  16. package/dist/src/listener.d.ts +36 -0
  17. package/dist/src/listener.d.ts.map +1 -0
  18. package/dist/src/prolly.d.ts +83 -0
  19. package/dist/src/prolly.d.ts.map +1 -0
  20. package/dist/src/sha1.d.ts +9 -0
  21. package/dist/src/sha1.d.ts.map +1 -0
  22. package/dist/src/valet.d.ts +34 -0
  23. package/dist/src/valet.d.ts.map +1 -0
  24. package/dist/tsconfig.tsbuildinfo +1 -0
  25. package/package.json +33 -3
  26. package/src/blockstore.js +3 -2
  27. package/src/clock.js +4 -3
  28. package/src/crypto.js +1 -0
  29. package/src/db-index.js +10 -5
  30. package/src/fireproof.js +15 -10
  31. package/src/hydrator.js +3 -3
  32. package/src/index.js +6 -0
  33. package/src/listener.js +2 -1
  34. package/src/prolly.js +11 -24
  35. package/src/sha1.js +2 -1
  36. package/src/valet.js +7 -5
  37. package/hooks/use-fireproof.js +0 -135
  38. package/index.js +0 -6
  39. package/scripts/keygen.js +0 -3
  40. package/test/block.js +0 -65
  41. package/test/clock.test.js +0 -694
  42. package/test/db-index.test.js +0 -261
  43. package/test/fireproof.test.js +0 -493
  44. package/test/fulltext.test.js +0 -66
  45. package/test/helpers.js +0 -45
  46. package/test/hydrator.test.js +0 -81
  47. package/test/listener.test.js +0 -102
  48. package/test/prolly.test.js +0 -190
  49. package/test/proofs.test.js +0 -53
  50. package/test/reproduce-fixture-bug.test.js +0 -65
  51. package/test/valet.test.js +0 -59
@@ -1,694 +0,0 @@
1
- /* global describe, it */
2
- // import { describe, it } from 'mocha'
3
- import assert from 'node:assert'
4
- import { advance, EventBlock, decodeEventBlock, findEventsToSync as findEventsWithProofToSync } from '../src/clock.js'
5
- // import { vis } from '../src/clock.js'
6
- import { Blockstore, seqEventData, setSeq } from './helpers.js'
7
-
8
- const testAdvance = async (blocks, oldHead, event) => {
9
- const { head } = await advance(blocks, oldHead, event)
10
- return head
11
- }
12
-
13
- const testFindEventsToSync = async (blocks, head) => (await findEventsWithProofToSync(blocks, head)).events
14
-
15
- async function visHead (blocks, head) {
16
- head.map(async (cid) => {
17
- const block = await blocks.get(cid)
18
- return (await decodeEventBlock(block.bytes)).value?.data?.value
19
- })
20
- // console.log('visHead', head, await Promise.all(values))
21
- }
22
-
23
- async function makeNext (blocks, parent, eventData) {
24
- const event = await EventBlock.create(eventData, parent)
25
- await blocks.put(event.cid, event.bytes)
26
- const head = await testAdvance(blocks, parent, event.cid)
27
- return { event, head }
28
- }
29
-
30
- describe('Clock', () => {
31
- it('create a new clock', async () => {
32
- const blocks = new Blockstore()
33
- // don't do this, create it with the first data block
34
- const event = await EventBlock.create({})
35
-
36
- await blocks.put(event.cid, event.bytes)
37
- const head = await testAdvance(blocks, [], event.cid)
38
-
39
- // for await (const line of vis(blocks, head)) console.log(line)
40
- assert.equal(head.length, 1)
41
- assert.equal(head[0].toString(), event.cid.toString())
42
-
43
- const sinceHead = head
44
- const toSync = await testFindEventsToSync(blocks, sinceHead)
45
- assert.equal(toSync.length, 0)
46
- })
47
-
48
- it('add events sequentially', async () => {
49
- setSeq(0)
50
- const blocks = new Blockstore()
51
- const emptyhead = [] // this makes head0 the root
52
-
53
- /*
54
- * Create event0 for alice, with emptyhead as parent
55
- */
56
- const { event: event0, head: head0 } = await makeNext(blocks, emptyhead, seqEventData('alice'))
57
- assert(head0.length, 1)
58
- assert.equal(head0[0].toString(), event0.cid.toString())
59
-
60
- /*
61
- * Create event1 for bob, with head0 as parent
62
- */
63
- const { event: event1, head: head1 } = await makeNext(blocks, head0, seqEventData('bob'))
64
-
65
- assert.equal(head1.length, 1)
66
- assert.equal(head1[0].toString(), event1.cid.toString())
67
-
68
- const toSync1 = await testFindEventsToSync(blocks, head1)
69
-
70
- assert.equal(toSync1.length, 0)
71
-
72
- /*
73
- * Create event2 for carol, with head1 as parent
74
- */
75
- const { event: event2, head: head2 } = await makeNext(blocks, head1, seqEventData('carol'))
76
-
77
- assert.equal(head2.length, 1)
78
- assert.equal(head2[0].toString(), event2.cid.toString())
79
-
80
- const toSync2 = await testFindEventsToSync(blocks, head2)
81
- assert.equal(toSync2.length, 0)
82
-
83
- const toSync1b = await testFindEventsToSync(blocks, [...head2, ...head0])
84
-
85
- assert.equal(toSync1b.length, 2)
86
- assert.equal(toSync1b[0].value.data.value, 'event1bob')
87
- assert.equal(toSync1b[1].value.data.value, 'event2carol')
88
-
89
- /*
90
- * Create event3 for dave, with head2 as parent
91
- */
92
-
93
- const { event: event3, head: head3 } = await makeNext(blocks, head2, seqEventData('dave'))
94
-
95
- assert.equal(head3.length, 1)
96
- assert.equal(head3[0].toString(), event3.cid.toString())
97
-
98
- const toSync3 = await testFindEventsToSync(blocks, [...head3, ...head0])
99
- assert.equal(toSync3.length, 3)
100
- assert.equal(toSync3[0].value.data.value, 'event1bob')
101
- assert.equal(toSync3[1].value.data.value, 'event2carol')
102
- assert.equal(toSync3[2].value.data.value, 'event3dave')
103
-
104
- const toSync3B = await testFindEventsToSync(blocks, [...head3, ...head1])
105
- assert.equal(toSync3B.length, 2)
106
- assert.equal(toSync3B[0].value.data.value, 'event2carol')
107
- assert.equal(toSync3B[1].value.data.value, 'event3dave')
108
-
109
- /*
110
- * Create event4 for eve, with head3 as parent
111
- */
112
- const { event: event4, head: head4 } = await makeNext(blocks, head3, seqEventData('eve'))
113
-
114
- assert.equal(head4.length, 1)
115
- assert.equal(head4[0].toString(), event4.cid.toString())
116
-
117
- const toSync4 = await testFindEventsToSync(blocks, [...head4, ...head0])
118
- assert.equal(toSync4.length, 4)
119
- assert.equal(toSync4[0].value.data.value, 'event1bob')
120
- assert.equal(toSync4[1].value.data.value, 'event2carol')
121
- assert.equal(toSync4[2].value.data.value, 'event3dave')
122
- assert.equal(toSync4[3].value.data.value, 'event4eve')
123
-
124
- const toSync4B = await testFindEventsToSync(blocks, [...head4, ...head1])
125
-
126
- assert.equal(toSync4B.length, 3)
127
- assert.equal(toSync4B[0].value.data.value, 'event2carol')
128
- assert.equal(toSync4B[1].value.data.value, 'event3dave')
129
- assert.equal(toSync4B[2].value.data.value, 'event4eve')
130
-
131
- const toSync4C = await testFindEventsToSync(blocks, [...head4, ...head2])
132
-
133
- assert.equal(toSync4C.length, 2)
134
- assert.equal(toSync4C[0].value.data.value, 'event3dave')
135
- assert.equal(toSync4C[1].value.data.value, 'event4eve')
136
-
137
- // don't ask if you already know
138
- // const toSync4D = await testFindEventsToSync(blocks, [...head4, ...head3])
139
- // assert.equal(toSync4D.length, 0)
140
-
141
- /*
142
- * Create event5 for frank, with head4 as parent
143
- */
144
- const { event: event5, head: head5 } = await makeNext(blocks, head4, seqEventData('frank'))
145
-
146
- assert.equal(head5.length, 1)
147
- assert.equal(head5[0].toString(), event5.cid.toString())
148
- const toSync5 = await testFindEventsToSync(blocks, [...head5, ...head0])
149
- assert.equal(toSync5.length, 5)
150
- assert.equal(toSync5[0].value.data.value, 'event1bob')
151
- assert.equal(toSync5[1].value.data.value, 'event2carol')
152
- assert.equal(toSync5[2].value.data.value, 'event3dave')
153
- assert.equal(toSync5[3].value.data.value, 'event4eve')
154
- assert.equal(toSync5[4].value.data.value, 'event5frank')
155
-
156
- const toSync5B = await testFindEventsToSync(blocks, [...head5, ...head1])
157
-
158
- assert.equal(toSync5B.length, 4)
159
- assert.equal(toSync5B[0].value.data.value, 'event2carol')
160
- assert.equal(toSync5B[1].value.data.value, 'event3dave')
161
- assert.equal(toSync5B[2].value.data.value, 'event4eve')
162
- assert.equal(toSync5B[3].value.data.value, 'event5frank')
163
-
164
- const toSync5C = await testFindEventsToSync(blocks, [...head5, ...head2])
165
- assert(toSync5C.length > 0, 'should have 3 events, has ' + toSync5C.length)
166
- assert.equal(toSync5C[0].value.data.value, 'event3dave')
167
- assert.equal(toSync5C[1].value.data.value, 'event4eve')
168
- assert.equal(toSync5C[2].value.data.value, 'event5frank')
169
-
170
- const toSync5D = await testFindEventsToSync(blocks, [...head5, ...head3])
171
- assert.equal(toSync5D.length, 2) // 4
172
- assert.equal(toSync5D[0].value.data.value, 'event4eve')
173
- assert.equal(toSync5D[1].value.data.value, 'event5frank')
174
-
175
- const toSync5E = await testFindEventsToSync(blocks, [...head5, ...head4])
176
- assert.equal(toSync5E.length, 1) // 5
177
- assert.equal(toSync5E[0].value.data.value, 'event5frank')
178
-
179
- /*
180
- * Create event6 for grace, with head5 as parent
181
- */
182
- const { event: event6, head: head6 } = await makeNext(blocks, head5, seqEventData('grace'))
183
-
184
- assert.equal(head6.length, 1)
185
- assert.equal(head6[0].toString(), event6.cid.toString())
186
-
187
- const toSync6 = await testFindEventsToSync(blocks, [...head6, ...head0])
188
- assert.equal(toSync6.length, 6) // 1
189
- assert.equal(toSync6[0].value.data.value, 'event1bob')
190
- assert.equal(toSync6[1].value.data.value, 'event2carol')
191
- assert.equal(toSync6[2].value.data.value, 'event3dave')
192
- assert.equal(toSync6[3].value.data.value, 'event4eve')
193
- assert.equal(toSync6[4].value.data.value, 'event5frank')
194
- assert.equal(toSync6[5].value.data.value, 'event6grace')
195
-
196
- const toSync6B = await testFindEventsToSync(blocks, [...head6, ...head1])
197
- assert.equal(toSync6B.length, 5) // 2
198
- assert.equal(toSync6B[0].value.data.value, 'event2carol')
199
- assert.equal(toSync6B[1].value.data.value, 'event3dave')
200
- assert.equal(toSync6B[2].value.data.value, 'event4eve')
201
- assert.equal(toSync6B[3].value.data.value, 'event5frank')
202
- assert.equal(toSync6B[4].value.data.value, 'event6grace')
203
-
204
- const toSync6C = await testFindEventsToSync(blocks, [...head6, ...head2])
205
- assert.equal(toSync6C.length, 4) // 3
206
- assert.equal(toSync6C[0].value.data.value, 'event3dave')
207
- assert.equal(toSync6C[1].value.data.value, 'event4eve')
208
- assert.equal(toSync6C[2].value.data.value, 'event5frank')
209
- assert.equal(toSync6C[3].value.data.value, 'event6grace')
210
-
211
- const toSync6D = await testFindEventsToSync(blocks, [...head6, ...head3])
212
- assert.equal(toSync6D.length, 3) // 4
213
- assert.equal(toSync6D[0].value.data.value, 'event4eve')
214
- assert.equal(toSync6D[1].value.data.value, 'event5frank')
215
- assert.equal(toSync6D[2].value.data.value, 'event6grace')
216
-
217
- const toSync6E = await testFindEventsToSync(blocks, [...head6, ...head4])
218
- assert.equal(toSync6E.length, 2) // 5
219
- assert.equal(toSync6E[0].value.data.value, 'event5frank')
220
- assert.equal(toSync6E[1].value.data.value, 'event6grace')
221
-
222
- const toSync6F = await testFindEventsToSync(blocks, [...head6, ...head5])
223
- assert.equal(toSync6F.length, 1)
224
- assert.equal(toSync6F[0].value.data.value, 'event6grace')
225
-
226
- /*
227
- * Create event7 for grace, with head6 as parent
228
- */
229
- const { event: event7, head: head7 } = await makeNext(blocks, head6, seqEventData('holly'))
230
-
231
- assert.equal(head7.length, 1)
232
- assert.equal(head7[0].toString(), event7.cid.toString())
233
-
234
- const toSync7 = await testFindEventsToSync(blocks, [...head7, ...head0])
235
- assert.equal(toSync7.length, 7)
236
- assert.equal(toSync7[0].value.data.value, 'event1bob')
237
- assert.equal(toSync7[1].value.data.value, 'event2carol')
238
- assert.equal(toSync7[2].value.data.value, 'event3dave')
239
- assert.equal(toSync7[3].value.data.value, 'event4eve')
240
- assert.equal(toSync7[4].value.data.value, 'event5frank')
241
- assert.equal(toSync7[5].value.data.value, 'event6grace')
242
- assert.equal(toSync7[6].value.data.value, 'event7holly')
243
-
244
- const toSync7B = await testFindEventsToSync(blocks, [...head7, ...head1])
245
- assert.equal(toSync7B.length, 6)
246
- assert.equal(toSync7B[0].value.data.value, 'event2carol')
247
- assert.equal(toSync7B[1].value.data.value, 'event3dave')
248
- assert.equal(toSync7B[2].value.data.value, 'event4eve')
249
- assert.equal(toSync7B[3].value.data.value, 'event5frank')
250
- assert.equal(toSync7B[4].value.data.value, 'event6grace')
251
-
252
- const toSync7C = await testFindEventsToSync(blocks, [...head7, ...head2])
253
- assert.equal(toSync7C.length, 5)
254
- assert.equal(toSync7C[0].value.data.value, 'event3dave')
255
- assert.equal(toSync7C[1].value.data.value, 'event4eve')
256
- assert.equal(toSync7C[2].value.data.value, 'event5frank')
257
- assert.equal(toSync7C[3].value.data.value, 'event6grace')
258
- assert.equal(toSync7C[4].value.data.value, 'event7holly')
259
-
260
- const toSync7D = await testFindEventsToSync(blocks, [...head7, ...head3])
261
- assert.equal(toSync7D.length, 4)
262
- assert.equal(toSync7D[0].value.data.value, 'event4eve')
263
- assert.equal(toSync7D[1].value.data.value, 'event5frank')
264
- assert.equal(toSync7D[2].value.data.value, 'event6grace')
265
- assert.equal(toSync7D[3].value.data.value, 'event7holly')
266
-
267
- const toSync7E = await testFindEventsToSync(blocks, [...head7, ...head4])
268
- assert.equal(toSync7E.length, 3)
269
- assert.equal(toSync7E[0].value.data.value, 'event5frank')
270
- assert.equal(toSync7E[1].value.data.value, 'event6grace')
271
- assert.equal(toSync7E[2].value.data.value, 'event7holly')
272
-
273
- const toSync7F = await testFindEventsToSync(blocks, [...head7, ...head5])
274
- assert.equal(toSync7F.length, 2)
275
- assert.equal(toSync7F[0].value.data.value, 'event6grace')
276
- assert.equal(toSync7F[1].value.data.value, 'event7holly')
277
-
278
- /*
279
- * Create event8 for isaac, with head7 as parent
280
- */
281
- const { event: event8, head: head8 } = await makeNext(blocks, head7, seqEventData('isaac'))
282
-
283
- assert.equal(head8.length, 1)
284
- assert.equal(head8[0].toString(), event8.cid.toString())
285
-
286
- const toSync8 = await testFindEventsToSync(blocks, [...head8, ...head0])
287
- assert.equal(toSync8.length, 8)
288
- assert.equal(toSync8[0].value.data.value, 'event1bob')
289
- assert.equal(toSync8[1].value.data.value, 'event2carol')
290
- assert.equal(toSync8[2].value.data.value, 'event3dave')
291
- assert.equal(toSync8[3].value.data.value, 'event4eve')
292
- assert.equal(toSync8[4].value.data.value, 'event5frank')
293
- assert.equal(toSync8[5].value.data.value, 'event6grace')
294
- assert.equal(toSync8[6].value.data.value, 'event7holly')
295
- assert.equal(toSync8[7].value.data.value, 'event8isaac')
296
-
297
- const toSync8B = await testFindEventsToSync(blocks, [...head8, ...head1])
298
- assert.equal(toSync8B.length, 7)
299
- assert.equal(toSync8B[0].value.data.value, 'event2carol')
300
- assert.equal(toSync8B[1].value.data.value, 'event3dave')
301
- assert.equal(toSync8B[2].value.data.value, 'event4eve')
302
- assert.equal(toSync8B[3].value.data.value, 'event5frank')
303
- assert.equal(toSync8B[4].value.data.value, 'event6grace')
304
- assert.equal(toSync8B[5].value.data.value, 'event7holly')
305
- assert.equal(toSync8B[6].value.data.value, 'event8isaac')
306
-
307
- const toSync8C = await testFindEventsToSync(blocks, [...head8, ...head2])
308
- assert.equal(toSync8C.length, 6) // 3
309
- assert.equal(toSync8C[0].value.data.value, 'event3dave')
310
- assert.equal(toSync8C[1].value.data.value, 'event4eve')
311
- assert.equal(toSync8C[2].value.data.value, 'event5frank')
312
- assert.equal(toSync8C[3].value.data.value, 'event6grace')
313
- assert.equal(toSync8C[4].value.data.value, 'event7holly')
314
- assert.equal(toSync8C[5].value.data.value, 'event8isaac')
315
-
316
- const toSync8D = await testFindEventsToSync(blocks, [...head8, ...head3])
317
- assert.equal(toSync8D.length, 5) // 4
318
- assert.equal(toSync8D[0].value.data.value, 'event4eve')
319
- assert.equal(toSync8D[1].value.data.value, 'event5frank')
320
- assert.equal(toSync8D[2].value.data.value, 'event6grace')
321
- assert.equal(toSync8D[3].value.data.value, 'event7holly')
322
- assert.equal(toSync8D[4].value.data.value, 'event8isaac')
323
-
324
- const toSync8E = await testFindEventsToSync(blocks, [...head8, ...head4])
325
- assert.equal(toSync8E.length, 4) // 5
326
- assert.equal(toSync8E[0].value.data.value, 'event5frank')
327
- assert.equal(toSync8E[1].value.data.value, 'event6grace')
328
- assert.equal(toSync8E[2].value.data.value, 'event7holly')
329
- assert.equal(toSync8E[3].value.data.value, 'event8isaac')
330
-
331
- const toSync8F = await testFindEventsToSync(blocks, [...head8, ...head5])
332
- assert.equal(toSync8F.length, 3) // 6
333
- assert.equal(toSync8F[0].value.data.value, 'event6grace')
334
- assert.equal(toSync8F[1].value.data.value, 'event7holly')
335
- assert.equal(toSync8F[2].value.data.value, 'event8isaac')
336
-
337
- /*
338
- * Create event9 for jen, with head8 as parent
339
- */
340
- const { event: event9, head: head9 } = await makeNext(blocks, head8, seqEventData('jen'))
341
-
342
- assert.equal(head9.length, 1)
343
- assert.equal(head9[0].toString(), event9.cid.toString())
344
-
345
- const toSync9 = await testFindEventsToSync(blocks, [...head9, ...head0])
346
- assert.equal(toSync9.length, 9)
347
- assert.equal(toSync9[0].value.data.value, 'event1bob')
348
- assert.equal(toSync9[1].value.data.value, 'event2carol')
349
- assert.equal(toSync9[2].value.data.value, 'event3dave')
350
- assert.equal(toSync9[3].value.data.value, 'event4eve')
351
- assert.equal(toSync9[4].value.data.value, 'event5frank')
352
- assert.equal(toSync9[5].value.data.value, 'event6grace')
353
- assert.equal(toSync9[6].value.data.value, 'event7holly')
354
- assert.equal(toSync9[7].value.data.value, 'event8isaac')
355
- assert.equal(toSync9[8].value.data.value, 'event9jen')
356
-
357
- const toSync9B = await testFindEventsToSync(blocks, [...head9, ...head1])
358
- assert.equal(toSync9B.length, 8)
359
- assert.equal(toSync9B[0].value.data.value, 'event2carol')
360
- assert.equal(toSync9B[1].value.data.value, 'event3dave')
361
- assert.equal(toSync9B[2].value.data.value, 'event4eve')
362
- assert.equal(toSync9B[3].value.data.value, 'event5frank')
363
- assert.equal(toSync9B[4].value.data.value, 'event6grace')
364
- assert.equal(toSync9B[5].value.data.value, 'event7holly')
365
- assert.equal(toSync9B[6].value.data.value, 'event8isaac')
366
- assert.equal(toSync9B[7].value.data.value, 'event9jen')
367
-
368
- const toSync9C = await testFindEventsToSync(blocks, [...head9, ...head2])
369
- assert.equal(toSync9C.length, 7)
370
- assert.equal(toSync9C[0].value.data.value, 'event3dave')
371
- assert.equal(toSync9C[1].value.data.value, 'event4eve')
372
- assert.equal(toSync9C[2].value.data.value, 'event5frank')
373
- assert.equal(toSync9C[3].value.data.value, 'event6grace')
374
- assert.equal(toSync9C[4].value.data.value, 'event7holly')
375
- assert.equal(toSync9C[5].value.data.value, 'event8isaac')
376
- assert.equal(toSync9C[6].value.data.value, 'event9jen')
377
-
378
- const toSync9D = await testFindEventsToSync(blocks, [...head9, ...head3])
379
- assert.equal(toSync9D.length, 6)
380
- assert.equal(toSync9D[0].value.data.value, 'event4eve')
381
- assert.equal(toSync9D[1].value.data.value, 'event5frank')
382
- assert.equal(toSync9D[2].value.data.value, 'event6grace')
383
- assert.equal(toSync9D[3].value.data.value, 'event7holly')
384
- assert.equal(toSync9D[4].value.data.value, 'event8isaac')
385
- assert.equal(toSync9D[5].value.data.value, 'event9jen')
386
-
387
- const toSync9E = await testFindEventsToSync(blocks, [...head9, ...head4])
388
- assert.equal(toSync9E.length, 5)
389
- assert.equal(toSync9E[0].value.data.value, 'event5frank')
390
- assert.equal(toSync9E[1].value.data.value, 'event6grace')
391
- assert.equal(toSync9E[2].value.data.value, 'event7holly')
392
- assert.equal(toSync9E[3].value.data.value, 'event8isaac')
393
- assert.equal(toSync9E[4].value.data.value, 'event9jen')
394
-
395
- // for await (const line of vis(blocks, head8)) console.log(line)
396
- })
397
-
398
- it('add two events with shared parents', async () => {
399
- setSeq(-1)
400
- const blocks = new Blockstore()
401
- const root = await EventBlock.create(seqEventData('root'))
402
- await blocks.put(root.cid, root.bytes)
403
-
404
- /** @type {import('../src/clock').EventLink<any>[]} */
405
- let head = await testAdvance(blocks, [], root.cid)
406
- assert.equal(head.length, 1)
407
- assert.equal(head[0], root.cid)
408
-
409
- const parents = head
410
-
411
- const event0 = await EventBlock.create(seqEventData(), parents)
412
- await blocks.put(event0.cid, event0.bytes)
413
-
414
- head = await testAdvance(blocks, parents, event0.cid)
415
- const head0 = head
416
-
417
- const event1 = await EventBlock.create(seqEventData(), parents)
418
- await blocks.put(event1.cid, event1.bytes)
419
- head = await testAdvance(blocks, head, event1.cid)
420
- const head1 = head
421
-
422
- // for await (const line of vis(blocks, head)) console.log(line)
423
- assert.equal(head.length, 2)
424
- assert.equal(head[0].toString(), event0.cid.toString())
425
- assert.equal(head[1].toString(), event1.cid.toString())
426
-
427
- let sinceHead = head1
428
- let toSync = await testFindEventsToSync(blocks, sinceHead)
429
- // assert.equal(toSync.length, 1) // 0
430
- // assert.equal(toSync[0].cid.toString(), event0.cid.toString())
431
-
432
- const event2 = await EventBlock.create(seqEventData(), head1)
433
- await blocks.put(event2.cid, event2.bytes)
434
- head = await testAdvance(blocks, head, event2.cid)
435
- const head2 = head
436
-
437
- assert.equal(head.length, 1)
438
-
439
- sinceHead = head2
440
- toSync = await testFindEventsToSync(blocks, sinceHead)
441
- assert.equal(toSync.length, 0)
442
-
443
- sinceHead = [...head0, ...head2]
444
- toSync = await testFindEventsToSync(blocks, sinceHead)
445
- })
446
-
447
- it('add two events with some shared parents', async () => {
448
- const blocks = new Blockstore()
449
- const root = await EventBlock.create(seqEventData())
450
- await blocks.put(root.cid, root.bytes)
451
-
452
- /** @type {import('../src/clock').EventLink<any>[]} */
453
- let head = [root.cid]
454
- const parents0 = head
455
-
456
- const event0 = await EventBlock.create(seqEventData(), parents0)
457
- await blocks.put(event0.cid, event0.bytes)
458
- head = await testAdvance(blocks, head, event0.cid)
459
-
460
- const event1 = await EventBlock.create(seqEventData(), parents0)
461
- await blocks.put(event1.cid, event1.bytes)
462
- head = await testAdvance(blocks, head, event1.cid)
463
-
464
- const event2 = await EventBlock.create(seqEventData(), parents0)
465
- await blocks.put(event2.cid, event2.bytes)
466
- head = await testAdvance(blocks, head, event2.cid)
467
-
468
- const event3 = await EventBlock.create(seqEventData(), [event0.cid, event1.cid])
469
- await blocks.put(event3.cid, event3.bytes)
470
- head = await testAdvance(blocks, head, event3.cid)
471
- // const parentz = head
472
-
473
- const event4 = await EventBlock.create(seqEventData(), [event2.cid])
474
- await blocks.put(event4.cid, event4.bytes)
475
- head = await testAdvance(blocks, head, event4.cid)
476
-
477
- // console.log('add two events with some shared parents')
478
- // for await (const line of vis(blocks, head)) console.log(line)
479
- assert.equal(head.length, 2)
480
- assert.equal(head[0].toString(), event3.cid.toString())
481
- assert.equal(head[1].toString(), event4.cid.toString())
482
- })
483
-
484
- it('converge when multi-root', async () => {
485
- setSeq(-1)
486
- const blocks = new Blockstore()
487
- const root = await EventBlock.create(seqEventData())
488
- await blocks.put(root.cid, root.bytes)
489
-
490
- /** @type {import('../src/clock').EventLink<any>[]} */
491
- let head = [root.cid]
492
- const parents0 = head
493
-
494
- const event0 = await EventBlock.create(seqEventData(), parents0)
495
- await blocks.put(event0.cid, event0.bytes)
496
- head = await testAdvance(blocks, head, event0.cid)
497
-
498
- const event1 = await EventBlock.create(seqEventData(), parents0)
499
- await blocks.put(event1.cid, event1.bytes)
500
- head = await testAdvance(blocks, head, event1.cid)
501
-
502
- const event1head = head
503
-
504
- const event2 = await EventBlock.create(seqEventData(), event1head)
505
- await blocks.put(event2.cid, event2.bytes)
506
- head = await testAdvance(blocks, head, event2.cid)
507
-
508
- const event3 = await EventBlock.create(seqEventData(), event1head)
509
- await blocks.put(event3.cid, event3.bytes)
510
- head = await testAdvance(blocks, head, event3.cid)
511
-
512
- const event3head = head
513
-
514
- const event4 = await EventBlock.create(seqEventData(), event1head)
515
- await blocks.put(event4.cid, event4.bytes)
516
- head = await testAdvance(blocks, head, event4.cid)
517
- const event4head = head
518
- await visHead(blocks, event4head)
519
-
520
- const event5 = await EventBlock.create(seqEventData(), event3head)
521
- await blocks.put(event5.cid, event5.bytes)
522
- head = await testAdvance(blocks, head, event5.cid)
523
- const event5head = head
524
- await visHead(blocks, event5head)
525
-
526
- const event6 = await EventBlock.create(seqEventData(), event5head)
527
- await blocks.put(event6.cid, event6.bytes)
528
- head = await testAdvance(blocks, head, event6.cid)
529
- const event6head = head
530
- await visHead(blocks, event6head)
531
-
532
- const event7 = await EventBlock.create(seqEventData(), event6head)
533
- await blocks.put(event7.cid, event7.bytes)
534
- head = await testAdvance(blocks, head, event7.cid)
535
- const event7head = head
536
- await visHead(blocks, event7head)
537
-
538
- const event8 = await EventBlock.create(seqEventData(), event7head)
539
- await blocks.put(event8.cid, event8.bytes)
540
- head = await testAdvance(blocks, head, event8.cid)
541
- const event8head = head
542
- await visHead(blocks, event8head)
543
-
544
- const event9 = await EventBlock.create(seqEventData(), event7head)
545
- await blocks.put(event9.cid, event9.bytes)
546
- head = await testAdvance(blocks, head, event9.cid)
547
- const event9head = head
548
- await visHead(blocks, event9head)
549
-
550
- const event10 = await EventBlock.create(seqEventData(), event9head)
551
- await blocks.put(event10.cid, event10.bytes)
552
- head = await testAdvance(blocks, head, event10.cid)
553
- const event10head = head
554
- await visHead(blocks, event10head)
555
-
556
- // console.log('converge when multi-root')
557
- // for await (const line of vis(blocks, event10head)) console.log(line)
558
-
559
- assert.equal(event10head.length, 1)
560
- assert.equal(event10head[0].toString(), event10.cid.toString())
561
-
562
- const toSync3 = await testFindEventsToSync(blocks, [event7.cid, event10.cid])
563
- assert.equal(toSync3[0].value.data.value, 'event9')
564
- assert.equal(toSync3[1].value.data.value, 'event8')
565
- assert.equal(toSync3[2].value.data.value, 'event10')
566
- })
567
-
568
- it('add an old event', async () => {
569
- const blocks = new Blockstore()
570
- const root = await EventBlock.create(seqEventData())
571
- await blocks.put(root.cid, root.bytes)
572
-
573
- /** @type {import('../src/clock').EventLink<any>[]} */
574
- let head = [root.cid]
575
- const parents0 = head
576
-
577
- const event0 = await EventBlock.create(seqEventData(), parents0)
578
- await blocks.put(event0.cid, event0.bytes)
579
- head = await testAdvance(blocks, head, event0.cid)
580
-
581
- const event1 = await EventBlock.create(seqEventData(), parents0)
582
- await blocks.put(event1.cid, event1.bytes)
583
- head = await testAdvance(blocks, head, event1.cid)
584
-
585
- const event1head = head
586
-
587
- const event2 = await EventBlock.create(seqEventData(), event1head)
588
- await blocks.put(event2.cid, event2.bytes)
589
- head = await testAdvance(blocks, head, event2.cid)
590
-
591
- const event3 = await EventBlock.create(seqEventData(), event1head)
592
- await blocks.put(event3.cid, event3.bytes)
593
- head = await testAdvance(blocks, head, event3.cid)
594
-
595
- const event4 = await EventBlock.create(seqEventData(), event1head)
596
- await blocks.put(event4.cid, event4.bytes)
597
- head = await testAdvance(blocks, head, event4.cid)
598
-
599
- const parents2 = head
600
-
601
- const event5 = await EventBlock.create(seqEventData(), parents2)
602
- await blocks.put(event5.cid, event5.bytes)
603
- head = await testAdvance(blocks, head, event5.cid)
604
-
605
- // now very old one
606
- const event6 = await EventBlock.create(seqEventData(), parents0)
607
- await blocks.put(event6.cid, event6.bytes)
608
- head = await testAdvance(blocks, head, event6.cid)
609
-
610
- // for await (const line of vis(blocks, head)) console.log(line)
611
- assert.equal(head.length, 2)
612
- assert.equal(head[0].toString(), event5.cid.toString())
613
- assert.equal(head[1].toString(), event6.cid.toString())
614
- })
615
-
616
- it('add an event with missing parents', async () => {
617
- setSeq(-1)
618
- const blocks = new Blockstore()
619
- const root = await EventBlock.create(seqEventData())
620
- await blocks.put(root.cid, root.bytes)
621
-
622
- /** @type {import('../src/clock').EventLink<any>[]} */
623
- let head = [root.cid]
624
-
625
- const event0 = await EventBlock.create(seqEventData(), head)
626
- await blocks.put(event0.cid, event0.bytes)
627
-
628
- const event1 = await EventBlock.create(seqEventData(), [event0.cid])
629
- await blocks.put(event1.cid, event1.bytes)
630
-
631
- head = await testAdvance(blocks, head, event1.cid)
632
-
633
- // for await (const line of vis(blocks, head)) console.log(line)
634
- assert.equal(head.length, 1)
635
- assert.equal(head[0].toString(), event1.cid.toString())
636
- })
637
-
638
- it('reproduce the issue from fireproof docs since update test', async () => {
639
- setSeq(-1)
640
- const blocks = new Blockstore()
641
- // alice
642
- const root = await EventBlock.create(seqEventData('alice'))
643
- await blocks.put(root.cid, root.bytes)
644
- let head = await testAdvance(blocks, [], root.cid)
645
- const roothead = head
646
- // db root
647
- let sinceHead = [...roothead]
648
- let toSync = await testFindEventsToSync(blocks, sinceHead)
649
- assert.equal(toSync.length, 0) // we use all docs for first query in Fireproof
650
-
651
- // create bob
652
- const event0 = await EventBlock.create(seqEventData('bob'), head)
653
- await blocks.put(event0.cid, event0.bytes)
654
- // console.log('new event0', event0.cid)
655
-
656
- head = await testAdvance(blocks, head, event0.cid)
657
-
658
- const event0head = head
659
- sinceHead = event0head
660
- toSync = await testFindEventsToSync(blocks, sinceHead)
661
- assert.equal(toSync.length, 0)
662
-
663
- sinceHead = [...roothead, ...event0head]
664
- toSync = await testFindEventsToSync(blocks, sinceHead)
665
- assert.equal(toSync.length, 1)
666
-
667
- // create carol
668
- const event1 = await EventBlock.create(seqEventData('carol'), head)
669
- await blocks.put(event1.cid, event1.bytes)
670
- head = await testAdvance(blocks, head, event1.cid)
671
- const event1head = head
672
-
673
- sinceHead = [...event0head, ...event1head]
674
- toSync = await testFindEventsToSync(blocks, sinceHead)
675
- assert.equal(toSync.length, 1)
676
- sinceHead = [...event1head, ...roothead]
677
- toSync = await testFindEventsToSync(blocks, sinceHead)
678
-
679
- assert.equal(toSync.length, 2)
680
-
681
- const event2 = await EventBlock.create(seqEventData('xxx'), head)
682
- await blocks.put(event2.cid, event2.bytes)
683
- head = await testAdvance(blocks, head, event2.cid)
684
- const event2head = head
685
-
686
- sinceHead = [...event2head, ...event0head]
687
- toSync = await testFindEventsToSync(blocks, sinceHead)
688
- assert.equal(toSync.length, 2)
689
-
690
- sinceHead = [...event2head, ...event1head]
691
- toSync = await testFindEventsToSync(blocks, sinceHead)
692
- assert.equal(toSync.length, 1)
693
- })
694
- })