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>2016-04-21 10:17:59 +0300
committerFeross Aboukhadijeh <feross@feross.org>2016-04-21 10:17:59 +0300
commita47d2ce4b27896a4c2e2e3820f69c712c2a0de3e (patch)
tree8ed140199cacd628c1e656dddcd5e9f81afa68d4 /lib/server.js
parent891e7e3fc2a0780cab9fdf64f699e713207b9604 (diff)
cleanup torrent reference leaks
Diffstat (limited to 'lib/server.js')
-rw-r--r--lib/server.js38
1 files changed, 27 insertions, 11 deletions
diff --git a/lib/server.js b/lib/server.js
index 27a645e..cfa883f 100644
--- a/lib/server.js
+++ b/lib/server.js
@@ -12,19 +12,22 @@ function Server (torrent, opts) {
var server = http.createServer(opts)
var sockets = []
+ var pendingReady = []
var closed = false
- server.on('connection', function (socket) {
- socket.setTimeout(36000000)
- sockets.push(socket)
- socket.on('close', function () {
- arrayRemove(sockets, sockets.indexOf(socket))
- })
- })
+ server.on('connection', onConnection)
+ server.on('request', onRequest)
var _close = server.close
server.close = function (cb) {
closed = true
+ torrent = null
+ server.removeListener('connection', onConnection)
+ server.removeListener('request', onRequest)
+ while (pendingReady.length) {
+ var onReady = pendingReady.pop()
+ torrent.removeListener('ready', onReady)
+ }
_close.call(server, cb)
}
@@ -38,7 +41,15 @@ function Server (torrent, opts) {
else server.close(cb)
}
- server.on('request', function (req, res) {
+ function onConnection (socket) {
+ socket.setTimeout(36000000)
+ sockets.push(socket)
+ socket.once('close', function () {
+ arrayRemove(sockets, sockets.indexOf(socket))
+ })
+ }
+
+ function onRequest (req, res) {
debug('onRequest')
// Allow CORS requests to specify arbitrary headers, e.g. 'Range',
@@ -61,10 +72,15 @@ function Server (torrent, opts) {
var pathname = url.parse(req.url).pathname
if (pathname === '/favicon.ico') return res.end()
- if (torrent.ready) onReady()
- else torrent.once('ready', onReady)
+ if (torrent.ready) {
+ onReady()
+ } else {
+ pendingReady.push(onReady)
+ torrent.once('ready', onReady)
+ }
function onReady () {
+ arrayRemove(pendingReady, pendingReady.indexOf(onReady))
if (pathname === '/') {
res.setHeader('Content-Type', 'text/html')
var listHtml = torrent.files.map(function (file, i) {
@@ -112,7 +128,7 @@ function Server (torrent, opts) {
if (req.method === 'HEAD') res.end()
pump(file.createReadStream(range), res)
}
- })
+ }
return server
}