@@ -12,6 +12,8 @@ var parallel = require('run-parallel')
1212var querystring = require ( 'querystring' )
1313var string2compact = require ( 'string2compact' )
1414
15+ var NUM_ANNOUNCE_PEERS = 50
16+ var MAX_ANNOUNCE_PEERS = 82
1517var REMOVE_IPV6_RE = / ^ : : f f f f : /
1618
1719inherits ( Server , EventEmitter )
@@ -141,6 +143,11 @@ Server.prototype._onHttpRequest = function (req, res) {
141143 var swarm = self . _getSwarm ( infoHash )
142144 var peer = swarm . peers [ addr ]
143145
146+ var numWant = Math . min (
147+ Number ( params . numwant ) || NUM_ANNOUNCE_PEERS ,
148+ MAX_ANNOUNCE_PEERS
149+ )
150+
144151 switch ( params . event ) {
145152 case 'started' :
146153 if ( peer ) {
@@ -210,8 +217,8 @@ Server.prototype._onHttpRequest = function (req, res) {
210217
211218 // send peers
212219 var peers = Number ( params . compact ) === 1
213- ? self . _getPeersCompact ( swarm )
214- : self . _getPeers ( swarm )
220+ ? self . _getPeersCompact ( swarm , numWant )
221+ : self . _getPeers ( swarm , numWant )
215222
216223 var response = {
217224 complete : swarm . complete ,
@@ -329,6 +336,10 @@ Server.prototype._onUdpRequest = function (msg, rinfo) {
329336 var swarm = self . _getSwarm ( infoHash )
330337 var peer = swarm . peers [ addr ]
331338
339+ // never send more than MAX_ANNOUNCE_PEERS or else the UDP packet will get bigger than
340+ // 512 bytes which is not safe
341+ numWant = Math . min ( numWant || NUM_ANNOUNCE_PEERS , MAX_ANNOUNCE_PEERS )
342+
332343 switch ( event ) {
333344 case common . EVENTS . started :
334345 if ( peer ) {
@@ -394,12 +405,7 @@ Server.prototype._onUdpRequest = function (msg, rinfo) {
394405 }
395406
396407 // send peers
397- var peers = self . _getPeersCompact ( swarm )
398-
399- // never send more than 70 peers or else the UDP packet will get too big
400- if ( peers . length >= 70 * 6 ) {
401- peers = peers . slice ( 0 , 70 * 6 )
402- }
408+ var peers = self . _getPeersCompact ( swarm , numWant )
403409
404410 send ( Buffer . concat ( [
405411 common . toUInt32 ( common . ACTIONS . ANNOUNCE ) ,
@@ -445,32 +451,34 @@ Server.prototype._onUdpRequest = function (msg, rinfo) {
445451 }
446452}
447453
448- Server . prototype . _getPeers = function ( swarm ) {
454+ Server . prototype . _getPeers = function ( swarm , numWant ) {
449455 var self = this
450456 var peers = [ ]
451457 for ( var peerId in swarm . peers ) {
452458 var peer = swarm . peers [ peerId ]
459+ if ( ! peer ) continue // ignore null values
453460 peers . push ( {
454461 'peer id' : peer . peerId ,
455462 ip : peer . ip ,
456463 port : peer . port
457464 } )
465+ if ( peers . length === numWant ) break
458466 }
459467 return peers
460468}
461469
462- Server . prototype . _getPeersCompact = function ( swarm ) {
470+ Server . prototype . _getPeersCompact = function ( swarm , numWant ) {
463471 var self = this
464- var addrs = [ ]
472+ var peers = [ ]
465473
466- Object . keys ( swarm . peers ) . forEach ( function ( peerId ) {
474+ for ( var peerId in swarm . peers ) {
467475 var peer = swarm . peers [ peerId ]
468- if ( peer ) {
469- addrs . push ( peer . ip + ':' + peer . port )
470- }
471- } )
476+ if ( ! peer ) continue // ignore null values
477+ peers . push ( peer . ip + ':' + peer . port )
478+ if ( peers . length === numWant ) break
479+ }
472480
473- return string2compact ( addrs )
481+ return string2compact ( peers )
474482}
475483
476484// HELPER FUNCTIONS
0 commit comments