Skip to content

Commit 48d0ea4

Browse files
committed
Handle peer 'error' events correctly
Handle peer 'error' events that are fired *before* the peer is emitted in a 'peer' event. Once the peer is emitted in a 'peer' event, then it's the consumer's responsibility to listen for errors. This fixes the most common error in WebTorrent Desktop according to our telemetry.
1 parent c7a2718 commit 48d0ea4

File tree

1 file changed

+26
-2
lines changed

1 file changed

+26
-2
lines changed

lib/client/websocket-tracker.js

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
422446
function noop () {}

0 commit comments

Comments
 (0)