| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -829,6 +829,40 @@ class MyClass extends EventEmitter { | |||
| 829 | 829 | } | |
| 830 | 830 | ``` | |
| 831 | 831 | ||
| 832 | + ## `events.getEventListeners(emitterOrTarget, eventName)` | ||
| 833 | + <!-- YAML | ||
| 834 | + added: | ||
| 835 | + - REPLACEME | ||
| 836 | + --> | ||
| 837 | + * `emitterOrTarget` {EventEmitter|EventTarget} | ||
| 838 | + * `eventName` {string|symbol} | ||
| 839 | + * Returns: {Function[]} | ||
| 840 | + | ||
| 841 | + Returns a copy of the array of listeners for the event named `eventName`. | ||
| 842 | + | ||
| 843 | + For `EventEmitter`s this behaves exactly the same as calling `.listeners` on | ||
| 844 | + the emitter. | ||
| 845 | + | ||
| 846 | + For `EventTarget`s this is the only way to get the event listeners for the | ||
| 847 | + event target. This is useful for debugging and diagnostic purposes. | ||
| 848 | + | ||
| 849 | + ```js | ||
| 850 | + const { getEventListeners, EventEmitter } = require('events'); | ||
| 851 | + | ||
| 852 | + { | ||
| 853 | + const ee = new EventEmitter(); | ||
| 854 | + const listener = () => console.log('Events are fun'); | ||
| 855 | + ee.on('foo', listener); | ||
| 856 | + getEventListeners(ee, 'foo'); // [listener] | ||
| 857 | + } | ||
| 858 | + { | ||
| 859 | + const et = new EventTarget(); | ||
| 860 | + const listener = () => console.log('Events are fun'); | ||
| 861 | + ee.addEventListener('foo', listener); | ||
| 862 | + getEventListeners(ee, 'foo'); // [listener] | ||
| 863 | + } | ||
| 864 | + ``` | ||
| 865 | + | ||
| 832 | 866 | ## `events.once(emitter, name[, options])` | |
| 833 | 867 | <!-- YAML | |
| 834 | 868 | added: | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -22,6 +22,7 @@ | |||
| 22 | 22 | 'use strict'; | |
| 23 | 23 | ||
| 24 | 24 | const { | |
| 25 | + ArrayPrototypePush, | ||
| 25 | 26 | Boolean, | |
| 26 | 27 | Error, | |
| 27 | 28 | ErrorCaptureStackTrace, | |
@@ -74,13 +75,14 @@ const lazyDOMException = hideStackFrames((message, name) => { | |||
| 74 | 75 | return new DOMException(message, name); | |
| 75 | 76 | }); | |
| 76 | 77 | ||
| 78 | + | ||
| 77 | 79 | function EventEmitter(opts) { | |
| 78 | 80 | EventEmitter.init.call(this, opts); | |
| 79 | 81 | } | |
| 80 | 82 | module.exports = EventEmitter; | |
| 81 | 83 | module.exports.once = once; | |
| 82 | 84 | module.exports.on = on; | |
| 83 | - | ||
| 85 | + module.exports.getEventListeners = getEventListeners; | ||
| 84 | 86 | // Backwards-compat with node 0.10.x | |
| 85 | 87 | EventEmitter.EventEmitter = EventEmitter; | |
| 86 | 88 | ||
@@ -634,6 +636,28 @@ function unwrapListeners(arr) { | |||
| 634 | 636 | return ret; | |
| 635 | 637 | } | |
| 636 | 638 | ||
| 639 | + function getEventListeners(emitterOrTarget, type) { | ||
| 640 | + // First check if EventEmitter | ||
| 641 | + if (typeof emitterOrTarget.listeners === 'function') { | ||
| 642 | + return emitterOrTarget.listeners(type); | ||
| 643 | + } | ||
| 644 | + // Require event target lazily to avoid always loading it | ||
| 645 | + const { isEventTarget, kEvents } = require('internal/event_target'); | ||
| 646 | + if (isEventTarget(emitterOrTarget)) { | ||
| 647 | + const root = emitterOrTarget[kEvents].get(type); | ||
| 648 | + const listeners = []; | ||
| 649 | + let handler = root?.next; | ||
| 650 | + while (handler?.listener !== undefined) { | ||
| 651 | + ArrayPrototypePush(listeners, handler.listener); | ||
| 652 | + handler = handler.next; | ||
| 653 | + } | ||
| 654 | + return listeners; | ||
| 655 | + } | ||
| 656 | + throw new ERR_INVALID_ARG_TYPE('emitter', | ||
| 657 | + ['EventEmitter', 'EventTarget'], | ||
| 658 | + emitterOrTarget); | ||
| 659 | + } | ||
| 660 | + | ||
| 637 | 661 | async function once(emitter, name, options = {}) { | |
| 638 | 662 | const signal = options ? options.signal : undefined; | |
| 639 | 663 | validateAbortSignal(signal, 'options.signal'); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -636,4 +636,6 @@ module.exports = { | |||
| 636 | 636 | kNewListener, | |
| 637 | 637 | kTrustEvent, | |
| 638 | 638 | kRemoveListener, | |
| 639 | + kEvents, | ||
| 640 | + isEventTarget, | ||
| 639 | 641 | }; | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,36 @@ | |||
| 1 | + 'use strict'; | ||
| 2 | + | ||
| 3 | + const common = require('../common'); | ||
| 4 | + | ||
| 5 | + const { | ||
| 6 | + deepStrictEqual, | ||
| 7 | + } = require('assert'); | ||
| 8 | + | ||
| 9 | + const { getEventListeners, EventEmitter } = require('events'); | ||
| 10 | + | ||
| 11 | + // Test getEventListeners on EventEmitter | ||
| 12 | + { | ||
| 13 | + const fn1 = common.mustNotCall(); | ||
| 14 | + const fn2 = common.mustNotCall(); | ||
| 15 | + const emitter = new EventEmitter(); | ||
| 16 | + emitter.on('foo', fn1); | ||
| 17 | + emitter.on('foo', fn2); | ||
| 18 | + emitter.on('baz', fn1); | ||
| 19 | + emitter.on('baz', fn1); | ||
| 20 | + deepStrictEqual(getEventListeners(emitter, 'foo'), [fn1, fn2]); | ||
| 21 | + deepStrictEqual(getEventListeners(emitter, 'bar'), []); | ||
| 22 | + deepStrictEqual(getEventListeners(emitter, 'baz'), [fn1, fn1]); | ||
| 23 | + } | ||
| 24 | + // Test getEventListeners on EventTarget | ||
| 25 | + { | ||
| 26 | + const fn1 = common.mustNotCall(); | ||
| 27 | + const fn2 = common.mustNotCall(); | ||
| 28 | + const target = new EventTarget(); | ||
| 29 | + target.addEventListener('foo', fn1); | ||
| 30 | + target.addEventListener('foo', fn2); | ||
| 31 | + target.addEventListener('baz', fn1); | ||
| 32 | + target.addEventListener('baz', fn1); | ||
| 33 | + deepStrictEqual(getEventListeners(target, 'foo'), [fn1, fn2]); | ||
| 34 | + deepStrictEqual(getEventListeners(target, 'bar'), []); | ||
| 35 | + deepStrictEqual(getEventListeners(target, 'baz'), [fn1]); | ||
| 36 | + } | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments