@fireproof/core 0.3.7 → 0.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/hooks/use-fireproof.js +135 -0
- package/index.js +6 -0
- package/package.json +6 -39
- package/scripts/keygen.js +3 -0
- package/src/blockstore.js +2 -3
- package/src/clock.js +3 -4
- package/src/crypto.js +0 -1
- package/src/db-index.js +5 -10
- package/src/fireproof.js +10 -15
- package/src/hydrator.js +3 -3
- package/src/listener.js +1 -2
- package/src/prolly.js +24 -11
- package/src/sha1.js +1 -2
- package/src/valet.js +5 -7
- package/test/block.js +65 -0
- package/test/clock.test.js +694 -0
- package/test/db-index.test.js +261 -0
- package/test/fireproof.test.js +493 -0
- package/test/fulltext.test.js +66 -0
- package/test/helpers.js +45 -0
- package/test/hydrator.test.js +81 -0
- package/test/listener.test.js +102 -0
- package/test/prolly.test.js +190 -0
- package/test/proofs.test.js +53 -0
- package/test/reproduce-fixture-bug.test.js +65 -0
- package/test/valet.test.js +59 -0
- package/webpack.config.js +8 -0
- package/dist/main.js +0 -2
- package/dist/main.js.LICENSE.txt +0 -17
- package/src/index.js +0 -6
@@ -0,0 +1,694 @@
|
|
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
|
+
})
|