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.
Files changed (86) hide show
  1. package/.github/workflows/test-node.yml +3 -4
  2. package/README.md +131 -404
  3. package/__snapshots__/test/storage.js.snapshot.cjs +15 -0
  4. package/examples/announce.js +19 -0
  5. package/examples/basic.js +10 -0
  6. package/examples/http.js +123 -0
  7. package/examples/lookup.js +20 -0
  8. package/index.js +365 -1600
  9. package/lib/bitfield.js +113 -285
  10. package/lib/block-encryption.js +68 -0
  11. package/lib/block-store.js +58 -0
  12. package/lib/core.js +468 -0
  13. package/lib/extensions.js +76 -0
  14. package/lib/merkle-tree.js +1110 -0
  15. package/lib/messages.js +571 -0
  16. package/lib/mutex.js +39 -0
  17. package/lib/oplog.js +224 -0
  18. package/lib/protocol.js +525 -0
  19. package/lib/random-iterator.js +46 -0
  20. package/lib/remote-bitfield.js +24 -0
  21. package/lib/replicator.js +857 -0
  22. package/lib/streams.js +39 -0
  23. package/package.json +44 -45
  24. package/test/basic.js +59 -471
  25. package/test/bitfield.js +48 -133
  26. package/test/core.js +290 -0
  27. package/test/encodings.js +18 -0
  28. package/test/encryption.js +123 -0
  29. package/test/extension.js +71 -0
  30. package/test/helpers/index.js +23 -0
  31. package/test/merkle-tree.js +518 -0
  32. package/test/mutex.js +137 -0
  33. package/test/oplog.js +399 -0
  34. package/test/preload.js +72 -0
  35. package/test/replicate.js +227 -824
  36. package/test/sessions.js +173 -0
  37. package/test/storage.js +31 -0
  38. package/test/streams.js +39 -146
  39. package/test/user-data.js +47 -0
  40. package/bench/all.sh +0 -65
  41. package/bench/copy-64kb-blocks.js +0 -51
  42. package/bench/helpers/read-throttled.js +0 -27
  43. package/bench/helpers/read.js +0 -47
  44. package/bench/helpers/write.js +0 -29
  45. package/bench/read-16kb-blocks-proof-throttled.js +0 -1
  46. package/bench/read-16kb-blocks-proof.js +0 -1
  47. package/bench/read-16kb-blocks-throttled.js +0 -1
  48. package/bench/read-16kb-blocks.js +0 -1
  49. package/bench/read-512b-blocks.js +0 -1
  50. package/bench/read-64kb-blocks-linear-batch.js +0 -18
  51. package/bench/read-64kb-blocks-linear.js +0 -18
  52. package/bench/read-64kb-blocks-proof.js +0 -1
  53. package/bench/read-64kb-blocks.js +0 -1
  54. package/bench/replicate-16kb-blocks.js +0 -19
  55. package/bench/replicate-64kb-blocks.js +0 -19
  56. package/bench/write-16kb-blocks.js +0 -1
  57. package/bench/write-512b-blocks.js +0 -1
  58. package/bench/write-64kb-blocks-static.js +0 -1
  59. package/bench/write-64kb-blocks.js +0 -1
  60. package/example.js +0 -23
  61. package/lib/cache.js +0 -26
  62. package/lib/crypto.js +0 -5
  63. package/lib/replicate.js +0 -829
  64. package/lib/safe-buffer-equals.js +0 -6
  65. package/lib/storage.js +0 -421
  66. package/lib/tree-index.js +0 -183
  67. package/test/ack.js +0 -306
  68. package/test/audit.js +0 -36
  69. package/test/cache.js +0 -93
  70. package/test/compat.js +0 -209
  71. package/test/copy.js +0 -377
  72. package/test/default-storage.js +0 -51
  73. package/test/extensions.js +0 -137
  74. package/test/get.js +0 -64
  75. package/test/head.js +0 -65
  76. package/test/helpers/create-tracking-ram.js +0 -27
  77. package/test/helpers/create.js +0 -6
  78. package/test/helpers/replicate.js +0 -4
  79. package/test/seek.js +0 -234
  80. package/test/selections.js +0 -95
  81. package/test/set-uploading-downloading.js +0 -91
  82. package/test/stats.js +0 -77
  83. package/test/timeouts.js +0 -22
  84. package/test/tree-index.js +0 -841
  85. package/test/update.js +0 -156
  86. package/test/value-encoding.js +0 -52
@@ -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
+ })
@@ -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
- var tape = require('tape')
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
- function test (batch = 1) {
7
- tape('createReadStream to createWriteStream', function (t) {
8
- var feed1 = create()
9
- var feed2 = create()
3
+ const { create } = require('./helpers')
10
4
 
11
- feed1.append(['hello', 'world'], function () {
12
- var r = feed1.createReadStream({ batch })
13
- var w = feed2.createWriteStream()
5
+ test('basic read stream', async function (t) {
6
+ const core = await create()
14
7
 
15
- r.pipe(w).on('finish', function () {
16
- collect(feed2.createReadStream({ batch }), function (err, data) {
17
- t.error(err, 'no error')
18
- t.same(data, [bufferFrom('hello'), bufferFrom('world')])
19
- t.end()
20
- })
21
- })
22
- })
23
- })
8
+ const expected = [
9
+ 'hello',
10
+ 'world',
11
+ 'verden',
12
+ 'welt'
13
+ ]
24
14
 
25
- tape('createReadStream with start, end', function (t) {
26
- var feed = create({ valueEncoding: 'utf-8' })
15
+ await core.append(expected)
27
16
 
28
- feed.append(['hello', 'multiple', 'worlds'], function () {
29
- collect(feed.createReadStream({ start: 1, end: 2, batch }), function (err, data) {
30
- t.error(err, 'no error')
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
- tape('createReadStream with start, no end', function (t) {
38
- var feed = create({ valueEncoding: 'utf-8' })
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
- rs.on('end', function () {
119
- t.fail('should never end')
120
- })
24
+ test('read stream with start / end', async function (t) {
25
+ const core = await create()
121
26
 
122
- setImmediate(function () {
123
- feed.append(['c', 'd', 'e'])
124
- })
125
- })
126
- })
127
- }
27
+ const datas = [
28
+ 'hello',
29
+ 'world',
30
+ 'verden',
31
+ 'welt'
32
+ ]
128
33
 
129
- tape('createWriteStream with maxBlockSize', function (t) {
130
- t.plan(11 * 2 + 1)
34
+ await core.append(datas)
131
35
 
132
- var feed = create()
36
+ {
37
+ const expected = datas.slice(1)
133
38
 
134
- var ws = feed.createWriteStream({ maxBlockSize: 100 * 1024 })
39
+ for await (const data of core.createReadStream({ start: 1 })) {
40
+ t.alike(data.toString(), expected.shift())
41
+ }
135
42
 
136
- ws.write(Buffer.alloc(1024 * 1024))
137
- ws.end(function () {
138
- t.same(feed.length, 11)
43
+ t.is(expected.length, 0)
44
+ }
139
45
 
140
- sameSize(0, 100 * 1024)
141
- sameSize(1, 100 * 1024)
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
- function sameSize (idx, size) {
153
- feed.get(idx, function (err, blk) {
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
- test()
162
- test(10)
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 () {}
@@ -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
- }
@@ -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')