Skip to content

Commit a77873a

Browse files
authored
Merge pull request webtorrent#1 from feross/feross/request-handler-changes
Replace the request handler option by exposing the Swarm
2 parents 8482c3a + 0c683df commit a77873a

File tree

4 files changed

+46
-56
lines changed

4 files changed

+46
-56
lines changed

lib/client/http-tracker.js

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -190,11 +190,11 @@ HTTPTracker.prototype._onAnnounceResponse = function (data) {
190190
self._trackerId = trackerId
191191
}
192192

193-
self.client.emit('update', {
193+
var response = Object.assign({}, data, {
194194
announce: self.announceUrl,
195-
complete: data.complete,
196-
incomplete: data.incomplete
195+
infoHash: common.binaryToHex(data.info_hash)
197196
})
197+
self.client.emit('update', response)
198198

199199
var addrs
200200
if (Buffer.isBuffer(data.peers)) {
@@ -248,15 +248,12 @@ HTTPTracker.prototype._onScrapeResponse = function (data) {
248248
}
249249

250250
keys.forEach(function (infoHash) {
251-
var response = data[infoHash]
252251
// TODO: optionally handle data.flags.min_request_interval
253252
// (separate from announce interval)
254-
self.client.emit('scrape', {
253+
var response = Object.assign(data[infoHash], {
255254
announce: self.announceUrl,
256-
infoHash: common.binaryToHex(infoHash),
257-
complete: response.complete,
258-
incomplete: response.incomplete,
259-
downloaded: response.downloaded
255+
infoHash: common.binaryToHex(infoHash)
260256
})
257+
self.client.emit('scrape', response)
261258
})
262259
}

lib/client/websocket-tracker.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -266,8 +266,11 @@ WebSocketTracker.prototype._onAnnounceResponse = function (data) {
266266
}
267267

268268
if (data.complete != null) {
269-
data.announce = self.announceUrl
270-
self.client.emit('update', data)
269+
var response = Object.assign({}, data, {
270+
announce: self.announceUrl,
271+
infoHash: common.binaryToHex(data.info_hash)
272+
})
273+
self.client.emit('update', response)
271274
}
272275

273276
var peer
@@ -323,16 +326,13 @@ WebSocketTracker.prototype._onScrapeResponse = function (data) {
323326
}
324327

325328
keys.forEach(function (infoHash) {
326-
var response = data[infoHash]
327329
// TODO: optionally handle data.flags.min_request_interval
328330
// (separate from announce interval)
329-
self.client.emit('scrape', {
331+
var response = Object.assign(data[infoHash], {
330332
announce: self.announceUrl,
331-
infoHash: common.binaryToHex(infoHash),
332-
complete: response.complete,
333-
incomplete: response.incomplete,
334-
downloaded: response.downloaded
333+
infoHash: common.binaryToHex(infoHash)
335334
})
335+
self.client.emit('scrape', response)
336336
})
337337
}
338338

server.js

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,14 @@ inherits(Server, EventEmitter)
2727
* metrics from clients that help the tracker keep overall statistics about the torrent.
2828
* Responses include a peer list that helps the client participate in the torrent.
2929
*
30-
* @param {Object} opts options object
31-
* @param {Number} opts.interval tell clients to announce on this interval (ms)
32-
* @param {Number} opts.trustProxy trust 'x-forwarded-for' header from reverse proxy
33-
* @param {boolean} opts.http start an http server? (default: true)
34-
* @param {boolean} opts.udp start a udp server? (default: true)
35-
* @param {boolean} opts.ws start a websocket server? (default: true)
36-
* @param {boolean} opts.stats enable web-based statistics? (default: true)
37-
* @param {function} opts.filter black/whitelist fn for disallowing/allowing torrents
38-
* @param {function} opts.requestHandler functions to handle params / response
30+
* @param {Object} opts options object
31+
* @param {Number} opts.interval tell clients to announce on this interval (ms)
32+
* @param {Number} opts.trustProxy trust 'x-forwarded-for' header from reverse proxy
33+
* @param {boolean} opts.http start an http server? (default: true)
34+
* @param {boolean} opts.udp start a udp server? (default: true)
35+
* @param {boolean} opts.ws start a websocket server? (default: true)
36+
* @param {boolean} opts.stats enable web-based statistics? (default: true)
37+
* @param {function} opts.filter black/whitelist fn for disallowing/allowing torrents
3938
*/
4039
function Server (opts) {
4140
var self = this
@@ -65,18 +64,6 @@ function Server (opts) {
6564
self.udp6 = null
6665
self.ws = null
6766

68-
self._reqHandler = opts.requestHandler || {}
69-
if (!self._reqHandler.getParams) {
70-
self._reqHandler.getParams = function (params) {
71-
return params
72-
}
73-
}
74-
if (!self._reqHandler.getResponse) {
75-
self._reqHandler.getResponse = function (params, cb) {
76-
return cb
77-
}
78-
}
79-
8067
// start an http tracker unless the user explictly says no
8168
if (opts.http !== false) {
8269
self.http = http.createServer()
@@ -293,6 +280,8 @@ function Server (opts) {
293280
}
294281
}
295282

283+
Server.Swarm = Swarm
284+
296285
Server.prototype._onError = function (err) {
297286
var self = this
298287
self.emit('error', err)
@@ -365,7 +354,7 @@ Server.prototype.createSwarm = function (infoHash, cb) {
365354
if (Buffer.isBuffer(infoHash)) infoHash = infoHash.toString('hex')
366355

367356
process.nextTick(function () {
368-
var swarm = self.torrents[infoHash] = new Swarm(infoHash, self)
357+
var swarm = self.torrents[infoHash] = new Server.Swarm(infoHash, self)
369358
cb(null, swarm)
370359
})
371360
}
@@ -649,8 +638,6 @@ Server.prototype._onWebSocketError = function (socket, err) {
649638

650639
Server.prototype._onRequest = function (params, cb) {
651640
var self = this
652-
params = self._reqHandler.getParams(params)
653-
cb = self._reqHandler.getResponse(params, cb)
654641
if (params && params.action === common.ACTIONS.CONNECT) {
655642
cb(null, { action: common.ACTIONS.CONNECT })
656643
} else if (params && params.action === common.ACTIONS.ANNOUNCE) {

test/request-handler.js

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,33 @@ var Client = require('../')
33
var common = require('./common')
44
var fixtures = require('webtorrent-fixtures')
55
var test = require('tape')
6+
var Server = require('../server')
67

78
var peerId = Buffer.from('01234567890123456789')
89

910
function testRequestHandler (t, serverType) {
10-
t.plan(4)
11+
t.plan(5)
1112

1213
var opts = { serverType: serverType } // this is test-suite-only option
13-
opts.requestHandler = {
14-
getParams: function (params) {
15-
params.extra = 123
16-
return params
17-
},
18-
getResponse: function (params, cb) {
19-
return function (err, response) {
20-
response.complete = params.extra * 2
21-
cb(err, response)
22-
}
14+
15+
class Swarm extends Server.Swarm {
16+
announce (params, cb) {
17+
super.announce(params, function (err, response) {
18+
if (err) return cb(response)
19+
response.complete = 246
20+
response.extraData = 'hi'
21+
cb(null, response)
22+
})
2323
}
2424
}
2525

26+
// Use a custom Swarm implementation for this test only
27+
var OldSwarm = Server.Swarm
28+
Server.Swarm = Swarm
29+
t.on('end', function () {
30+
Server.Swarm = OldSwarm
31+
})
32+
2633
common.createServer(t, opts, function (server, announceUrl) {
2734
var client1 = new Client({
2835
infoHash: fixtures.alice.parsedTorrent.infoHash,
@@ -41,6 +48,7 @@ function testRequestHandler (t, serverType) {
4148

4249
client1.once('update', function (data) {
4350
t.equal(data.complete, 246)
51+
t.equal(data.extraData.toString(), 'hi')
4452

4553
client1.destroy(function () {
4654
t.pass('client1 destroyed')
@@ -59,10 +67,8 @@ test('http: request handler option intercepts announce requests and responses',
5967
testRequestHandler(t, 'http')
6068
})
6169

62-
test('udp: request handler option intercepts announce requests and responses', function (t) {
63-
testRequestHandler(t, 'udp')
64-
})
65-
6670
test('ws: request handler option intercepts announce requests and responses', function (t) {
6771
testRequestHandler(t, 'ws')
6872
})
73+
74+
// NOTE: it's not possible to include extra data in a UDP response, because it's compact and accepts only params that are in the spec!

0 commit comments

Comments
 (0)