Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/webtorrent/webtorrent.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaylee <34007889+KayleePop@users.noreply.github.com>2020-10-10 01:41:25 +0300
committerGitHub <noreply@github.com>2020-10-10 01:41:25 +0300
commit219dd1e59e0ae8bfbd4862055bcba7dce84a41ea (patch)
tree15796b88416265a3ea2bc510f2383980dd891a90 /lib/torrent.js
parent8fb308b5d5848d7e515140fac901cf429fd7d017 (diff)
parent6a649a2fab00adf862f2a3879144a09cbfb3bcb8 (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.js35
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()