diff --git a/server.js b/server.js index 123583c..9d29bef 100644 --- a/server.js +++ b/server.js @@ -34,42 +34,40 @@ const parseWebSocketRequest = require('./lib/server/parse-websocket') class Server extends EventEmitter { constructor (opts = {}) { super() - const self = this - debug('new server %s', JSON.stringify(opts)) - self.intervalMs = opts.interval + this.intervalMs = opts.interval ? opts.interval : 10 * 60 * 1000 // 10 min - self._trustProxy = !!opts.trustProxy - if (typeof opts.filter === 'function') self._filter = opts.filter + this._trustProxy = !!opts.trustProxy + if (typeof opts.filter === 'function') this._filter = opts.filter - self.peersCacheLength = opts.peersCacheLength - self.peersCacheTtl = opts.peersCacheTtl + this.peersCacheLength = opts.peersCacheLength + this.peersCacheTtl = opts.peersCacheTtl - self._listenCalled = false - self.listening = false - self.destroyed = false - self.torrents = {} + this._listenCalled = false + this.listening = false + this.destroyed = false + this.torrents = {} - self.http = null - self.udp4 = null - self.udp6 = null - self.ws = null + this.http = null + this.udp4 = null + this.udp6 = null + this.ws = null // start an http tracker unless the user explictly says no if (opts.http !== false) { - self.http = http.createServer() - self.http.on('error', err => { self._onError(err) }) - self.http.on('listening', onListening) + this.http = http.createServer() + this.http.on('error', err => { this._onError(err) }) + this.http.on('listening', onListening) // Add default http request handler on next tick to give user the chance to add // their own handler first. Handle requests untouched by user's handler. process.nextTick(() => { - self.http.on('request', (req, res) => { + this.http.on('request', (req, res) => { if (res.headersSent) return - self.onHttpRequest(req, res) + this.onHttpRequest(req, res) }) }) } @@ -78,32 +76,32 @@ class Server extends EventEmitter { if (opts.udp !== false) { const isNode10 = /^v0.10./.test(process.version) - self.udp4 = self.udp = dgram.createSocket( + this.udp4 = this.udp = dgram.createSocket( isNode10 ? 'udp4' : { type: 'udp4', reuseAddr: true } ) - self.udp4.on('message', (msg, rinfo) => { self.onUdpRequest(msg, rinfo) }) - self.udp4.on('error', err => { self._onError(err) }) - self.udp4.on('listening', onListening) + this.udp4.on('message', (msg, rinfo) => { this.onUdpRequest(msg, rinfo) }) + this.udp4.on('error', err => { this._onError(err) }) + this.udp4.on('listening', onListening) - self.udp6 = dgram.createSocket( + this.udp6 = dgram.createSocket( isNode10 ? 'udp6' : { type: 'udp6', reuseAddr: true } ) - self.udp6.on('message', (msg, rinfo) => { self.onUdpRequest(msg, rinfo) }) - self.udp6.on('error', err => { self._onError(err) }) - self.udp6.on('listening', onListening) + this.udp6.on('message', (msg, rinfo) => { this.onUdpRequest(msg, rinfo) }) + this.udp6.on('error', err => { this._onError(err) }) + this.udp6.on('listening', onListening) } // start a websocket tracker (for WebTorrent) unless the user explicitly says no if (opts.ws !== false) { - if (!self.http) { - self.http = http.createServer() - self.http.on('error', err => { self._onError(err) }) - self.http.on('listening', onListening) + if (!this.http) { + this.http = http.createServer() + this.http.on('error', err => { this._onError(err) }) + this.http.on('listening', onListening) // Add default http request handler on next tick to give user the chance to add // their own handler first. Handle requests untouched by user's handler. process.nextTick(() => { - self.http.on('request', (req, res) => { + this.http.on('request', (req, res) => { if (res.headersSent) return // For websocket trackers, we only need to handle the UPGRADE http method. // Return 404 for all other request types. @@ -112,35 +110,35 @@ class Server extends EventEmitter { }) }) } - self.ws = new WebSocketServer({ - server: self.http, + this.ws = new WebSocketServer({ + server: this.http, perMessageDeflate: false, clientTracking: false }) - self.ws.address = () => { - return self.http.address() + this.ws.address = () => { + return this.http.address() } - self.ws.on('error', err => { self._onError(err) }) - self.ws.on('connection', (socket, req) => { + this.ws.on('error', err => { this._onError(err) }) + this.ws.on('connection', (socket, req) => { // Note: socket.upgradeReq was removed in ws@3.0.0, so re-add it. // https://github.com/websockets/ws/pull/1099 socket.upgradeReq = req - self.onWebSocketConnection(socket) + this.onWebSocketConnection(socket) }) } if (opts.stats !== false) { - if (!self.http) { - self.http = http.createServer() - self.http.on('error', err => { self._onError(err) }) - self.http.on('listening', onListening) + if (!this.http) { + this.http = http.createServer() + this.http.on('error', err => { this._onError(err) }) + this.http.on('listening', onListening) } // Http handler for '/stats' route - self.http.on('request', (req, res) => { + this.http.on('request', (req, res) => { if (res.headersSent) return - const infoHashes = Object.keys(self.torrents) + const infoHashes = Object.keys(this.torrents) let activeTorrents = 0 const allPeers = {} @@ -196,7 +194,7 @@ class Server extends EventEmitter { if (req.method === 'GET' && (req.url === '/stats' || req.url === '/stats.json')) { infoHashes.forEach(infoHash => { - const peers = self.torrents[infoHash].peers + const peers = this.torrents[infoHash].peers const keys = peers.keys if (keys.length > 0) activeTorrents++ @@ -253,14 +251,24 @@ class Server extends EventEmitter { res.write(JSON.stringify(stats)) res.end() } else if (req.url === '/stats') { - res.end(`