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-06-08 02:11:15 +0300
committerGitHub <noreply@github.com>2020-06-08 02:11:15 +0300
commit9358cb69663992cbc2e04ebac86e90023e52d984 (patch)
treececfec1db921c5abf95d2eeaf2f28289885312fc
parentfa877f1c7398f2fd27476ed7a1574ee737f85c89 (diff)
parentcf5a15e2da6e270fa251c8765eed6e05c2f85ecd (diff)
Merge pull request #1870 from KayleePop/fix-interest
-rw-r--r--lib/torrent.js32
-rw-r--r--test/node/download-from-ip.js54
2 files changed, 73 insertions, 13 deletions
diff --git a/lib/torrent.js b/lib/torrent.js
index 1a765a1..6e98725 100644
--- a/lib/torrent.js
+++ b/lib/torrent.js
@@ -1048,11 +1048,13 @@ class Torrent extends EventEmitter {
wire.on('bitfield', () => {
updateSeedStatus()
this._update()
+ this._updateWireInterest(wire)
})
wire.on('have', () => {
updateSeedStatus()
this._update()
+ this._updateWireInterest(wire)
})
wire.once('interested', () => {
@@ -1084,7 +1086,9 @@ class Torrent extends EventEmitter {
})
wire.bitfield(this.bitfield) // always send bitfield (required)
- wire.uninterested() // always start out uninterested (as per protocol)
+
+ // initialize interest in case bitfield message was already received before above handler was registered
+ this._updateWireInterest(wire)
// Send PORT message to peers that support DHT
if (wire.peerExtensions.dht && this.client.dht && this.client.dht.listening) {
@@ -1147,24 +1151,26 @@ class Torrent extends EventEmitter {
const prev = this._amInterested
this._amInterested = !!this._selections.length
- this.wires.forEach(wire => {
- let interested = false
- for (let index = 0; index < this.pieces.length; ++index) {
- if (this.pieces[index] && wire.peerPieces.get(index)) {
- interested = true
- break
- }
- }
-
- if (interested) wire.interested()
- else wire.uninterested()
- })
+ this.wires.forEach(wire => this._updateWireInterest(wire))
if (prev === this._amInterested) return
if (this._amInterested) this.emit('interested')
else this.emit('uninterested')
}
+ _updateWireInterest (wire) {
+ let interested = false
+ for (let index = 0; index < this.pieces.length; ++index) {
+ if (this.pieces[index] && wire.peerPieces.get(index)) {
+ interested = true
+ break
+ }
+ }
+
+ if (interested) wire.interested()
+ else wire.uninterested()
+ }
+
/**
* Heartbeat to update all peers and their requests.
*/
diff --git a/test/node/download-from-ip.js b/test/node/download-from-ip.js
new file mode 100644
index 0000000..270b774
--- /dev/null
+++ b/test/node/download-from-ip.js
@@ -0,0 +1,54 @@
+const fixtures = require('webtorrent-fixtures')
+const fs = require('fs')
+const MemoryChunkStore = require('memory-chunk-store')
+const test = require('tape')
+const WebTorrent = require('../../')
+
+test('Download via torrent.addPeer()', (t) => {
+ t.plan(7)
+ // if initial interest isn't set, then this test is delayed
+ t.timeoutAfter(5000)
+
+ const seeder = new WebTorrent({ tracker: false, dht: false })
+
+ seeder.on('error', (err) => t.fail(err))
+ seeder.on('warning', (err) => t.fail(err))
+
+ const torrent = seeder.add(fixtures.leaves.parsedTorrent, { store: MemoryChunkStore })
+
+ torrent.on('ready', function () {
+ // torrent metadata has been fetched -- sanity check it
+ t.equal(torrent.name, 'Leaves of Grass by Walt Whitman.epub')
+
+ var names = ['Leaves of Grass by Walt Whitman.epub']
+ t.deepEqual(torrent.files.map(function (file) { return file.name }), names)
+ })
+
+ torrent.load(fs.createReadStream(fixtures.leaves.contentPath), (err) => {
+ t.error(err)
+
+ // torrent data now loaded into seeder
+
+ const downloader = new WebTorrent({ tracker: false, dht: false })
+
+ downloader.on('error', function (err) { t.fail(err) })
+ downloader.on('warning', function (err) { t.fail(err) })
+
+ downloader.add(fixtures.leaves.parsedTorrent, { store: MemoryChunkStore }, (torrent) => {
+ torrent.addPeer(`localhost:${seeder.torrentPort}`)
+
+ torrent.once('done', function () {
+ torrent.files.forEach((file) => {
+ file.getBuffer((err, buf) => {
+ t.error(err)
+
+ t.deepEqual(buf, fixtures.leaves.content, 'downloaded correct content')
+
+ seeder.destroy((err) => t.error(err, 'seeder destroyed'))
+ downloader.destroy((err) => t.error(err, 'downloader destroyed'))
+ })
+ })
+ })
+ })
+ })
+})