From 28c6105086b3bffea17204593c1a24a01c5afbc1 Mon Sep 17 00:00:00 2001 From: Lxxyx Date: Sun, 13 Nov 2022 23:30:27 +0800 Subject: [PATCH 1/3] events: refactor to use validator --- lib/events.js | 16 +-- .../test-event-emitter-max-listeners.js | 99 +++++++++++++------ 2 files changed, 74 insertions(+), 41 deletions(-) diff --git a/lib/events.js b/lib/events.js index e05a3bc6b8b168..aa417bde0735c7 100644 --- a/lib/events.js +++ b/lib/events.js @@ -33,7 +33,6 @@ const { ErrorCaptureStackTrace, FunctionPrototypeBind, FunctionPrototypeCall, - NumberIsNaN, NumberMAX_SAFE_INTEGER, ObjectCreate, ObjectDefineProperty, @@ -70,7 +69,6 @@ const { codes: { ERR_INVALID_ARG_TYPE, ERR_INVALID_THIS, - ERR_OUT_OF_RANGE, ERR_UNHANDLED_ERROR }, genericNodeError, @@ -81,6 +79,7 @@ const { validateAbortSignal, validateBoolean, validateFunction, + validateNumber, validateString, } = require('internal/validators'); @@ -279,11 +278,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; } }); @@ -313,8 +308,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, 'n', 0); if (eventTargets.length === 0) { defaultMaxListeners = n; } else { @@ -410,9 +404,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, 'n', 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 a881bf86497f16..5e8df1785a148b 100644 --- a/test/parallel/test-event-emitter-max-listeners.js +++ b/test/parallel/test-event-emitter-max-listeners.js @@ -24,45 +24,86 @@ 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()); +const throwInvalidType = [true, 'string']; +const throwOutOfRange = [-1, NaN]; -// Should not corrupt the 'maxListeners' queue. -e.setMaxListeners(42); +// for EventEmitter.prototype.setMaxListeners +{ + const e = new events.EventEmitter(); -const throwsObjs = [NaN, -1, 'and even this']; + e.on('maxListeners', common.mustCall()); -for (const obj of throwsObjs) { - 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)}` - } - ); + // Should not corrupt the 'maxListeners' queue. + e.setMaxListeners(42); - assert.throws( - () => events.defaultMaxListeners = obj, - { - 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)}` - } - ); + for (const obj of throwInvalidType) { + assert.throws( + () => e.setMaxListeners(obj), + { + code: 'ERR_INVALID_ARG_TYPE', + name: 'TypeError', + message: `The "n" argument must be of type number. Received type ${typeof obj} (${inspect(obj)})` + } + ); + } + + for (const obj of throwOutOfRange) { + assert.throws( + () => e.setMaxListeners(obj), + { + code: 'ERR_OUT_OF_RANGE', + name: 'RangeError', + message: 'The value of "n" is out of range. ' + + `It must be >= 0. Received ${inspect(obj)}` + } + ); + } + + e.emit('maxListeners'); } -e.emit('maxListeners'); +// for EventEmitter.defaultMaxListeners +{ + for (const obj of throwInvalidType) { + assert.throws( + () => events.defaultMaxListeners = obj, + { + code: 'ERR_INVALID_ARG_TYPE', + name: 'TypeError', + message: `The "defaultMaxListeners" argument must be of type number. Received type ${typeof obj} (${inspect(obj)})` + } + ); + } + + for (const obj of throwOutOfRange) { + assert.throws( + () => events.defaultMaxListeners = obj, + { + code: 'ERR_OUT_OF_RANGE', + name: 'RangeError', + message: 'The value of "defaultMaxListeners" is out of range. ' + + `It must be >= 0. Received ${inspect(obj)}` + } + ); + } +} +// for EventEmitter.setMaxListeners { const { EventEmitter, defaultMaxListeners } = events; - for (const obj of throwsObjs) { - assert.throws(() => EventEmitter.setMaxListeners(obj), { - code: 'ERR_OUT_OF_RANGE', - }); + for (const obj of throwInvalidType) { + assert.throws( + () => EventEmitter.setMaxListeners(obj), + { code: 'ERR_INVALID_ARG_TYPE' } + ); + } + + for (const obj of throwOutOfRange) { + assert.throws( + () => EventEmitter.setMaxListeners(obj), + { code: 'ERR_OUT_OF_RANGE' } + ); } assert.throws( From 7e7fc873f0e813abac6b96b84018cd36b8d9cff3 Mon Sep 17 00:00:00 2001 From: ZiJian Liu Date: Mon, 14 Nov 2022 14:01:37 +0800 Subject: [PATCH 2/3] fixup! remove validation for error message --- test/parallel/test-event-emitter-max-listeners.js | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/test/parallel/test-event-emitter-max-listeners.js b/test/parallel/test-event-emitter-max-listeners.js index 5e8df1785a148b..b59e5dda028144 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 throwInvalidType = [true, 'string']; const throwOutOfRange = [-1, NaN]; @@ -42,8 +41,7 @@ const throwOutOfRange = [-1, NaN]; () => e.setMaxListeners(obj), { code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: `The "n" argument must be of type number. Received type ${typeof obj} (${inspect(obj)})` + name: 'TypeError' } ); } @@ -53,9 +51,7 @@ const throwOutOfRange = [-1, NaN]; () => e.setMaxListeners(obj), { code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "n" is out of range. ' + - `It must be >= 0. Received ${inspect(obj)}` + name: 'RangeError' } ); } @@ -70,8 +66,7 @@ const throwOutOfRange = [-1, NaN]; () => events.defaultMaxListeners = obj, { code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: `The "defaultMaxListeners" argument must be of type number. Received type ${typeof obj} (${inspect(obj)})` + name: 'TypeError' } ); } @@ -81,9 +76,7 @@ const throwOutOfRange = [-1, NaN]; () => events.defaultMaxListeners = obj, { code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "defaultMaxListeners" is out of range. ' + - `It must be >= 0. Received ${inspect(obj)}` + name: 'RangeError' } ); } From bbd69141bf46e6e21d558b8e5c072935281de738 Mon Sep 17 00:00:00 2001 From: ZiJian Liu Date: Tue, 15 Nov 2022 17:41:39 +0800 Subject: [PATCH 3/3] fixup! add trailing commas --- test/parallel/test-event-emitter-max-listeners.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/parallel/test-event-emitter-max-listeners.js b/test/parallel/test-event-emitter-max-listeners.js index b59e5dda028144..8c2c5ccc7e96b8 100644 --- a/test/parallel/test-event-emitter-max-listeners.js +++ b/test/parallel/test-event-emitter-max-listeners.js @@ -41,7 +41,7 @@ const throwOutOfRange = [-1, NaN]; () => e.setMaxListeners(obj), { code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' + name: 'TypeError', } ); } @@ -51,7 +51,7 @@ const throwOutOfRange = [-1, NaN]; () => e.setMaxListeners(obj), { code: 'ERR_OUT_OF_RANGE', - name: 'RangeError' + name: 'RangeError', } ); } @@ -66,7 +66,7 @@ const throwOutOfRange = [-1, NaN]; () => events.defaultMaxListeners = obj, { code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' + name: 'TypeError', } ); } @@ -76,7 +76,7 @@ const throwOutOfRange = [-1, NaN]; () => events.defaultMaxListeners = obj, { code: 'ERR_OUT_OF_RANGE', - name: 'RangeError' + name: 'RangeError', } ); }