@@ -6,7 +6,6 @@ var dgram = require('dgram')
66var EventEmitter = require ( 'events' ) . EventEmitter
77var http = require ( 'http' )
88var inherits = require ( 'inherits' )
9- var portfinder = require ( 'portfinder' )
109var series = require ( 'run-series' )
1110var string2compact = require ( 'string2compact' )
1211
@@ -15,9 +14,6 @@ var Swarm = require('./lib/swarm')
1514var parseHttpRequest = require ( './lib/parse_http' )
1615var parseUdpRequest = require ( './lib/parse_udp' )
1716
18- // Use random port above 1024
19- portfinder . basePort = Math . floor ( Math . random ( ) * 60000 ) + 1025
20-
2117inherits ( Server , EventEmitter )
2218
2319/**
@@ -40,40 +36,41 @@ function Server (opts) {
4036 EventEmitter . call ( self )
4137 opts = opts || { }
4238
39+ if ( opts . http === false && opts . udp === false )
40+ throw new Error ( 'must start at least one type of server (http or udp)' )
41+
4342 self . _intervalMs = opts . interval
4443 ? opts . interval
4544 : 10 * 60 * 1000 // 10 min
4645
4746 self . _trustProxy = ! ! opts . trustProxy
47+ if ( typeof opts . filter === 'function' ) self . _filter = opts . filter
4848
4949 self . listening = false
50- self . port = null
5150 self . torrents = { }
5251
5352 // default to starting an http server unless the user explictly says no
5453 if ( opts . http !== false ) {
55- self . _httpServer = http . createServer ( )
56- self . _httpServer . on ( 'request' , self . onHttpRequest . bind ( self ) )
57- self . _httpServer . on ( 'error' , self . _onError . bind ( self ) )
58- self . _httpServer . on ( 'listening' , onListening )
54+ self . http = http . createServer ( )
55+ self . http . on ( 'request' , self . onHttpRequest . bind ( self ) )
56+ self . http . on ( 'error' , self . _onError . bind ( self ) )
57+ self . http . on ( 'listening' , onListening )
5958 }
6059
6160 // default to starting a udp server unless the user explicitly says no
6261 if ( opts . udp !== false ) {
63- self . _udpSocket = dgram . createSocket ( 'udp4' )
64- self . _udpSocket . on ( 'message' , self . onUdpRequest . bind ( self ) )
65- self . _udpSocket . on ( 'error' , self . _onError . bind ( self ) )
66- self . _udpSocket . on ( 'listening' , onListening )
62+ self . udp = dgram . createSocket ( 'udp4' )
63+ self . udp . on ( 'message' , self . onUdpRequest . bind ( self ) )
64+ self . udp . on ( 'error' , self . _onError . bind ( self ) )
65+ self . udp . on ( 'listening' , onListening )
6766 }
6867
69- if ( typeof opts . filter === 'function' ) self . _filter = opts . filter
70-
71- var num = ! ! self . _httpServer + ! ! self . _udpSocket
68+ var num = ! ! self . http + ! ! self . udp
7269 function onListening ( ) {
7370 num -= 1
7471 if ( num === 0 ) {
7572 self . listening = true
76- self . emit ( 'listening' , self . port )
73+ self . emit ( 'listening' )
7774 }
7875 }
7976}
@@ -92,28 +89,24 @@ Server.prototype.listen = function (port, onlistening) {
9289 if ( self . listening ) throw new Error ( 'server already listening' )
9390 if ( onlistening ) self . once ( 'listening' , onlistening )
9491
95- function onPort ( err , port ) {
96- if ( err ) return self . emit ( 'error' , err )
97- self . port = port
98- // ATTENTION:
99- // binding to :: only receives IPv4 connections if the bindv6only
100- // sysctl is set 0, which is the default on many operating systems.
101- self . _httpServer && self . _httpServer . listen ( port . http || port , '::' )
102- self . _udpSocket && self . _udpSocket . bind ( port . udp || port )
103- }
92+ if ( ! port ) port = 0
10493
105- if ( port ) onPort ( null , port )
106- else portfinder . getPort ( onPort )
94+ // ATTENTION:
95+ // binding to :: only receives IPv4 connections if the bindv6only
96+ // sysctl is set 0, which is the default on many operating systems.
97+ self . http && self . http . listen ( port . http || port , '::' )
98+ self . udp && self . udp . bind ( port . udp || port )
10799}
108100
109101Server . prototype . close = function ( cb ) {
110102 var self = this
103+ self . listening = false
111104 cb = cb || function ( ) { }
112- if ( self . _udpSocket ) {
113- self . _udpSocket . close ( )
105+ if ( self . udp ) {
106+ self . udp . close ( )
114107 }
115- if ( self . _httpServer ) {
116- self . _httpServer . close ( cb )
108+ if ( self . http ) {
109+ self . http . close ( cb )
117110 } else {
118111 cb ( null )
119112 }
@@ -122,7 +115,7 @@ Server.prototype.close = function (cb) {
122115Server . prototype . getSwarm = function ( infoHash ) {
123116 var self = this
124117 if ( Buffer . isBuffer ( infoHash ) ) infoHash = infoHash . toString ( 'hex' )
125- if ( self . _filter && self . _filter ( infoHash ) ) return null
118+ if ( self . _filter && ! self . _filter ( infoHash ) ) return null
126119 var swarm = self . torrents [ infoHash ]
127120 if ( ! swarm ) swarm = self . torrents [ infoHash ] = new Swarm ( infoHash , this )
128121 return swarm
@@ -157,6 +150,10 @@ Server.prototype.onHttpRequest = function (req, res) {
157150
158151 delete response . action // only needed for UDP encoding
159152 res . end ( bencode . encode ( response ) )
153+
154+ if ( params . action === common . ACTIONS . ANNOUNCE ) {
155+ self . emit ( common . EVENT_NAMES [ params . event ] , params . addr )
156+ }
160157 } )
161158}
162159
@@ -177,15 +174,21 @@ Server.prototype.onUdpRequest = function (msg, rinfo) {
177174 if ( err ) {
178175 self . emit ( 'warning' , err )
179176 response = {
180- action : common . ACTIONS . ERRROR ,
177+ action : common . ACTIONS . ERROR ,
181178 'failure reason' : err . message
182179 }
183180 }
181+ if ( ! self . listening ) return
184182
185183 response . transactionId = params . transactionId
186184 response . connectionId = params . connectionId
185+
187186 var buf = makeUdpPacket ( response )
188- self . _udpSocket . send ( buf , 0 , buf . length , rinfo . port , rinfo . address )
187+ self . udp . send ( buf , 0 , buf . length , rinfo . port , rinfo . address )
188+
189+ if ( params . action === common . ACTIONS . ANNOUNCE ) {
190+ self . emit ( common . EVENT_NAMES [ params . event ] , params . addr )
191+ }
189192 } )
190193}
191194
@@ -204,7 +207,8 @@ Server.prototype._onRequest = function (params, cb) {
204207Server . prototype . _onAnnounce = function ( params , cb ) {
205208 var self = this
206209 var swarm = self . getSwarm ( params . info_hash )
207- if ( swarm === null ) return cb ( new Error ( 'invalid hash' ) )
210+ if ( swarm === null ) return cb ( new Error ( 'disallowed info_hash' ) )
211+ if ( ! params . event || params . event === 'empty' ) params . event = 'update'
208212 swarm . announce ( params , function ( err , response ) {
209213 if ( response ) {
210214 if ( ! response . action ) response . action = common . ACTIONS . ANNOUNCE
@@ -311,7 +315,7 @@ function makeUdpPacket (params) {
311315 packet = Buffer . concat ( [
312316 common . toUInt32 ( common . ACTIONS . ERROR ) ,
313317 common . toUInt32 ( params . transactionId || 0 ) ,
314- new Buffer ( params . message , 'utf8' )
318+ new Buffer ( params [ 'failure reason' ] , 'utf8' )
315319 ] )
316320 break
317321 default :
0 commit comments