Skip to content

Commit 4d8115c

Browse files
Joe LooneyJoe Looney
authored andcommitted
Merge remote-tracking branch 'feross/master'
2 parents a26a210 + e767760 commit 4d8115c

File tree

6 files changed

+29
-11
lines changed

6 files changed

+29
-11
lines changed

lib/client/tracker.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,15 @@ inherits(Tracker, EventEmitter)
88
function Tracker (client, announceUrl) {
99
var self = this
1010
EventEmitter.call(self)
11-
1211
self.client = client
1312
self.announceUrl = announceUrl
13+
1414
self.interval = null
1515
self.destroyed = false
1616
}
1717

1818
Tracker.prototype.setInterval = function (intervalMs) {
1919
var self = this
20-
if (self.interval) return
2120
if (intervalMs == null) intervalMs = self.DEFAULT_ANNOUNCE_INTERVAL
2221

2322
clearInterval(self.interval)

lib/client/websocket-tracker.js

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ var socketPool = {}
1818

1919
var RECONNECT_VARIANCE = 30 * 1000
2020
var RECONNECT_MINIMUM = 5 * 1000
21+
var OFFER_TIMEOUT = 50 * 1000
2122

2223
inherits(WebSocketTracker, Tracker)
2324

@@ -42,8 +43,7 @@ WebSocketTracker.prototype.announce = function (opts) {
4243
return self.socket.once('connect', self.announce.bind(self, opts))
4344
}
4445

45-
// TODO: Limit number of offers (temporarily)
46-
// TODO: remove this when we cleanup old RTCPeerConnections cleanly
46+
// Limit the number of offers that are generated, since it can be slow
4747
var numwant = Math.min(opts.numwant, 10)
4848

4949
self._generateOffers(numwant, function (offers) {
@@ -177,6 +177,7 @@ WebSocketTracker.prototype._onSocketData = function (data) {
177177

178178
var peer
179179
if (data.offer && data.peer_id) {
180+
debug('creating peer (from remote offer)')
180181
peer = new Peer({
181182
trickle: false,
182183
config: self.client._rtcConfig,
@@ -199,11 +200,16 @@ WebSocketTracker.prototype._onSocketData = function (data) {
199200
}
200201

201202
if (data.answer && data.peer_id) {
202-
peer = self.peers[common.binaryToHex(data.offer_id)]
203+
var offerId = common.binaryToHex(data.offer_id)
204+
peer = self.peers[offerId]
203205
if (peer) {
204206
peer.id = common.binaryToHex(data.peer_id)
205207
peer.signal(data.answer)
206208
self.client.emit('peer', peer)
209+
210+
clearTimeout(peer.trackerTimeout)
211+
peer.trackerTimeout = null
212+
self.peers[offerId] = null
207213
} else {
208214
debug('got unexpected answer: ' + JSON.stringify(data.answer))
209215
}
@@ -253,13 +259,13 @@ WebSocketTracker.prototype._generateOffers = function (numwant, cb) {
253259
var offers = []
254260
debug('generating %s offers', numwant)
255261

256-
// TODO: cleanup dead peers and peers that never get a return offer, from self.peers
257262
for (var i = 0; i < numwant; ++i) {
258263
generateOffer()
259264
}
260265

261266
function generateOffer () {
262267
var offerId = hat(160)
268+
debug('creating peer (from _generateOffers)')
263269
var peer = self.peers[offerId] = new Peer({
264270
initiator: true,
265271
trickle: false,
@@ -273,6 +279,12 @@ WebSocketTracker.prototype._generateOffers = function (numwant, cb) {
273279
})
274280
checkDone()
275281
})
282+
peer.trackerTimeout = setTimeout(function () {
283+
debug('tracker timeout: destroying peer')
284+
peer.trackerTimeout = null
285+
self.peers[offerId] = null
286+
peer.destroy()
287+
}, OFFER_TIMEOUT)
276288
}
277289

278290
function checkDone () {

lib/server/swarm.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ Swarm.prototype.announce = function (params, cb) {
3030
cb(null, {
3131
complete: self.complete,
3232
incomplete: self.incomplete,
33-
peers: self._getPeers(params.numwant, !!params.socket)
33+
peers: self._getPeers(params.numwant, params.peer_id, !!params.socket)
3434
})
3535
}
3636

@@ -97,14 +97,16 @@ Swarm.prototype._onAnnounceUpdate = function (params, peer) {
9797
}
9898
}
9999

100-
Swarm.prototype._getPeers = function (numwant, isWebRTC) {
100+
Swarm.prototype._getPeers = function (numwant, ownPeerId, isWebRTC) {
101101
var peers = []
102102
var ite = randomIterate(Object.keys(this.peers))
103103
var peerId
104104
while ((peerId = ite()) && peers.length < numwant) {
105105
var peer = this.peers[peerId]
106106
if (!peer) continue
107-
if ((isWebRTC && peer.socket) || (!isWebRTC && peer.ip)) peers.push(peer)
107+
if (isWebRTC && peer.peerId === ownPeerId) continue // don't send peer to itself
108+
if ((isWebRTC && peer.ip) || (!isWebRTC && peer.socket)) continue // send proper peer type
109+
peers.push(peer)
108110
}
109111
return peers
110112
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "bittorrent-tracker",
33
"description": "Simple, robust, BitTorrent tracker (client & server) implementation",
4-
"version": "6.2.0",
4+
"version": "6.3.2",
55
"author": {
66
"name": "Feross Aboukhadijeh",
77
"email": "[email protected]",

server.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,10 @@ Server.prototype._onWebSocketRequest = function (socket, params) {
316316

317317
var peers = response.peers
318318
delete response.peers
319-
response.interval = self.intervalMs
319+
320+
// WebSocket tracker should have a shorter interval – default: 2 minutes
321+
response.interval = Math.ceil(self.intervalMs / 1000 / 5)
322+
320323
response.info_hash = common.hexToBinary(params.info_hash)
321324

322325
socket.send(JSON.stringify(response), socket.onSend)

test/client.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ function testClientUpdate (t, serverType) {
112112
client.start()
113113

114114
client.once('update', function () {
115+
client.setInterval(2000)
116+
115117
// after interval (2s), we should get another update
116118
client.once('update', function (data) {
117119
// received an update!

0 commit comments

Comments
 (0)