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, [], {}, ''];