From dcde609fffd1b7e66f7ea4881e8838d9f5915ec2 Mon Sep 17 00:00:00 2001 From: John Hiesey Date: Mon, 12 Apr 2021 20:25:27 -0700 Subject: Add timeouts and retry inside webconn --- lib/webconn.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'lib') diff --git a/lib/webconn.js b/lib/webconn.js index ca6e0a7..c957fbb 100644 --- a/lib/webconn.js +++ b/lib/webconn.js @@ -7,6 +7,9 @@ const Wire = require('bittorrent-protocol') const VERSION = require('../package.json').version +const SOCKET_TIMEOUT = 60000 +const RETRY_DELAY = 10000 + /** * Converts requests for torrent blocks into http range requests. * @param {string} url web seed url @@ -54,15 +57,17 @@ class WebConn extends Wire { this.on('request', (pieceIndex, offset, length, callback) => { debug('request pieceIndex=%d offset=%d length=%d', pieceIndex, offset, length) this.httpRequest(pieceIndex, offset, length, (err, data) => { - // TODO: timeout - if (err) { // Cancel all in progress requests for this piece this.lt_donthave.donthave(pieceIndex) - this.bitfield.set(pieceIndex, false) - // TODO: delay before re-advertising - this.have(pieceIndex) + // Wait a little while before saying the webseed has the failed piece again + const retryTimeout = setTimeout(() => { + if (this.destroyed) return + + this.have(pieceIndex) + }, RETRY_DELAY) + if (retryTimeout.unref) retryTimeout.unref() } callback(err, data) @@ -133,7 +138,8 @@ class WebConn extends Wire { headers: { 'user-agent': `WebTorrent/${VERSION} (https://webtorrent.io)`, range: `bytes=${start}-${end}` - } + }, + timeout: SOCKET_TIMEOUT } function onResponse (res, data) { if (res.statusCode < 200 || res.statusCode >= 300) { -- cgit v1.2.3