@@ -276,7 +276,7 @@ WebSocketTracker.prototype._onAnnounceResponse = function (data) {
276276 var peer
277277 if ( data . offer && data . peer_id ) {
278278 debug ( 'creating peer (from remote offer)' )
279- peer = new Peer ( {
279+ peer = self . _createPeer ( {
280280 trickle : false ,
281281 config : self . client . _rtcConfig ,
282282 wrtc : self . client . _wrtc
@@ -389,7 +389,7 @@ WebSocketTracker.prototype._generateOffers = function (numwant, cb) {
389389 function generateOffer ( ) {
390390 var offerId = randombytes ( 20 ) . toString ( 'hex' )
391391 debug ( 'creating peer (from _generateOffers)' )
392- var peer = self . peers [ offerId ] = new Peer ( {
392+ var peer = self . peers [ offerId ] = self . _createPeer ( {
393393 initiator : true ,
394394 trickle : false ,
395395 config : self . client . _rtcConfig ,
@@ -419,4 +419,28 @@ WebSocketTracker.prototype._generateOffers = function (numwant, cb) {
419419 }
420420}
421421
422+ WebSocketTracker . prototype . _createPeer = function ( opts ) {
423+ var self = this
424+ var peer = new Peer ( opts )
425+
426+ peer . once ( 'error' , onError )
427+ peer . once ( 'connect' , onConnect )
428+
429+ return peer
430+
431+ // Handle peer 'error' events that are fired *before* the peer is emitted in
432+ // a 'peer' event.
433+ function onError ( err ) {
434+ self . client . emit ( 'warning' , new Error ( 'Connection error: ' + err . message ) )
435+ peer . destroy ( )
436+ }
437+
438+ // Once the peer is emitted in a 'peer' event, then it's the consumer's
439+ // responsibility to listen for errors, so the listeners are removed here.
440+ function onConnect ( ) {
441+ peer . removeListener ( 'error' , onError )
442+ peer . removeListener ( 'connect' , onConnect )
443+ }
444+ }
445+
422446function noop ( ) { }
0 commit comments