diff --git a/lib/torrent.js b/lib/torrent.js index ef541eab..abf439b0 100644 --- a/lib/torrent.js +++ b/lib/torrent.js @@ -277,6 +277,19 @@ class Torrent extends EventEmitter { } _onListening () { + if (this.destroyed) return + + if (this.info) { + // if full metadata was included in initial torrent id, use it immediately. Otherwise, + // wait for torrent-discovery to find peers and ut_metadata to get the metadata. + this._onMetadata(this) + } else { + if (this.xs) this._getMetadataFromServer() + this._startDiscovery() + } + } + + _startDiscovery () { if (this.discovery || this.destroyed) return let trackerOpts = this.client.tracker @@ -334,14 +347,6 @@ class Torrent extends EventEmitter { this.discovery.on('warning', (err) => { this.emit('warning', err) }) - - if (this.info) { - // if full metadata was included in initial torrent id, use it immediately. Otherwise, - // wait for torrent-discovery to find peers and ut_metadata to get the metadata. - this._onMetadata(this) - } else if (this.xs) { - this._getMetadataFromServer() - } } _getMetadataFromServer () { @@ -611,6 +616,9 @@ class Torrent extends EventEmitter { if (this.destroyed) return this._debug('on store') + // Start discovery before emitting 'ready' + this._startDiscovery() + this.ready = true this.emit('ready') diff --git a/test/common.js b/test/common.js new file mode 100644 index 00000000..6f2ce1e1 --- /dev/null +++ b/test/common.js @@ -0,0 +1,13 @@ +const os = require('os') +const fs = require('fs') +const path = require('path') + +exports.getDownloadPath = function (infix, infoHash) { + let tmpPath + try { + tmpPath = path.join(fs.statSync('/tmp') && '/tmp') + } catch (err) { + tmpPath = path.join(typeof os.tmpdir === 'function' ? os.tmpdir() : '/') + } + return path.join(tmpPath, 'webtorrent', 'test', infix, infoHash) +} diff --git a/test/node/blocklist-dht.js b/test/node/blocklist-dht.js index e9567310..fa3915a2 100644 --- a/test/node/blocklist-dht.js +++ b/test/node/blocklist-dht.js @@ -3,6 +3,7 @@ var fixtures = require('webtorrent-fixtures') var series = require('run-series') var test = require('tape') var WebTorrent = require('../../') +var common = require('../common') test('blocklist blocks peers discovered via DHT', function (t) { t.plan(8) @@ -25,7 +26,9 @@ test('blocklist blocks peers discovered via DHT', function (t) { client1.on('error', function (err) { t.fail(err) }) client1.on('warning', function (err) { t.fail(err) }) - var torrent1 = client1.add(fixtures.leaves.parsedTorrent) + var torrent1 = client1.add(fixtures.leaves.parsedTorrent, { + path: common.getDownloadPath('client_1', fixtures.leaves.parsedTorrent.infoHash) + }) torrent1.on('peer', function () { t.fail('client1 should not find any peers') @@ -63,7 +66,9 @@ test('blocklist blocks peers discovered via DHT', function (t) { client2.on('error', function (err) { t.fail(err) }) client2.on('warning', function (err) { t.fail(err) }) - var torrent2 = client2.add(fixtures.leaves.parsedTorrent) + var torrent2 = client2.add(fixtures.leaves.parsedTorrent, { + path: common.getDownloadPath('client_2', fixtures.leaves.parsedTorrent.infoHash) + }) torrent2.on('blockedPeer', function (addr) { t.pass('client2 blocked connection to client1: ' + addr) diff --git a/test/node/blocklist-tracker.js b/test/node/blocklist-tracker.js index 302bd8f8..e877d240 100644 --- a/test/node/blocklist-tracker.js +++ b/test/node/blocklist-tracker.js @@ -3,6 +3,7 @@ var series = require('run-series') var test = require('tape') var TrackerServer = require('bittorrent-tracker/server') var WebTorrent = require('../../') +var common = require('../common') test('blocklist blocks peers discovered via tracker', function (t) { t.plan(9) @@ -38,7 +39,9 @@ test('blocklist blocks peers discovered via tracker', function (t) { client1.on('error', function (err) { t.fail(err) }) client1.on('warning', function (err) { t.fail(err) }) - var torrent1 = client1.add(parsedTorrent) + var torrent1 = client1.add(parsedTorrent, { + path: common.getDownloadPath('client_1', parsedTorrent.infoHash) + }) torrent1.on('invalidPeer', function () { t.pass('client1 found itself') @@ -58,7 +61,9 @@ test('blocklist blocks peers discovered via tracker', function (t) { client2.on('error', function (err) { t.fail(err) }) client2.on('warning', function (err) { t.fail(err) }) - var torrent2 = client2.add(parsedTorrent) + var torrent2 = client2.add(parsedTorrent, { + path: common.getDownloadPath('client_2', parsedTorrent.infoHash) + }) torrent2.once('blockedPeer', function () { t.pass('client2 blocked first peer')