Skip to content

Commit

Permalink
webtorrent module works with browserify (fix #88)
Browse files Browse the repository at this point in the history
  • Loading branch information
feross committed Sep 13, 2014
1 parent c24aab1 commit 8290a91
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 57 deletions.
62 changes: 5 additions & 57 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,9 @@ var fs = require('fs')
var FSStorage = require('./lib/fs-storage')
var hh = require('http-https')
var inherits = require('inherits')
var mime = require('mime')
var parallel = require('run-parallel')
var parseTorrent = require('parse-torrent')
var pump = require('pump')
var rangeParser = require('range-parser')
var url = require('url')

var Server = require('./lib/server')

inherits(WebTorrent, Client)

Expand All @@ -31,15 +27,9 @@ function WebTorrent (opts) {

if (opts.list) return

if (opts.port !== false) {
// start http server
self.server = http.createServer()
self.server.on('connection', function (socket) {
socket.setTimeout(36000000)
})
self.server.on('request', self._onRequest.bind(self))
self.server.listen(opts.port)
self.server.once('listening', function () {
if (opts.port !== false && typeof Server === 'function') {
self.server = new Server(self, opts.port)
self.server.on('listening', function () {
self.listening = true
self.emit('listening')
})
Expand Down Expand Up @@ -75,7 +65,7 @@ WebTorrent.prototype.download = function (torrentId, opts, ontorrent) {
debug('add %s', torrentId)

opts = extend({
storage: FSStorage
storage: typeof FSStorage === 'function' && FSStorage
}, opts)

// TODO: fix this to work with multiple torrents
Expand Down Expand Up @@ -165,45 +155,3 @@ WebTorrent.prototype._onTorrent = function (torrent) {
self.index = torrent.index
self.torrent = torrent
}

WebTorrent.prototype._onRequest = function (req, res) {
var self = this
debug('onRequest')

var u = url.parse(req.url)
if (u.pathname === '/favicon.ico') return res.end()
if (u.pathname === '/') u.pathname = '/' + self.index
var i = Number(u.pathname.slice(1))

if (isNaN(i) || i >= self.torrent.files.length) {
res.statusCode = 404
return res.end()
}

if (self.torrent) onTorrent(self.torrent)
else self.once('torrent', onTorrent)

function onTorrent (torrent) {
var file = torrent.files[i]

res.setHeader('Accept-Ranges', 'bytes')
res.setHeader('Content-Type', mime.lookup(file.name))
res.statusCode = 206

var range
if (req.headers.range) {
// no support for multi-range reqs
range = rangeParser(file.length, req.headers.range)[0]
debug('range %s', JSON.stringify(range))
res.setHeader(
'Content-Range',
'bytes ' + range.start + '-' + range.end + '/' + file.length
)
res.setHeader('Content-Length', range.end - range.start + 1)
} else {
res.setHeader('Content-Length', file.length)
}
if (req.method === 'HEAD') res.end()
pump(file.createReadStream(range), res)
}
}
58 changes: 58 additions & 0 deletions lib/server.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
var debug = require('debug')('webtorrent:server')
var http = require('http')
var mime = require('mime')
var pump = require('pump')
var rangeParser = require('range-parser')
var url = require('url')

module.exports = function Server (webtorrent, port) {
var server = http.createServer()

server.on('connection', function (socket) {
socket.setTimeout(36000000)
})

server.on('request', function (req, res) {
debug('onRequest')

var u = url.parse(req.url)
if (u.pathname === '/favicon.ico') return res.end()
if (u.pathname === '/') u.pathname = '/' + webtorrent.index
var i = Number(u.pathname.slice(1))

if (isNaN(i) || i >= webtorrent.torrent.files.length) {
res.statusCode = 404
return res.end()
}

if (webtorrent.torrent) onTorrent(webtorrent.torrent)
else webtorrent.once('torrent', onTorrent)

function onTorrent (torrent) {
var file = torrent.files[i]

res.setHeader('accept-ranges', 'bytes')
res.setHeader('content-type', mime.lookup(file.name))
res.statusCode = 206

var range
if (req.headers.range) {
// no support for multi-range reqs
range = rangeParser(file.length, req.headers.range)[0]
debug('range %s', JSON.stringify(range))
res.setHeader(
'Content-Range',
'bytes ' + range.start + '-' + range.end + '/' + file.length
)
res.setHeader('Content-Length', range.end - range.start + 1)
} else {
res.setHeader('Content-Length', file.length)
}
if (req.method === 'HEAD') res.end()
pump(file.createReadStream(range), res)
}
})
server.listen(port)

return server
}
4 changes: 4 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@
"email": "feross@feross.org",
"url": "http://feross.org/"
},
"browser": {
"./lib/fs-storage": false,
"./lib/server": false
},
"bin": {
"webtorrent": "./bin/cmd.js"
},
Expand Down

0 comments on commit 8290a91

Please sign in to comment.