Skip to content

Commit ec28147

Browse files
committed
Blacklist peers that don't announce
TODO: also remove those after some time
1 parent da760b0 commit ec28147

File tree

1 file changed

+15
-1
lines changed

1 file changed

+15
-1
lines changed

lib/server/swarm.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ var randomIterate = require('random-iterate')
77
// need to support when overriding Server.getSwarm()
88
function 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

Comments
 (0)