diff options
author | Feross Aboukhadijeh <feross@feross.org> | 2016-04-21 10:17:59 +0300 |
---|---|---|
committer | Feross Aboukhadijeh <feross@feross.org> | 2016-04-21 10:17:59 +0300 |
commit | a47d2ce4b27896a4c2e2e3820f69c712c2a0de3e (patch) | |
tree | 8ed140199cacd628c1e656dddcd5e9f81afa68d4 /lib/server.js | |
parent | 891e7e3fc2a0780cab9fdf64f699e713207b9604 (diff) |
cleanup torrent reference leaks
Diffstat (limited to 'lib/server.js')
-rw-r--r-- | lib/server.js | 38 |
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 } |