1# Events
2
3<!--introduced_in=v0.10.0-->
4
5> Stability: 2 - Stable
6
7<!--type=module-->
8
9<!-- source_link=lib/events.js -->
10
11Much of the Node.js core API is built around an idiomatic asynchronous
12event-driven architecture in which certain kinds of objects (called "emitters")
13emit named events that cause `Function` objects ("listeners") to be called.
14
15For instance: a [`net.Server`][] object emits an event each time a peer
16connects to it; a [`fs.ReadStream`][] emits an event when the file is opened;
17a [stream][] emits an event whenever data is available to be read.
18
19All objects that emit events are instances of the `EventEmitter` class. These
20objects expose an `eventEmitter.on()` function that allows one or more
21functions to be attached to named events emitted by the object. Typically,
22event names are camel-cased strings but any valid JavaScript property key
23can be used.
24
25When the `EventEmitter` object emits an event, all of the functions attached
26to that specific event are called _synchronously_. Any values returned by the
27called listeners are _ignored_ and discarded.
28
29The following example shows a simple `EventEmitter` instance with a single
30listener. The `eventEmitter.on()` method is used to register listeners, while
31the `eventEmitter.emit()` method is used to trigger the event.
32
33```mjs
34import { EventEmitter } from 'node:events';
35
36class MyEmitter extends EventEmitter {}
37
38const myEmitter = new MyEmitter();
39myEmitter.on('event', () => {
40  console.log('an event occurred!');
41});
42myEmitter.emit('event');
43```
44
45```cjs
46const EventEmitter = require('node:events');
47
48class MyEmitter extends EventEmitter {}
49
50const myEmitter = new MyEmitter();
51myEmitter.on('event', () => {
52  console.log('an event occurred!');
53});
54myEmitter.emit('event');
55```
56
57## Passing arguments and `this` to listeners
58
59The `eventEmitter.emit()` method allows an arbitrary set of arguments to be
60passed to the listener functions. Keep in mind that when
61an ordinary listener function is called, the standard `this` keyword
62is intentionally set to reference the `EventEmitter` instance to which the
63listener is attached.
64
65```mjs
66import { EventEmitter } from 'node:events';
67class MyEmitter extends EventEmitter {}
68const myEmitter = new MyEmitter();
69myEmitter.on('event', function(a, b) {
70  console.log(a, b, this, this === myEmitter);
71  // Prints:
72  //   a b MyEmitter {
73  //     _events: [Object: null prototype] { event: [Function (anonymous)] },
74  //     _eventsCount: 1,
75  //     _maxListeners: undefined,
76  //     [Symbol(kCapture)]: false
77  //   } true
78});
79myEmitter.emit('event', 'a', 'b');
80```
81
82```cjs
83const EventEmitter = require('node:events');
84class MyEmitter extends EventEmitter {}
85const myEmitter = new MyEmitter();
86myEmitter.on('event', function(a, b) {
87  console.log(a, b, this, this === myEmitter);
88  // Prints:
89  //   a b MyEmitter {
90  //     _events: [Object: null prototype] { event: [Function (anonymous)] },
91  //     _eventsCount: 1,
92  //     _maxListeners: undefined,
93  //     [Symbol(kCapture)]: false
94  //   } true
95});
96myEmitter.emit('event', 'a', 'b');
97```
98
99It is possible to use ES6 Arrow Functions as listeners, however, when doing so,
100the `this` keyword will no longer reference the `EventEmitter` instance:
101
102```mjs
103import { EventEmitter } from 'node:events';
104class MyEmitter extends EventEmitter {}
105const myEmitter = new MyEmitter();
106myEmitter.on('event', (a, b) => {
107  console.log(a, b, this);
108  // Prints: a b {}
109});
110myEmitter.emit('event', 'a', 'b');
111```
112
113```cjs
114const EventEmitter = require('node:events');
115class MyEmitter extends EventEmitter {}
116const myEmitter = new MyEmitter();
117myEmitter.on('event', (a, b) => {
118  console.log(a, b, this);
119  // Prints: a b {}
120});
121myEmitter.emit('event', 'a', 'b');
122```
123
124## Asynchronous vs. synchronous
125
126The `EventEmitter` calls all listeners synchronously in the order in which
127they were registered. This ensures the proper sequencing of
128events and helps avoid race conditions and logic errors. When appropriate,
129listener functions can switch to an asynchronous mode of operation using
130the `setImmediate()` or `process.nextTick()` methods:
131
132```mjs
133import { EventEmitter } from 'node:events';
134class MyEmitter extends EventEmitter {}
135const myEmitter = new MyEmitter();
136myEmitter.on('event', (a, b) => {
137  setImmediate(() => {
138    console.log('this happens asynchronously');
139  });
140});
141myEmitter.emit('event', 'a', 'b');
142```
143
144```cjs
145const EventEmitter = require('node:events');
146class MyEmitter extends EventEmitter {}
147const myEmitter = new MyEmitter();
148myEmitter.on('event', (a, b) => {
149  setImmediate(() => {
150    console.log('this happens asynchronously');
151  });
152});
153myEmitter.emit('event', 'a', 'b');
154```
155
156## Handling events only once
157
158When a listener is registered using the `eventEmitter.on()` method, that
159listener is invoked _every time_ the named event is emitted.
160
161```mjs
162import { EventEmitter } from 'node:events';
163class MyEmitter extends EventEmitter {}
164const myEmitter = new MyEmitter();
165let m = 0;
166myEmitter.on('event', () => {
167  console.log(++m);
168});
169myEmitter.emit('event');
170// Prints: 1
171myEmitter.emit('event');
172// Prints: 2
173```
174
175```cjs
176const EventEmitter = require('node:events');
177class MyEmitter extends EventEmitter {}
178const myEmitter = new MyEmitter();
179let m = 0;
180myEmitter.on('event', () => {
181  console.log(++m);
182});
183myEmitter.emit('event');
184// Prints: 1
185myEmitter.emit('event');
186// Prints: 2
187```
188
189Using the `eventEmitter.once()` method, it is possible to register a listener
190that is called at most once for a particular event. Once the event is emitted,
191the listener is unregistered and _then_ called.
192
193```mjs
194import { EventEmitter } from 'node:events';
195class MyEmitter extends EventEmitter {}
196const myEmitter = new MyEmitter();
197let m = 0;
198myEmitter.once('event', () => {
199  console.log(++m);
200});
201myEmitter.emit('event');
202// Prints: 1
203myEmitter.emit('event');
204// Ignored
205```
206
207```cjs
208const EventEmitter = require('node:events');
209class MyEmitter extends EventEmitter {}
210const myEmitter = new MyEmitter();
211let m = 0;
212myEmitter.once('event', () => {
213  console.log(++m);
214});
215myEmitter.emit('event');
216// Prints: 1
217myEmitter.emit('event');
218// Ignored
219```
220
221## Error events
222
223When an error occurs within an `EventEmitter` instance, the typical action is
224for an `'error'` event to be emitted. These are treated as special cases
225within Node.js.
226
227If an `EventEmitter` does _not_ have at least one listener registered for the
228`'error'` event, and an `'error'` event is emitted, the error is thrown, a
229stack trace is printed, and the Node.js process exits.
230
231```mjs
232import { EventEmitter } from 'node:events';
233class MyEmitter extends EventEmitter {}
234const myEmitter = new MyEmitter();
235myEmitter.emit('error', new Error('whoops!'));
236// Throws and crashes Node.js
237```
238
239```cjs
240const EventEmitter = require('node:events');
241class MyEmitter extends EventEmitter {}
242const myEmitter = new MyEmitter();
243myEmitter.emit('error', new Error('whoops!'));
244// Throws and crashes Node.js
245```
246
247To guard against crashing the Node.js process the [`domain`][] module can be
248used. (Note, however, that the `node:domain` module is deprecated.)
249
250As a best practice, listeners should always be added for the `'error'` events.
251
252```mjs
253import { EventEmitter } from 'node:events';
254class MyEmitter extends EventEmitter {}
255const myEmitter = new MyEmitter();
256myEmitter.on('error', (err) => {
257  console.error('whoops! there was an error');
258});
259myEmitter.emit('error', new Error('whoops!'));
260// Prints: whoops! there was an error
261```
262
263```cjs
264const EventEmitter = require('node:events');
265class MyEmitter extends EventEmitter {}
266const myEmitter = new MyEmitter();
267myEmitter.on('error', (err) => {
268  console.error('whoops! there was an error');
269});
270myEmitter.emit('error', new Error('whoops!'));
271// Prints: whoops! there was an error
272```
273
274It is possible to monitor `'error'` events without consuming the emitted error
275by installing a listener using the symbol `events.errorMonitor`.
276
277```mjs
278import { EventEmitter, errorMonitor } from 'node:events';
279
280const myEmitter = new EventEmitter();
281myEmitter.on(errorMonitor, (err) => {
282  MyMonitoringTool.log(err);
283});
284myEmitter.emit('error', new Error('whoops!'));
285// Still throws and crashes Node.js
286```
287
288```cjs
289const { EventEmitter, errorMonitor } = require('node:events');
290
291const myEmitter = new EventEmitter();
292myEmitter.on(errorMonitor, (err) => {
293  MyMonitoringTool.log(err);
294});
295myEmitter.emit('error', new Error('whoops!'));
296// Still throws and crashes Node.js
297```
298
299## Capture rejections of promises
300
301Using `async` functions with event handlers is problematic, because it
302can lead to an unhandled rejection in case of a thrown exception:
303
304```mjs
305import { EventEmitter } from 'node:events';
306const ee = new EventEmitter();
307ee.on('something', async (value) => {
308  throw new Error('kaboom');
309});
310```
311
312```cjs
313const EventEmitter = require('node:events');
314const ee = new EventEmitter();
315ee.on('something', async (value) => {
316  throw new Error('kaboom');
317});
318```
319
320The `captureRejections` option in the `EventEmitter` constructor or the global
321setting change this behavior, installing a `.then(undefined, handler)`
322handler on the `Promise`. This handler routes the exception
323asynchronously to the [`Symbol.for('nodejs.rejection')`][rejection] method
324if there is one, or to [`'error'`][error] event handler if there is none.
325
326```mjs
327import { EventEmitter } from 'node:events';
328const ee1 = new EventEmitter({ captureRejections: true });
329ee1.on('something', async (value) => {
330  throw new Error('kaboom');
331});
332
333ee1.on('error', console.log);
334
335const ee2 = new EventEmitter({ captureRejections: true });
336ee2.on('something', async (value) => {
337  throw new Error('kaboom');
338});
339
340ee2[Symbol.for('nodejs.rejection')] = console.log;
341```
342
343```cjs
344const EventEmitter = require('node:events');
345const ee1 = new EventEmitter({ captureRejections: true });
346ee1.on('something', async (value) => {
347  throw new Error('kaboom');
348});
349
350ee1.on('error', console.log);
351
352const ee2 = new EventEmitter({ captureRejections: true });
353ee2.on('something', async (value) => {
354  throw new Error('kaboom');
355});
356
357ee2[Symbol.for('nodejs.rejection')] = console.log;
358```
359
360Setting `events.captureRejections = true` will change the default for all
361new instances of `EventEmitter`.
362
363```mjs
364import { EventEmitter } from 'node:events';
365
366EventEmitter.captureRejections = true;
367const ee1 = new EventEmitter();
368ee1.on('something', async (value) => {
369  throw new Error('kaboom');
370});
371
372ee1.on('error', console.log);
373```
374
375```cjs
376const events = require('node:events');
377events.captureRejections = true;
378const ee1 = new events.EventEmitter();
379ee1.on('something', async (value) => {
380  throw new Error('kaboom');
381});
382
383ee1.on('error', console.log);
384```
385
386The `'error'` events that are generated by the `captureRejections` behavior
387do not have a catch handler to avoid infinite error loops: the
388recommendation is to **not use `async` functions as `'error'` event handlers**.
389
390## Class: `EventEmitter`
391
392<!-- YAML
393added: v0.1.26
394changes:
395  - version:
396     - v13.4.0
397     - v12.16.0
398    pr-url: https://github.com/nodejs/node/pull/27867
399    description: Added captureRejections option.
400-->
401
402The `EventEmitter` class is defined and exposed by the `node:events` module:
403
404```mjs
405import { EventEmitter } from 'node:events';
406```
407
408```cjs
409const EventEmitter = require('node:events');
410```
411
412All `EventEmitter`s emit the event `'newListener'` when new listeners are
413added and `'removeListener'` when existing listeners are removed.
414
415It supports the following option:
416
417* `captureRejections` {boolean} It enables
418  [automatic capturing of promise rejection][capturerejections].
419  **Default:** `false`.
420
421### Event: `'newListener'`
422
423<!-- YAML
424added: v0.1.26
425-->
426
427* `eventName` {string|symbol} The name of the event being listened for
428* `listener` {Function} The event handler function
429
430The `EventEmitter` instance will emit its own `'newListener'` event _before_
431a listener is added to its internal array of listeners.
432
433Listeners registered for the `'newListener'` event are passed the event
434name and a reference to the listener being added.
435
436The fact that the event is triggered before adding the listener has a subtle
437but important side effect: any _additional_ listeners registered to the same
438`name` _within_ the `'newListener'` callback are inserted _before_ the
439listener that is in the process of being added.
440
441```mjs
442import { EventEmitter } from 'node:events';
443class MyEmitter extends EventEmitter {}
444
445const myEmitter = new MyEmitter();
446// Only do this once so we don't loop forever
447myEmitter.once('newListener', (event, listener) => {
448  if (event === 'event') {
449    // Insert a new listener in front
450    myEmitter.on('event', () => {
451      console.log('B');
452    });
453  }
454});
455myEmitter.on('event', () => {
456  console.log('A');
457});
458myEmitter.emit('event');
459// Prints:
460//   B
461//   A
462```
463
464```cjs
465const EventEmitter = require('node:events');
466class MyEmitter extends EventEmitter {}
467
468const myEmitter = new MyEmitter();
469// Only do this once so we don't loop forever
470myEmitter.once('newListener', (event, listener) => {
471  if (event === 'event') {
472    // Insert a new listener in front
473    myEmitter.on('event', () => {
474      console.log('B');
475    });
476  }
477});
478myEmitter.on('event', () => {
479  console.log('A');
480});
481myEmitter.emit('event');
482// Prints:
483//   B
484//   A
485```
486
487### Event: `'removeListener'`
488
489<!-- YAML
490added: v0.9.3
491changes:
492  - version:
493    - v6.1.0
494    - v4.7.0
495    pr-url: https://github.com/nodejs/node/pull/6394
496    description: For listeners attached using `.once()`, the `listener` argument
497                 now yields the original listener function.
498-->
499
500* `eventName` {string|symbol} The event name
501* `listener` {Function} The event handler function
502
503The `'removeListener'` event is emitted _after_ the `listener` is removed.
504
505### `emitter.addListener(eventName, listener)`
506
507<!-- YAML
508added: v0.1.26
509-->
510
511* `eventName` {string|symbol}
512* `listener` {Function}
513
514Alias for `emitter.on(eventName, listener)`.
515
516### `emitter.emit(eventName[, ...args])`
517
518<!-- YAML
519added: v0.1.26
520-->
521
522* `eventName` {string|symbol}
523* `...args` {any}
524* Returns: {boolean}
525
526Synchronously calls each of the listeners registered for the event named
527`eventName`, in the order they were registered, passing the supplied arguments
528to each.
529
530Returns `true` if the event had listeners, `false` otherwise.
531
532```mjs
533import { EventEmitter } from 'node:events';
534const myEmitter = new EventEmitter();
535
536// First listener
537myEmitter.on('event', function firstListener() {
538  console.log('Helloooo! first listener');
539});
540// Second listener
541myEmitter.on('event', function secondListener(arg1, arg2) {
542  console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
543});
544// Third listener
545myEmitter.on('event', function thirdListener(...args) {
546  const parameters = args.join(', ');
547  console.log(`event with parameters ${parameters} in third listener`);
548});
549
550console.log(myEmitter.listeners('event'));
551
552myEmitter.emit('event', 1, 2, 3, 4, 5);
553
554// Prints:
555// [
556//   [Function: firstListener],
557//   [Function: secondListener],
558//   [Function: thirdListener]
559// ]
560// Helloooo! first listener
561// event with parameters 1, 2 in second listener
562// event with parameters 1, 2, 3, 4, 5 in third listener
563```
564
565```cjs
566const EventEmitter = require('node:events');
567const myEmitter = new EventEmitter();
568
569// First listener
570myEmitter.on('event', function firstListener() {
571  console.log('Helloooo! first listener');
572});
573// Second listener
574myEmitter.on('event', function secondListener(arg1, arg2) {
575  console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
576});
577// Third listener
578myEmitter.on('event', function thirdListener(...args) {
579  const parameters = args.join(', ');
580  console.log(`event with parameters ${parameters} in third listener`);
581});
582
583console.log(myEmitter.listeners('event'));
584
585myEmitter.emit('event', 1, 2, 3, 4, 5);
586
587// Prints:
588// [
589//   [Function: firstListener],
590//   [Function: secondListener],
591//   [Function: thirdListener]
592// ]
593// Helloooo! first listener
594// event with parameters 1, 2 in second listener
595// event with parameters 1, 2, 3, 4, 5 in third listener
596```
597
598### `emitter.eventNames()`
599
600<!-- YAML
601added: v6.0.0
602-->
603
604* Returns: {Array}
605
606Returns an array listing the events for which the emitter has registered
607listeners. The values in the array are strings or `Symbol`s.
608
609```mjs
610import { EventEmitter } from 'node:events';
611
612const myEE = new EventEmitter();
613myEE.on('foo', () => {});
614myEE.on('bar', () => {});
615
616const sym = Symbol('symbol');
617myEE.on(sym, () => {});
618
619console.log(myEE.eventNames());
620// Prints: [ 'foo', 'bar', Symbol(symbol) ]
621```
622
623```cjs
624const EventEmitter = require('node:events');
625
626const myEE = new EventEmitter();
627myEE.on('foo', () => {});
628myEE.on('bar', () => {});
629
630const sym = Symbol('symbol');
631myEE.on(sym, () => {});
632
633console.log(myEE.eventNames());
634// Prints: [ 'foo', 'bar', Symbol(symbol) ]
635```
636
637### `emitter.getMaxListeners()`
638
639<!-- YAML
640added: v1.0.0
641-->
642
643* Returns: {integer}
644
645Returns the current max listener value for the `EventEmitter` which is either
646set by [`emitter.setMaxListeners(n)`][] or defaults to
647[`events.defaultMaxListeners`][].
648
649### `emitter.listenerCount(eventName[, listener])`
650
651<!-- YAML
652added: v3.2.0
653changes:
654  - version: v18.16.0
655    pr-url: https://github.com/nodejs/node/pull/46523
656    description: Added the `listener` argument.
657-->
658
659* `eventName` {string|symbol} The name of the event being listened for
660* `listener` {Function} The event handler function
661* Returns: {integer}
662
663Returns the number of listeners listening for the event named `eventName`.
664If `listener` is provided, it will return how many times the listener is found
665in the list of the listeners of the event.
666
667### `emitter.listeners(eventName)`
668
669<!-- YAML
670added: v0.1.26
671changes:
672  - version: v7.0.0
673    pr-url: https://github.com/nodejs/node/pull/6881
674    description: For listeners attached using `.once()` this returns the
675                 original listeners instead of wrapper functions now.
676-->
677
678* `eventName` {string|symbol}
679* Returns: {Function\[]}
680
681Returns a copy of the array of listeners for the event named `eventName`.
682
683```js
684server.on('connection', (stream) => {
685  console.log('someone connected!');
686});
687console.log(util.inspect(server.listeners('connection')));
688// Prints: [ [Function] ]
689```
690
691### `emitter.off(eventName, listener)`
692
693<!-- YAML
694added: v10.0.0
695-->
696
697* `eventName` {string|symbol}
698* `listener` {Function}
699* Returns: {EventEmitter}
700
701Alias for [`emitter.removeListener()`][].
702
703### `emitter.on(eventName, listener)`
704
705<!-- YAML
706added: v0.1.101
707-->
708
709* `eventName` {string|symbol} The name of the event.
710* `listener` {Function} The callback function
711* Returns: {EventEmitter}
712
713Adds the `listener` function to the end of the listeners array for the
714event named `eventName`. No checks are made to see if the `listener` has
715already been added. Multiple calls passing the same combination of `eventName`
716and `listener` will result in the `listener` being added, and called, multiple
717times.
718
719```js
720server.on('connection', (stream) => {
721  console.log('someone connected!');
722});
723```
724
725Returns a reference to the `EventEmitter`, so that calls can be chained.
726
727By default, event listeners are invoked in the order they are added. The
728`emitter.prependListener()` method can be used as an alternative to add the
729event listener to the beginning of the listeners array.
730
731```mjs
732import { EventEmitter } from 'node:events';
733const myEE = new EventEmitter();
734myEE.on('foo', () => console.log('a'));
735myEE.prependListener('foo', () => console.log('b'));
736myEE.emit('foo');
737// Prints:
738//   b
739//   a
740```
741
742```cjs
743const EventEmitter = require('node:events');
744const myEE = new EventEmitter();
745myEE.on('foo', () => console.log('a'));
746myEE.prependListener('foo', () => console.log('b'));
747myEE.emit('foo');
748// Prints:
749//   b
750//   a
751```
752
753### `emitter.once(eventName, listener)`
754
755<!-- YAML
756added: v0.3.0
757-->
758
759* `eventName` {string|symbol} The name of the event.
760* `listener` {Function} The callback function
761* Returns: {EventEmitter}
762
763Adds a **one-time** `listener` function for the event named `eventName`. The
764next time `eventName` is triggered, this listener is removed and then invoked.
765
766```js
767server.once('connection', (stream) => {
768  console.log('Ah, we have our first user!');
769});
770```
771
772Returns a reference to the `EventEmitter`, so that calls can be chained.
773
774By default, event listeners are invoked in the order they are added. The
775`emitter.prependOnceListener()` method can be used as an alternative to add the
776event listener to the beginning of the listeners array.
777
778```mjs
779import { EventEmitter } from 'node:events';
780const myEE = new EventEmitter();
781myEE.once('foo', () => console.log('a'));
782myEE.prependOnceListener('foo', () => console.log('b'));
783myEE.emit('foo');
784// Prints:
785//   b
786//   a
787```
788
789```cjs
790const EventEmitter = require('node:events');
791const myEE = new EventEmitter();
792myEE.once('foo', () => console.log('a'));
793myEE.prependOnceListener('foo', () => console.log('b'));
794myEE.emit('foo');
795// Prints:
796//   b
797//   a
798```
799
800### `emitter.prependListener(eventName, listener)`
801
802<!-- YAML
803added: v6.0.0
804-->
805
806* `eventName` {string|symbol} The name of the event.
807* `listener` {Function} The callback function
808* Returns: {EventEmitter}
809
810Adds the `listener` function to the _beginning_ of the listeners array for the
811event named `eventName`. No checks are made to see if the `listener` has
812already been added. Multiple calls passing the same combination of `eventName`
813and `listener` will result in the `listener` being added, and called, multiple
814times.
815
816```js
817server.prependListener('connection', (stream) => {
818  console.log('someone connected!');
819});
820```
821
822Returns a reference to the `EventEmitter`, so that calls can be chained.
823
824### `emitter.prependOnceListener(eventName, listener)`
825
826<!-- YAML
827added: v6.0.0
828-->
829
830* `eventName` {string|symbol} The name of the event.
831* `listener` {Function} The callback function
832* Returns: {EventEmitter}
833
834Adds a **one-time** `listener` function for the event named `eventName` to the
835_beginning_ of the listeners array. The next time `eventName` is triggered, this
836listener is removed, and then invoked.
837
838```js
839server.prependOnceListener('connection', (stream) => {
840  console.log('Ah, we have our first user!');
841});
842```
843
844Returns a reference to the `EventEmitter`, so that calls can be chained.
845
846### `emitter.removeAllListeners([eventName])`
847
848<!-- YAML
849added: v0.1.26
850-->
851
852* `eventName` {string|symbol}
853* Returns: {EventEmitter}
854
855Removes all listeners, or those of the specified `eventName`.
856
857It is bad practice to remove listeners added elsewhere in the code,
858particularly when the `EventEmitter` instance was created by some other
859component or module (e.g. sockets or file streams).
860
861Returns a reference to the `EventEmitter`, so that calls can be chained.
862
863### `emitter.removeListener(eventName, listener)`
864
865<!-- YAML
866added: v0.1.26
867-->
868
869* `eventName` {string|symbol}
870* `listener` {Function}
871* Returns: {EventEmitter}
872
873Removes the specified `listener` from the listener array for the event named
874`eventName`.
875
876```js
877const callback = (stream) => {
878  console.log('someone connected!');
879};
880server.on('connection', callback);
881// ...
882server.removeListener('connection', callback);
883```
884
885`removeListener()` will remove, at most, one instance of a listener from the
886listener array. If any single listener has been added multiple times to the
887listener array for the specified `eventName`, then `removeListener()` must be
888called multiple times to remove each instance.
889
890Once an event is emitted, all listeners attached to it at the
891time of emitting are called in order. This implies that any
892`removeListener()` or `removeAllListeners()` calls _after_ emitting and
893_before_ the last listener finishes execution will not remove them from
894`emit()` in progress. Subsequent events behave as expected.
895
896```mjs
897import { EventEmitter } from 'node:events';
898class MyEmitter extends EventEmitter {}
899const myEmitter = new MyEmitter();
900
901const callbackA = () => {
902  console.log('A');
903  myEmitter.removeListener('event', callbackB);
904};
905
906const callbackB = () => {
907  console.log('B');
908};
909
910myEmitter.on('event', callbackA);
911
912myEmitter.on('event', callbackB);
913
914// callbackA removes listener callbackB but it will still be called.
915// Internal listener array at time of emit [callbackA, callbackB]
916myEmitter.emit('event');
917// Prints:
918//   A
919//   B
920
921// callbackB is now removed.
922// Internal listener array [callbackA]
923myEmitter.emit('event');
924// Prints:
925//   A
926```
927
928```cjs
929const EventEmitter = require('node:events');
930class MyEmitter extends EventEmitter {}
931const myEmitter = new MyEmitter();
932
933const callbackA = () => {
934  console.log('A');
935  myEmitter.removeListener('event', callbackB);
936};
937
938const callbackB = () => {
939  console.log('B');
940};
941
942myEmitter.on('event', callbackA);
943
944myEmitter.on('event', callbackB);
945
946// callbackA removes listener callbackB but it will still be called.
947// Internal listener array at time of emit [callbackA, callbackB]
948myEmitter.emit('event');
949// Prints:
950//   A
951//   B
952
953// callbackB is now removed.
954// Internal listener array [callbackA]
955myEmitter.emit('event');
956// Prints:
957//   A
958```
959
960Because listeners are managed using an internal array, calling this will
961change the position indices of any listener registered _after_ the listener
962being removed. This will not impact the order in which listeners are called,
963but it means that any copies of the listener array as returned by
964the `emitter.listeners()` method will need to be recreated.
965
966When a single function has been added as a handler multiple times for a single
967event (as in the example below), `removeListener()` will remove the most
968recently added instance. In the example the `once('ping')`
969listener is removed:
970
971```mjs
972import { EventEmitter } from 'node:events';
973const ee = new EventEmitter();
974
975function pong() {
976  console.log('pong');
977}
978
979ee.on('ping', pong);
980ee.once('ping', pong);
981ee.removeListener('ping', pong);
982
983ee.emit('ping');
984ee.emit('ping');
985```
986
987```cjs
988const EventEmitter = require('node:events');
989const ee = new EventEmitter();
990
991function pong() {
992  console.log('pong');
993}
994
995ee.on('ping', pong);
996ee.once('ping', pong);
997ee.removeListener('ping', pong);
998
999ee.emit('ping');
1000ee.emit('ping');
1001```
1002
1003Returns a reference to the `EventEmitter`, so that calls can be chained.
1004
1005### `emitter.setMaxListeners(n)`
1006
1007<!-- YAML
1008added: v0.3.5
1009-->
1010
1011* `n` {integer}
1012* Returns: {EventEmitter}
1013
1014By default `EventEmitter`s will print a warning if more than `10` listeners are
1015added for a particular event. This is a useful default that helps finding
1016memory leaks. The `emitter.setMaxListeners()` method allows the limit to be
1017modified for this specific `EventEmitter` instance. The value can be set to
1018`Infinity` (or `0`) to indicate an unlimited number of listeners.
1019
1020Returns a reference to the `EventEmitter`, so that calls can be chained.
1021
1022### `emitter.rawListeners(eventName)`
1023
1024<!-- YAML
1025added: v9.4.0
1026-->
1027
1028* `eventName` {string|symbol}
1029* Returns: {Function\[]}
1030
1031Returns a copy of the array of listeners for the event named `eventName`,
1032including any wrappers (such as those created by `.once()`).
1033
1034```mjs
1035import { EventEmitter } from 'node:events';
1036const emitter = new EventEmitter();
1037emitter.once('log', () => console.log('log once'));
1038
1039// Returns a new Array with a function `onceWrapper` which has a property
1040// `listener` which contains the original listener bound above
1041const listeners = emitter.rawListeners('log');
1042const logFnWrapper = listeners[0];
1043
1044// Logs "log once" to the console and does not unbind the `once` event
1045logFnWrapper.listener();
1046
1047// Logs "log once" to the console and removes the listener
1048logFnWrapper();
1049
1050emitter.on('log', () => console.log('log persistently'));
1051// Will return a new Array with a single function bound by `.on()` above
1052const newListeners = emitter.rawListeners('log');
1053
1054// Logs "log persistently" twice
1055newListeners[0]();
1056emitter.emit('log');
1057```
1058
1059```cjs
1060const EventEmitter = require('node:events');
1061const emitter = new EventEmitter();
1062emitter.once('log', () => console.log('log once'));
1063
1064// Returns a new Array with a function `onceWrapper` which has a property
1065// `listener` which contains the original listener bound above
1066const listeners = emitter.rawListeners('log');
1067const logFnWrapper = listeners[0];
1068
1069// Logs "log once" to the console and does not unbind the `once` event
1070logFnWrapper.listener();
1071
1072// Logs "log once" to the console and removes the listener
1073logFnWrapper();
1074
1075emitter.on('log', () => console.log('log persistently'));
1076// Will return a new Array with a single function bound by `.on()` above
1077const newListeners = emitter.rawListeners('log');
1078
1079// Logs "log persistently" twice
1080newListeners[0]();
1081emitter.emit('log');
1082```
1083
1084### `emitter[Symbol.for('nodejs.rejection')](err, eventName[, ...args])`
1085
1086<!-- YAML
1087added:
1088 - v13.4.0
1089 - v12.16.0
1090changes:
1091  - version:
1092    - v17.4.0
1093    - v16.14.0
1094    pr-url: https://github.com/nodejs/node/pull/41267
1095    description: No longer experimental.
1096-->
1097
1098* `err` Error
1099* `eventName` {string|symbol}
1100* `...args` {any}
1101
1102The `Symbol.for('nodejs.rejection')` method is called in case a
1103promise rejection happens when emitting an event and
1104[`captureRejections`][capturerejections] is enabled on the emitter.
1105It is possible to use [`events.captureRejectionSymbol`][rejectionsymbol] in
1106place of `Symbol.for('nodejs.rejection')`.
1107
1108```mjs
1109import { EventEmitter, captureRejectionSymbol } from 'node:events';
1110
1111class MyClass extends EventEmitter {
1112  constructor() {
1113    super({ captureRejections: true });
1114  }
1115
1116  [captureRejectionSymbol](err, event, ...args) {
1117    console.log('rejection happened for', event, 'with', err, ...args);
1118    this.destroy(err);
1119  }
1120
1121  destroy(err) {
1122    // Tear the resource down here.
1123  }
1124}
1125```
1126
1127```cjs
1128const { EventEmitter, captureRejectionSymbol } = require('node:events');
1129
1130class MyClass extends EventEmitter {
1131  constructor() {
1132    super({ captureRejections: true });
1133  }
1134
1135  [captureRejectionSymbol](err, event, ...args) {
1136    console.log('rejection happened for', event, 'with', err, ...args);
1137    this.destroy(err);
1138  }
1139
1140  destroy(err) {
1141    // Tear the resource down here.
1142  }
1143}
1144```
1145
1146## `events.defaultMaxListeners`
1147
1148<!-- YAML
1149added: v0.11.2
1150-->
1151
1152By default, a maximum of `10` listeners can be registered for any single
1153event. This limit can be changed for individual `EventEmitter` instances
1154using the [`emitter.setMaxListeners(n)`][] method. To change the default
1155for _all_ `EventEmitter` instances, the `events.defaultMaxListeners`
1156property can be used. If this value is not a positive number, a `RangeError`
1157is thrown.
1158
1159Take caution when setting the `events.defaultMaxListeners` because the
1160change affects _all_ `EventEmitter` instances, including those created before
1161the change is made. However, calling [`emitter.setMaxListeners(n)`][] still has
1162precedence over `events.defaultMaxListeners`.
1163
1164This is not a hard limit. The `EventEmitter` instance will allow
1165more listeners to be added but will output a trace warning to stderr indicating
1166that a "possible EventEmitter memory leak" has been detected. For any single
1167`EventEmitter`, the `emitter.getMaxListeners()` and `emitter.setMaxListeners()`
1168methods can be used to temporarily avoid this warning:
1169
1170```mjs
1171import { EventEmitter } from 'node:events';
1172const emitter = new EventEmitter();
1173emitter.setMaxListeners(emitter.getMaxListeners() + 1);
1174emitter.once('event', () => {
1175  // do stuff
1176  emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
1177});
1178```
1179
1180```cjs
1181const EventEmitter = require('node:events');
1182const emitter = new EventEmitter();
1183emitter.setMaxListeners(emitter.getMaxListeners() + 1);
1184emitter.once('event', () => {
1185  // do stuff
1186  emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
1187});
1188```
1189
1190The [`--trace-warnings`][] command-line flag can be used to display the
1191stack trace for such warnings.
1192
1193The emitted warning can be inspected with [`process.on('warning')`][] and will
1194have the additional `emitter`, `type`, and `count` properties, referring to
1195the event emitter instance, the event's name and the number of attached
1196listeners, respectively.
1197Its `name` property is set to `'MaxListenersExceededWarning'`.
1198
1199## `events.errorMonitor`
1200
1201<!-- YAML
1202added:
1203 - v13.6.0
1204 - v12.17.0
1205-->
1206
1207This symbol shall be used to install a listener for only monitoring `'error'`
1208events. Listeners installed using this symbol are called before the regular
1209`'error'` listeners are called.
1210
1211Installing a listener using this symbol does not change the behavior once an
1212`'error'` event is emitted. Therefore, the process will still crash if no
1213regular `'error'` listener is installed.
1214
1215## `events.getEventListeners(emitterOrTarget, eventName)`
1216
1217<!-- YAML
1218added:
1219 - v15.2.0
1220 - v14.17.0
1221-->
1222
1223* `emitterOrTarget` {EventEmitter|EventTarget}
1224* `eventName` {string|symbol}
1225* Returns: {Function\[]}
1226
1227Returns a copy of the array of listeners for the event named `eventName`.
1228
1229For `EventEmitter`s this behaves exactly the same as calling `.listeners` on
1230the emitter.
1231
1232For `EventTarget`s this is the only way to get the event listeners for the
1233event target. This is useful for debugging and diagnostic purposes.
1234
1235```mjs
1236import { getEventListeners, EventEmitter } from 'node:events';
1237
1238{
1239  const ee = new EventEmitter();
1240  const listener = () => console.log('Events are fun');
1241  ee.on('foo', listener);
1242  console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
1243}
1244{
1245  const et = new EventTarget();
1246  const listener = () => console.log('Events are fun');
1247  et.addEventListener('foo', listener);
1248  console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
1249}
1250```
1251
1252```cjs
1253const { getEventListeners, EventEmitter } = require('node:events');
1254
1255{
1256  const ee = new EventEmitter();
1257  const listener = () => console.log('Events are fun');
1258  ee.on('foo', listener);
1259  console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
1260}
1261{
1262  const et = new EventTarget();
1263  const listener = () => console.log('Events are fun');
1264  et.addEventListener('foo', listener);
1265  console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
1266}
1267```
1268
1269## `events.getMaxListeners(emitterOrTarget)`
1270
1271<!-- YAML
1272added: v18.17.0
1273-->
1274
1275* `emitterOrTarget` {EventEmitter|EventTarget}
1276* Returns: {number}
1277
1278Returns the currently set max amount of listeners.
1279
1280For `EventEmitter`s this behaves exactly the same as calling `.getMaxListeners` on
1281the emitter.
1282
1283For `EventTarget`s this is the only way to get the max event listeners for the
1284event target. If the number of event handlers on a single EventTarget exceeds
1285the max set, the EventTarget will print a warning.
1286
1287```mjs
1288import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
1289
1290{
1291  const ee = new EventEmitter();
1292  console.log(getMaxListeners(ee)); // 10
1293  setMaxListeners(11, ee);
1294  console.log(getMaxListeners(ee)); // 11
1295}
1296{
1297  const et = new EventTarget();
1298  console.log(getMaxListeners(et)); // 10
1299  setMaxListeners(11, et);
1300  console.log(getMaxListeners(et)); // 11
1301}
1302```
1303
1304```cjs
1305const { getMaxListeners, setMaxListeners, EventEmitter } = require('node:events');
1306
1307{
1308  const ee = new EventEmitter();
1309  console.log(getMaxListeners(ee)); // 10
1310  setMaxListeners(11, ee);
1311  console.log(getMaxListeners(ee)); // 11
1312}
1313{
1314  const et = new EventTarget();
1315  console.log(getMaxListeners(et)); // 10
1316  setMaxListeners(11, et);
1317  console.log(getMaxListeners(et)); // 11
1318}
1319```
1320
1321## `events.once(emitter, name[, options])`
1322
1323<!-- YAML
1324added:
1325 - v11.13.0
1326 - v10.16.0
1327changes:
1328  - version: v15.0.0
1329    pr-url: https://github.com/nodejs/node/pull/34912
1330    description: The `signal` option is supported now.
1331-->
1332
1333* `emitter` {EventEmitter}
1334* `name` {string}
1335* `options` {Object}
1336  * `signal` {AbortSignal} Can be used to cancel waiting for the event.
1337* Returns: {Promise}
1338
1339Creates a `Promise` that is fulfilled when the `EventEmitter` emits the given
1340event or that is rejected if the `EventEmitter` emits `'error'` while waiting.
1341The `Promise` will resolve with an array of all the arguments emitted to the
1342given event.
1343
1344This method is intentionally generic and works with the web platform
1345[EventTarget][WHATWG-EventTarget] interface, which has no special
1346`'error'` event semantics and does not listen to the `'error'` event.
1347
1348```mjs
1349import { once, EventEmitter } from 'node:events';
1350import process from 'node:process';
1351
1352const ee = new EventEmitter();
1353
1354process.nextTick(() => {
1355  ee.emit('myevent', 42);
1356});
1357
1358const [value] = await once(ee, 'myevent');
1359console.log(value);
1360
1361const err = new Error('kaboom');
1362process.nextTick(() => {
1363  ee.emit('error', err);
1364});
1365
1366try {
1367  await once(ee, 'myevent');
1368} catch (err) {
1369  console.error('error happened', err);
1370}
1371```
1372
1373```cjs
1374const { once, EventEmitter } = require('node:events');
1375
1376async function run() {
1377  const ee = new EventEmitter();
1378
1379  process.nextTick(() => {
1380    ee.emit('myevent', 42);
1381  });
1382
1383  const [value] = await once(ee, 'myevent');
1384  console.log(value);
1385
1386  const err = new Error('kaboom');
1387  process.nextTick(() => {
1388    ee.emit('error', err);
1389  });
1390
1391  try {
1392    await once(ee, 'myevent');
1393  } catch (err) {
1394    console.error('error happened', err);
1395  }
1396}
1397
1398run();
1399```
1400
1401The special handling of the `'error'` event is only used when `events.once()`
1402is used to wait for another event. If `events.once()` is used to wait for the
1403'`error'` event itself, then it is treated as any other kind of event without
1404special handling:
1405
1406```mjs
1407import { EventEmitter, once } from 'node:events';
1408
1409const ee = new EventEmitter();
1410
1411once(ee, 'error')
1412  .then(([err]) => console.log('ok', err.message))
1413  .catch((err) => console.error('error', err.message));
1414
1415ee.emit('error', new Error('boom'));
1416
1417// Prints: ok boom
1418```
1419
1420```cjs
1421const { EventEmitter, once } = require('node:events');
1422
1423const ee = new EventEmitter();
1424
1425once(ee, 'error')
1426  .then(([err]) => console.log('ok', err.message))
1427  .catch((err) => console.error('error', err.message));
1428
1429ee.emit('error', new Error('boom'));
1430
1431// Prints: ok boom
1432```
1433
1434An {AbortSignal} can be used to cancel waiting for the event:
1435
1436```mjs
1437import { EventEmitter, once } from 'node:events';
1438
1439const ee = new EventEmitter();
1440const ac = new AbortController();
1441
1442async function foo(emitter, event, signal) {
1443  try {
1444    await once(emitter, event, { signal });
1445    console.log('event emitted!');
1446  } catch (error) {
1447    if (error.name === 'AbortError') {
1448      console.error('Waiting for the event was canceled!');
1449    } else {
1450      console.error('There was an error', error.message);
1451    }
1452  }
1453}
1454
1455foo(ee, 'foo', ac.signal);
1456ac.abort(); // Abort waiting for the event
1457ee.emit('foo'); // Prints: Waiting for the event was canceled!
1458```
1459
1460```cjs
1461const { EventEmitter, once } = require('node:events');
1462
1463const ee = new EventEmitter();
1464const ac = new AbortController();
1465
1466async function foo(emitter, event, signal) {
1467  try {
1468    await once(emitter, event, { signal });
1469    console.log('event emitted!');
1470  } catch (error) {
1471    if (error.name === 'AbortError') {
1472      console.error('Waiting for the event was canceled!');
1473    } else {
1474      console.error('There was an error', error.message);
1475    }
1476  }
1477}
1478
1479foo(ee, 'foo', ac.signal);
1480ac.abort(); // Abort waiting for the event
1481ee.emit('foo'); // Prints: Waiting for the event was canceled!
1482```
1483
1484### Awaiting multiple events emitted on `process.nextTick()`
1485
1486There is an edge case worth noting when using the `events.once()` function
1487to await multiple events emitted on in the same batch of `process.nextTick()`
1488operations, or whenever multiple events are emitted synchronously. Specifically,
1489because the `process.nextTick()` queue is drained before the `Promise` microtask
1490queue, and because `EventEmitter` emits all events synchronously, it is possible
1491for `events.once()` to miss an event.
1492
1493```mjs
1494import { EventEmitter, once } from 'node:events';
1495import process from 'node:process';
1496
1497const myEE = new EventEmitter();
1498
1499async function foo() {
1500  await once(myEE, 'bar');
1501  console.log('bar');
1502
1503  // This Promise will never resolve because the 'foo' event will
1504  // have already been emitted before the Promise is created.
1505  await once(myEE, 'foo');
1506  console.log('foo');
1507}
1508
1509process.nextTick(() => {
1510  myEE.emit('bar');
1511  myEE.emit('foo');
1512});
1513
1514foo().then(() => console.log('done'));
1515```
1516
1517```cjs
1518const { EventEmitter, once } = require('node:events');
1519
1520const myEE = new EventEmitter();
1521
1522async function foo() {
1523  await once(myEE, 'bar');
1524  console.log('bar');
1525
1526  // This Promise will never resolve because the 'foo' event will
1527  // have already been emitted before the Promise is created.
1528  await once(myEE, 'foo');
1529  console.log('foo');
1530}
1531
1532process.nextTick(() => {
1533  myEE.emit('bar');
1534  myEE.emit('foo');
1535});
1536
1537foo().then(() => console.log('done'));
1538```
1539
1540To catch both events, create each of the Promises _before_ awaiting either
1541of them, then it becomes possible to use `Promise.all()`, `Promise.race()`,
1542or `Promise.allSettled()`:
1543
1544```mjs
1545import { EventEmitter, once } from 'node:events';
1546import process from 'node:process';
1547
1548const myEE = new EventEmitter();
1549
1550async function foo() {
1551  await Promise.all([once(myEE, 'bar'), once(myEE, 'foo')]);
1552  console.log('foo', 'bar');
1553}
1554
1555process.nextTick(() => {
1556  myEE.emit('bar');
1557  myEE.emit('foo');
1558});
1559
1560foo().then(() => console.log('done'));
1561```
1562
1563```cjs
1564const { EventEmitter, once } = require('node:events');
1565
1566const myEE = new EventEmitter();
1567
1568async function foo() {
1569  await Promise.all([once(myEE, 'bar'), once(myEE, 'foo')]);
1570  console.log('foo', 'bar');
1571}
1572
1573process.nextTick(() => {
1574  myEE.emit('bar');
1575  myEE.emit('foo');
1576});
1577
1578foo().then(() => console.log('done'));
1579```
1580
1581## `events.captureRejections`
1582
1583<!-- YAML
1584added:
1585 - v13.4.0
1586 - v12.16.0
1587changes:
1588  - version:
1589    - v17.4.0
1590    - v16.14.0
1591    pr-url: https://github.com/nodejs/node/pull/41267
1592    description: No longer experimental.
1593-->
1594
1595Value: {boolean}
1596
1597Change the default `captureRejections` option on all new `EventEmitter` objects.
1598
1599## `events.captureRejectionSymbol`
1600
1601<!-- YAML
1602added:
1603  - v13.4.0
1604  - v12.16.0
1605changes:
1606  - version:
1607    - v17.4.0
1608    - v16.14.0
1609    pr-url: https://github.com/nodejs/node/pull/41267
1610    description: No longer experimental.
1611-->
1612
1613Value: `Symbol.for('nodejs.rejection')`
1614
1615See how to write a custom [rejection handler][rejection].
1616
1617## `events.listenerCount(emitter, eventName)`
1618
1619<!-- YAML
1620added: v0.9.12
1621deprecated: v3.2.0
1622-->
1623
1624> Stability: 0 - Deprecated: Use [`emitter.listenerCount()`][] instead.
1625
1626* `emitter` {EventEmitter} The emitter to query
1627* `eventName` {string|symbol} The event name
1628
1629A class method that returns the number of listeners for the given `eventName`
1630registered on the given `emitter`.
1631
1632```mjs
1633import { EventEmitter, listenerCount } from 'node:events';
1634
1635const myEmitter = new EventEmitter();
1636myEmitter.on('event', () => {});
1637myEmitter.on('event', () => {});
1638console.log(listenerCount(myEmitter, 'event'));
1639// Prints: 2
1640```
1641
1642```cjs
1643const { EventEmitter, listenerCount } = require('node:events');
1644
1645const myEmitter = new EventEmitter();
1646myEmitter.on('event', () => {});
1647myEmitter.on('event', () => {});
1648console.log(listenerCount(myEmitter, 'event'));
1649// Prints: 2
1650```
1651
1652## `events.on(emitter, eventName[, options])`
1653
1654<!-- YAML
1655added:
1656 - v13.6.0
1657 - v12.16.0
1658-->
1659
1660* `emitter` {EventEmitter}
1661* `eventName` {string|symbol} The name of the event being listened for
1662* `options` {Object}
1663  * `signal` {AbortSignal} Can be used to cancel awaiting events.
1664* Returns: {AsyncIterator} that iterates `eventName` events emitted by the `emitter`
1665
1666```mjs
1667import { on, EventEmitter } from 'node:events';
1668import process from 'node:process';
1669
1670const ee = new EventEmitter();
1671
1672// Emit later on
1673process.nextTick(() => {
1674  ee.emit('foo', 'bar');
1675  ee.emit('foo', 42);
1676});
1677
1678for await (const event of on(ee, 'foo')) {
1679  // The execution of this inner block is synchronous and it
1680  // processes one event at a time (even with await). Do not use
1681  // if concurrent execution is required.
1682  console.log(event); // prints ['bar'] [42]
1683}
1684// Unreachable here
1685```
1686
1687```cjs
1688const { on, EventEmitter } = require('node:events');
1689
1690(async () => {
1691  const ee = new EventEmitter();
1692
1693  // Emit later on
1694  process.nextTick(() => {
1695    ee.emit('foo', 'bar');
1696    ee.emit('foo', 42);
1697  });
1698
1699  for await (const event of on(ee, 'foo')) {
1700    // The execution of this inner block is synchronous and it
1701    // processes one event at a time (even with await). Do not use
1702    // if concurrent execution is required.
1703    console.log(event); // prints ['bar'] [42]
1704  }
1705  // Unreachable here
1706})();
1707```
1708
1709Returns an `AsyncIterator` that iterates `eventName` events. It will throw
1710if the `EventEmitter` emits `'error'`. It removes all listeners when
1711exiting the loop. The `value` returned by each iteration is an array
1712composed of the emitted event arguments.
1713
1714An {AbortSignal} can be used to cancel waiting on events:
1715
1716```mjs
1717import { on, EventEmitter } from 'node:events';
1718import process from 'node:process';
1719
1720const ac = new AbortController();
1721
1722(async () => {
1723  const ee = new EventEmitter();
1724
1725  // Emit later on
1726  process.nextTick(() => {
1727    ee.emit('foo', 'bar');
1728    ee.emit('foo', 42);
1729  });
1730
1731  for await (const event of on(ee, 'foo', { signal: ac.signal })) {
1732    // The execution of this inner block is synchronous and it
1733    // processes one event at a time (even with await). Do not use
1734    // if concurrent execution is required.
1735    console.log(event); // prints ['bar'] [42]
1736  }
1737  // Unreachable here
1738})();
1739
1740process.nextTick(() => ac.abort());
1741```
1742
1743```cjs
1744const { on, EventEmitter } = require('node:events');
1745
1746const ac = new AbortController();
1747
1748(async () => {
1749  const ee = new EventEmitter();
1750
1751  // Emit later on
1752  process.nextTick(() => {
1753    ee.emit('foo', 'bar');
1754    ee.emit('foo', 42);
1755  });
1756
1757  for await (const event of on(ee, 'foo', { signal: ac.signal })) {
1758    // The execution of this inner block is synchronous and it
1759    // processes one event at a time (even with await). Do not use
1760    // if concurrent execution is required.
1761    console.log(event); // prints ['bar'] [42]
1762  }
1763  // Unreachable here
1764})();
1765
1766process.nextTick(() => ac.abort());
1767```
1768
1769## `events.setMaxListeners(n[, ...eventTargets])`
1770
1771<!-- YAML
1772added: v15.4.0
1773-->
1774
1775* `n` {number} A non-negative number. The maximum number of listeners per
1776  `EventTarget` event.
1777* `...eventsTargets` {EventTarget\[]|EventEmitter\[]} Zero or more {EventTarget}
1778  or {EventEmitter} instances. If none are specified, `n` is set as the default
1779  max for all newly created {EventTarget} and {EventEmitter} objects.
1780
1781```mjs
1782import { setMaxListeners, EventEmitter } from 'node:events';
1783
1784const target = new EventTarget();
1785const emitter = new EventEmitter();
1786
1787setMaxListeners(5, target, emitter);
1788```
1789
1790```cjs
1791const {
1792  setMaxListeners,
1793  EventEmitter,
1794} = require('node:events');
1795
1796const target = new EventTarget();
1797const emitter = new EventEmitter();
1798
1799setMaxListeners(5, target, emitter);
1800```
1801
1802## `events.addAbortListener(signal, resource)`
1803
1804<!-- YAML
1805added: v18.18.0
1806-->
1807
1808> Stability: 1 - Experimental
1809
1810* `signal` {AbortSignal}
1811* `listener` {Function|EventListener}
1812* Returns: {Disposable} that removes the `abort` listener.
1813
1814Listens once to the `abort` event on the provided `signal`.
1815
1816Listening to the `abort` event on abort signals is unsafe and may
1817lead to resource leaks since another third party with the signal can
1818call [`e.stopImmediatePropagation()`][]. Unfortunately Node.js cannot change
1819this since it would violate the web standard. Additionally, the original
1820API makes it easy to forget to remove listeners.
1821
1822This API allows safely using `AbortSignal`s in Node.js APIs by solving these
1823two issues by listening to the event such that `stopImmediatePropagation` does
1824not prevent the listener from running.
1825
1826Returns a disposable so that it may be unsubscribed from more easily.
1827
1828```cjs
1829const { addAbortListener } = require('node:events');
1830
1831function example(signal) {
1832  let disposable;
1833  try {
1834    signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
1835    disposable = addAbortListener(signal, (e) => {
1836      // Do something when signal is aborted.
1837    });
1838  } finally {
1839    disposable?.[Symbol.dispose]();
1840  }
1841}
1842```
1843
1844```mjs
1845import { addAbortListener } from 'node:events';
1846
1847function example(signal) {
1848  let disposable;
1849  try {
1850    signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
1851    disposable = addAbortListener(signal, (e) => {
1852      // Do something when signal is aborted.
1853    });
1854  } finally {
1855    disposable?.[Symbol.dispose]();
1856  }
1857}
1858```
1859
1860## Class: `events.EventEmitterAsyncResource extends EventEmitter`
1861
1862<!-- YAML
1863added:
1864  - v17.4.0
1865  - v16.14.0
1866-->
1867
1868Integrates `EventEmitter` with {AsyncResource} for `EventEmitter`s that
1869require manual async tracking. Specifically, all events emitted by instances
1870of `events.EventEmitterAsyncResource` will run within its [async context][].
1871
1872```mjs
1873import { EventEmitterAsyncResource, EventEmitter } from 'node:events';
1874import { notStrictEqual, strictEqual } from 'node:assert';
1875import { executionAsyncId, triggerAsyncId } from 'node:async_hooks';
1876
1877// Async tracking tooling will identify this as 'Q'.
1878const ee1 = new EventEmitterAsyncResource({ name: 'Q' });
1879
1880// 'foo' listeners will run in the EventEmitters async context.
1881ee1.on('foo', () => {
1882  strictEqual(executionAsyncId(), ee1.asyncId);
1883  strictEqual(triggerAsyncId(), ee1.triggerAsyncId);
1884});
1885
1886const ee2 = new EventEmitter();
1887
1888// 'foo' listeners on ordinary EventEmitters that do not track async
1889// context, however, run in the same async context as the emit().
1890ee2.on('foo', () => {
1891  notStrictEqual(executionAsyncId(), ee2.asyncId);
1892  notStrictEqual(triggerAsyncId(), ee2.triggerAsyncId);
1893});
1894
1895Promise.resolve().then(() => {
1896  ee1.emit('foo');
1897  ee2.emit('foo');
1898});
1899```
1900
1901```cjs
1902const { EventEmitterAsyncResource, EventEmitter } = require('node:events');
1903const { notStrictEqual, strictEqual } = require('node:assert');
1904const { executionAsyncId, triggerAsyncId } = require('node:async_hooks');
1905
1906// Async tracking tooling will identify this as 'Q'.
1907const ee1 = new EventEmitterAsyncResource({ name: 'Q' });
1908
1909// 'foo' listeners will run in the EventEmitters async context.
1910ee1.on('foo', () => {
1911  strictEqual(executionAsyncId(), ee1.asyncId);
1912  strictEqual(triggerAsyncId(), ee1.triggerAsyncId);
1913});
1914
1915const ee2 = new EventEmitter();
1916
1917// 'foo' listeners on ordinary EventEmitters that do not track async
1918// context, however, run in the same async context as the emit().
1919ee2.on('foo', () => {
1920  notStrictEqual(executionAsyncId(), ee2.asyncId);
1921  notStrictEqual(triggerAsyncId(), ee2.triggerAsyncId);
1922});
1923
1924Promise.resolve().then(() => {
1925  ee1.emit('foo');
1926  ee2.emit('foo');
1927});
1928```
1929
1930The `EventEmitterAsyncResource` class has the same methods and takes the
1931same options as `EventEmitter` and `AsyncResource` themselves.
1932
1933### `new events.EventEmitterAsyncResource([options])`
1934
1935* `options` {Object}
1936  * `captureRejections` {boolean} It enables
1937    [automatic capturing of promise rejection][capturerejections].
1938    **Default:** `false`.
1939  * `name` {string} The type of async event. **Default:** [`new.target.name`][].
1940  * `triggerAsyncId` {number} The ID of the execution context that created this
1941    async event. **Default:** `executionAsyncId()`.
1942  * `requireManualDestroy` {boolean} If set to `true`, disables `emitDestroy`
1943    when the object is garbage collected. This usually does not need to be set
1944    (even if `emitDestroy` is called manually), unless the resource's `asyncId`
1945    is retrieved and the sensitive API's `emitDestroy` is called with it.
1946    When set to `false`, the `emitDestroy` call on garbage collection
1947    will only take place if there is at least one active `destroy` hook.
1948    **Default:** `false`.
1949
1950### `eventemitterasyncresource.asyncId`
1951
1952* Type: {number} The unique `asyncId` assigned to the resource.
1953
1954### `eventemitterasyncresource.asyncResource`
1955
1956* Type: The underlying {AsyncResource}.
1957
1958The returned `AsyncResource` object has an additional `eventEmitter` property
1959that provides a reference to this `EventEmitterAsyncResource`.
1960
1961### `eventemitterasyncresource.emitDestroy()`
1962
1963Call all `destroy` hooks. This should only ever be called once. An error will
1964be thrown if it is called more than once. This **must** be manually called. If
1965the resource is left to be collected by the GC then the `destroy` hooks will
1966never be called.
1967
1968### `eventemitterasyncresource.triggerAsyncId`
1969
1970* Type: {number} The same `triggerAsyncId` that is passed to the
1971  `AsyncResource` constructor.
1972
1973<a id="event-target-and-event-api"></a>
1974
1975## `EventTarget` and `Event` API
1976
1977<!-- YAML
1978added: v14.5.0
1979changes:
1980  - version: v16.0.0
1981    pr-url: https://github.com/nodejs/node/pull/37237
1982    description: changed EventTarget error handling.
1983  - version: v15.4.0
1984    pr-url: https://github.com/nodejs/node/pull/35949
1985    description: No longer experimental.
1986  - version: v15.0.0
1987    pr-url: https://github.com/nodejs/node/pull/35496
1988    description:
1989      The `EventTarget` and `Event` classes are now available as globals.
1990-->
1991
1992The `EventTarget` and `Event` objects are a Node.js-specific implementation
1993of the [`EventTarget` Web API][] that are exposed by some Node.js core APIs.
1994
1995```js
1996const target = new EventTarget();
1997
1998target.addEventListener('foo', (event) => {
1999  console.log('foo event happened!');
2000});
2001```
2002
2003### Node.js `EventTarget` vs. DOM `EventTarget`
2004
2005There are two key differences between the Node.js `EventTarget` and the
2006[`EventTarget` Web API][]:
2007
20081. Whereas DOM `EventTarget` instances _may_ be hierarchical, there is no
2009   concept of hierarchy and event propagation in Node.js. That is, an event
2010   dispatched to an `EventTarget` does not propagate through a hierarchy of
2011   nested target objects that may each have their own set of handlers for the
2012   event.
20132. In the Node.js `EventTarget`, if an event listener is an async function
2014   or returns a `Promise`, and the returned `Promise` rejects, the rejection
2015   is automatically captured and handled the same way as a listener that
2016   throws synchronously (see [`EventTarget` error handling][] for details).
2017
2018### `NodeEventTarget` vs. `EventEmitter`
2019
2020The `NodeEventTarget` object implements a modified subset of the
2021`EventEmitter` API that allows it to closely _emulate_ an `EventEmitter` in
2022certain situations. A `NodeEventTarget` is _not_ an instance of `EventEmitter`
2023and cannot be used in place of an `EventEmitter` in most cases.
2024
20251. Unlike `EventEmitter`, any given `listener` can be registered at most once
2026   per event `type`. Attempts to register a `listener` multiple times are
2027   ignored.
20282. The `NodeEventTarget` does not emulate the full `EventEmitter` API.
2029   Specifically the `prependListener()`, `prependOnceListener()`,
2030   `rawListeners()`, and `errorMonitor` APIs are not emulated.
2031   The `'newListener'` and `'removeListener'` events will also not be emitted.
20323. The `NodeEventTarget` does not implement any special default behavior
2033   for events with type `'error'`.
20344. The `NodeEventTarget` supports `EventListener` objects as well as
2035   functions as handlers for all event types.
2036
2037### Event listener
2038
2039Event listeners registered for an event `type` may either be JavaScript
2040functions or objects with a `handleEvent` property whose value is a function.
2041
2042In either case, the handler function is invoked with the `event` argument
2043passed to the `eventTarget.dispatchEvent()` function.
2044
2045Async functions may be used as event listeners. If an async handler function
2046rejects, the rejection is captured and handled as described in
2047[`EventTarget` error handling][].
2048
2049An error thrown by one handler function does not prevent the other handlers
2050from being invoked.
2051
2052The return value of a handler function is ignored.
2053
2054Handlers are always invoked in the order they were added.
2055
2056Handler functions may mutate the `event` object.
2057
2058```js
2059function handler1(event) {
2060  console.log(event.type);  // Prints 'foo'
2061  event.a = 1;
2062}
2063
2064async function handler2(event) {
2065  console.log(event.type);  // Prints 'foo'
2066  console.log(event.a);  // Prints 1
2067}
2068
2069const handler3 = {
2070  handleEvent(event) {
2071    console.log(event.type);  // Prints 'foo'
2072  },
2073};
2074
2075const handler4 = {
2076  async handleEvent(event) {
2077    console.log(event.type);  // Prints 'foo'
2078  },
2079};
2080
2081const target = new EventTarget();
2082
2083target.addEventListener('foo', handler1);
2084target.addEventListener('foo', handler2);
2085target.addEventListener('foo', handler3);
2086target.addEventListener('foo', handler4, { once: true });
2087```
2088
2089### `EventTarget` error handling
2090
2091When a registered event listener throws (or returns a Promise that rejects),
2092by default the error is treated as an uncaught exception on
2093`process.nextTick()`. This means uncaught exceptions in `EventTarget`s will
2094terminate the Node.js process by default.
2095
2096Throwing within an event listener will _not_ stop the other registered handlers
2097from being invoked.
2098
2099The `EventTarget` does not implement any special default handling for `'error'`
2100type events like `EventEmitter`.
2101
2102Currently errors are first forwarded to the `process.on('error')` event
2103before reaching `process.on('uncaughtException')`. This behavior is
2104deprecated and will change in a future release to align `EventTarget` with
2105other Node.js APIs. Any code relying on the `process.on('error')` event should
2106be aligned with the new behavior.
2107
2108### Class: `Event`
2109
2110<!-- YAML
2111added: v14.5.0
2112changes:
2113  - version: v15.0.0
2114    pr-url: https://github.com/nodejs/node/pull/35496
2115    description: The `Event` class is now available through the global object.
2116-->
2117
2118The `Event` object is an adaptation of the [`Event` Web API][]. Instances
2119are created internally by Node.js.
2120
2121#### `event.bubbles`
2122
2123<!-- YAML
2124added: v14.5.0
2125-->
2126
2127* Type: {boolean} Always returns `false`.
2128
2129This is not used in Node.js and is provided purely for completeness.
2130
2131#### `event.cancelBubble`
2132
2133<!-- YAML
2134added: v14.5.0
2135-->
2136
2137> Stability: 3 - Legacy: Use [`event.stopPropagation()`][] instead.
2138
2139* Type: {boolean}
2140
2141Alias for `event.stopPropagation()` if set to `true`. This is not used
2142in Node.js and is provided purely for completeness.
2143
2144#### `event.cancelable`
2145
2146<!-- YAML
2147added: v14.5.0
2148-->
2149
2150* Type: {boolean} True if the event was created with the `cancelable` option.
2151
2152#### `event.composed`
2153
2154<!-- YAML
2155added: v14.5.0
2156-->
2157
2158* Type: {boolean} Always returns `false`.
2159
2160This is not used in Node.js and is provided purely for completeness.
2161
2162#### `event.composedPath()`
2163
2164<!-- YAML
2165added: v14.5.0
2166-->
2167
2168Returns an array containing the current `EventTarget` as the only entry or
2169empty if the event is not being dispatched. This is not used in
2170Node.js and is provided purely for completeness.
2171
2172#### `event.currentTarget`
2173
2174<!-- YAML
2175added: v14.5.0
2176-->
2177
2178* Type: {EventTarget} The `EventTarget` dispatching the event.
2179
2180Alias for `event.target`.
2181
2182#### `event.defaultPrevented`
2183
2184<!-- YAML
2185added: v14.5.0
2186-->
2187
2188* Type: {boolean}
2189
2190Is `true` if `cancelable` is `true` and `event.preventDefault()` has been
2191called.
2192
2193#### `event.eventPhase`
2194
2195<!-- YAML
2196added: v14.5.0
2197-->
2198
2199* Type: {number} Returns `0` while an event is not being dispatched, `2` while
2200  it is being dispatched.
2201
2202This is not used in Node.js and is provided purely for completeness.
2203
2204#### `event.isTrusted`
2205
2206<!-- YAML
2207added: v14.5.0
2208-->
2209
2210* Type: {boolean}
2211
2212The {AbortSignal} `"abort"` event is emitted with `isTrusted` set to `true`. The
2213value is `false` in all other cases.
2214
2215#### `event.preventDefault()`
2216
2217<!-- YAML
2218added: v14.5.0
2219-->
2220
2221Sets the `defaultPrevented` property to `true` if `cancelable` is `true`.
2222
2223#### `event.returnValue`
2224
2225<!-- YAML
2226added: v14.5.0
2227-->
2228
2229> Stability: 3 - Legacy: Use [`event.defaultPrevented`][] instead.
2230
2231* Type: {boolean} True if the event has not been canceled.
2232
2233The value of `event.returnValue` is always the opposite of `event.defaultPrevented`.
2234This is not used in Node.js and is provided purely for completeness.
2235
2236#### `event.srcElement`
2237
2238<!-- YAML
2239added: v14.5.0
2240-->
2241
2242> Stability: 3 - Legacy: Use [`event.target`][] instead.
2243
2244* Type: {EventTarget} The `EventTarget` dispatching the event.
2245
2246Alias for `event.target`.
2247
2248#### `event.stopImmediatePropagation()`
2249
2250<!-- YAML
2251added: v14.5.0
2252-->
2253
2254Stops the invocation of event listeners after the current one completes.
2255
2256#### `event.stopPropagation()`
2257
2258<!-- YAML
2259added: v14.5.0
2260-->
2261
2262This is not used in Node.js and is provided purely for completeness.
2263
2264#### `event.target`
2265
2266<!-- YAML
2267added: v14.5.0
2268-->
2269
2270* Type: {EventTarget} The `EventTarget` dispatching the event.
2271
2272#### `event.timeStamp`
2273
2274<!-- YAML
2275added: v14.5.0
2276-->
2277
2278* Type: {number}
2279
2280The millisecond timestamp when the `Event` object was created.
2281
2282#### `event.type`
2283
2284<!-- YAML
2285added: v14.5.0
2286-->
2287
2288* Type: {string}
2289
2290The event type identifier.
2291
2292### Class: `EventTarget`
2293
2294<!-- YAML
2295added: v14.5.0
2296changes:
2297  - version: v15.0.0
2298    pr-url: https://github.com/nodejs/node/pull/35496
2299    description:
2300      The `EventTarget` class is now available through the global object.
2301-->
2302
2303#### `eventTarget.addEventListener(type, listener[, options])`
2304
2305<!-- YAML
2306added: v14.5.0
2307changes:
2308  - version: v15.4.0
2309    pr-url: https://github.com/nodejs/node/pull/36258
2310    description: add support for `signal` option.
2311-->
2312
2313* `type` {string}
2314* `listener` {Function|EventListener}
2315* `options` {Object}
2316  * `once` {boolean} When `true`, the listener is automatically removed
2317    when it is first invoked. **Default:** `false`.
2318  * `passive` {boolean} When `true`, serves as a hint that the listener will
2319    not call the `Event` object's `preventDefault()` method.
2320    **Default:** `false`.
2321  * `capture` {boolean} Not directly used by Node.js. Added for API
2322    completeness. **Default:** `false`.
2323  * `signal` {AbortSignal} The listener will be removed when the given
2324    AbortSignal object's `abort()` method is called.
2325
2326Adds a new handler for the `type` event. Any given `listener` is added
2327only once per `type` and per `capture` option value.
2328
2329If the `once` option is `true`, the `listener` is removed after the
2330next time a `type` event is dispatched.
2331
2332The `capture` option is not used by Node.js in any functional way other than
2333tracking registered event listeners per the `EventTarget` specification.
2334Specifically, the `capture` option is used as part of the key when registering
2335a `listener`. Any individual `listener` may be added once with
2336`capture = false`, and once with `capture = true`.
2337
2338```js
2339function handler(event) {}
2340
2341const target = new EventTarget();
2342target.addEventListener('foo', handler, { capture: true });  // first
2343target.addEventListener('foo', handler, { capture: false }); // second
2344
2345// Removes the second instance of handler
2346target.removeEventListener('foo', handler);
2347
2348// Removes the first instance of handler
2349target.removeEventListener('foo', handler, { capture: true });
2350```
2351
2352#### `eventTarget.dispatchEvent(event)`
2353
2354<!-- YAML
2355added: v14.5.0
2356-->
2357
2358* `event` {Event}
2359* Returns: {boolean} `true` if either event's `cancelable` attribute value is
2360  false or its `preventDefault()` method was not invoked, otherwise `false`.
2361
2362Dispatches the `event` to the list of handlers for `event.type`.
2363
2364The registered event listeners is synchronously invoked in the order they
2365were registered.
2366
2367#### `eventTarget.removeEventListener(type, listener[, options])`
2368
2369<!-- YAML
2370added: v14.5.0
2371-->
2372
2373* `type` {string}
2374* `listener` {Function|EventListener}
2375* `options` {Object}
2376  * `capture` {boolean}
2377
2378Removes the `listener` from the list of handlers for event `type`.
2379
2380### Class: `CustomEvent`
2381
2382<!-- YAML
2383added: v18.7.0
2384-->
2385
2386> Stability: 1 - Experimental.
2387
2388* Extends: {Event}
2389
2390The `CustomEvent` object is an adaptation of the [`CustomEvent` Web API][].
2391Instances are created internally by Node.js.
2392
2393#### `event.detail`
2394
2395<!-- YAML
2396added: v18.7.0
2397-->
2398
2399> Stability: 1 - Experimental.
2400
2401* Type: {any} Returns custom data passed when initializing.
2402
2403Read-only.
2404
2405### Class: `NodeEventTarget`
2406
2407<!-- YAML
2408added: v14.5.0
2409-->
2410
2411* Extends: {EventTarget}
2412
2413The `NodeEventTarget` is a Node.js-specific extension to `EventTarget`
2414that emulates a subset of the `EventEmitter` API.
2415
2416#### `nodeEventTarget.addListener(type, listener)`
2417
2418<!-- YAML
2419added: v14.5.0
2420-->
2421
2422* `type` {string}
2423
2424* `listener` {Function|EventListener}
2425
2426* Returns: {EventTarget} this
2427
2428Node.js-specific extension to the `EventTarget` class that emulates the
2429equivalent `EventEmitter` API. The only difference between `addListener()` and
2430`addEventListener()` is that `addListener()` will return a reference to the
2431`EventTarget`.
2432
2433#### `nodeEventTarget.emit(type, arg)`
2434
2435<!-- YAML
2436added: v15.2.0
2437-->
2438
2439* `type` {string}
2440* `arg` {any}
2441* Returns: {boolean} `true` if event listeners registered for the `type` exist,
2442  otherwise `false`.
2443
2444Node.js-specific extension to the `EventTarget` class that dispatches the
2445`arg` to the list of handlers for `type`.
2446
2447#### `nodeEventTarget.eventNames()`
2448
2449<!-- YAML
2450added: v14.5.0
2451-->
2452
2453* Returns: {string\[]}
2454
2455Node.js-specific extension to the `EventTarget` class that returns an array
2456of event `type` names for which event listeners are registered.
2457
2458#### `nodeEventTarget.listenerCount(type)`
2459
2460<!-- YAML
2461added: v14.5.0
2462-->
2463
2464* `type` {string}
2465
2466* Returns: {number}
2467
2468Node.js-specific extension to the `EventTarget` class that returns the number
2469of event listeners registered for the `type`.
2470
2471#### `nodeEventTarget.setMaxListeners(n)`
2472
2473<!-- YAML
2474added: v14.5.0
2475-->
2476
2477* `n` {number}
2478
2479Node.js-specific extension to the `EventTarget` class that sets the number
2480of max event listeners as `n`.
2481
2482#### `nodeEventTarget.getMaxListeners()`
2483
2484<!-- YAML
2485added: v14.5.0
2486-->
2487
2488* Returns: {number}
2489
2490Node.js-specific extension to the `EventTarget` class that returns the number
2491of max event listeners.
2492
2493#### `nodeEventTarget.off(type, listener[, options])`
2494
2495<!-- YAML
2496added: v14.5.0
2497-->
2498
2499* `type` {string}
2500
2501* `listener` {Function|EventListener}
2502
2503* `options` {Object}
2504  * `capture` {boolean}
2505
2506* Returns: {EventTarget} this
2507
2508Node.js-specific alias for `eventTarget.removeEventListener()`.
2509
2510#### `nodeEventTarget.on(type, listener)`
2511
2512<!-- YAML
2513added: v14.5.0
2514-->
2515
2516* `type` {string}
2517
2518* `listener` {Function|EventListener}
2519
2520* Returns: {EventTarget} this
2521
2522Node.js-specific alias for `eventTarget.addEventListener()`.
2523
2524#### `nodeEventTarget.once(type, listener)`
2525
2526<!-- YAML
2527added: v14.5.0
2528-->
2529
2530* `type` {string}
2531
2532* `listener` {Function|EventListener}
2533
2534* Returns: {EventTarget} this
2535
2536Node.js-specific extension to the `EventTarget` class that adds a `once`
2537listener for the given event `type`. This is equivalent to calling `on`
2538with the `once` option set to `true`.
2539
2540#### `nodeEventTarget.removeAllListeners([type])`
2541
2542<!-- YAML
2543added: v14.5.0
2544-->
2545
2546* `type` {string}
2547
2548* Returns: {EventTarget} this
2549
2550Node.js-specific extension to the `EventTarget` class. If `type` is specified,
2551removes all registered listeners for `type`, otherwise removes all registered
2552listeners.
2553
2554#### `nodeEventTarget.removeListener(type, listener[, options])`
2555
2556<!-- YAML
2557added: v14.5.0
2558-->
2559
2560* `type` {string}
2561
2562* `listener` {Function|EventListener}
2563
2564* `options` {Object}
2565  * `capture` {boolean}
2566
2567* Returns: {EventTarget} this
2568
2569Node.js-specific extension to the `EventTarget` class that removes the
2570`listener` for the given `type`. The only difference between `removeListener()`
2571and `removeEventListener()` is that `removeListener()` will return a reference
2572to the `EventTarget`.
2573
2574[WHATWG-EventTarget]: https://dom.spec.whatwg.org/#interface-eventtarget
2575[`--trace-warnings`]: cli.md#--trace-warnings
2576[`CustomEvent` Web API]: https://dom.spec.whatwg.org/#customevent
2577[`EventTarget` Web API]: https://dom.spec.whatwg.org/#eventtarget
2578[`EventTarget` error handling]: #eventtarget-error-handling
2579[`Event` Web API]: https://dom.spec.whatwg.org/#event
2580[`domain`]: domain.md
2581[`e.stopImmediatePropagation()`]: #eventstopimmediatepropagation
2582[`emitter.listenerCount()`]: #emitterlistenercounteventname-listener
2583[`emitter.removeListener()`]: #emitterremovelistenereventname-listener
2584[`emitter.setMaxListeners(n)`]: #emittersetmaxlistenersn
2585[`event.defaultPrevented`]: #eventdefaultprevented
2586[`event.stopPropagation()`]: #eventstoppropagation
2587[`event.target`]: #eventtarget
2588[`events.defaultMaxListeners`]: #eventsdefaultmaxlisteners
2589[`fs.ReadStream`]: fs.md#class-fsreadstream
2590[`net.Server`]: net.md#class-netserver
2591[`new.target.name`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new.target
2592[`process.on('warning')`]: process.md#event-warning
2593[async context]: async_context.md
2594[capturerejections]: #capture-rejections-of-promises
2595[error]: #error-events
2596[rejection]: #emittersymbolfornodejsrejectionerr-eventname-args
2597[rejectionsymbol]: #eventscapturerejectionsymbol
2598[stream]: stream.md
2599