From c762faa5f86599ffc37e484415c7d5c7d6fc3817 Mon Sep 17 00:00:00 2001 From: scottinet Date: Wed, 13 Nov 2019 14:29:19 +0100 Subject: [PATCH] [fix] erroneous error message on browser ws error --- src/protocols/websocket.js | 6 ++++-- test/protocol/websocket.test.js | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/protocols/websocket.js b/src/protocols/websocket.js index 09ea205a6..97a57929e 100644 --- a/src/protocols/websocket.js +++ b/src/protocols/websocket.js @@ -90,8 +90,10 @@ class WSNode extends RTWrapper { let err = error; if (!(error instanceof Error)) { - err = error ? - new Error(error.message || error) : new Error('Unexpected error'); + // browser-side, the payload sent to this event is a generic "Event" + // object bearing no information about the cause of the error + err = error && (typeof Event === 'undefined' || !(error instanceof Event)) ? + new Error(error.message || error) : new Error('Connection error'); } this.clientNetworkError(err); diff --git a/test/protocol/websocket.test.js b/test/protocol/websocket.test.js index 0bf8adb02..64c3accf0 100644 --- a/test/protocol/websocket.test.js +++ b/test/protocol/websocket.test.js @@ -414,6 +414,26 @@ describe('WebSocket networking module', () => { should(websocket.wasConnected).be.false(); }); + it('should reject with a proper error if onerror is called with an event (browser)', () => { + const Event = sinon.stub(); + Object.defineProperty(global, 'Event', { + value: Event, + enumerable: false, + writable: false, + configurable: true + }); + + const promise = websocket.connect(); + websocket.client.onerror(new Event()); + + return should(promise).rejectedWith(Error, {message: 'Connection error'}) + .then(() => delete global.Event) + .catch(e => { + delete global.Event; + throw e; + }); + }); + describe('#constructor', () => { it('should throw if an invalid host is provided', () => { const invalidHosts = [undefined, null, 123, false, true, [], {}, ''];