Пример #1
0
    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)
    })
Пример #2
0
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)
}
Пример #3
0
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)
}
Пример #4
0
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)
}
Пример #5
0
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)
}
Пример #6
0
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
      }
    })
  }
}
Пример #7
0
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
      }
    });
  }
};
Пример #9
0
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);
  }
};
Пример #11
0
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)
  }
}
Пример #12
0
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)
})
Пример #13
0
 return Buffer.concat(contacts.map(function (contact) {
   return Buffer.concat([ contact.id, string2compact(contact.addr) ])
 }))
Пример #14
0
Http.prototype._buildPeersResponseCompact = function(peers) {
    return string2compact(peers.map(function(peer) {
        return peer.ip + ':' + peer.port;
    }));
};