diff options
author | Feross Aboukhadijeh <feross@feross.org> | 2014-03-28 09:26:59 +0400 |
---|---|---|
committer | Feross Aboukhadijeh <feross@feross.org> | 2014-04-17 10:24:44 +0400 |
commit | eaaf482972422ea2755b3f2e4922ed49b6c07ffe (patch) | |
tree | 4e732d65d88a28e6b8f68d7a978c849d11e5afbb /lib/torrent.js | |
parent | 803b91ff8394226e8246cae228fcf8b5f95528f1 (diff) |
use ut_metadata
Diffstat (limited to 'lib/torrent.js')
-rw-r--r-- | lib/torrent.js | 117 |
1 files changed, 12 insertions, 105 deletions
diff --git a/lib/torrent.js b/lib/torrent.js index a5f6506..8d2f0e0 100644 --- a/lib/torrent.js +++ b/lib/torrent.js @@ -7,6 +7,7 @@ var magnet = require('magnet-uri') var parseTorrent = require('parse-torrent') var Storage = require('./storage') var Swarm = require('bittorrent-swarm') +var ut_metadata = require('ut_metadata') var BLOCK_LENGTH = 16 * 1024 var MAX_BLOCK_LENGTH = 128 * 1024 @@ -14,10 +15,6 @@ var MAX_OUTSTANDING_REQUESTS = 5 var METADATA_BLOCK_LENGTH = 16 * 1024 var PIECE_TIMEOUT = 10000 -var EXTENDED_MESSAGES = { - ut_metadata: 1 -} - inherits(Torrent, EventEmitter) /** @@ -147,6 +144,14 @@ Torrent.prototype.addPeer = function (addr) { Torrent.prototype._onWire = function (wire) { var self = this + wire.use(ut_metadata(self.metadata)) + + wire.ut_metadata.on('metadata', function (metadata) { + self._onMetadata(metadata) + }) + + wire.ut_metadata.fetch(metadata) + // Send KEEP-ALIVE (every 60s) so peers will not disconnect the wire wire.setKeepAlive(true) @@ -165,35 +170,6 @@ Torrent.prototype._onWire = function (wire) { // Timeout for piece requests to this peer wire.setTimeout(PIECE_TIMEOUT) - - // Support extended messages: - // - ut_metadata (metadata fetching, trackerless torrents) - if (wire.peerExtensions.extended) { - console.log(wire.remoteAddress, 'supports extended messages', wire.peerExtensions) - - var extendedMessage = { - m: EXTENDED_MESSAGES - } - - // Only send metadata_size if we have complete metadata - if (self.metadata) - extendedMessage.metadata_size = self.metadata.length - - wire.extended(0, extendedMessage) - } - - wire.on('extended', function (ext, buf) { - console.log(wire.remoteAddress, 'extended', ext) - - if (ext === 0) // 0 = handshake - self._onExtendedHandshake(wire, buf) - else if (ext === EXTENDED_MESSAGES.ut_metadata) - self._onUtMetadata(wire, buf) - }) - - if (self.metadata) { - self._onWireWithMetadata(wire) - } } Torrent.prototype._onWireWithMetadata = function (wire) { @@ -256,76 +232,6 @@ Torrent.prototype._onWireWithMetadata = function (wire) { wire.interested() // always start out interested } -Torrent.prototype._onExtendedHandshake = function (wire, buf) { - var self = this - var dict - try { - dict = bncode.decode(buf.toString()) - console.log(wire.remoteAddress, 'extended handshake' + JSON.stringify(dict)) - } catch (e) { - console.error(wire.remoteAddress, 'extended handshake error', e.message) - return - } - if (!dict) return - - // If torrent is missing metadata and peer supports ut_metadata extension, - // then request all metadata pieces - if (!self.metadata && dict.metadata_size && dict.m && dict.m.ut_metadata) { - var numPieces = Math.ceil(dict.metadata_size / METADATA_BLOCK_LENGTH) - wire.metadata = new Buffer(dict.metadata_size) - - console.log('metadata size: ' + dict.metadata_size) - console.log(numPieces + ' pieces') - - // request all pieces - for (var piece = 0; piece < numPieces; piece++) { - wire.extended(dict.m.ut_metadata, { - msg_type: 0, - piece: piece - }) - } - } -} - -// 0 - request -// 1 - data -// 2 - reject -Torrent.prototype._onUtMetadata = function (wire, buf) { - var self = this - - var dict - var data - try { - var str = buf.toString() - var dataIndex = str.indexOf('ee') + 2 - dict = bncode.decode(str.substring(0, dataIndex)) - data = buf.slice(dataIndex) - console.log(wire.remoteAddress, 'ut_metadata', JSON.stringify(dict), 'metadata byte length', data.length) - } catch (e) { - console.error('Error decoding extended message: ' + e.message) - } - if (!dict) return - - switch (dict.msg_type) { - // ut_metadata request (from peer) - // example: {'msg_type': 0, 'piece': 0} - case 0: - // TODO - break - // ut_metadata data (in response to our request) - // example: {'msg_type': 1, 'piece': 0, 'total_size': 3425} - case 1: - data.copy(wire.metadata, dict.piece * METADATA_BLOCK_LENGTH) - self._onMetadata(wire.metadata) - break - // ut_metadata reject (peer doesn't have piece we requested) - // {'msg_type': 2, 'piece': 0} - case 2: - // TODO - break - } -} - Torrent.prototype._onMetadata = function (metadata) { var self = this @@ -334,6 +240,7 @@ Torrent.prototype._onMetadata = function (metadata) { try { var info = bncode.decode(metadata) + // TODO: can this be removed? if (info.info) { self.torrentFile = info } else { @@ -345,8 +252,8 @@ Torrent.prototype._onMetadata = function (metadata) { } self.parsedTorrent = parseTorrent(self.torrentFile) - } catch (e) { - console.error(e) + } catch (err) { + console.error(err) return } |