bittorrent-dht

Simple, robust, BitTorrent DHT implementation
Node.js implementation of the BitTorrent DHT protocol. BitTorrent DHT is the main peer discovery layer for BitTorrent, which allows for trackerless torrents. DHTs are awesome!
This module is used by WebTorrent.
features
- complete implementation of the DHT protocol in JavaScript
- follows the spec
- robust and well-tested (comprehensive test suite, and used by WebTorrent and peerflix)
- efficient recursive lookup algorithm minimizes UDP traffic
- supports multiple, concurrent lookups using the same routing table
install
npm install bittorrent-dht
example
npm install magnet-uri
var DHT = require('bittorrent-dht')
var magnet = require('magnet-uri')
var uri = 'magnet:?xt=urn:btih:e3811b9539cacff680e418124272177c47477157'
var parsed = magnet(uri)
console.log(parsed.infoHash)
var dht = new DHT()
dht.listen(20000, function () {
console.log('now listening')
})
dht.on('ready', function () {
dht.lookup(parsed.infoHash)
})
dht.on('peer', function (addr, hash, from) {
console.log('found potential peer ' + addr + ' through ' + from)
})
api
dht = new DHT([opts])
Create a new dht
instance.
If opts
is specified, then the default options (shown below) will be overridden.
{
nodeId: '',
bootstrap: []
}
dht.lookup(infoHash)
Find peers for the given infoHash. infoHash
can be a string or Buffer.
This does a recursive lookup in the DHT. Potential peers that are discovered are emitted
as peer
events. See the peer
event below for more info.
dht.lookup()
should only be called after the ready event has fired, otherwise the lookup
may fail because the DHT routing table doesn't contain enough nodes.
dht.listen([port], [onlistening])
Make the DHT listen on the given port
. If port
is undefined, an available port is
automatically picked with portfinder.
If onlistening
is defined, it is attached to the listening
event.
arr = dht.toArray()
Returns the nodes in the DHT as an array. This is useful for persisting the DHT
to disk between restarts of a BitTorrent client (as recommended by the spec). Each node in the array is an object with id
(hex string) and addr
(string) properties.
To restore the DHT nodes when instantiating a new DHT
object, simply pass in the array as the value of the bootstrap
option.
var dht1 = new DHT()
var arr = dht1.toArray()
dht1.destroy()
var dht2 = new DHT({ bootstrap: arr })
dht.addNode(addr, [nodeId])
Manually add a node to the DHT routing table. If there is space in the routing table (or
an unresponsive node can be evicted to make space), the node will be added. If not, the
node will not be added. This is useful to call when a peer wire sends a PORT
message to
share their DHT port.
If nodeId
is undefined, then the peer will be pinged to learn their node id. If the peer does not respond, the will not be added to the routing table.
dht.destroy([callback])
Destroy the DHT. Closes the socket and cleans up large data structure resources.
events
self.on('ready', function () { ... })
Emitted when the DHT is ready to handle lookups (i.e. the routing table contains at least K nodes, discovered via the bootstrap nodes).
self.on('peer', function (addr, infoHash) { ... })
Emitted when a potential peer is found. addr
is of the form IP_ADDRESS:PORT
.
infoHash
is the torrent info hash of the swarm that the peer belongs to. Emitted
in response to a lookup(infoHash)
call.
self.on('node', function (addr) { ... })
Emitted when the DHT finds a new node.
self.on('listening', function () { ... })
Emitted when the DHT is listening.
self.on('warning', function (err) { ... })
Emitted when the DHT gets an unexpected message from another DHT node. This is purely
informational.
self.on('error', function (err) { ... })
Emitted when the DHT has a fatal error.
further reading
license
MIT. Copyright (c) Feross Aboukhadijeh.