@@ -9,8 +9,12 @@ var EventEmitter = require('events').EventEmitter
99var http = require ( 'http' )
1010var inherits = require ( 'inherits' )
1111var ipLib = require ( 'ip' )
12+ var portfinder = require ( 'portfinder' )
1213var string2compact = require ( 'string2compact' )
1314
15+ // Use random port above 1024
16+ portfinder . basePort = Math . floor ( Math . random ( ) * 60000 ) + 1025
17+
1418var NUM_ANNOUNCE_PEERS = 50
1519var MAX_ANNOUNCE_PEERS = 82
1620var REMOVE_IPV6_RE = / ^ : : f f f f : /
@@ -43,6 +47,7 @@ function Server (opts) {
4347
4448 self . _trustProxy = ! ! opts . trustProxy
4549
50+ self . listening = false
4651 self . port = null
4752 self . torrents = { }
4853
@@ -65,7 +70,10 @@ function Server (opts) {
6570 var num = ! ! self . _httpServer + ! ! self . _udpServer
6671 function onListening ( ) {
6772 num -= 1
68- if ( num === 0 ) self . emit ( 'listening' , self . port )
73+ if ( num === 0 ) {
74+ self . listening = true
75+ self . emit ( 'listening' , self . port )
76+ }
6977 }
7078}
7179
@@ -76,10 +84,22 @@ Server.prototype._onError = function (err) {
7684
7785Server . prototype . listen = function ( port , onlistening ) {
7886 var self = this
79- self . port = port
87+ if ( typeof port === 'function' ) {
88+ onlistening = port
89+ port = undefined
90+ }
91+ if ( self . listening ) throw new Error ( 'server already listening' )
8092 if ( onlistening ) self . once ( 'listening' , onlistening )
81- self . _httpServer && self . _httpServer . listen ( port . http || port )
82- self . _udpServer && self . _udpServer . bind ( port . udp || port )
93+
94+ function onPort ( err , port ) {
95+ if ( err ) return self . emit ( 'error' , err )
96+ self . port = port
97+ self . _httpServer && self . _httpServer . listen ( port . http || port )
98+ self . _udpServer && self . _udpServer . bind ( port . udp || port )
99+ }
100+
101+ if ( port ) onPort ( null , port )
102+ else portfinder . getPort ( onPort )
83103}
84104
85105Server . prototype . close = function ( cb ) {
0 commit comments