Skip to content

Commit

Permalink
[fix] Pass an ErrorEvent to the onerror event handler
Browse files Browse the repository at this point in the history
Fixes #1173
  • Loading branch information
lpinca committed Jan 5, 2018
1 parent 3936f3a commit 63e275e
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 33 deletions.
27 changes: 23 additions & 4 deletions lib/event-target.js
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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 () {
Expand Down
37 changes: 8 additions & 29 deletions test/websocket.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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();
});
Expand Down

0 comments on commit 63e275e

Please sign in to comment.