@@ -3,15 +3,16 @@ exports.Server = Server
33
44var bncode = require ( 'bncode' )
55var compact2string = require ( 'compact2string' )
6+ var dgram = require ( 'dgram' )
67var EventEmitter = require ( 'events' ) . EventEmitter
78var extend = require ( 'extend.js' )
89var hat = require ( 'hat' )
910var http = require ( 'http' )
1011var inherits = require ( 'inherits' )
12+ var parallel = require ( 'run-parallel' )
1113var querystring = require ( 'querystring' )
1214var string2compact = require ( 'string2compact' )
13- var dgram = require ( 'dgram' )
14- var parseUrl = require ( 'url' ) . parse
15+ var url = require ( 'url' )
1516
1617var CONNECTION_ID = Buffer . concat ( [ toUInt32 ( 0x417 ) , toUInt32 ( 0x27101980 ) ] )
1718var ACTIONS = { CONNECT : 0 , ANNOUNCE : 1 }
@@ -118,9 +119,9 @@ Client.prototype._request = function (opts) {
118119
119120Client . prototype . _requestHttp = function ( announceUrl , opts ) {
120121 var self = this
121- var url = announceUrl + '?' + querystring . stringify ( opts )
122+ var fullUrl = announceUrl + '?' + querystring . stringify ( opts )
122123
123- var req = http . get ( url , function ( res ) {
124+ var req = http . get ( fullUrl , function ( res ) {
124125 var data = ''
125126 if ( res . statusCode !== 200 ) {
126127 res . resume ( ) // consume the whole stream
@@ -142,7 +143,7 @@ Client.prototype._requestHttp = function (announceUrl, opts) {
142143
143144Client . prototype . _requestUdp = function ( announceUrl , opts ) {
144145 var self = this
145- var parsedUrl = parseUrl ( announceUrl )
146+ var parsedUrl = url . parse ( announceUrl )
146147 var socket = dgram . createSocket ( 'udp4' )
147148 var transactionId = new Buffer ( hat ( 32 ) , 'hex' )
148149
@@ -311,26 +312,52 @@ function Server (opts) {
311312
312313 self . torrents = { }
313314
314- self . _server = http . createServer ( )
315- self . _server . on ( 'request' , self . _onRequest . bind ( self ) )
316- self . _server . on ( 'error' , function ( err ) {
317- self . emit ( 'error' , err )
318- } )
315+ // default to starting an http server unless the user explictly says no
316+ if ( opts . http !== false ) {
317+ self . _httpServer = http . createServer ( )
318+ self . _httpServer . on ( 'request' , self . _onHttpRequest . bind ( self ) )
319+ self . _httpServer . on ( 'error' , function ( err ) {
320+ self . emit ( 'error' , err )
321+ } )
322+ }
323+
324+ // default to starting a udp server unless the user explicitly says no
325+ if ( opts . udp !== false ) {
326+ self . _udpServer = dgram . createSocket ( 'udp4' )
327+ self . _udpServer . on ( 'message' , self . _onUdpRequest . bind ( self ) )
328+ }
319329}
320330
321331Server . prototype . listen = function ( port ) {
322332 var self = this
323- self . _server . listen ( port , function ( ) {
333+ var tasks = [ ]
334+
335+ self . _httpServer && tasks . push ( function ( cb ) {
336+ self . _httpServer . listen ( port , cb )
337+ } )
338+ self . _udpServer && tasks . push ( function ( cb ) {
339+ self . _udpServer . bind ( port , cb )
340+ } )
341+
342+ parallel ( tasks , function ( err ) {
343+ if ( err ) return self . emit ( 'error' , err )
324344 self . emit ( 'listening' )
325345 } )
326346}
327347
328348Server . prototype . close = function ( cb ) {
329349 var self = this
330- self . _server . close ( cb )
350+ if ( self . _udpServer ) {
351+ self . _udpServer . close ( )
352+ }
353+ if ( self . _httpServer ) {
354+ self . _httpServer . close ( cb )
355+ } else {
356+ cb ( null )
357+ }
331358}
332359
333- Server . prototype . _onRequest = function ( req , res ) {
360+ Server . prototype . _onHttpRequest = function ( req , res ) {
334361 var self = this
335362
336363 function error ( message ) {
@@ -450,6 +477,10 @@ Server.prototype._onRequest = function (req, res) {
450477 }
451478}
452479
480+ Server . prototype . _onUdpRequest = function ( req , res ) {
481+ // TODO: implement UDP server
482+ }
483+
453484Server . prototype . _getPeers = function ( swarm ) {
454485 var self = this
455486 var peers = [ ]
0 commit comments