From c5437886086f455c61f0ff71bbfecd3f9e6b2609 Mon Sep 17 00:00:00 2001 From: Julen Garcia Leunda Date: Wed, 25 Aug 2021 23:14:51 +0200 Subject: [PATCH] fix: handle done event when new files selected (#2183) --- lib/torrent.js | 2 ++ test/node/torrent-events.js | 54 +++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/lib/torrent.js b/lib/torrent.js index 7e98a8e015..3d4730f42c 100644 --- a/lib/torrent.js +++ b/lib/torrent.js @@ -1697,6 +1697,8 @@ class Torrent extends EventEmitter { this.done = true this._debug(`torrent done: ${this.infoHash}`) this.emit('done') + } else { + this.done = false } this._gcSelections() diff --git a/test/node/torrent-events.js b/test/node/torrent-events.js index 138fd19e02..46136a4874 100644 --- a/test/node/torrent-events.js +++ b/test/node/torrent-events.js @@ -2,6 +2,7 @@ const fixtures = require('webtorrent-fixtures') const test = require('tape') const WebTorrent = require('../../') const MemoryChunkStore = require('memory-chunk-store') +const randombytes = require('randombytes') test('client.add: emit torrent events in order', t => { t.plan(6) @@ -81,3 +82,56 @@ test('client.seed: emit torrent events in order', t => { client.destroy(err => { t.error(err, 'client destroyed') }) }) }) + +test('file.select: check multiple done events', t => { + t.plan(5) + + const client1 = new WebTorrent({ dht: false, tracker: false, lsd: false, utp: false }) + const client2 = new WebTorrent({ dht: false, tracker: false, lsd: false, utp: false }) + + client1.on('error', err => { t.fail(err) }) + client1.on('warning', err => { t.fail(err) }) + + client2.on('error', err => { t.fail(err) }) + client2.on('warning', err => { t.fail(err) }) + + const fileA = Buffer.from(randombytes(16 * 1024).toString('hex')) + const fileB = Buffer.from(randombytes(16 * 1024).toString('hex')) + + // Start seeding + client2.seed([fileA, fileB], { announce: [] }, seedTorrent => { + // Select only fileA (index 0) + const magnet = seedTorrent.magnetURI + '&so=0' + + // Start downloading + const torrent = client1.add(magnet, { store: MemoryChunkStore }) + + // Manually connect peers + torrent.addPeer(`127.0.0.1:${client2.address().port}`) + + let order = 0 + + torrent.on('infoHash', () => { + t.equal(++order, 1) + }) + + torrent.on('metadata', () => { + t.equal(++order, 2) + }) + + torrent.on('ready', () => { + t.equal(++order, 3) + }) + + torrent.on('done', () => { + ++order + + if (order === 4) { + torrent.files[1].select(0) + } else if (order === 5) { + client1.destroy(err => { t.error(err, 'client 1 destroyed') }) + client2.destroy(err => { t.error(err, 'client 2 destroyed') }) + } + }) + }) +})