hypercore 9.12.0 → 10.0.0-alpha.11
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/.github/workflows/test-node.yml +3 -4
- package/README.md +131 -404
- package/__snapshots__/test/storage.js.snapshot.cjs +15 -0
- package/examples/announce.js +19 -0
- package/examples/basic.js +10 -0
- package/examples/http.js +123 -0
- package/examples/lookup.js +20 -0
- package/index.js +365 -1600
- package/lib/bitfield.js +113 -285
- package/lib/block-encryption.js +68 -0
- package/lib/block-store.js +58 -0
- package/lib/core.js +468 -0
- package/lib/extensions.js +76 -0
- package/lib/merkle-tree.js +1110 -0
- package/lib/messages.js +571 -0
- package/lib/mutex.js +39 -0
- package/lib/oplog.js +224 -0
- package/lib/protocol.js +525 -0
- package/lib/random-iterator.js +46 -0
- package/lib/remote-bitfield.js +24 -0
- package/lib/replicator.js +857 -0
- package/lib/streams.js +39 -0
- package/package.json +44 -45
- package/test/basic.js +59 -471
- package/test/bitfield.js +48 -133
- package/test/core.js +290 -0
- package/test/encodings.js +18 -0
- package/test/encryption.js +123 -0
- package/test/extension.js +71 -0
- package/test/helpers/index.js +23 -0
- package/test/merkle-tree.js +518 -0
- package/test/mutex.js +137 -0
- package/test/oplog.js +399 -0
- package/test/preload.js +72 -0
- package/test/replicate.js +227 -824
- package/test/sessions.js +173 -0
- package/test/storage.js +31 -0
- package/test/streams.js +39 -146
- package/test/user-data.js +47 -0
- package/bench/all.sh +0 -65
- package/bench/copy-64kb-blocks.js +0 -51
- package/bench/helpers/read-throttled.js +0 -27
- package/bench/helpers/read.js +0 -47
- package/bench/helpers/write.js +0 -29
- package/bench/read-16kb-blocks-proof-throttled.js +0 -1
- package/bench/read-16kb-blocks-proof.js +0 -1
- package/bench/read-16kb-blocks-throttled.js +0 -1
- package/bench/read-16kb-blocks.js +0 -1
- package/bench/read-512b-blocks.js +0 -1
- package/bench/read-64kb-blocks-linear-batch.js +0 -18
- package/bench/read-64kb-blocks-linear.js +0 -18
- package/bench/read-64kb-blocks-proof.js +0 -1
- package/bench/read-64kb-blocks.js +0 -1
- package/bench/replicate-16kb-blocks.js +0 -19
- package/bench/replicate-64kb-blocks.js +0 -19
- package/bench/write-16kb-blocks.js +0 -1
- package/bench/write-512b-blocks.js +0 -1
- package/bench/write-64kb-blocks-static.js +0 -1
- package/bench/write-64kb-blocks.js +0 -1
- package/example.js +0 -23
- package/lib/cache.js +0 -26
- package/lib/crypto.js +0 -5
- package/lib/replicate.js +0 -829
- package/lib/safe-buffer-equals.js +0 -6
- package/lib/storage.js +0 -421
- package/lib/tree-index.js +0 -183
- package/test/ack.js +0 -306
- package/test/audit.js +0 -36
- package/test/cache.js +0 -93
- package/test/compat.js +0 -209
- package/test/copy.js +0 -377
- package/test/default-storage.js +0 -51
- package/test/extensions.js +0 -137
- package/test/get.js +0 -64
- package/test/head.js +0 -65
- package/test/helpers/create-tracking-ram.js +0 -27
- package/test/helpers/create.js +0 -6
- package/test/helpers/replicate.js +0 -4
- package/test/seek.js +0 -234
- package/test/selections.js +0 -95
- package/test/set-uploading-downloading.js +0 -91
- package/test/stats.js +0 -77
- package/test/timeouts.js +0 -22
- package/test/tree-index.js +0 -841
- package/test/update.js +0 -156
- package/test/value-encoding.js +0 -52
package/test/ack.js
DELETED
|
@@ -1,306 +0,0 @@
|
|
|
1
|
-
var create = require('./helpers/create')
|
|
2
|
-
var tape = require('tape')
|
|
3
|
-
|
|
4
|
-
tape('replicate with ack', function (t) {
|
|
5
|
-
var feed = create()
|
|
6
|
-
feed.on('ready', function () {
|
|
7
|
-
var clone = create(feed.key)
|
|
8
|
-
|
|
9
|
-
var stream = feed.replicate(true, { live: true, ack: true })
|
|
10
|
-
stream.pipe(clone.replicate(false, { live: true })).pipe(stream)
|
|
11
|
-
|
|
12
|
-
stream.once('duplex-channel', function () {
|
|
13
|
-
feed.append(['a', 'b', 'c'])
|
|
14
|
-
})
|
|
15
|
-
var seen = 0
|
|
16
|
-
stream.on('ack', function (ack) {
|
|
17
|
-
seen++
|
|
18
|
-
if (seen > 3) t.fail()
|
|
19
|
-
if (seen === 3) t.end()
|
|
20
|
-
})
|
|
21
|
-
})
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
tape('ack only when something is downloaded', function (t) {
|
|
25
|
-
t.plan(1)
|
|
26
|
-
var feed = create()
|
|
27
|
-
feed.on('ready', function () {
|
|
28
|
-
var clone = create(feed.key)
|
|
29
|
-
var stream1 = clone.replicate(true)
|
|
30
|
-
stream1.on('ack', function (ack) {
|
|
31
|
-
t.fail('unexpected ack')
|
|
32
|
-
})
|
|
33
|
-
feed.append(['a', 'b', 'c'], function () {
|
|
34
|
-
// pre-populate with 3 records
|
|
35
|
-
stream1.pipe(feed.replicate(false)).pipe(stream1)
|
|
36
|
-
})
|
|
37
|
-
stream1.on('end', function () {
|
|
38
|
-
feed.append(['d', 'e'])
|
|
39
|
-
// add 2 more records. only these should be ACK'd
|
|
40
|
-
var acks = []
|
|
41
|
-
var stream2 = feed.replicate(true, { ack: true })
|
|
42
|
-
stream2.on('ack', function (ack) {
|
|
43
|
-
acks.push(ack.start)
|
|
44
|
-
})
|
|
45
|
-
stream2.pipe(clone.replicate(false)).pipe(stream2)
|
|
46
|
-
stream2.on('end', function () {
|
|
47
|
-
t.deepEqual(acks.sort(), [3, 4])
|
|
48
|
-
t.end()
|
|
49
|
-
})
|
|
50
|
-
})
|
|
51
|
-
})
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
tape('simultaneous replication with ack and no-ack', function (t) {
|
|
55
|
-
t.plan(1)
|
|
56
|
-
var feed = create()
|
|
57
|
-
feed.on('ready', function () {
|
|
58
|
-
feed.append(['a', 'b', 'c'])
|
|
59
|
-
|
|
60
|
-
var clone1 = create(feed.key)
|
|
61
|
-
var clone2 = create(feed.key)
|
|
62
|
-
var stream0 = feed.replicate(true, { ack: true })
|
|
63
|
-
var stream1 = clone1.replicate(false)
|
|
64
|
-
var stream2 = clone2.replicate(false)
|
|
65
|
-
var stream3 = feed.replicate(true)
|
|
66
|
-
stream1.pipe(stream0).pipe(stream1)
|
|
67
|
-
stream2.pipe(stream3).pipe(stream2)
|
|
68
|
-
|
|
69
|
-
var acks = []
|
|
70
|
-
stream0.on('ack', function (ack) {
|
|
71
|
-
acks.push(ack.start)
|
|
72
|
-
})
|
|
73
|
-
stream1.on('ack', function (ack) {
|
|
74
|
-
t.fail('unexpected ack')
|
|
75
|
-
})
|
|
76
|
-
stream2.on('ack', function (ack) {
|
|
77
|
-
t.fail('unexpected ack')
|
|
78
|
-
})
|
|
79
|
-
stream3.on('ack', function (ack) {
|
|
80
|
-
t.fail('unexpected ack')
|
|
81
|
-
})
|
|
82
|
-
stream1.on('end', function () {
|
|
83
|
-
t.deepEqual(acks.sort(), [0, 1, 2])
|
|
84
|
-
t.end()
|
|
85
|
-
})
|
|
86
|
-
})
|
|
87
|
-
})
|
|
88
|
-
|
|
89
|
-
tape('simultaneous replication with two acks', function (t) {
|
|
90
|
-
t.plan(1)
|
|
91
|
-
var feed = create()
|
|
92
|
-
feed.on('ready', function () {
|
|
93
|
-
feed.append(['a', 'b', 'c'])
|
|
94
|
-
|
|
95
|
-
var clone1 = create(feed.key)
|
|
96
|
-
var clone2 = create(feed.key)
|
|
97
|
-
var stream0 = feed.replicate(true, { ack: true })
|
|
98
|
-
var stream1 = clone1.replicate(false)
|
|
99
|
-
var stream2 = clone2.replicate(false)
|
|
100
|
-
var stream3 = feed.replicate(true, { ack: true })
|
|
101
|
-
stream1.pipe(stream0).pipe(stream1)
|
|
102
|
-
stream2.pipe(stream3).pipe(stream2)
|
|
103
|
-
|
|
104
|
-
var acks = [[], []]
|
|
105
|
-
stream0.on('ack', function (ack) {
|
|
106
|
-
acks[0].push(ack.start)
|
|
107
|
-
})
|
|
108
|
-
stream1.on('ack', function (ack) {
|
|
109
|
-
t.fail('unexpected ack')
|
|
110
|
-
})
|
|
111
|
-
stream2.on('ack', function (ack) {
|
|
112
|
-
t.fail('unexpected ack')
|
|
113
|
-
})
|
|
114
|
-
stream3.on('ack', function (ack) {
|
|
115
|
-
acks[1].push(ack.start)
|
|
116
|
-
})
|
|
117
|
-
var pending = 2
|
|
118
|
-
stream1.on('end', function () {
|
|
119
|
-
if (--pending === 0) check()
|
|
120
|
-
})
|
|
121
|
-
stream2.on('end', function () {
|
|
122
|
-
if (--pending === 0) check()
|
|
123
|
-
})
|
|
124
|
-
function check () {
|
|
125
|
-
acks.forEach(function (r) { r.sort() })
|
|
126
|
-
t.deepEqual(acks, [[0, 1, 2], [0, 1, 2]])
|
|
127
|
-
t.end()
|
|
128
|
-
}
|
|
129
|
-
})
|
|
130
|
-
})
|
|
131
|
-
|
|
132
|
-
tape('acks where clones should not ack', function (t) {
|
|
133
|
-
t.plan(1)
|
|
134
|
-
var feed = create()
|
|
135
|
-
feed.on('ready', function () {
|
|
136
|
-
feed.append(['a', 'b', 'c'])
|
|
137
|
-
|
|
138
|
-
var clone1 = create(feed.key)
|
|
139
|
-
var clone2 = create(feed.key)
|
|
140
|
-
var stream1 = feed.replicate(true, { ack: true })
|
|
141
|
-
var stream2 = feed.replicate(true, { ack: true })
|
|
142
|
-
var cstream1 = clone1.replicate(false, { ack: true }) // but shouldn't get any acks
|
|
143
|
-
var cstream2 = clone2.replicate(false, { ack: true }) // but shouldn't get any acks
|
|
144
|
-
stream1.pipe(cstream1).pipe(stream1)
|
|
145
|
-
stream2.pipe(cstream2).pipe(stream2)
|
|
146
|
-
|
|
147
|
-
cstream1.on('ack', function (ack) {
|
|
148
|
-
t.fail('unexpected ack')
|
|
149
|
-
})
|
|
150
|
-
cstream2.on('ack', function (ack) {
|
|
151
|
-
t.fail('unexpected ack')
|
|
152
|
-
})
|
|
153
|
-
var acks = [[], []]
|
|
154
|
-
stream1.on('ack', function (ack) {
|
|
155
|
-
acks[0].push(ack.start)
|
|
156
|
-
})
|
|
157
|
-
stream2.on('ack', function (ack) {
|
|
158
|
-
acks[1].push(ack.start)
|
|
159
|
-
})
|
|
160
|
-
var pending = 2
|
|
161
|
-
stream1.on('end', function () {
|
|
162
|
-
if (--pending === 0) check()
|
|
163
|
-
})
|
|
164
|
-
stream2.on('end', function () {
|
|
165
|
-
if (--pending === 0) check()
|
|
166
|
-
})
|
|
167
|
-
function check () {
|
|
168
|
-
acks.forEach(function (r) { r.sort() })
|
|
169
|
-
t.deepEqual(acks, [[0, 1, 2], [0, 1, 2]])
|
|
170
|
-
t.end()
|
|
171
|
-
}
|
|
172
|
-
})
|
|
173
|
-
})
|
|
174
|
-
|
|
175
|
-
tape('transitive clone acks', function (t) {
|
|
176
|
-
t.plan(2)
|
|
177
|
-
var feed = create()
|
|
178
|
-
feed.on('ready', function () {
|
|
179
|
-
feed.append(['a', 'b', 'c'], ready)
|
|
180
|
-
})
|
|
181
|
-
function ready (err) {
|
|
182
|
-
t.ifError(err)
|
|
183
|
-
var clone1 = create(feed.key)
|
|
184
|
-
var clone2 = create(feed.key)
|
|
185
|
-
var stream1 = feed.replicate(true, { live: true, ack: true })
|
|
186
|
-
var stream2 = clone1.replicate(false, { live: true, ack: true })
|
|
187
|
-
var stream3 = clone1.replicate(true, { live: true, ack: true })
|
|
188
|
-
var stream4 = clone2.replicate(false, { live: true, ack: true })
|
|
189
|
-
var acks = [[], [], [], []]
|
|
190
|
-
;[stream1, stream2, stream3, stream4].forEach(function (stream, i) {
|
|
191
|
-
stream.on('ack', function (ack) {
|
|
192
|
-
acks[i].push(ack.start)
|
|
193
|
-
})
|
|
194
|
-
})
|
|
195
|
-
stream1.pipe(stream2).pipe(stream1)
|
|
196
|
-
stream3.pipe(stream4).pipe(stream3)
|
|
197
|
-
var dl = 0
|
|
198
|
-
clone2.on('download', function () {
|
|
199
|
-
// allow an extra tick for ack response to arrive
|
|
200
|
-
if (++dl === 3) setImmediate(check)
|
|
201
|
-
})
|
|
202
|
-
function check () {
|
|
203
|
-
acks.forEach(function (r) { r.sort() })
|
|
204
|
-
t.deepEqual(acks, [[0, 1, 2], [], [0, 1, 2], []])
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
})
|
|
208
|
-
|
|
209
|
-
tape('larger gossip network acks', function (t) {
|
|
210
|
-
t.plan(16)
|
|
211
|
-
var feed = create()
|
|
212
|
-
var cores = [feed]
|
|
213
|
-
var acks = {}
|
|
214
|
-
feed.on('ready', function () {
|
|
215
|
-
for (var i = 1; i < 10; i++) {
|
|
216
|
-
cores.push(create(feed.key))
|
|
217
|
-
}
|
|
218
|
-
next(0)
|
|
219
|
-
})
|
|
220
|
-
var ops = [
|
|
221
|
-
['append', 'A'],
|
|
222
|
-
['connect', 0, 1], // acks["0,1"].push(0)
|
|
223
|
-
['append', 'B'],
|
|
224
|
-
['append', 'C'],
|
|
225
|
-
['connect', 1, 2], // acks["1,2"].push(0)
|
|
226
|
-
['connect', 0, 1], // acks["0,1"].push(1,2)
|
|
227
|
-
['append', 'D'],
|
|
228
|
-
['append', 'E'],
|
|
229
|
-
['append', 'F'],
|
|
230
|
-
['connect', 0, 5], // acks["0,5"].push(0,1,2,3,4,5)
|
|
231
|
-
['connect', 2, 5], // acks["5,2"].push(1,2,3,4,5)
|
|
232
|
-
['connect', 5, 6], // acks["5,6"].push(0,1,2,3,4,5)
|
|
233
|
-
['connect', 1, 6], // acks["6,1"].push(3,4,5)
|
|
234
|
-
['append', 'G'],
|
|
235
|
-
['append', 'H'],
|
|
236
|
-
['connect', 4, 2], // acks["2,4"].push(0,1,2,3,4,5)
|
|
237
|
-
['connect', 0, 7], // acks["0,7"].push(0,1,2,3,4,5,6,7)
|
|
238
|
-
['connect', 4, 7], // acks["7,4"].push(6,7)
|
|
239
|
-
['connect', 4, 5], // acks["4,5"].push(6,7)
|
|
240
|
-
['connect', 5, 8], // acks["5,8"].push(0,1,2,3,4,5,6,7)
|
|
241
|
-
['append', 'I'],
|
|
242
|
-
['append', 'J'],
|
|
243
|
-
['append', 'K'],
|
|
244
|
-
['connect', 0, 8], // acks["0,8"].push(8,9,10)
|
|
245
|
-
['connect', 5, 9], // acks["5,9"].push(0,1,2,3,4,5,6,7)
|
|
246
|
-
['connect', 8, 4], // acks["8,4"].push(8,9,10)
|
|
247
|
-
['append', 'L'],
|
|
248
|
-
['append', 'M'],
|
|
249
|
-
['append', 'N'],
|
|
250
|
-
['append', 'O'],
|
|
251
|
-
['connect', 9, 0], // acks["0,9"].push(8,9,10,11,12,13,14)
|
|
252
|
-
['connect', 2, 9] // acks["9,2"].push(6,7,8,9,10,11,12,13,14)
|
|
253
|
-
]
|
|
254
|
-
function next (i) {
|
|
255
|
-
var op = ops[i]
|
|
256
|
-
if (!op) return check()
|
|
257
|
-
if (op[0] === 'append') {
|
|
258
|
-
feed.append(op[1], function (err) {
|
|
259
|
-
t.ifError(err)
|
|
260
|
-
next(i + 1)
|
|
261
|
-
})
|
|
262
|
-
} else if (op[0] === 'connect') {
|
|
263
|
-
var src = cores[op[1]]
|
|
264
|
-
var dst = cores[op[2]]
|
|
265
|
-
var sr = src.replicate(true, { ack: true })
|
|
266
|
-
var dr = dst.replicate(false, { ack: true })
|
|
267
|
-
sr.on('ack', function (ack) {
|
|
268
|
-
var key = op[1] + ',' + op[2]
|
|
269
|
-
if (!acks[key]) acks[key] = []
|
|
270
|
-
acks[key].push(ack.start)
|
|
271
|
-
})
|
|
272
|
-
dr.on('ack', function (ack) {
|
|
273
|
-
var key = op[2] + ',' + op[1]
|
|
274
|
-
if (!acks[key]) acks[key] = []
|
|
275
|
-
acks[key].push(ack.start)
|
|
276
|
-
})
|
|
277
|
-
sr.pipe(dr).pipe(sr)
|
|
278
|
-
var pending = 2
|
|
279
|
-
sr.on('end', function () { if (--pending === 0) next(i + 1) })
|
|
280
|
-
dr.on('end', function () { if (--pending === 0) next(i + 1) })
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
function check () {
|
|
284
|
-
Object.keys(acks).forEach(function (key) {
|
|
285
|
-
acks[key].sort(function (a, b) { return a - b })
|
|
286
|
-
})
|
|
287
|
-
t.deepEqual(acks, {
|
|
288
|
-
'0,1': [0, 1, 2],
|
|
289
|
-
'1,2': [0],
|
|
290
|
-
'0,5': [0, 1, 2, 3, 4, 5],
|
|
291
|
-
'5,2': [1, 2, 3, 4, 5],
|
|
292
|
-
'5,6': [0, 1, 2, 3, 4, 5],
|
|
293
|
-
'6,1': [3, 4, 5],
|
|
294
|
-
'2,4': [0, 1, 2, 3, 4, 5],
|
|
295
|
-
'0,7': [0, 1, 2, 3, 4, 5, 6, 7],
|
|
296
|
-
'7,4': [6, 7],
|
|
297
|
-
'4,5': [6, 7],
|
|
298
|
-
'5,8': [0, 1, 2, 3, 4, 5, 6, 7],
|
|
299
|
-
'0,8': [8, 9, 10],
|
|
300
|
-
'5,9': [0, 1, 2, 3, 4, 5, 6, 7],
|
|
301
|
-
'8,4': [8, 9, 10],
|
|
302
|
-
'0,9': [8, 9, 10, 11, 12, 13, 14],
|
|
303
|
-
'9,2': [6, 7, 8, 9, 10, 11, 12, 13, 14]
|
|
304
|
-
})
|
|
305
|
-
}
|
|
306
|
-
})
|
package/test/audit.js
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
var tape = require('tape')
|
|
2
|
-
var create = require('./helpers/create')
|
|
3
|
-
|
|
4
|
-
tape('basic audit', function (t) {
|
|
5
|
-
var feed = create()
|
|
6
|
-
|
|
7
|
-
feed.append('hello')
|
|
8
|
-
feed.append('world', function () {
|
|
9
|
-
feed.audit(function (err, report) {
|
|
10
|
-
t.error(err, 'no error')
|
|
11
|
-
t.same(report, { valid: 2, invalid: 0 })
|
|
12
|
-
t.end()
|
|
13
|
-
})
|
|
14
|
-
})
|
|
15
|
-
})
|
|
16
|
-
|
|
17
|
-
tape('basic audit with bad data', function (t) {
|
|
18
|
-
var feed = create()
|
|
19
|
-
|
|
20
|
-
feed.append('hello')
|
|
21
|
-
feed.append('world', function () {
|
|
22
|
-
feed._storage.data.write(0, Buffer.from('H'), function () {
|
|
23
|
-
t.ok(feed.has(0))
|
|
24
|
-
feed.audit(function (err, report) {
|
|
25
|
-
t.error(err, 'no error')
|
|
26
|
-
t.same(report, { valid: 1, invalid: 1 })
|
|
27
|
-
t.notOk(feed.has(0))
|
|
28
|
-
feed.audit(function (err, report) {
|
|
29
|
-
t.error(err, 'no error')
|
|
30
|
-
t.same(report, { valid: 1, invalid: 0 })
|
|
31
|
-
t.end()
|
|
32
|
-
})
|
|
33
|
-
})
|
|
34
|
-
})
|
|
35
|
-
})
|
|
36
|
-
})
|
package/test/cache.js
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
var tape = require('tape')
|
|
2
|
-
var create = require('./helpers/create')
|
|
3
|
-
|
|
4
|
-
tape('default options does not use data cache', function (t) {
|
|
5
|
-
var feed = create()
|
|
6
|
-
feed.append(['hello', 'world'], err => {
|
|
7
|
-
t.error(err, 'no error')
|
|
8
|
-
feed.get(0, function (err, block) {
|
|
9
|
-
t.error(err, 'no error')
|
|
10
|
-
t.same(feed._storage.treeCache.byteSize, 40)
|
|
11
|
-
feed.get(1, function (err, block) {
|
|
12
|
-
t.error(err, 'no error')
|
|
13
|
-
t.same(feed._storage.treeCache.byteSize, 80)
|
|
14
|
-
t.false(feed._storage.dataCache)
|
|
15
|
-
t.end()
|
|
16
|
-
})
|
|
17
|
-
})
|
|
18
|
-
})
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
tape('numeric data cache opt creates data cache', function (t) {
|
|
22
|
-
var feed = create({ cache: { data: 1024 } })
|
|
23
|
-
var firstLength = Buffer.byteLength('hello')
|
|
24
|
-
var secondLength = Buffer.byteLength('world')
|
|
25
|
-
|
|
26
|
-
feed.append(['hello', 'world'], err => {
|
|
27
|
-
t.error(err, 'no error')
|
|
28
|
-
feed.get(0, function (err, block) {
|
|
29
|
-
t.error(err, 'no error')
|
|
30
|
-
t.true(feed._storage.dataCache)
|
|
31
|
-
t.same(feed._storage.dataCache.byteSize, firstLength)
|
|
32
|
-
feed.get(1, function (err, block) {
|
|
33
|
-
t.error(err, 'no error')
|
|
34
|
-
t.same(feed._storage.dataCache.byteSize, firstLength + secondLength)
|
|
35
|
-
t.end()
|
|
36
|
-
})
|
|
37
|
-
})
|
|
38
|
-
})
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
tape('can use a custom cache object', function (t) {
|
|
42
|
-
var treeStorage = []
|
|
43
|
-
var dataStorage = []
|
|
44
|
-
var createCache = function (storage) {
|
|
45
|
-
return {
|
|
46
|
-
get: function (key) {
|
|
47
|
-
return storage[key]
|
|
48
|
-
},
|
|
49
|
-
set: function (key, value) {
|
|
50
|
-
storage[key] = value
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
var feed = create({
|
|
56
|
-
cache: {
|
|
57
|
-
tree: createCache(treeStorage),
|
|
58
|
-
data: createCache(dataStorage)
|
|
59
|
-
}
|
|
60
|
-
})
|
|
61
|
-
feed.append(['hello', 'world'], err => {
|
|
62
|
-
t.error(err, 'no error')
|
|
63
|
-
feed.get(0, function (err, block) {
|
|
64
|
-
t.error(err, 'no error')
|
|
65
|
-
t.same(dataStorage.length, 1)
|
|
66
|
-
t.same(treeStorage.length, 1)
|
|
67
|
-
feed.get(1, function (err, block) {
|
|
68
|
-
t.error(err, 'no error')
|
|
69
|
-
t.same(dataStorage.length, 2)
|
|
70
|
-
// tree storage should have entries at 0 and 2
|
|
71
|
-
t.same(treeStorage.length, 3)
|
|
72
|
-
t.end()
|
|
73
|
-
})
|
|
74
|
-
})
|
|
75
|
-
})
|
|
76
|
-
})
|
|
77
|
-
|
|
78
|
-
tape('can disable all caching', function (t) {
|
|
79
|
-
var feed = create({ cache: { tree: false } })
|
|
80
|
-
|
|
81
|
-
feed.append(['hello', 'world'], err => {
|
|
82
|
-
t.error(err, 'no error')
|
|
83
|
-
feed.get(0, function (err, block) {
|
|
84
|
-
t.error(err, 'no error')
|
|
85
|
-
feed.get(1, function (err, block) {
|
|
86
|
-
t.error(err, 'no error')
|
|
87
|
-
t.false(feed._storage.dataCache)
|
|
88
|
-
t.false(feed._storage.treeCache)
|
|
89
|
-
t.end()
|
|
90
|
-
})
|
|
91
|
-
})
|
|
92
|
-
})
|
|
93
|
-
})
|
package/test/compat.js
DELETED
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
var tape = require('tape')
|
|
2
|
-
var hypercore = require('../')
|
|
3
|
-
var ram = require('random-access-memory')
|
|
4
|
-
var replicate = require('./helpers/replicate')
|
|
5
|
-
|
|
6
|
-
tape('deterministic data and tree', function (t) {
|
|
7
|
-
t.plan(10)
|
|
8
|
-
|
|
9
|
-
var expectedTree = Buffer.from(
|
|
10
|
-
'0502570200002807424c414b4532620000000000000000000000000000000000ab27d45f509274' +
|
|
11
|
-
'ce0d08f4f09ba2d0e0d8df61a0c2a78932e81b5ef26ef398df0000000000000001064321a8413b' +
|
|
12
|
-
'e8c604599689e2c7a59367b031b598bceeeb16556a8f3252e0de000000000000000294c1705400' +
|
|
13
|
-
'5942a002c7c39fbb9c6183518691fb401436f1a2f329b380230af800000000000000018dfe81d5' +
|
|
14
|
-
'76464773f848b9aba1c886fde57a49c283ab57f4a297d976d986651e00000000000000041d2fad' +
|
|
15
|
-
'c9ce604c7e592949edc964e45aaa10990d7ee53328439ef9b2cf8aa6ff00000000000000013a8d' +
|
|
16
|
-
'cc74e80b8314e8e13e1e462358cf58cf5fc4413a9b18a891ffacc551c395000000000000000228' +
|
|
17
|
-
'28647a654a712738e35f49d1c05c676010be0b33882affc1d1e7e9fee59d400000000000000001' +
|
|
18
|
-
'000000000000000000000000000000000000000000000000000000000000000000000000000000' +
|
|
19
|
-
'00baac70b6d38243efa028ee977c462e4bec73d21d09ceb8cc16f4d4b1ee228a45000000000000' +
|
|
20
|
-
'0001d1b021632c7fab84544053379112ca7b165bb21283821816c5b6c89ff7f78e2d0000000000' +
|
|
21
|
-
'000002d2ab421cece792033058787a5ba72f3a701fddc25540d5924e9819d7c12e02f200000000' +
|
|
22
|
-
'00000001',
|
|
23
|
-
'hex'
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
for (var i = 0; i < 5; i++) run()
|
|
27
|
-
|
|
28
|
-
function run () {
|
|
29
|
-
var st = storage()
|
|
30
|
-
var feed = hypercore(st)
|
|
31
|
-
|
|
32
|
-
feed.append(['a', 'b', 'c', 'd', 'e', 'f'], function () {
|
|
33
|
-
t.same(st.data.toBuffer().toString(), 'abcdef')
|
|
34
|
-
t.same(st.tree.toBuffer(), expectedTree)
|
|
35
|
-
})
|
|
36
|
-
}
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
tape('deterministic data and tree after replication', function (t) {
|
|
40
|
-
t.plan(10)
|
|
41
|
-
|
|
42
|
-
var expectedTree = Buffer.from(
|
|
43
|
-
'0502570200002807424c414b4532620000000000000000000000000000000000ab27d45f509274' +
|
|
44
|
-
'ce0d08f4f09ba2d0e0d8df61a0c2a78932e81b5ef26ef398df0000000000000001064321a8413b' +
|
|
45
|
-
'e8c604599689e2c7a59367b031b598bceeeb16556a8f3252e0de000000000000000294c1705400' +
|
|
46
|
-
'5942a002c7c39fbb9c6183518691fb401436f1a2f329b380230af800000000000000018dfe81d5' +
|
|
47
|
-
'76464773f848b9aba1c886fde57a49c283ab57f4a297d976d986651e00000000000000041d2fad' +
|
|
48
|
-
'c9ce604c7e592949edc964e45aaa10990d7ee53328439ef9b2cf8aa6ff00000000000000013a8d' +
|
|
49
|
-
'cc74e80b8314e8e13e1e462358cf58cf5fc4413a9b18a891ffacc551c395000000000000000228' +
|
|
50
|
-
'28647a654a712738e35f49d1c05c676010be0b33882affc1d1e7e9fee59d400000000000000001' +
|
|
51
|
-
'000000000000000000000000000000000000000000000000000000000000000000000000000000' +
|
|
52
|
-
'00baac70b6d38243efa028ee977c462e4bec73d21d09ceb8cc16f4d4b1ee228a45000000000000' +
|
|
53
|
-
'0001d1b021632c7fab84544053379112ca7b165bb21283821816c5b6c89ff7f78e2d0000000000' +
|
|
54
|
-
'000002d2ab421cece792033058787a5ba72f3a701fddc25540d5924e9819d7c12e02f200000000' +
|
|
55
|
-
'00000001',
|
|
56
|
-
'hex'
|
|
57
|
-
)
|
|
58
|
-
|
|
59
|
-
for (var i = 0; i < 5; i++) run()
|
|
60
|
-
|
|
61
|
-
function run () {
|
|
62
|
-
var feed = hypercore(ram)
|
|
63
|
-
|
|
64
|
-
feed.append(['a', 'b', 'c', 'd', 'e', 'f'], function () {
|
|
65
|
-
var st = storage()
|
|
66
|
-
var clone = hypercore(st, feed.key)
|
|
67
|
-
|
|
68
|
-
replicate(feed, clone).on('end', function () {
|
|
69
|
-
t.same(st.data.toBuffer().toString(), 'abcdef')
|
|
70
|
-
t.same(st.tree.toBuffer(), expectedTree)
|
|
71
|
-
})
|
|
72
|
-
})
|
|
73
|
-
}
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
tape('deterministic signatures', function (t) {
|
|
77
|
-
t.plan(20)
|
|
78
|
-
|
|
79
|
-
var key = Buffer.from('9718a1ff1c4ca79feac551c0c7212a65e4091278ec886b88be01ee4039682238', 'hex')
|
|
80
|
-
var secretKey = Buffer.from(
|
|
81
|
-
'53729c0311846cca9cc0eded07aaf9e6689705b6a0b1bb8c3a2a839b72fda383' +
|
|
82
|
-
'9718a1ff1c4ca79feac551c0c7212a65e4091278ec886b88be01ee4039682238',
|
|
83
|
-
'hex'
|
|
84
|
-
)
|
|
85
|
-
|
|
86
|
-
var compatExpectedSignatures = Buffer.from(
|
|
87
|
-
'050257010000400745643235353139000000000000000000000000000000000084684e8dd76c339' +
|
|
88
|
-
'd6f5754e813204906ee818e6c6cdc6a816a2ac785a3e0d926ac08641a904013194fe6121847b7da' +
|
|
89
|
-
'd4e361965d47715428eb0a0ededbdd5909d037ff3c3614fa0100ed9264a712d3b77cbe7a4f6eadd' +
|
|
90
|
-
'8f342809be99dfb9154a19e278d7a5de7d2b4d890f7701a38b006469f6bab1aff66ac6125d48baf' +
|
|
91
|
-
'dc0711057675ed57d445ce7ed4613881be37ebc56bb40556b822e431bb4dc3517421f9a5e3ed124' +
|
|
92
|
-
'eb5c4db8367386d9ce12b2408613b9fec2837022772a635ffd807',
|
|
93
|
-
'hex'
|
|
94
|
-
)
|
|
95
|
-
|
|
96
|
-
var expectedSignature = Buffer.from(
|
|
97
|
-
'42e057f2c225b4c5b97876a15959324931ad84646a8bf2e4d14487c0f117966a585edcdda54670d' +
|
|
98
|
-
'd5def829ca85924ce44ae307835e57d5729aef8cd91678b06',
|
|
99
|
-
'hex'
|
|
100
|
-
)
|
|
101
|
-
|
|
102
|
-
for (var i = 0; i < 5; i++) run()
|
|
103
|
-
|
|
104
|
-
function run () {
|
|
105
|
-
var st = storage()
|
|
106
|
-
var feed = hypercore(st, key, {
|
|
107
|
-
secretKey: secretKey
|
|
108
|
-
})
|
|
109
|
-
|
|
110
|
-
feed.append(['a', 'b', 'c'], function () {
|
|
111
|
-
t.same(st.data.toBuffer().toString(), 'abc')
|
|
112
|
-
feed.verify(feed.length - 1, compatExpectedSignatures.slice(-64), function (err, valid) {
|
|
113
|
-
t.error(err, 'no error')
|
|
114
|
-
t.ok(valid, 'compat sigs still valid')
|
|
115
|
-
})
|
|
116
|
-
t.same(st.signatures.toBuffer().slice(-64), expectedSignature, 'only needs last sig')
|
|
117
|
-
})
|
|
118
|
-
}
|
|
119
|
-
})
|
|
120
|
-
|
|
121
|
-
tape('deterministic signatures after replication', function (t) {
|
|
122
|
-
t.plan(10)
|
|
123
|
-
|
|
124
|
-
var key = Buffer.from('9718a1ff1c4ca79feac551c0c7212a65e4091278ec886b88be01ee4039682238', 'hex')
|
|
125
|
-
var secretKey = Buffer.from(
|
|
126
|
-
'53729c0311846cca9cc0eded07aaf9e6689705b6a0b1bb8c3a2a839b72fda383' +
|
|
127
|
-
'9718a1ff1c4ca79feac551c0c7212a65e4091278ec886b88be01ee4039682238',
|
|
128
|
-
'hex'
|
|
129
|
-
)
|
|
130
|
-
|
|
131
|
-
var expectedSignature = Buffer.from(
|
|
132
|
-
'42e057f2c225b4c5b97876a15959324931ad84646a8bf2e4d14487c0f117966a585edcdda54670d' +
|
|
133
|
-
'd5def829ca85924ce44ae307835e57d5729aef8cd91678b06',
|
|
134
|
-
'hex'
|
|
135
|
-
)
|
|
136
|
-
|
|
137
|
-
for (var i = 0; i < 5; i++) run()
|
|
138
|
-
|
|
139
|
-
function run () {
|
|
140
|
-
var feed = hypercore(ram, key, {
|
|
141
|
-
secretKey: secretKey
|
|
142
|
-
})
|
|
143
|
-
|
|
144
|
-
feed.append(['a', 'b', 'c'], function () {
|
|
145
|
-
var st = storage()
|
|
146
|
-
var clone = hypercore(st, feed.key)
|
|
147
|
-
|
|
148
|
-
replicate(feed, clone).on('end', function () {
|
|
149
|
-
t.same(st.data.toBuffer().toString(), 'abc')
|
|
150
|
-
t.same(st.signatures.toBuffer().slice(-64), expectedSignature, 'only needs last sig')
|
|
151
|
-
})
|
|
152
|
-
})
|
|
153
|
-
}
|
|
154
|
-
})
|
|
155
|
-
|
|
156
|
-
tape('compat signatures work', function (t) {
|
|
157
|
-
var key = Buffer.from('9718a1ff1c4ca79feac551c0c7212a65e4091278ec886b88be01ee4039682238', 'hex')
|
|
158
|
-
var secretKey = Buffer.from(
|
|
159
|
-
'53729c0311846cca9cc0eded07aaf9e6689705b6a0b1bb8c3a2a839b72fda383' +
|
|
160
|
-
'9718a1ff1c4ca79feac551c0c7212a65e4091278ec886b88be01ee4039682238',
|
|
161
|
-
'hex'
|
|
162
|
-
)
|
|
163
|
-
|
|
164
|
-
var compatExpectedSignatures = Buffer.from(
|
|
165
|
-
'050257010000400745643235353139000000000000000000000000000000000084684e8dd76c339' +
|
|
166
|
-
'd6f5754e813204906ee818e6c6cdc6a816a2ac785a3e0d926ac08641a904013194fe6121847b7da' +
|
|
167
|
-
'd4e361965d47715428eb0a0ededbdd5909d037ff3c3614fa0100ed9264a712d3b77cbe7a4f6eadd' +
|
|
168
|
-
'8f342809be99dfb9154a19e278d7a5de7d2b4d890f7701a38b006469f6bab1aff66ac6125d48baf' +
|
|
169
|
-
'dc0711057675ed57d445ce7ed4613881be37ebc56bb40556b822e431bb4dc3517421f9a5e3ed124' +
|
|
170
|
-
'eb5c4db8367386d9ce12b2408613b9fec2837022772a635ffd807',
|
|
171
|
-
'hex'
|
|
172
|
-
)
|
|
173
|
-
|
|
174
|
-
var st = storage()
|
|
175
|
-
|
|
176
|
-
var feed = hypercore(st, key, {
|
|
177
|
-
secretKey
|
|
178
|
-
})
|
|
179
|
-
|
|
180
|
-
feed.append(['a', 'b', 'c'], function () {
|
|
181
|
-
st.signatures.write(0, compatExpectedSignatures, function () {
|
|
182
|
-
var clone = hypercore(ram, key)
|
|
183
|
-
|
|
184
|
-
replicate(feed, clone).on('end', function () {
|
|
185
|
-
t.same(clone.length, 3)
|
|
186
|
-
clone.proof(2, function (err, proof) {
|
|
187
|
-
t.error(err)
|
|
188
|
-
t.same(proof.signature, compatExpectedSignatures.slice(-64))
|
|
189
|
-
|
|
190
|
-
feed.append('d', function () {
|
|
191
|
-
replicate(feed, clone).on('end', function () {
|
|
192
|
-
t.same(clone.length, 4)
|
|
193
|
-
t.end()
|
|
194
|
-
})
|
|
195
|
-
})
|
|
196
|
-
})
|
|
197
|
-
})
|
|
198
|
-
})
|
|
199
|
-
})
|
|
200
|
-
})
|
|
201
|
-
|
|
202
|
-
function storage () {
|
|
203
|
-
return create
|
|
204
|
-
|
|
205
|
-
function create (name) {
|
|
206
|
-
create[name] = ram()
|
|
207
|
-
return create[name]
|
|
208
|
-
}
|
|
209
|
-
}
|