Skip to content

Commit a2bbaab

Browse files
authored
Merge pull request webtorrent#357 from jhiesey/master
Support ws noServer option and server option objects
2 parents 2a82829 + db1b63d commit a2bbaab

File tree

1 file changed

+32
-26
lines changed

1 file changed

+32
-26
lines changed

server.js

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@ const hasOwnProperty = Object.prototype.hasOwnProperty
2323
* metrics from clients that help the tracker keep overall statistics about the torrent.
2424
* Responses include a peer list that helps the client participate in the torrent.
2525
*
26-
* @param {Object} opts options object
27-
* @param {Number} opts.interval tell clients to announce on this interval (ms)
28-
* @param {Number} opts.trustProxy trust 'x-forwarded-for' header from reverse proxy
29-
* @param {boolean} opts.http start an http server? (default: true)
30-
* @param {boolean} opts.udp start a udp server? (default: true)
31-
* @param {boolean} opts.ws start a websocket server? (default: true)
32-
* @param {boolean} opts.stats enable web-based statistics? (default: true)
33-
* @param {function} opts.filter black/whitelist fn for disallowing/allowing torrents
26+
* @param {Object} opts options object
27+
* @param {Number} opts.interval tell clients to announce on this interval (ms)
28+
* @param {Number} opts.trustProxy trust 'x-forwarded-for' header from reverse proxy
29+
* @param {boolean|Object} opts.http start an http server?, or options for http.createServer (default: true)
30+
* @param {boolean|Object} opts.udp start a udp server?, or extra options for dgram.createSocket (default: true)
31+
* @param {boolean|Object} opts.ws start a websocket server?, or extra options for new WebSocketServer (default: true)
32+
* @param {boolean} opts.stats enable web-based statistics? (default: true)
33+
* @param {function} opts.filter black/whitelist fn for disallowing/allowing torrents
3434
*/
3535
class Server extends EventEmitter {
3636
constructor (opts = {}) {
@@ -59,7 +59,7 @@ class Server extends EventEmitter {
5959

6060
// start an http tracker unless the user explictly says no
6161
if (opts.http !== false) {
62-
this.http = http.createServer()
62+
this.http = http.createServer(isObject(opts.http) ? opts.http : undefined)
6363
this.http.on('error', err => { this._onError(err) })
6464
this.http.on('listening', onListening)
6565

@@ -75,26 +75,29 @@ class Server extends EventEmitter {
7575

7676
// start a udp tracker unless the user explicitly says no
7777
if (opts.udp !== false) {
78-
const isNode10 = /^v0.10./.test(process.version)
79-
80-
this.udp4 = this.udp = dgram.createSocket(
81-
isNode10 ? 'udp4' : { type: 'udp4', reuseAddr: true }
82-
)
78+
this.udp4 = this.udp = dgram.createSocket({
79+
type: 'udp4',
80+
reuseAddr: true,
81+
...(isObject(opts.udp) ? opts.udp : undefined)
82+
})
8383
this.udp4.on('message', (msg, rinfo) => { this.onUdpRequest(msg, rinfo) })
8484
this.udp4.on('error', err => { this._onError(err) })
8585
this.udp4.on('listening', onListening)
8686

87-
this.udp6 = dgram.createSocket(
88-
isNode10 ? 'udp6' : { type: 'udp6', reuseAddr: true }
89-
)
87+
this.udp6 = dgram.createSocket({
88+
type: 'udp6',
89+
reuseAddr: true,
90+
...(isObject(opts.udp) ? opts.udp : undefined)
91+
})
9092
this.udp6.on('message', (msg, rinfo) => { this.onUdpRequest(msg, rinfo) })
9193
this.udp6.on('error', err => { this._onError(err) })
9294
this.udp6.on('listening', onListening)
9395
}
9496

9597
// start a websocket tracker (for WebTorrent) unless the user explicitly says no
9698
if (opts.ws !== false) {
97-
if (!this.http) {
99+
const noServer = isObject(opts.ws) && opts.ws.noServer
100+
if (!this.http && !noServer) {
98101
this.http = http.createServer()
99102
this.http.on('error', err => { this._onError(err) })
100103
this.http.on('listening', onListening)
@@ -112,12 +115,15 @@ class Server extends EventEmitter {
112115
})
113116
}
114117
this.ws = new WebSocketServer({
115-
server: this.http,
118+
server: noServer ? undefined : this.http,
116119
perMessageDeflate: false,
117-
clientTracking: false
120+
clientTracking: false,
121+
...(isObject(opts.ws) ? opts.ws : undefined)
118122
})
119-
this.ws.address = () => {
120-
return this.http.address()
123+
if (!noServer) {
124+
this.ws.address = () => {
125+
return this.http.address()
126+
}
121127
}
122128
this.ws.on('error', err => { this._onError(err) })
123129
this.ws.on('connection', (socket, req) => {
@@ -297,10 +303,6 @@ class Server extends EventEmitter {
297303

298304
debug('listen (port: %o hostname: %o)', port, hostname)
299305

300-
function isObject (obj) {
301-
return typeof obj === 'object' && obj !== null
302-
}
303-
304306
const httpPort = isObject(port) ? (port.http || 0) : port
305307
const udpPort = isObject(port) ? (port.udp || 0) : port
306308

@@ -801,6 +803,10 @@ function makeUdpPacket (params) {
801803
return packet
802804
}
803805

806+
function isObject (obj) {
807+
return typeof obj === 'object' && obj !== null
808+
}
809+
804810
function toNumber (x) {
805811
x = Number(x)
806812
return x >= 0 ? x : false

0 commit comments

Comments
 (0)