From 4befc9e4b3ed16c80577251af50645d5b84b884b Mon Sep 17 00:00:00 2001 From: chosunghoon Date: Mon, 30 Sep 2024 20:47:10 +0900 Subject: [PATCH 1/2] events: add hasEventListener util for validate There was some repetitive logics that validated the existence of eventlisteners. We now replace this with a single line of, `hasEventListener(self, type)`. `self` is the object(e.g. EventEmitter) to be checked whether eventlisteners exists or not. `type` is the type of eventlisteners, which can be `undefined` --- lib/events.js | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/events.js b/lib/events.js index 256dd580e159bd..e5a052a186ba55 100644 --- a/lib/events.js +++ b/lib/events.js @@ -275,6 +275,12 @@ ObjectDefineProperty(EventEmitter, 'defaultMaxListeners', { }, }); +function hasEventListener(self, type) { + if (type === undefined) + return self._events !== undefined; + return self._events !== undefined && self._events[type] !== undefined; +}; + ObjectDefineProperties(EventEmitter, { kMaxEventTargetListeners: { __proto__: null, @@ -667,14 +673,12 @@ EventEmitter.prototype.prependOnceListener = EventEmitter.prototype.removeListener = function removeListener(type, listener) { checkListener(listener); - - const events = this._events; - if (events === undefined) + + if (!hasEventListener(this, type)) return this; + const events = this._events; const list = events[type]; - if (list === undefined) - return this; if (list === listener || list.listener === listener) { this._eventsCount -= 1; @@ -728,9 +732,9 @@ EventEmitter.prototype.off = EventEmitter.prototype.removeListener; */ EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) { - const events = this._events; - if (events === undefined) + if (!hasEventListener(this)) return this; + const events = this._events; // Not listening for removeListener, no need to emit if (events.removeListener === undefined) { @@ -775,14 +779,10 @@ EventEmitter.prototype.removeAllListeners = }; function _listeners(target, type, unwrap) { - const events = target._events; - - if (events === undefined) - return []; - - const evlistener = events[type]; - if (evlistener === undefined) + if (!hasEventListener(target, type)) return []; + + const evlistener = target._events[type]; if (typeof evlistener === 'function') return unwrap ? [evlistener.listener || evlistener] : [evlistener]; From d7a42a42df7fda2823d84a9e8dbe7ce197f389d1 Mon Sep 17 00:00:00 2001 From: chosunghoon Date: Wed, 2 Oct 2024 10:09:25 +0900 Subject: [PATCH 2/2] fixup! events: add hasEventListener util for validate --- lib/events.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/events.js b/lib/events.js index e5a052a186ba55..47a30b002985f0 100644 --- a/lib/events.js +++ b/lib/events.js @@ -673,7 +673,7 @@ EventEmitter.prototype.prependOnceListener = EventEmitter.prototype.removeListener = function removeListener(type, listener) { checkListener(listener); - + if (!hasEventListener(this, type)) return this; @@ -781,7 +781,7 @@ EventEmitter.prototype.removeAllListeners = function _listeners(target, type, unwrap) { if (!hasEventListener(target, type)) return []; - + const evlistener = target._events[type]; if (typeof evlistener === 'function')