lt_donthave

2.0.0 • Public • Published

lt_donthave npm downloads javascript style guide

The BitTorrent lt_donthave extension (BEP 54)

JavaScript implementation of the The BitTorrent lt_donthave extension (BEP 54). Use with bittorrent-protocol.

The purpose of this extension is to allow peers to indicate that they no longer have a piece. It provides a single donthave message that means the opposite of the standard have message. In addition, when a client receives donthave, it knows that all requests for the matching piece have failed.

Works in the browser with browserify! This module is used by WebTorrent.

install

npm install lt_donthave

usage

This package should be used with bittorrent-protocol, which supports a plugin-like system for extending the protocol with additional functionality.

Say you're already using bittorrent-protocol. Your code might look something like this:

import BitField from 'bitfield'
import Protocol from 'bittorrent-protocol'
import net from 'net'

net.createServer(socket => {
  var wire = new Protocol()
  socket.pipe(wire).pipe(socket)

  // handle handshake
  wire.on('handshake', (infoHash, peerId) => {
    wire.handshake(Buffer.from('my info hash'), Buffer.from('my peer id'))

    // advertise that we have all 10 pieces of the torrent
    const bitfield = new BitField(10)
    for (let i = 0; i <= 10; i++) {
      bitfield.set(i, true)
    }
    wire.bitfield(bitfield)
  })

}).listen(6881)

To add support for BEP 54, simply modify your code like this:

import BitField from 'bitfield'
import Protocol from 'bittorrent-protocol'
import net from 'net'
import lt_donthave from 'lt_donthave'

net.createServer(socket => {
  const wire = new Protocol()
  socket.pipe(wire).pipe(socket)

  // initialize the extension
  wire.use(lt_donthave())

  // all `lt_donthave` functionality can now be accessed at wire.lt_donthave

  wire.on('request', (pieceIndex, offset, length, cb) => {
    // whoops, turns out we don't have any pieces after all
    wire.lt_donthave.donthave(pieceIndex)
    cb(new Error('not found'))
  })

  // 'donthave' event will fire when the remote peer indicates it no longer has a piece
  wire.lt_donthave.on('donthave', index => {
    // remote peer no longer has piece `index`
  })

  // handle handshake
  wire.on('handshake', (infoHash, peerId) => {
    wire.handshake(Buffer.from('my info hash'), Buffer.from('my peer id'))

    // advertise that we have all 10 pieces of the torrent
    const bitfield = new BitField(10)
    for (let i = 0; i <= 10; i++) {
      bitfield.set(i, true)
    }
    wire.bitfield(bitfield)
  })

}).listen(6881)

api

lt_donthave()

Initialize the extension.

wire.use(lt_donthave())

lt_donthave.donthave(index)

Tell the remote peer that this peer no longer has the piece with the specified index.

Opposite of wire.have.

lt_donthave.on('donthave', index => {})

Fired when the remote peer no longer has the piece with the specified index.

Opposite of wire.on('have', index => ())

After this is fired, all outstanding requests to the remote peer for that piece will automatically fail.

license

MIT. Copyright (c) John Hiesey and WebTorrent, LLC.

Package Sidebar

Install

Weekly Downloads

2,987

Version

2.0.0

License

MIT

Unpacked Size

8.49 kB

Total Files

5

Last publish

Collaborators

  • alxhotel
  • feross
  • mafintosh
  • flet
  • watson
  • diegorbaquero
  • hicom150
  • jhiesey
  • webtorrent-bot