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/sessions.js
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
const test = require('brittle')
|
|
2
|
+
const ram = require('random-access-memory')
|
|
3
|
+
const crypto = require('hypercore-crypto')
|
|
4
|
+
|
|
5
|
+
const Hypercore = require('../')
|
|
6
|
+
|
|
7
|
+
test('sessions - can create writable sessions from a read-only core', async function (t) {
|
|
8
|
+
t.plan(5)
|
|
9
|
+
|
|
10
|
+
const keyPair = crypto.keyPair()
|
|
11
|
+
const core = new Hypercore(ram, keyPair.publicKey, {
|
|
12
|
+
valueEncoding: 'utf-8'
|
|
13
|
+
})
|
|
14
|
+
await core.ready()
|
|
15
|
+
t.absent(core.writable)
|
|
16
|
+
|
|
17
|
+
const session = core.session({ keyPair: { secretKey: keyPair.secretKey } })
|
|
18
|
+
t.ok(session.writable)
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
await core.append('hello')
|
|
22
|
+
t.fail('should not have appended to the read-only core')
|
|
23
|
+
} catch {
|
|
24
|
+
t.pass('read-only core append threw correctly')
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
try {
|
|
28
|
+
await session.append('world')
|
|
29
|
+
t.pass('session append did not throw')
|
|
30
|
+
} catch {
|
|
31
|
+
t.fail('session append should not have thrown')
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
t.is(core.length, 1)
|
|
35
|
+
t.end()
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
test('sessions - writable session with custom sign function', async function (t) {
|
|
39
|
+
t.plan(5)
|
|
40
|
+
|
|
41
|
+
const keyPair = crypto.keyPair()
|
|
42
|
+
const core = new Hypercore(ram, keyPair.publicKey, {
|
|
43
|
+
valueEncoding: 'utf-8'
|
|
44
|
+
})
|
|
45
|
+
await core.ready()
|
|
46
|
+
t.absent(core.writable)
|
|
47
|
+
|
|
48
|
+
const session = core.session({ sign: signable => crypto.sign(signable, keyPair.secretKey) })
|
|
49
|
+
t.ok(session.writable)
|
|
50
|
+
|
|
51
|
+
try {
|
|
52
|
+
await core.append('hello')
|
|
53
|
+
t.fail('should not have appended to the read-only core')
|
|
54
|
+
} catch {
|
|
55
|
+
t.pass('read-only core append threw correctly')
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
try {
|
|
59
|
+
await session.append('world')
|
|
60
|
+
t.pass('session append did not throw')
|
|
61
|
+
} catch {
|
|
62
|
+
t.fail('session append should not have thrown')
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
t.is(core.length, 1)
|
|
66
|
+
t.end()
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
test('sessions - writable session with invalid keypair throws', async function (t) {
|
|
70
|
+
t.plan(2)
|
|
71
|
+
|
|
72
|
+
const keyPair1 = crypto.keyPair()
|
|
73
|
+
const keyPair2 = crypto.keyPair()
|
|
74
|
+
|
|
75
|
+
try {
|
|
76
|
+
const core = new Hypercore(ram, keyPair2.publicKey) // Create a new core in read-only mode.
|
|
77
|
+
core.session({ keyPair: keyPair1 })
|
|
78
|
+
t.fail('invalid keypair did not throw')
|
|
79
|
+
} catch {
|
|
80
|
+
t.pass('invalid keypair threw')
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
try {
|
|
84
|
+
const core = new Hypercore(ram, keyPair1.publicKey, { keyPair: keyPair2 }) // eslint-disable-line
|
|
85
|
+
await core.ready()
|
|
86
|
+
t.fail('invalid keypair did not throw')
|
|
87
|
+
} catch {
|
|
88
|
+
t.pass('invalid keypair threw')
|
|
89
|
+
}
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
test('sessions - auto close', async function (t) {
|
|
93
|
+
const core = new Hypercore(ram, { autoClose: true })
|
|
94
|
+
|
|
95
|
+
let closed = false
|
|
96
|
+
core.on('close', function () {
|
|
97
|
+
closed = true
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
const a = core.session()
|
|
101
|
+
const b = core.session()
|
|
102
|
+
|
|
103
|
+
await a.close()
|
|
104
|
+
t.absent(closed, 'not closed yet')
|
|
105
|
+
|
|
106
|
+
await b.close()
|
|
107
|
+
t.ok(closed, 'all closed')
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
test('sessions - auto close different order', async function (t) {
|
|
111
|
+
const core = new Hypercore(ram, { autoClose: true })
|
|
112
|
+
|
|
113
|
+
const a = core.session()
|
|
114
|
+
const b = core.session()
|
|
115
|
+
|
|
116
|
+
let closed = false
|
|
117
|
+
a.on('close', function () {
|
|
118
|
+
closed = true
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
await core.close()
|
|
122
|
+
t.absent(closed, 'not closed yet')
|
|
123
|
+
|
|
124
|
+
await b.close()
|
|
125
|
+
t.ok(closed, 'all closed')
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
test('sessions - auto close with all closing', async function (t) {
|
|
129
|
+
const core = new Hypercore(ram, { autoClose: true })
|
|
130
|
+
|
|
131
|
+
const a = core.session()
|
|
132
|
+
const b = core.session()
|
|
133
|
+
|
|
134
|
+
let closed = 0
|
|
135
|
+
a.on('close', () => closed++)
|
|
136
|
+
b.on('close', () => closed++)
|
|
137
|
+
core.on('close', () => closed++)
|
|
138
|
+
|
|
139
|
+
await Promise.all([core.close(), a.close(), b.close()])
|
|
140
|
+
t.is(closed, 3, 'all closed')
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
test('sessions - auto close when using from option', async function (t) {
|
|
144
|
+
const core1 = new Hypercore(ram, {
|
|
145
|
+
autoClose: true
|
|
146
|
+
})
|
|
147
|
+
const core2 = new Hypercore({
|
|
148
|
+
preload: () => {
|
|
149
|
+
return {
|
|
150
|
+
from: core1
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
})
|
|
154
|
+
await core2.close()
|
|
155
|
+
t.ok(core1.closed)
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
test('sessions - close with from option', async function (t) {
|
|
159
|
+
const core1 = new Hypercore(ram)
|
|
160
|
+
await core1.append('hello world')
|
|
161
|
+
|
|
162
|
+
const core2 = new Hypercore({
|
|
163
|
+
preload: () => {
|
|
164
|
+
return {
|
|
165
|
+
from: core1
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
})
|
|
169
|
+
await core2.close()
|
|
170
|
+
|
|
171
|
+
t.absent(core1.closed)
|
|
172
|
+
t.alike(await core1.get(0), Buffer.from('hello world'))
|
|
173
|
+
})
|
package/test/storage.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const test = require('brittle')
|
|
2
|
+
const sodium = require('sodium-universal')
|
|
3
|
+
const crypto = require('hypercore-crypto')
|
|
4
|
+
const RAM = require('random-access-memory')
|
|
5
|
+
const Hypercore = require('..')
|
|
6
|
+
|
|
7
|
+
const keyPair = crypto.keyPair(Buffer.alloc(sodium.crypto_sign_SEEDBYTES, 'seed'))
|
|
8
|
+
|
|
9
|
+
const encryptionKey = Buffer.alloc(sodium.crypto_stream_KEYBYTES, 'encryption key')
|
|
10
|
+
|
|
11
|
+
test('storage layout', async function (t) {
|
|
12
|
+
const core = new Hypercore(RAM, { keyPair })
|
|
13
|
+
|
|
14
|
+
for (let i = 0; i < 10000; i++) {
|
|
15
|
+
await core.append(Buffer.from([i]))
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
t.snapshot(core.core.blocks.storage.toBuffer().toString('base64'), 'blocks')
|
|
19
|
+
t.snapshot(core.core.tree.storage.toBuffer().toString('base64'), 'tree')
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
test('encrypted storage layout', async function (t) {
|
|
23
|
+
const core = new Hypercore(RAM, { keyPair, encryptionKey })
|
|
24
|
+
|
|
25
|
+
for (let i = 0; i < 10000; i++) {
|
|
26
|
+
await core.append(Buffer.from([i]))
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
t.snapshot(core.core.blocks.storage.toBuffer().toString('base64'), 'blocks')
|
|
30
|
+
t.snapshot(core.core.tree.storage.toBuffer().toString('base64'), 'tree')
|
|
31
|
+
})
|
package/test/streams.js
CHANGED
|
@@ -1,162 +1,55 @@
|
|
|
1
|
-
|
|
2
|
-
var collect = require('stream-collector')
|
|
3
|
-
var create = require('./helpers/create')
|
|
4
|
-
var bufferFrom = require('buffer-from')
|
|
1
|
+
const test = require('brittle')
|
|
5
2
|
|
|
6
|
-
|
|
7
|
-
tape('createReadStream to createWriteStream', function (t) {
|
|
8
|
-
var feed1 = create()
|
|
9
|
-
var feed2 = create()
|
|
3
|
+
const { create } = require('./helpers')
|
|
10
4
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
var w = feed2.createWriteStream()
|
|
5
|
+
test('basic read stream', async function (t) {
|
|
6
|
+
const core = await create()
|
|
14
7
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
})
|
|
22
|
-
})
|
|
23
|
-
})
|
|
8
|
+
const expected = [
|
|
9
|
+
'hello',
|
|
10
|
+
'world',
|
|
11
|
+
'verden',
|
|
12
|
+
'welt'
|
|
13
|
+
]
|
|
24
14
|
|
|
25
|
-
|
|
26
|
-
var feed = create({ valueEncoding: 'utf-8' })
|
|
15
|
+
await core.append(expected)
|
|
27
16
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
t.same(data, ['multiple'])
|
|
32
|
-
t.end()
|
|
33
|
-
})
|
|
34
|
-
})
|
|
35
|
-
})
|
|
17
|
+
for await (const data of core.createReadStream()) {
|
|
18
|
+
t.alike(data.toString(), expected.shift())
|
|
19
|
+
}
|
|
36
20
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
feed.append(['hello', 'multiple', 'worlds'], function () {
|
|
41
|
-
collect(feed.createReadStream({ start: 1, batch }), function (err, data) {
|
|
42
|
-
t.error(err, 'no error')
|
|
43
|
-
t.same(data, ['multiple', 'worlds'])
|
|
44
|
-
t.end()
|
|
45
|
-
})
|
|
46
|
-
})
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
tape('createReadStream with no start, end', function (t) {
|
|
50
|
-
var feed = create({ valueEncoding: 'utf-8' })
|
|
51
|
-
|
|
52
|
-
feed.append(['hello', 'multiple', 'worlds'], function () {
|
|
53
|
-
collect(feed.createReadStream({ end: 2, batch }), function (err, data) {
|
|
54
|
-
t.error(err, 'no error')
|
|
55
|
-
t.same(data, ['hello', 'multiple'])
|
|
56
|
-
t.end()
|
|
57
|
-
})
|
|
58
|
-
})
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
tape('createReadStream with live: true', function (t) {
|
|
62
|
-
var feed = create({ valueEncoding: 'utf-8' })
|
|
63
|
-
var expected = ['a', 'b', 'c', 'd', 'e']
|
|
64
|
-
|
|
65
|
-
t.plan(expected.length)
|
|
66
|
-
|
|
67
|
-
var rs = feed.createReadStream({ live: true, batch })
|
|
68
|
-
|
|
69
|
-
rs.on('data', function (data) {
|
|
70
|
-
t.same(data, expected.shift())
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
rs.on('end', function () {
|
|
74
|
-
t.fail('should never end')
|
|
75
|
-
})
|
|
76
|
-
|
|
77
|
-
feed.append('a', function () {
|
|
78
|
-
feed.append('b', function () {
|
|
79
|
-
feed.append(['c', 'd', 'e'])
|
|
80
|
-
})
|
|
81
|
-
})
|
|
82
|
-
})
|
|
83
|
-
|
|
84
|
-
tape('createReadStream with live: true after append', function (t) {
|
|
85
|
-
var feed = create({ valueEncoding: 'utf-8' })
|
|
86
|
-
var expected = ['a', 'b', 'c', 'd', 'e']
|
|
87
|
-
|
|
88
|
-
t.plan(expected.length)
|
|
89
|
-
|
|
90
|
-
feed.append(['a', 'b'], function () {
|
|
91
|
-
var rs = feed.createReadStream({ live: true, batch })
|
|
92
|
-
|
|
93
|
-
rs.on('data', function (data) {
|
|
94
|
-
t.same(data, expected.shift())
|
|
95
|
-
})
|
|
96
|
-
|
|
97
|
-
rs.on('end', function () {
|
|
98
|
-
t.fail('should never end')
|
|
99
|
-
})
|
|
100
|
-
|
|
101
|
-
feed.append(['c', 'd', 'e'])
|
|
102
|
-
})
|
|
103
|
-
})
|
|
104
|
-
|
|
105
|
-
tape('createReadStream with live: true and tail: true', function (t) {
|
|
106
|
-
var feed = create({ valueEncoding: 'utf-8' })
|
|
107
|
-
var expected = ['c', 'd', 'e']
|
|
108
|
-
|
|
109
|
-
t.plan(expected.length)
|
|
110
|
-
|
|
111
|
-
feed.append(['a', 'b'], function () {
|
|
112
|
-
var rs = feed.createReadStream({ live: true, tail: true, batch })
|
|
113
|
-
|
|
114
|
-
rs.on('data', function (data) {
|
|
115
|
-
t.same(data, expected.shift())
|
|
116
|
-
})
|
|
21
|
+
t.is(expected.length, 0)
|
|
22
|
+
})
|
|
117
23
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
})
|
|
24
|
+
test('read stream with start / end', async function (t) {
|
|
25
|
+
const core = await create()
|
|
121
26
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
27
|
+
const datas = [
|
|
28
|
+
'hello',
|
|
29
|
+
'world',
|
|
30
|
+
'verden',
|
|
31
|
+
'welt'
|
|
32
|
+
]
|
|
128
33
|
|
|
129
|
-
|
|
130
|
-
t.plan(11 * 2 + 1)
|
|
34
|
+
await core.append(datas)
|
|
131
35
|
|
|
132
|
-
|
|
36
|
+
{
|
|
37
|
+
const expected = datas.slice(1)
|
|
133
38
|
|
|
134
|
-
|
|
39
|
+
for await (const data of core.createReadStream({ start: 1 })) {
|
|
40
|
+
t.alike(data.toString(), expected.shift())
|
|
41
|
+
}
|
|
135
42
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
t.same(feed.length, 11)
|
|
43
|
+
t.is(expected.length, 0)
|
|
44
|
+
}
|
|
139
45
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
sameSize(2, 100 * 1024)
|
|
143
|
-
sameSize(3, 100 * 1024)
|
|
144
|
-
sameSize(4, 100 * 1024)
|
|
145
|
-
sameSize(5, 100 * 1024)
|
|
146
|
-
sameSize(6, 100 * 1024)
|
|
147
|
-
sameSize(7, 100 * 1024)
|
|
148
|
-
sameSize(8, 100 * 1024)
|
|
149
|
-
sameSize(9, 100 * 1024)
|
|
150
|
-
sameSize(10, 1024 * 1024 - 10 * 100 * 1024)
|
|
46
|
+
{
|
|
47
|
+
const expected = datas.slice(2, 3)
|
|
151
48
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
t.error(err, 'no error')
|
|
155
|
-
t.same(blk.length, size)
|
|
156
|
-
})
|
|
49
|
+
for await (const data of core.createReadStream({ start: 2, end: 3 })) {
|
|
50
|
+
t.alike(data.toString(), expected.shift())
|
|
157
51
|
}
|
|
158
|
-
})
|
|
159
|
-
})
|
|
160
52
|
|
|
161
|
-
|
|
162
|
-
|
|
53
|
+
t.is(expected.length, 0)
|
|
54
|
+
}
|
|
55
|
+
})
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
const test = require('brittle')
|
|
2
|
+
const Hypercore = require('../')
|
|
3
|
+
const tmp = require('tmp-promise')
|
|
4
|
+
const { create } = require('./helpers')
|
|
5
|
+
|
|
6
|
+
test('userdata - can set through setUserData', async function (t) {
|
|
7
|
+
const core = await create()
|
|
8
|
+
await core.setUserData('hello', Buffer.from('world'))
|
|
9
|
+
|
|
10
|
+
t.alike(await core.getUserData('hello'), Buffer.from('world'))
|
|
11
|
+
|
|
12
|
+
t.end()
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
test('userdata - can set through constructor option', async function (t) {
|
|
16
|
+
const core = await create({
|
|
17
|
+
userData: {
|
|
18
|
+
hello: Buffer.from('world')
|
|
19
|
+
}
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
t.alike(await core.getUserData('hello'), Buffer.from('world'))
|
|
23
|
+
|
|
24
|
+
t.end()
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
test('userdata - persists across restarts', async function (t) {
|
|
28
|
+
const dir = await tmp.dir()
|
|
29
|
+
|
|
30
|
+
let core = new Hypercore(dir.path, {
|
|
31
|
+
userData: {
|
|
32
|
+
hello: Buffer.from('world')
|
|
33
|
+
}
|
|
34
|
+
})
|
|
35
|
+
await core.ready()
|
|
36
|
+
|
|
37
|
+
await core.close()
|
|
38
|
+
core = new Hypercore(dir.path, {
|
|
39
|
+
userData: {
|
|
40
|
+
other: Buffer.from('another')
|
|
41
|
+
}
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
t.alike(await core.getUserData('hello'), Buffer.from('world'))
|
|
45
|
+
t.alike(await core.getUserData('other'), Buffer.from('another'))
|
|
46
|
+
t.end()
|
|
47
|
+
})
|
package/bench/all.sh
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
run () {
|
|
2
|
-
echo '> node write-16kb-blocks.js'
|
|
3
|
-
node write-16kb-blocks.js
|
|
4
|
-
echo
|
|
5
|
-
echo '> node write-512b-blocks.js'
|
|
6
|
-
node write-512b-blocks.js
|
|
7
|
-
echo
|
|
8
|
-
echo '> node write-64kb-blocks-static.js'
|
|
9
|
-
node write-64kb-blocks-static.js
|
|
10
|
-
echo
|
|
11
|
-
echo '> node write-64kb-blocks.js'
|
|
12
|
-
node write-64kb-blocks.js
|
|
13
|
-
echo
|
|
14
|
-
echo '> node copy-64kb-blocks.js'
|
|
15
|
-
node copy-64kb-blocks.js
|
|
16
|
-
echo
|
|
17
|
-
echo '> node read-16kb-blocks-proof.js'
|
|
18
|
-
node read-16kb-blocks-proof.js
|
|
19
|
-
echo
|
|
20
|
-
echo '> node read-16kb-blocks.js'
|
|
21
|
-
node read-16kb-blocks.js
|
|
22
|
-
echo
|
|
23
|
-
echo '> node read-512b-blocks.js'
|
|
24
|
-
node read-512b-blocks.js
|
|
25
|
-
echo
|
|
26
|
-
echo '> node read-64kb-blocks-linear.js'
|
|
27
|
-
node read-64kb-blocks-linear.js
|
|
28
|
-
echo
|
|
29
|
-
echo '> node read-64kb-blocks-linear-batch.js'
|
|
30
|
-
node read-64kb-blocks-linear-batch.js
|
|
31
|
-
echo
|
|
32
|
-
echo '> node read-64kb-blocks-proof.js'
|
|
33
|
-
node read-64kb-blocks-proof.js
|
|
34
|
-
echo
|
|
35
|
-
echo '> node read-64kb-blocks.js'
|
|
36
|
-
node read-64kb-blocks.js
|
|
37
|
-
echo
|
|
38
|
-
echo '> node replicate-16kb-blocks.js'
|
|
39
|
-
node replicate-16kb-blocks.js
|
|
40
|
-
echo
|
|
41
|
-
echo '> node replicate-64kb-blocks.js'
|
|
42
|
-
node replicate-64kb-blocks.js
|
|
43
|
-
echo
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
clear_cache () {
|
|
47
|
-
echo '> rm -rf cores'
|
|
48
|
-
rm -rf cores
|
|
49
|
-
echo
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
echo "> git checkout $(git log --pretty=format:'%h' -n 1)"
|
|
53
|
-
echo
|
|
54
|
-
|
|
55
|
-
echo '# clearing cache'
|
|
56
|
-
echo
|
|
57
|
-
clear_cache
|
|
58
|
-
|
|
59
|
-
echo '# running all benchmarks'
|
|
60
|
-
echo
|
|
61
|
-
run
|
|
62
|
-
|
|
63
|
-
echo '# re-running all benchmarks'
|
|
64
|
-
echo
|
|
65
|
-
run
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
var hypercore = require('../')
|
|
2
|
-
var shuffle = require('shuffle-array')
|
|
3
|
-
var path = require('path')
|
|
4
|
-
|
|
5
|
-
var source = hypercore(path.join(__dirname, 'cores/64kb'))
|
|
6
|
-
|
|
7
|
-
source.ready(function () {
|
|
8
|
-
var dest = hypercore(path.join(__dirname, 'cores/64kb-copy'), source.key, { overwrite: true })
|
|
9
|
-
|
|
10
|
-
var then = Date.now()
|
|
11
|
-
var missing = []
|
|
12
|
-
var active = 0
|
|
13
|
-
var size = 0
|
|
14
|
-
var cnt = 0
|
|
15
|
-
|
|
16
|
-
for (var i = 0; i < source.length; i++) missing.push(i)
|
|
17
|
-
|
|
18
|
-
shuffle(missing)
|
|
19
|
-
|
|
20
|
-
for (var j = 0; j < 16; j++) {
|
|
21
|
-
active++
|
|
22
|
-
copy(null, null)
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function copy (err, data) {
|
|
26
|
-
if (err) throw err
|
|
27
|
-
|
|
28
|
-
active--
|
|
29
|
-
|
|
30
|
-
if (!missing.length) {
|
|
31
|
-
if (!active) {
|
|
32
|
-
console.log(Math.floor(1000 * size / (Date.now() - then)) + ' bytes/s')
|
|
33
|
-
console.log(Math.floor(1000 * cnt / (Date.now() - then)) + ' blocks/s')
|
|
34
|
-
}
|
|
35
|
-
return
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
var block = missing.shift()
|
|
39
|
-
|
|
40
|
-
active++
|
|
41
|
-
source.proof(block, function (err, proof) {
|
|
42
|
-
if (err) throw err
|
|
43
|
-
source.get(block, function (err, data) {
|
|
44
|
-
if (err) throw err
|
|
45
|
-
size += data.length
|
|
46
|
-
cnt++
|
|
47
|
-
dest.put(block, data, proof, copy)
|
|
48
|
-
})
|
|
49
|
-
})
|
|
50
|
-
}
|
|
51
|
-
})
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
var path = require('path')
|
|
2
|
-
var speedometer = require('speedometer')
|
|
3
|
-
var hypercore = require('../../')
|
|
4
|
-
|
|
5
|
-
module.exports = function (dir, proof) {
|
|
6
|
-
var speed = speedometer()
|
|
7
|
-
var feed = hypercore(path.join(__dirname, '../cores', dir))
|
|
8
|
-
|
|
9
|
-
feed.ready(function () {
|
|
10
|
-
for (var i = 0; i < 16; i++) read()
|
|
11
|
-
|
|
12
|
-
function read (err, data) {
|
|
13
|
-
if (speed() > 10000000) return setTimeout(read, 250)
|
|
14
|
-
if (err) throw err
|
|
15
|
-
if (data) speed(data.length)
|
|
16
|
-
|
|
17
|
-
var next = Math.floor(Math.random() * feed.length)
|
|
18
|
-
feed.get(next, read)
|
|
19
|
-
if (proof) feed.proof(next, noop)
|
|
20
|
-
}
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
process.title = 'hypercore-read-10mb'
|
|
24
|
-
console.log('Reading data at ~10mb/s. Pid is %d', process.pid)
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function noop () {}
|
package/bench/helpers/read.js
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
var path = require('path')
|
|
2
|
-
var hypercore = require('../../')
|
|
3
|
-
|
|
4
|
-
module.exports = function (dir, proof) {
|
|
5
|
-
var feed = hypercore(path.join(__dirname, '../cores', dir))
|
|
6
|
-
|
|
7
|
-
var then = Date.now()
|
|
8
|
-
var size = 0
|
|
9
|
-
var cnt = 0
|
|
10
|
-
|
|
11
|
-
feed.ready(function () {
|
|
12
|
-
var missing = feed.length
|
|
13
|
-
var reading = 0
|
|
14
|
-
|
|
15
|
-
for (var i = 0; i < 16; i++) read(null, null)
|
|
16
|
-
|
|
17
|
-
function read (err, data) {
|
|
18
|
-
if (err) throw err
|
|
19
|
-
|
|
20
|
-
if (data) {
|
|
21
|
-
reading--
|
|
22
|
-
cnt++
|
|
23
|
-
size += data.length
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
if (!missing) {
|
|
27
|
-
if (!reading) {
|
|
28
|
-
console.log(Math.floor(1000 * size / (Date.now() - then)) + ' bytes/s')
|
|
29
|
-
console.log(Math.floor(1000 * cnt / (Date.now() - then)) + ' blocks/s')
|
|
30
|
-
}
|
|
31
|
-
return
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
missing--
|
|
35
|
-
reading++
|
|
36
|
-
|
|
37
|
-
var block = Math.floor(Math.random() * feed.length)
|
|
38
|
-
|
|
39
|
-
if (proof) feed.proof(block, onproof)
|
|
40
|
-
else onproof()
|
|
41
|
-
|
|
42
|
-
function onproof () {
|
|
43
|
-
feed.get(block, read)
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
})
|
|
47
|
-
}
|
package/bench/helpers/write.js
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
// NOTES: rerunning this benchmark is *a lot* faster on the 2nd
|
|
2
|
-
// run. Can we gain massive perf by preallocating files?
|
|
3
|
-
|
|
4
|
-
var hypercore = require('../../')
|
|
5
|
-
var path = require('path')
|
|
6
|
-
var bufferAlloc = require('buffer-alloc-unsafe')
|
|
7
|
-
|
|
8
|
-
module.exports = function (dir, blockSize, count, finalize) {
|
|
9
|
-
var feed = hypercore(path.join(__dirname, '../cores', dir), { live: !finalize, overwrite: true })
|
|
10
|
-
|
|
11
|
-
var then = Date.now()
|
|
12
|
-
var buf = bufferAlloc(blockSize)
|
|
13
|
-
buf.fill(0)
|
|
14
|
-
|
|
15
|
-
var blocks = []
|
|
16
|
-
while (blocks.length < 128) blocks.push(buf)
|
|
17
|
-
|
|
18
|
-
feed.append(blocks, function loop (err) {
|
|
19
|
-
if (err) throw err
|
|
20
|
-
if (feed.length < count) feed.append(blocks, loop)
|
|
21
|
-
else if (finalize) feed.finalize(done)
|
|
22
|
-
else done()
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
function done () {
|
|
26
|
-
console.log(Math.floor(1000 * blockSize * feed.length / (Date.now() - then)) + ' bytes/s')
|
|
27
|
-
console.log(Math.floor(1000 * feed.length / (Date.now() - then)) + ' blocks/s')
|
|
28
|
-
}
|
|
29
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
require('./helpers/read-throttled')('16kb', true)
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
require('./helpers/read')('16kb', true)
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
require('./helpers/read-throttled')('16kb')
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
require('./helpers/read')('16kb')
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
require('./helpers/read')('512b')
|