Skip to content

Commit bb0a278

Browse files
authored
Merge pull request webtorrent#218 from yciabaud/request-handler3
Expose swarm object on tracker server
2 parents f5a32ff + a77873a commit bb0a278

File tree

4 files changed

+89
-19
lines changed

4 files changed

+89
-19
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: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -266,11 +266,11 @@ WebSocketTracker.prototype._onAnnounceResponse = function (data) {
266266
}
267267

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

276276
var peer
@@ -326,16 +326,13 @@ WebSocketTracker.prototype._onScrapeResponse = function (data) {
326326
}
327327

328328
keys.forEach(function (infoHash) {
329-
var response = data[infoHash]
330329
// TODO: optionally handle data.flags.min_request_interval
331330
// (separate from announce interval)
332-
self.client.emit('scrape', {
331+
var response = Object.assign(data[infoHash], {
333332
announce: self.announceUrl,
334-
infoHash: common.binaryToHex(infoHash),
335-
complete: response.complete,
336-
incomplete: response.incomplete,
337-
downloaded: response.downloaded
333+
infoHash: common.binaryToHex(infoHash)
338334
})
335+
self.client.emit('scrape', response)
339336
})
340337
}
341338

server.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,8 @@ function Server (opts) {
280280
}
281281
}
282282

283+
Server.Swarm = Swarm
284+
283285
Server.prototype._onError = function (err) {
284286
var self = this
285287
self.emit('error', err)
@@ -352,7 +354,7 @@ Server.prototype.createSwarm = function (infoHash, cb) {
352354
if (Buffer.isBuffer(infoHash)) infoHash = infoHash.toString('hex')
353355

354356
process.nextTick(function () {
355-
var swarm = self.torrents[infoHash] = new Swarm(infoHash, self)
357+
var swarm = self.torrents[infoHash] = new Server.Swarm(infoHash, self)
356358
cb(null, swarm)
357359
})
358360
}

test/request-handler.js

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
var Buffer = require('safe-buffer').Buffer
2+
var Client = require('../')
3+
var common = require('./common')
4+
var fixtures = require('webtorrent-fixtures')
5+
var test = require('tape')
6+
var Server = require('../server')
7+
8+
var peerId = Buffer.from('01234567890123456789')
9+
10+
function testRequestHandler (t, serverType) {
11+
t.plan(5)
12+
13+
var opts = { serverType: serverType } // this is test-suite-only option
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+
})
23+
}
24+
}
25+
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+
33+
common.createServer(t, opts, function (server, announceUrl) {
34+
var client1 = new Client({
35+
infoHash: fixtures.alice.parsedTorrent.infoHash,
36+
announce: announceUrl,
37+
peerId: peerId,
38+
port: 6881,
39+
wrtc: {}
40+
})
41+
42+
client1.on('error', function (err) { t.error(err) })
43+
if (serverType === 'ws') common.mockWebsocketTracker(client1)
44+
45+
server.once('start', function () {
46+
t.pass('got start message from client1')
47+
})
48+
49+
client1.once('update', function (data) {
50+
t.equal(data.complete, 246)
51+
t.equal(data.extraData.toString(), 'hi')
52+
53+
client1.destroy(function () {
54+
t.pass('client1 destroyed')
55+
})
56+
57+
server.close(function () {
58+
t.pass('server destroyed')
59+
})
60+
})
61+
62+
client1.start()
63+
})
64+
}
65+
66+
test('http: request handler option intercepts announce requests and responses', function (t) {
67+
testRequestHandler(t, 'http')
68+
})
69+
70+
test('ws: request handler option intercepts announce requests and responses', function (t) {
71+
testRequestHandler(t, 'ws')
72+
})
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)