Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/webtorrent/webtorrent.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFeross Aboukhadijeh <feross@feross.org>2014-03-28 09:26:59 +0400
committerFeross Aboukhadijeh <feross@feross.org>2014-04-17 10:24:44 +0400
commiteaaf482972422ea2755b3f2e4922ed49b6c07ffe (patch)
tree4e732d65d88a28e6b8f68d7a978c849d11e5afbb /lib/torrent.js
parent803b91ff8394226e8246cae228fcf8b5f95528f1 (diff)
use ut_metadata
Diffstat (limited to 'lib/torrent.js')
-rw-r--r--lib/torrent.js117
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
}