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 <anna@addaleax.net>
Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Yongsheng Zhang <zyszys98@gmail.com>
Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
Reviewed-By: Сковорода Никита Андреевич <chalkerx@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
  • Loading branch information
BridgeAR authored and targos committed May 17, 2019
1 parent 3ac4a71 commit 1f935f8
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 1f935f8

Please sign in to comment.