From 63e275e75f8ab8f4385e7ef104a74c582cd0c793 Mon Sep 17 00:00:00 2001 From: Luigi Pinca Date: Sat, 23 Dec 2017 17:54:00 +0100 Subject: [PATCH] [fix] Pass an `ErrorEvent` to the `onerror` event handler Fixes #1173 --- lib/event-target.js | 27 +++++++++++++++++++++++---- test/websocket.test.js | 37 ++++++++----------------------------- 2 files changed, 31 insertions(+), 33 deletions(-) diff --git a/lib/event-target.js b/lib/event-target.js index c48137b91..574e9080e 100644 --- a/lib/event-target.js +++ b/lib/event-target.js @@ -78,6 +78,27 @@ class OpenEvent extends Event { } } +/** + * Class representing an error event. + * + * @extends Event + * @private + */ +class ErrorEvent extends Event { + /** + * Create a new `ErrorEvent`. + * + * @param {Object} error The error that generated this event + * @param {WebSocket} target A reference to the target to which the event was dispatched + */ + constructor (error, target) { + super('error', target); + + this.message = error.message; + this.error = error; + } +} + /** * This provides methods for emulating the `EventTarget` interface. It's not * meant to be used directly. @@ -103,10 +124,8 @@ const EventTarget = { listener.call(this, new CloseEvent(code, message, this)); } - function onError (event) { - event.type = 'error'; - event.target = this; - listener.call(this, event); + function onError (error) { + listener.call(this, new ErrorEvent(error, this)); } function onOpen () { diff --git a/test/websocket.test.js b/test/websocket.test.js index 5356c7ee8..634340349 100644 --- a/test/websocket.test.js +++ b/test/websocket.test.js @@ -1656,52 +1656,31 @@ describe('WebSocket', function () { wss.on('connection', (client) => client.close(1001, 'some daft reason')); }); - it('should have target set on Events', function (done) { - const wss = new WebSocket.Server({ port: 0 }, () => { - const port = wss._server.address().port; - const ws = new WebSocket(`ws://localhost:${port}`); - - ws.addEventListener('open', (openEvent) => { - assert.strictEqual(openEvent.target, ws); - }); - ws.addEventListener('message', (messageEvent) => { - assert.strictEqual(messageEvent.target, ws); - wss.close(); - }); - ws.addEventListener('close', (closeEvent) => { - assert.strictEqual(closeEvent.target, ws); - ws.emit('error', new Error('forced')); - }); - ws.addEventListener('error', (errorEvent) => { - assert.strictEqual(errorEvent.message, 'forced'); - assert.strictEqual(errorEvent.target, ws); - - done(); - }); - }); - - wss.on('connection', (client) => client.send('hi')); - }); - - it('should have type set on Events', function (done) { + it('sets `target` and `type` on events', function (done) { const wss = new WebSocket.Server({ port: 0 }, () => { + const err = new Error('forced'); const port = wss._server.address().port; const ws = new WebSocket(`ws://localhost:${port}`); ws.addEventListener('open', (openEvent) => { assert.strictEqual(openEvent.type, 'open'); + assert.strictEqual(openEvent.target, ws); }); ws.addEventListener('message', (messageEvent) => { assert.strictEqual(messageEvent.type, 'message'); + assert.strictEqual(messageEvent.target, ws); wss.close(); }); ws.addEventListener('close', (closeEvent) => { assert.strictEqual(closeEvent.type, 'close'); - ws.emit('error', new Error('forced')); + assert.strictEqual(closeEvent.target, ws); + ws.emit('error', err); }); ws.addEventListener('error', (errorEvent) => { assert.strictEqual(errorEvent.message, 'forced'); assert.strictEqual(errorEvent.type, 'error'); + assert.strictEqual(errorEvent.target, ws); + assert.strictEqual(errorEvent.error, err); done(); });