@@ -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 */
3535class 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 = / ^ v 0 . 1 0 . / . 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+
804810function toNumber ( x ) {
805811 x = Number ( x )
806812 return x >= 0 ? x : false
0 commit comments