const DHT = require('bittorrent-dht/server') const fixtures = require('webtorrent-fixtures') const series = require('run-series') const test = require('tape') const WebTorrent = require('../../') const common = require('../common') test('blocklist blocks peers discovered via DHT', function (t) { t.plan(8) let dhtServer, client1, client2 series([ function (cb) { dhtServer = new DHT({ bootstrap: false }) dhtServer.on('error', function (err) { t.fail(err) }) dhtServer.on('warning', function (err) { t.fail(err) }) dhtServer.listen(cb) }, function (cb) { let torrentReady = false let announced = false client1 = new WebTorrent({ tracker: false, lsd: false, dht: { bootstrap: '127.0.0.1:' + dhtServer.address().port } }) client1.on('error', function (err) { t.fail(err) }) client1.on('warning', function (err) { t.fail(err) }) const 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') }) torrent1.on('blockedPeer', function () { t.fail('client1 should not block any peers') }) torrent1.on('ready', function () { t.pass('torrent1 ready') torrentReady = true maybeDone() }) torrent1.on('dhtAnnounce', function () { t.pass('client1 announced to dht') announced = true maybeDone() }) function maybeDone () { if (torrentReady && announced) cb(null) } }, function (cb) { client2 = new WebTorrent({ tracker: false, lsd: false, dht: { bootstrap: '127.0.0.1:' + dhtServer.address().port }, blocklist: ['127.0.0.1'] }) client2.on('error', function (err) { t.fail(err) }) client2.on('warning', function (err) { t.fail(err) }) const 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) blockedPeer = true maybeDone() }) torrent2.on('dhtAnnounce', function () { t.pass('client2 announced to dht') announced = true maybeDone() }) torrent2.on('peer', function (addr) { t.fail('client2 should not find any peers') }) let blockedPeer, announced function maybeDone () { if (blockedPeer && announced) cb(null) } } ], function (err) { t.error(err) dhtServer.destroy(function (err) { t.error(err, 'dht server destroyed') }) client1.destroy(function (err) { t.error(err, 'client1 destroyed') }) client2.destroy(function (err) { t.error(err, 'client2 destroyed') }) }) })