hypercore 10.0.0-alpha.15 → 10.0.0-alpha.16
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/index.js +5 -1
- package/lib/core.js +3 -2
- package/lib/merkle-tree.js +17 -6
- package/lib/streams.js +18 -1
- package/package.json +2 -2
package/index.js
CHANGED
|
@@ -14,7 +14,7 @@ const Replicator = require('./lib/replicator')
|
|
|
14
14
|
const Extensions = require('./lib/extensions')
|
|
15
15
|
const Core = require('./lib/core')
|
|
16
16
|
const BlockEncryption = require('./lib/block-encryption')
|
|
17
|
-
const { ReadStream } = require('./lib/streams')
|
|
17
|
+
const { ReadStream, WriteStream } = require('./lib/streams')
|
|
18
18
|
|
|
19
19
|
const promises = Symbol.for('hypercore.promises')
|
|
20
20
|
const inspect = Symbol.for('nodejs.util.inspect.custom')
|
|
@@ -428,6 +428,10 @@ module.exports = class Hypercore extends EventEmitter {
|
|
|
428
428
|
return new ReadStream(this, opts)
|
|
429
429
|
}
|
|
430
430
|
|
|
431
|
+
createWriteStream (opts) {
|
|
432
|
+
return new WriteStream(this, opts)
|
|
433
|
+
}
|
|
434
|
+
|
|
431
435
|
download (range) {
|
|
432
436
|
const linear = !!(range && range.linear)
|
|
433
437
|
|
package/lib/core.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const hypercoreCrypto = require('hypercore-crypto')
|
|
2
|
+
const b4a = require('b4a')
|
|
2
3
|
const Oplog = require('./oplog')
|
|
3
4
|
const Mutex = require('./mutex')
|
|
4
5
|
const MerkleTree = require('./merkle-tree')
|
|
@@ -90,7 +91,7 @@ module.exports = class Core {
|
|
|
90
91
|
await oplog.flush(header)
|
|
91
92
|
}
|
|
92
93
|
|
|
93
|
-
if (opts.keyPair && !header.signer.publicKey
|
|
94
|
+
if (opts.keyPair && !b4a.equals(header.signer.publicKey, opts.keyPair.publicKey)) {
|
|
94
95
|
throw new Error('Another hypercore is stored here')
|
|
95
96
|
}
|
|
96
97
|
|
|
@@ -176,7 +177,7 @@ module.exports = class Core {
|
|
|
176
177
|
|
|
177
178
|
for (const u of this.header.userData) {
|
|
178
179
|
if (u.key !== key) continue
|
|
179
|
-
if (value &&
|
|
180
|
+
if (value && b4a.equals(u.value, value)) return
|
|
180
181
|
empty = false
|
|
181
182
|
break
|
|
182
183
|
}
|
package/lib/merkle-tree.js
CHANGED
|
@@ -215,7 +215,7 @@ class ReorgBatch extends MerkleTreeBatch {
|
|
|
215
215
|
const nodes = []
|
|
216
216
|
const root = verifyBlock(proof, this.tree.crypto, nodes)
|
|
217
217
|
|
|
218
|
-
if (root === null || !root.hash
|
|
218
|
+
if (root === null || !b4a.equals(root.hash, this.diff.hash)) return false
|
|
219
219
|
|
|
220
220
|
this.nodes.push(...nodes)
|
|
221
221
|
return this._update(nodes)
|
|
@@ -233,7 +233,7 @@ class ReorgBatch extends MerkleTreeBatch {
|
|
|
233
233
|
if (!left) break
|
|
234
234
|
|
|
235
235
|
const existing = await this.tree.get(left.index, false)
|
|
236
|
-
if (!existing || !existing.hash
|
|
236
|
+
if (!existing || !b4a.equals(existing.hash, left.hash)) {
|
|
237
237
|
diff = left
|
|
238
238
|
} else {
|
|
239
239
|
diff = n.get(ite.sibling())
|
|
@@ -355,7 +355,7 @@ module.exports = class MerkleTree {
|
|
|
355
355
|
}
|
|
356
356
|
|
|
357
357
|
addNode (node) {
|
|
358
|
-
if (node.size === 0 && node.hash
|
|
358
|
+
if (node.size === 0 && b4a.equals(node.hash, BLANK_HASH)) node = blankNode(node.index)
|
|
359
359
|
this.unflushed.set(node.index, node)
|
|
360
360
|
}
|
|
361
361
|
|
|
@@ -379,6 +379,17 @@ module.exports = class MerkleTree {
|
|
|
379
379
|
return this.signature !== null && this.crypto.verify(this.signable(), this.signature, key)
|
|
380
380
|
}
|
|
381
381
|
|
|
382
|
+
getRoots (length) {
|
|
383
|
+
const indexes = flat.fullRoots(2 * length)
|
|
384
|
+
const roots = new Array(indexes.length)
|
|
385
|
+
|
|
386
|
+
for (let i = 0; i < indexes.length; i++) {
|
|
387
|
+
roots[i] = this.get(indexes[i], true)
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
return Promise.all(roots)
|
|
391
|
+
}
|
|
392
|
+
|
|
382
393
|
get (index, error = true) {
|
|
383
394
|
let node = this.unflushed.get(index)
|
|
384
395
|
|
|
@@ -534,7 +545,7 @@ module.exports = class MerkleTree {
|
|
|
534
545
|
|
|
535
546
|
for (const root of batch.roots) {
|
|
536
547
|
const existing = await this.get(root.index, false)
|
|
537
|
-
if (existing && existing.hash
|
|
548
|
+
if (existing && b4a.equals(existing.hash, root.hash)) continue
|
|
538
549
|
batch._updateDiffRoot(root)
|
|
539
550
|
break
|
|
540
551
|
}
|
|
@@ -562,7 +573,7 @@ module.exports = class MerkleTree {
|
|
|
562
573
|
|
|
563
574
|
if (unverified) {
|
|
564
575
|
const verified = await this.get(unverified.index)
|
|
565
|
-
if (!verified.hash
|
|
576
|
+
if (!b4a.equals(verified.hash, unverified.hash)) {
|
|
566
577
|
throw new Error('Invalid checksum at node ' + unverified.index)
|
|
567
578
|
}
|
|
568
579
|
}
|
|
@@ -707,7 +718,7 @@ module.exports = class MerkleTree {
|
|
|
707
718
|
await new Promise((resolve, reject) => {
|
|
708
719
|
storage.read(0, OLD_TREE.length, (err, buf) => {
|
|
709
720
|
if (err) return resolve()
|
|
710
|
-
if (
|
|
721
|
+
if (b4a.equals(buf, OLD_TREE)) return reject(new Error('Storage contains an incompatible merkle tree'))
|
|
711
722
|
resolve()
|
|
712
723
|
})
|
|
713
724
|
})
|
package/lib/streams.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const { Readable } = require('streamx')
|
|
1
|
+
const { Writable, Readable } = require('streamx')
|
|
2
2
|
|
|
3
3
|
class ReadStream extends Readable {
|
|
4
4
|
constructor (core, opts = {}) {
|
|
@@ -37,3 +37,20 @@ class ReadStream extends Readable {
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
exports.ReadStream = ReadStream
|
|
40
|
+
|
|
41
|
+
class WriteStream extends Writable {
|
|
42
|
+
constructor (core) {
|
|
43
|
+
super()
|
|
44
|
+
this.core = core
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
_writev (batch, cb) {
|
|
48
|
+
this._writevP(batch).then(cb, cb)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async _writevP (batch) {
|
|
52
|
+
await this.core.append(batch)
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
exports.WriteStream = WriteStream
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hypercore",
|
|
3
|
-
"version": "10.0.0-alpha.
|
|
3
|
+
"version": "10.0.0-alpha.16",
|
|
4
4
|
"description": "Hypercore 10",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"@hyperswarm/secret-stream": "^5.0.0",
|
|
36
36
|
"b4a": "^1.1.0",
|
|
37
37
|
"big-sparse-array": "^1.0.2",
|
|
38
|
-
"codecs": "^
|
|
38
|
+
"codecs": "^3.0.0",
|
|
39
39
|
"compact-encoding": "^2.5.0",
|
|
40
40
|
"crc32-universal": "^1.0.1",
|
|
41
41
|
"events": "^3.3.0",
|