Skip to content

Commit

Permalink
events: improve max listeners warning
Browse files Browse the repository at this point in the history
This adds the constructor name of the event target to the emitted
warning. Right now it's difficult to identify where the leak is
actually coming from and having some further information about the
source will likely help to identify the source.

PR-URL: #27694
Reviewed-By: Anna Henningsen <[email protected]>
Reviewed-By: Jeremiah Senkpiel <[email protected]>
Reviewed-By: Rich Trott <[email protected]>
Reviewed-By: Yongsheng Zhang <[email protected]>
Reviewed-By: Trivikram Kamat <[email protected]>
Reviewed-By: Сковорода Никита Андреевич <[email protected]>
Reviewed-By: Luigi Pinca <[email protected]>
  • Loading branch information
BridgeAR authored and danbev committed May 17, 2019
1 parent 776e000 commit 9375088
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 6 deletions.
8 changes: 6 additions & 2 deletions lib/events.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ const {
ERR_UNHANDLED_ERROR
} = require('internal/errors').codes;

const {
inspect
} = require('internal/util/inspect');

function EventEmitter() {
EventEmitter.init.call(this);
}
Expand Down Expand Up @@ -253,8 +257,8 @@ function _addListener(target, type, listener, prepend) {
// eslint-disable-next-line no-restricted-syntax
const w = new Error('Possible EventEmitter memory leak detected. ' +
`${existing.length} ${String(type)} listeners ` +
'added. Use emitter.setMaxListeners() to ' +
'increase limit');
`added to ${inspect(target, { depth: -1 })}. Use ` +
'emitter.setMaxListeners() to increase limit');
w.name = 'MaxListenersExceededWarning';
w.emitter = target;
w.type = type;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ process.on('warning', common.mustCall((warning) => {
assert.strictEqual(warning.emitter, e);
assert.strictEqual(warning.count, 2);
assert.strictEqual(warning.type, null);
assert.ok(warning.message.includes('2 null listeners added.'));
assert.ok(warning.message.includes(
'2 null listeners added to [EventEmitter].'));
}));

e.on(null, () => {});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ process.on('warning', common.mustCall((warning) => {
assert.strictEqual(warning.emitter, e);
assert.strictEqual(warning.count, 2);
assert.strictEqual(warning.type, symbol);
assert.ok(warning.message.includes('2 Symbol(symbol) listeners added.'));
assert.ok(warning.message.includes(
'2 Symbol(symbol) listeners added to [EventEmitter].'));
}));

e.on(symbol, () => {});
Expand Down
12 changes: 10 additions & 2 deletions test/parallel/test-event-emitter-max-listeners-warning.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,14 @@ const common = require('../common');
const events = require('events');
const assert = require('assert');

const e = new events.EventEmitter();
class FakeInput extends events.EventEmitter {
resume() {}
pause() {}
write() {}
end() {}
}

const e = new FakeInput();
e.setMaxListeners(1);

process.on('warning', common.mustCall((warning) => {
Expand All @@ -15,7 +22,8 @@ process.on('warning', common.mustCall((warning) => {
assert.strictEqual(warning.emitter, e);
assert.strictEqual(warning.count, 2);
assert.strictEqual(warning.type, 'event-type');
assert.ok(warning.message.includes('2 event-type listeners added.'));
assert.ok(warning.message.includes(
'2 event-type listeners added to [FakeInput].'));
}));

e.on('event-type', () => {});
Expand Down

0 comments on commit 9375088

Please sign in to comment.