diff options
author | Kaylee <34007889+KayleePop@users.noreply.github.com> | 2020-10-10 01:41:25 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-10 01:41:25 +0300 |
commit | 219dd1e59e0ae8bfbd4862055bcba7dce84a41ea (patch) | |
tree | 15796b88416265a3ea2bc510f2383980dd891a90 /lib/torrent.js | |
parent | 8fb308b5d5848d7e515140fac901cf429fd7d017 (diff) | |
parent | 6a649a2fab00adf862f2a3879144a09cbfb3bcb8 (diff) |
Merge pull request #1923 from webtorrent/add_utp_support
uTP support (disabled by default). when enabled, uTP is tried first for all ip:port and timeouts fall back to TCP
Co-authored-by: Pierre Dubouilh <pldubouilh@gmail.com>
Diffstat (limited to 'lib/torrent.js')
-rw-r--r-- | lib/torrent.js | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/lib/torrent.js b/lib/torrent.js index e2ee673..f24ccf3 100644 --- a/lib/torrent.js +++ b/lib/torrent.js @@ -24,6 +24,7 @@ const sha1 = require('simple-sha1') const speedometer = require('speedometer') const utMetadata = require('ut_metadata') const utPex = require('ut_pex') // browser exclude +const utp = require('utp-native') // browser exclude const parseRange = require('parse-numeric-range') const File = require('./file') @@ -750,7 +751,8 @@ class Torrent extends EventEmitter { } } - const wasAdded = !!this._addPeer(peer) + // if the utp connection fails to connect, then it is replaced with a tcp connection to the same ip:port + const wasAdded = !!this._addPeer(peer, this.client.utp ? 'utp' : 'tcp') if (wasAdded) { this.emit('peer', peer) } else { @@ -759,7 +761,7 @@ class Torrent extends EventEmitter { return wasAdded } - _addPeer (peer) { + _addPeer (peer, type) { if (this.destroyed) { if (typeof peer !== 'string') peer.destroy() return null @@ -787,7 +789,7 @@ class Torrent extends EventEmitter { let newPeer if (typeof peer === 'string') { // `peer` is an addr ("ip:port" string) - newPeer = Peer.createTCPOutgoingPeer(peer, this) + newPeer = type === 'utp' ? Peer.createUTPOutgoingPeer(peer, this) : Peer.createTCPOutgoingPeer(peer, this) } else { // `peer` is a WebRTC connection (simple-peer) newPeer = Peer.createWebRTCPeer(peer, this) @@ -1682,7 +1684,7 @@ class Torrent extends EventEmitter { const peer = this._queue.shift() if (!peer) return // queue could be empty - this._debug('tcp connect attempt to %s', peer.addr) + this._debug('%s connect attempt to %s', peer.type, peer.addr) const parts = addrToIPPort(peer.addr) const opts = { @@ -1690,7 +1692,13 @@ class Torrent extends EventEmitter { port: parts[1] } - const conn = peer.conn = net.connect(opts) + if (peer.type === 'utpOutgoing') { + peer.conn = utp.connect(opts.port, opts.host) + } else { + peer.conn = net.connect(opts) + } + + const conn = peer.conn conn.once('connect', () => { peer.onConnect() }) conn.once('error', err => { peer.destroy(err) }) @@ -1703,11 +1711,16 @@ class Torrent extends EventEmitter { // TODO: If torrent is done, do not try to reconnect after a timeout if (peer.retries >= RECONNECT_WAIT.length) { - this._debug( - 'conn %s closed: will not re-add (max %s attempts)', - peer.addr, RECONNECT_WAIT.length - ) - return + if (this.client.utp) { + const newPeer = this._addPeer(peer.addr, 'tcp') + if (newPeer) newPeer.retries = 0 + } else { + this._debug( + 'conn %s closed: will not re-add (max %s attempts)', + peer.addr, RECONNECT_WAIT.length + ) + return + } } const ms = RECONNECT_WAIT[peer.retries] @@ -1717,7 +1730,7 @@ class Torrent extends EventEmitter { ) const reconnectTimeout = setTimeout(() => { - const newPeer = this._addPeer(peer.addr) + const newPeer = this._addPeer(peer.addr, this.client.utp ? 'utp' : 'tcp') if (newPeer) newPeer.retries = peer.retries + 1 }, ms) if (reconnectTimeout.unref) reconnectTimeout.unref() |