swarm.announce(params, function (err, response) { if (err) return cb(err) if (!response.action) response.action = common.ACTIONS.ANNOUNCE if (!response.interval) response.interval = Math.ceil(self.intervalMs / 1000) if (params.compact === 1) { var peers = response.peers // Find IPv4 peers response.peers = string2compact(peers.filter(function (peer) { return common.IPV4_RE.test(peer.ip) }).map(function (peer) { return peer.ip + ':' + peer.port })) // Find IPv6 peers response.peers6 = string2compact(peers.filter(function (peer) { return common.IPV6_RE.test(peer.ip) }).map(function (peer) { return '[' + peer.ip + ']:' + peer.port })) } else if (params.compact === 0) { // IPv6 peers are not separate for non-compact responses response.peers = response.peers.map(function (peer) { return { 'peer id': common.hexToBinary(peer.peerId), ip: peer.ip, port: peer.port } }) } // else, return full peer objects (used for websocket responses) cb(null, response) })
DHT.prototype._addPeer = function (addr, infoHash, from) { var self = this if (self._destroyed) return infoHash = idToHexString(infoHash) var peers = self.peers[infoHash] if (!peers) { peers = self.peers[infoHash] = [] } var compactPeerInfo = string2compact(addr) // TODO: make this faster using a set var exists = peers.some(function (peer) { return bufferEqual(peer, compactPeerInfo) }) if (!exists) { peers.push(compactPeerInfo) } self.emit('peer', addr, infoHash, from) debug('adding peer ' + addr + ' ' + infoHash + ' discovered through ' + from) }
Server.prototype._getPeersCompact = function (swarm) { var self = this var addrs = Object.keys(swarm.peers).map(function (peerId) { var peer = swarm.peers[peerId] return peer.ip + ':' + peer.port }) return string2compact(addrs) }
Server.prototype._getPeersCompact = function (swarm, numWant) { var peers = [] for (var peerId in swarm.peers) { if (peers.length >= numWant) break var peer = swarm.peers[peerId] if (!peer) continue // ignore null values peers.push(peer.ip + ':' + peer.port) } return string2compact(peers) }
Server.prototype._getPeersCompact = function (swarm) { var self = this var addrs = [] Object.keys(swarm.peers).forEach(function (peerId) { var peer = swarm.peers[peerId] if (peer) { addrs.push(peer.ip + ':' + peer.port) } }) return string2compact(addrs) }
DHT.prototype._removePeer = function (addr, infoHash) { var self = this if (self.destroyed) return infoHash = idToHexString(infoHash) var peers = self.peers[infoHash] if (peers && peers.index[addr]) { peers.index[addr] = null var compactPeerInfo = string2compact(addr) peers.list.some(function (peer, index) { if (bufferEqual(peer, compactPeerInfo)) { peers.list.splice(index, 1) self._debug('removePeer %s %s', addr, infoHash) return true // abort early } }) } }
DHT.prototype._addPeer = function (addr, infoHash) { var self = this if (self._destroyed) return infoHash = idToHexString(infoHash) var peers = self.peers[infoHash] if (!peers) peers = self.peers[infoHash] = { index: {}, // addr -> true list: [] // compactAddr } if (!peers.index[addr]) { peers.index[addr] = true peers.list.push(string2compact(addr)) self._debug('addPeer %s %s', addr, infoHash) self.emit('announce', addr, infoHash) } }
DHT.prototype._removePeer = function (addr, infoHash) { const self = this; if (self.destroyed) return; infoHash = idToHexString(infoHash); const peers = self.peers[infoHash]; if (peers && peers.index[addr]) { peers.index[addr] = null; const compactPeerInfo = string2compact(addr); peers.list.some(function (peer, index) { if (bufferEqual(peer, compactPeerInfo)) { peers.list.splice(index, 1); self._debug('removePeer %s %s', addr, infoHash); return true; // abort early } }); } };
DHT.prototype.removePeer = function (addr, infoHash) { var self = this if (self._destroyed) return infoHash = idToHexString(infoHash) var peers = self.peers[infoHash] if (peers) { var compactPeerInfo = string2compact(addr) // TODO: make this faster using a set peers.some(function (peer, index) { if (bufferEqual(peer, compactPeerInfo)) { peers.splice(index, 1) self._debug('removePeer %s %s', addr, infoHash) return true // abort early } }) } }
DHT.prototype._addPeer = function (addr, infoHash) { const self = this; if (self.destroyed) return; infoHash = idToHexString(infoHash); let peers = self.peers[infoHash]; if (!peers) { peers = self.peers[infoHash] = { index: {}, // addr -> true list: [] // compactAddr }; } if (!peers.index[addr]) { peers.index[addr] = true; peers.list.push(string2compact(addr)); self._debug('addPeer %s %s', addr, infoHash); self.emit('announce', addr, infoHash); } };
DHT.prototype._addPeer = function (addr, infoHash) { var self = this if (self._destroyed) return infoHash = idToHexString(infoHash) var peers = self.peers[infoHash] if (!peers) { peers = self.peers[infoHash] = [] } var compactPeerInfo = string2compact(addr) // TODO: make this faster using a set var exists = peers.some(function (peer) { return bufferEqual(peer, compactPeerInfo) }) if (!exists) { peers.push(compactPeerInfo) self._debug('addPeer %s %s', addr, infoHash) self.emit('announce', addr, infoHash) } }
sock.on('message', function (message, rinfo) { var id = rinfo.address + ':' + rinfo.port if (message.length === 1 && message[0] === 0) { Object.keys(pairs).some(function (ch) { var clear = function () { delete pairs[ch] } if (pairs[ch][id]) { clearTimeout(timeouts[ch]) timeouts[ch] = setTimeout(clear, 10 * 1000) sock.send(PING, 0, PING.length, rinfo.port, rinfo.address) return true } }) return } var channel = message.toString() console.log('remembering %s (%s) for a while', id, channel) if (!pairs[channel]) pairs[channel] = {} pairs[channel][id] = id var clear = function () { delete pairs[channel] } clearTimeout(timeouts[channel]) timeouts[channel] = setTimeout(clear, 10 * 1000) var buf = string2compact(Object.keys(pairs[channel]).slice(0, 100)) sock.send(buf, 0, buf.length, rinfo.port, rinfo.address) })
return Buffer.concat(contacts.map(function (contact) { return Buffer.concat([ contact.id, string2compact(contact.addr) ]) }))
Http.prototype._buildPeersResponseCompact = function(peers) { return string2compact(peers.map(function(peer) { return peer.ip + ':' + peer.port; })); };