Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add IPv6 DHT support #950

Open
wants to merge 3 commits into
base: master
from
Open
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file or symbol
Failed to load files and symbols.

Always

Just for now

@@ -120,27 +120,23 @@ function WebTorrent (opts) {
self._downloadSpeed = speedometer()
self._uploadSpeed = speedometer()

if (opts.dht !== false && typeof DHT === 'function' /* browser exclude */) {
// use a single DHT instance for all torrents, so the routing table can be reused
self.dht = new DHT(extend({ nodeId: self.nodeId }, opts.dht))

self.dht.once('error', function (err) {
self._destroy(err)
})

self.dht.once('listening', function () {
var address = self.dht.address()
if (address) self.dhtPort = address.port
})

// Ignore warning when there are > 10 torrents in the client
self.dht.setMaxListeners(0)
// We need one DHT for IPv4, and one DHT for IPv6, as per BEP-0032:
// "A node wishing to participate in both DHTs must maintain two distinct routing tables, one for IPv4 and one for IPv6."

self.dht.listen(self.dhtPort)
if (opts.dht !== false && typeof DHT === 'function' /* browser exclude */) {
self.dht = new DHT(extend({ nodeId: self.nodeId, ipv6: false }, opts.dht))
this._initDHT(self.dht)
} else {
self.dht = false
}

if (opts.dht6 !== false && typeof DHT === 'function' /* browser exclude */) {
self.dht6 = new DHT(extend({ nodeId: self.nodeId, ipv6: true }, opts.dht6))
this._initDHT(self.dht6)
} else {
self.dht6 = false
}

// Enable or disable BEP19 (Web Seeds). Enabled by default:
self.enableWebSeeds = opts.webSeeds !== false

@@ -429,6 +425,12 @@ WebTorrent.prototype._destroy = function (err, cb) {
})
}

if (self.dht6) {
tasks.push(function (cb) {
self.dht6.destroy(cb)
})
}

parallel(tasks, cb)

if (err) self.emit('error', err)
@@ -451,6 +453,25 @@ WebTorrent.prototype._onListening = function () {
this.emit('listening')
}

WebTorrent.prototype._initDHT = function (dht) {
var portField = dht.ipv6 ? 'dhtPort6' : 'dhtPort'
var self = this

dht.once('error', function (err) {
self._destroy(err)
})

dht.once('listening', function () {
var address = dht.address()
if (address) self[portField] = address.port
})

// Ignore warning when there are > 10 torrents in the client
dht.setMaxListeners(0)

dht.listen(this[portField])
}

/**
* Check if `obj` is a node Readable stream
* @param {*} obj
@@ -187,6 +187,7 @@ Peer.prototype.onHandshake = function (infoHash, peerId) {

Peer.prototype.handshake = function () {
var self = this

var opts = {
dht: self.swarm.private ? false : !!self.swarm.client.dht
}
@@ -331,6 +331,7 @@ Torrent.prototype._onListening = function () {
announce: self.announce,
peerId: self.client.peerId,
dht: !self.private && self.client.dht,
dht6: !self.private && self.client.dht6,
tracker: trackerOpts,
port: self.client.torrentPort
})
@@ -937,7 +938,7 @@ Torrent.prototype._onWire = function (wire, addr) {
}

// When peer sends PORT message, add that DHT node to routing table
if (self.client.dht && self.client.dht.listening) {
if ((self.client.dht && self.client.dht.listening) || (self.client.dht6 && self.client.dht6.listening)) {
wire.on('port', function (port) {
if (self.destroyed || self.client.dht.destroyed) {
return
@@ -950,7 +951,12 @@ Torrent.prototype._onWire = function (wire, addr) {
}

self._debug('port: %s (from %s)', port, addr)
self.client.dht.addNode({ host: wire.remoteAddress, port: port })

if (net.isIPv6(wire.remoteAddress) && self.client.dht6 && self.client.dht6.listening) {
self.client.dht6.addNode({ host: wire.remoteAddress, port: port })
} else if (net.isIPv4(wire.remoteAddress) && self.client.dht && self.client.dht.listening) {
self.client.dht.addNode({ host: wire.remoteAddress, port: port })
}
})
}

@@ -21,7 +21,7 @@ if (!(global && global.process && global.process.versions && global.process.vers
test('image append w/ query selector', function (t) {
t.plan(6)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })

client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })
@@ -39,7 +39,7 @@ if (!(global && global.process && global.process.versions && global.process.vers
test('image append w/ element', function (t) {
t.plan(6)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })

client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })
@@ -57,7 +57,7 @@ if (!(global && global.process && global.process.versions && global.process.vers
test('image render w/ query selector', function (t) {
t.plan(6)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })

client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })
@@ -79,7 +79,7 @@ if (!(global && global.process && global.process.versions && global.process.vers
test('image render w/ element', function (t) {
t.plan(6)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })

client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })
@@ -101,7 +101,7 @@ if (!(global && global.process && global.process.versions && global.process.vers
test('WebTorrent.WEBRTC_SUPPORT', function (t) {
t.plan(2)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })

client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })
@@ -6,7 +6,7 @@ var WebTorrent = require('../')
test('client.add: duplicate trackers', function (t) {
t.plan(3)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })

client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })
@@ -30,7 +30,7 @@ test('client.add: duplicate trackers, with multiple torrents', function (t) {
announce: [ 'wss://example.com', 'wss://example.com', 'wss://example.com' ]
}

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })

client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })
@@ -67,7 +67,7 @@ test('client.add: duplicate trackers (including in .torrent file), multiple torr
var parsedTorrentAlice = extend(fixtures.alice.parsedTorrent)
parsedTorrentAlice.announce = [ 'wss://example.com', 'wss://example.com', 'wss://example.com' ]

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })

client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })
@@ -7,7 +7,7 @@ var WebTorrent = require('../')
test('client.add: magnet uri, utf-8 string', function (t) {
t.plan(6)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })

client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })
@@ -29,7 +29,7 @@ test('client.add: magnet uri, utf-8 string', function (t) {
test('client.add: torrent file, buffer', function (t) {
t.plan(6)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })

client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })
@@ -51,7 +51,7 @@ test('client.add: torrent file, buffer', function (t) {
test('client.add: info hash, hex string', function (t) {
t.plan(6)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })

client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })
@@ -73,7 +73,7 @@ test('client.add: info hash, hex string', function (t) {
test('client.add: info hash, buffer', function (t) {
t.plan(6)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })

client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })
@@ -95,7 +95,7 @@ test('client.add: info hash, buffer', function (t) {
test('client.add: parsed torrent, from `parse-torrent`', function (t) {
t.plan(6)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })

client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })
@@ -117,7 +117,7 @@ test('client.add: parsed torrent, from `parse-torrent`', function (t) {
test('client.add: parsed torrent, with string type announce property', function (t) {
t.plan(7)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })

client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })
@@ -148,7 +148,7 @@ test('client.add: parsed torrent, with string type announce property', function
test('client.add: parsed torrent, with array type announce property', function (t) {
t.plan(7)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })

client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })
@@ -179,7 +179,7 @@ test('client.add: parsed torrent, with array type announce property', function (
test('client.add: invalid torrent id: empty string', function (t) {
t.plan(3)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })

client.on('error', function (err) {
t.ok(err instanceof Error)
@@ -195,7 +195,7 @@ test('client.add: invalid torrent id: empty string', function (t) {
test('client.add: invalid torrent id: short buffer', function (t) {
t.plan(3)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })

client.on('error', function (err) {
t.ok(err instanceof Error)
@@ -6,7 +6,7 @@ var WebTorrent = require('../')
test('after client.destroy(), throw on client.add() or client.seed()', function (t) {
t.plan(3)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })

client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })
@@ -24,7 +24,7 @@ test('after client.destroy(), throw on client.add() or client.seed()', function
test('after client.destroy(), no "torrent" or "ready" events emitted', function (t) {
t.plan(1)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })

client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })
@@ -5,7 +5,7 @@ var WebTorrent = require('../')
test('client.remove: remove by Torrent object', function (t) {
t.plan(5)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })

client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })
@@ -8,7 +8,7 @@ var WebTorrent = require('../')
test('client.seed: torrent file (Buffer)', function (t) {
t.plan(6)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })

client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })
@@ -31,7 +31,7 @@ test('client.seed: torrent file (Buffer)', function (t) {
test('client.seed: torrent file (Buffer), set name on buffer', function (t) {
t.plan(6)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })

client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })
@@ -56,7 +56,7 @@ test('client.seed: torrent file (Blob)', function (t) {

t.plan(6)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })

client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })
@@ -5,7 +5,7 @@ var WebTorrent = require('../')
test('client.seed followed by duplicate client.add (sync)', function (t) {
t.plan(6)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })
client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })

@@ -36,7 +36,7 @@ test('client.seed followed by duplicate client.add (sync)', function (t) {
test('client.seed followed by duplicate client.add (async)', function (t) {
t.plan(6)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })
client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })

@@ -67,7 +67,7 @@ test('client.seed followed by duplicate client.add (async)', function (t) {
test('client.seed followed by two duplicate client.add calls (sync)', function (t) {
t.plan(9)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })
client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })

@@ -110,7 +110,7 @@ test('client.seed followed by two duplicate client.add calls (sync)', function (
test('client.seed followed by two duplicate client.add calls (async)', function (t) {
t.plan(9)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })
client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })

@@ -153,7 +153,7 @@ test('client.seed followed by two duplicate client.add calls (async)', function
test('successive sync client.add, client.remove, client.add, client.remove (sync)', function (t) {
t.plan(3)

var client = new WebTorrent({ dht: false, tracker: false })
var client = new WebTorrent({ dht: false, dht6: false, tracker: false })
client.on('error', function (err) { t.fail(err) })
client.on('warning', function (err) { t.fail(err) })

ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.