@@ -7,6 +7,7 @@ var randomIterate = require('random-iterate')
77// need to support when overriding Server.getSwarm()
88function Swarm ( infoHash , server ) {
99 this . peers = { }
10+ this . interval = server . intervalMs
1011 this . complete = 0
1112 this . incomplete = 0
1213}
@@ -54,7 +55,8 @@ Swarm.prototype._onAnnounceStarted = function (params, peer) {
5455 peerId : params . peer_id , // as hex
5556 ip : params . ip , // only http, udp
5657 port : params . port , // only http, udp
57- socket : params . socket // only websocket
58+ socket : params . socket , // only websocket
59+ lastSeen : Date . now ( )
5860 }
5961}
6062
@@ -89,6 +91,8 @@ Swarm.prototype._onAnnounceUpdate = function (params, peer) {
8991 debug ( 'unexpected `update` event from peer that is not in swarm' )
9092 return this . _onAnnounceStarted ( params , peer ) // treat as a start
9193 }
94+
95+ peer . lastSeen = Date . now ( )
9296
9397 if ( ! peer . complete && params . left === 0 ) {
9498 this . complete += 1
@@ -101,9 +105,19 @@ Swarm.prototype._getPeers = function (numwant, isWebRTC) {
101105 var peers = [ ]
102106 var ite = randomIterate ( Object . keys ( this . peers ) )
103107 var peerId
108+
109+ // allow peers to skip one announce interval before blacklisting
110+ var blacklistMaximum = Date . now ( ) - 2 * this . interval
111+
104112 while ( ( peerId = ite ( ) ) && peers . length < numwant ) {
105113 var peer = this . peers [ peerId ]
106114 if ( ! peer ) continue
115+
116+ // blacklist peers which aren't announing
117+ // changing their ports to another
118+ if ( peer . lastSeen < blacklistMaximum ) {
119+ peer . port = 1
120+ }
107121 if ( ( isWebRTC && peer . socket ) || ( ! isWebRTC && peer . ip ) ) peers . push ( peer )
108122 }
109123 return peers
0 commit comments