summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuigi Pinca <luigipinca@gmail.com>2020-10-26 16:36:05 +0100
committerMyles Borins <mylesborins@github.com>2020-11-16 11:58:06 -0500
commitb48473228c3c96933875bc1567c4ecb8b0b10c16 (patch)
tree97dbad8f4bad9bed5ccd46187134f0de3e042dcb
parentc6eb0b62d9d062aa63383cc44dcf58534304db46 (diff)
downloadnode-new-b48473228c3c96933875bc1567c4ecb8b0b10c16.tar.gz
events: assume an EventEmitter if emitter.on is a function
Assume that the `emitter` argument of `EventEmitter.once()` is an `EventEmitter` if `emitter.on` is a function. Refs: https://github.com/nodejs/node/commit/4b3654e923e7c3c2 Refs: https://github.com/websockets/ws/issues/1795 PR-URL: https://github.com/nodejs/node/pull/35818 Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
-rw-r--r--lib/events.js5
-rw-r--r--test/parallel/test-events-once.js22
2 files changed, 26 insertions, 1 deletions
diff --git a/lib/events.js b/lib/events.js
index 51259e6821..300f9f1e6b 100644
--- a/lib/events.js
+++ b/lib/events.js
@@ -623,7 +623,10 @@ function unwrapListeners(arr) {
function once(emitter, name) {
return new Promise((resolve, reject) => {
- if (typeof emitter.addEventListener === 'function') {
+ if (
+ typeof emitter.addEventListener === 'function' &&
+ typeof emitter.on !== 'function'
+ ) {
// EventTarget does not have `error` event semantics like Node
// EventEmitters, we do not listen to `error` events here.
emitter.addEventListener(
diff --git a/test/parallel/test-events-once.js b/test/parallel/test-events-once.js
index fea143f587..d07492ea63 100644
--- a/test/parallel/test-events-once.js
+++ b/test/parallel/test-events-once.js
@@ -166,6 +166,27 @@ async function onceWithEventTargetError() {
strictEqual(Reflect.has(et.events, 'error'), false);
}
+async function assumesEventEmitterIfOnIsAFunction() {
+ const ee = new EventEmitter();
+ ee.addEventListener = () => {};
+
+ const expected = new Error('kaboom');
+ let err;
+ process.nextTick(() => {
+ ee.emit('error', expected);
+ });
+
+ try {
+ await once(ee, 'myevent');
+ } catch (_e) {
+ err = _e;
+ }
+
+ strictEqual(err, expected);
+ strictEqual(ee.listenerCount('error'), 0);
+ strictEqual(ee.listenerCount('myevent'), 0);
+}
+
Promise.all([
onceAnEvent(),
onceAnEventWithTwoArgs(),
@@ -175,4 +196,5 @@ Promise.all([
onceWithEventTarget(),
onceWithEventTargetTwoArgs(),
onceWithEventTargetError(),
+ assumesEventEmitterIfOnIsAFunction(),
]).then(common.mustCall());