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