diff --git a/lib/events.js b/lib/events.js index 3f3e3d295ce570..4ed193dfcb9b17 100644 --- a/lib/events.js +++ b/lib/events.js @@ -33,7 +33,6 @@ const { ErrorCaptureStackTrace, FunctionPrototypeBind, FunctionPrototypeCall, - NumberIsNaN, NumberMAX_SAFE_INTEGER, ObjectDefineProperty, ObjectDefineProperties, @@ -69,7 +68,6 @@ const { codes: { ERR_INVALID_ARG_TYPE, ERR_INVALID_THIS, - ERR_OUT_OF_RANGE, ERR_UNHANDLED_ERROR }, genericNodeError, @@ -80,6 +78,7 @@ const { validateAbortSignal, validateBoolean, validateFunction, + validateNumber, validateString, } = require('internal/validators'); @@ -278,11 +277,7 @@ ObjectDefineProperty(EventEmitter, 'defaultMaxListeners', { return defaultMaxListeners; }, set: function(arg) { - if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { - throw new ERR_OUT_OF_RANGE('defaultMaxListeners', - 'a non-negative number', - arg); - } + validateNumber(arg, 'defaultMaxListeners', 0); defaultMaxListeners = arg; } }); @@ -312,8 +307,7 @@ ObjectDefineProperties(EventEmitter, { */ EventEmitter.setMaxListeners = function(n = defaultMaxListeners, ...eventTargets) { - if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) - throw new ERR_OUT_OF_RANGE('n', 'a non-negative number', n); + validateNumber(n, 'setMaxListeners', 0); if (eventTargets.length === 0) { defaultMaxListeners = n; } else { @@ -409,9 +403,7 @@ function emitUnhandledRejectionOrErr(ee, err, type, args) { * @returns {EventEmitter} */ EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { - throw new ERR_OUT_OF_RANGE('n', 'a non-negative number', n); - } + validateNumber(n, 'setMaxListeners', 0); this._maxListeners = n; return this; }; diff --git a/test/parallel/test-event-emitter-max-listeners.js b/test/parallel/test-event-emitter-max-listeners.js index 7bd1a6d619af23..9b9c2ad0d5d403 100644 --- a/test/parallel/test-event-emitter-max-listeners.js +++ b/test/parallel/test-event-emitter-max-listeners.js @@ -23,7 +23,6 @@ const common = require('../common'); const assert = require('assert'); const events = require('events'); -const { inspect } = require('util'); const e = new events.EventEmitter(); e.on('maxListeners', common.mustCall()); @@ -31,16 +30,15 @@ e.on('maxListeners', common.mustCall()); // Should not corrupt the 'maxListeners' queue. e.setMaxListeners(42); -const throwsObjs = [NaN, -1, 'and even this']; +const rangeErrorObjs = [NaN, -1]; +const typeErrorObj = 'and even this'; -for (const obj of throwsObjs) { +for (const obj of rangeErrorObjs) { assert.throws( () => e.setMaxListeners(obj), { code: 'ERR_OUT_OF_RANGE', name: 'RangeError', - message: 'The value of "n" is out of range. ' + - `It must be a non-negative number. Received ${inspect(obj)}`, } ); @@ -49,22 +47,40 @@ for (const obj of throwsObjs) { { code: 'ERR_OUT_OF_RANGE', name: 'RangeError', - message: 'The value of "defaultMaxListeners" is out of range. ' + - `It must be a non-negative number. Received ${inspect(obj)}`, } ); } +assert.throws( + () => e.setMaxListeners(typeErrorObj), + { + code: 'ERR_INVALID_ARG_TYPE', + name: 'TypeError', + } +); + +assert.throws( + () => events.defaultMaxListeners = typeErrorObj, + { + code: 'ERR_INVALID_ARG_TYPE', + name: 'TypeError', + } +); + e.emit('maxListeners'); { const { EventEmitter, defaultMaxListeners } = events; - for (const obj of throwsObjs) { + for (const obj of rangeErrorObjs) { assert.throws(() => EventEmitter.setMaxListeners(obj), { code: 'ERR_OUT_OF_RANGE', }); } + assert.throws(() => EventEmitter.setMaxListeners(typeErrorObj), { + code: 'ERR_INVALID_ARG_TYPE', + }); + assert.throws( () => EventEmitter.setMaxListeners(defaultMaxListeners, 'INVALID_EMITTER'), { code: 'ERR_INVALID_ARG_TYPE' }