| | |
| | | /** |
| | | * Much of the Node.js core API is built around an idiomatic asynchronous |
| | | * event-driven architecture in which certain kinds of objects (called "emitters") |
| | | * emit named events that cause `Function` objects ("listeners") to be called. |
| | | * |
| | | * For instance: a `net.Server` object emits an event each time a peer |
| | | * connects to it; a `fs.ReadStream` emits an event when the file is opened; |
| | | * a `stream` emits an event whenever data is available to be read. |
| | | * |
| | | * All objects that emit events are instances of the `EventEmitter` class. These |
| | | * objects expose an `eventEmitter.on()` function that allows one or more |
| | | * functions to be attached to named events emitted by the object. Typically, |
| | | * event names are camel-cased strings but any valid JavaScript property key |
| | | * can be used. |
| | | * |
| | | * When the `EventEmitter` object emits an event, all of the functions attached |
| | | * to that specific event are called _synchronously_. Any values returned by the |
| | | * called listeners are _ignored_ and discarded. |
| | | * |
| | | * The following example shows a simple `EventEmitter` instance with a single |
| | | * listener. The `eventEmitter.on()` method is used to register listeners, while |
| | | * the `eventEmitter.emit()` method is used to trigger the event. |
| | | * |
| | | * ```js |
| | | * import { EventEmitter } from 'node:events'; |
| | | * |
| | | * class MyEmitter extends EventEmitter {} |
| | | * |
| | | * const myEmitter = new MyEmitter(); |
| | | * myEmitter.on('event', () => { |
| | | * console.log('an event occurred!'); |
| | | * }); |
| | | * myEmitter.emit('event'); |
| | | * ``` |
| | | * @see [source](https://github.com/nodejs/node/blob/v25.x/lib/events.js) |
| | | */ |
| | | declare module "node:events" { |
| | | import { AsyncResource, AsyncResourceOptions } from "node:async_hooks"; |
| | | // #region Event map helpers |
| | |
| | | */ |
| | | class EventEmitter<T extends EventMap<T> = any> { |
| | | constructor(options?: EventEmitterOptions); |
| | | /** |
| | | * The `Symbol.for('nodejs.rejection')` method is called in case a |
| | | * promise rejection happens when emitting an event and |
| | | * `captureRejections` is enabled on the emitter. |
| | | * It is possible to use `events.captureRejectionSymbol` in |
| | | * place of `Symbol.for('nodejs.rejection')`. |
| | | * |
| | | * ```js |
| | | * import { EventEmitter, captureRejectionSymbol } from 'node:events'; |
| | | * |
| | | * class MyClass extends EventEmitter { |
| | | * constructor() { |
| | | * super({ captureRejections: true }); |
| | | * } |
| | | * |
| | | * [captureRejectionSymbol](err, event, ...args) { |
| | | * console.log('rejection happened for', event, 'with', err, ...args); |
| | | * this.destroy(err); |
| | | * } |
| | | * |
| | | * destroy(err) { |
| | | * // Tear the resource down here. |
| | | * } |
| | | * } |
| | | * ``` |
| | | * @since v13.4.0, v12.16.0 |
| | | */ |
| | | [EventEmitter.captureRejectionSymbol]?(error: Error, event: string | symbol, ...args: any[]): void; |
| | | /** |
| | | * Alias for `emitter.on(eventName, listener)`. |
| | | * @since v0.1.26 |
| | | */ |
| | | addListener<E extends string | symbol>(eventName: EventNames<T, E>, listener: Listener<T, E>): this; |
| | | /** |
| | | * Synchronously calls each of the listeners registered for the event named |
| | | * `eventName`, in the order they were registered, passing the supplied arguments |
| | | * to each. |
| | | * |
| | | * Returns `true` if the event had listeners, `false` otherwise. |
| | | * |
| | | * ```js |
| | | * import { EventEmitter } from 'node:events'; |
| | | * const myEmitter = new EventEmitter(); |
| | | * |
| | | * // First listener |
| | | * myEmitter.on('event', function firstListener() { |
| | | * console.log('Helloooo! first listener'); |
| | | * }); |
| | | * // Second listener |
| | | * myEmitter.on('event', function secondListener(arg1, arg2) { |
| | | * console.log(`event with parameters ${arg1}, ${arg2} in second listener`); |
| | | * }); |
| | | * // Third listener |
| | | * myEmitter.on('event', function thirdListener(...args) { |
| | | * const parameters = args.join(', '); |
| | | * console.log(`event with parameters ${parameters} in third listener`); |
| | | * }); |
| | | * |
| | | * console.log(myEmitter.listeners('event')); |
| | | * |
| | | * myEmitter.emit('event', 1, 2, 3, 4, 5); |
| | | * |
| | | * // Prints: |
| | | * // [ |
| | | * // [Function: firstListener], |
| | | * // [Function: secondListener], |
| | | * // [Function: thirdListener] |
| | | * // ] |
| | | * // Helloooo! first listener |
| | | * // event with parameters 1, 2 in second listener |
| | | * // event with parameters 1, 2, 3, 4, 5 in third listener |
| | | * ``` |
| | | * @since v0.1.26 |
| | | */ |
| | | emit<E extends string | symbol>(eventName: EventNames<T, E>, ...args: Args<T, E>): boolean; |
| | | /** |
| | | * Returns an array listing the events for which the emitter has registered |
| | | * listeners. |
| | | * |
| | | * ```js |
| | | * import { EventEmitter } from 'node:events'; |
| | | * |
| | | * const myEE = new EventEmitter(); |
| | | * myEE.on('foo', () => {}); |
| | | * myEE.on('bar', () => {}); |
| | | * |
| | | * const sym = Symbol('symbol'); |
| | | * myEE.on(sym, () => {}); |
| | | * |
| | | * console.log(myEE.eventNames()); |
| | | * // Prints: [ 'foo', 'bar', Symbol(symbol) ] |
| | | * ``` |
| | | * @since v6.0.0 |
| | | */ |
| | | eventNames(): (string | symbol)[]; |
| | | /** |
| | | * Returns the current max listener value for the `EventEmitter` which is either |
| | | * set by `emitter.setMaxListeners(n)` or defaults to |
| | | * `events.defaultMaxListeners`. |
| | | * @since v1.0.0 |
| | | */ |
| | | getMaxListeners(): number; |
| | | /** |
| | | * Returns the number of listeners listening for the event named `eventName`. |
| | | * If `listener` is provided, it will return how many times the listener is found |
| | | * in the list of the listeners of the event. |
| | | * @since v3.2.0 |
| | | * @param eventName The name of the event being listened for |
| | | * @param listener The event handler function |
| | | */ |
| | | listenerCount<E extends string | symbol>(eventName: EventNames<T, E>, listener?: Listener<T, E>): number; |
| | | /** |
| | | * Returns a copy of the array of listeners for the event named `eventName`. |
| | | * |
| | | * ```js |
| | | * server.on('connection', (stream) => { |
| | | * console.log('someone connected!'); |
| | | * }); |
| | | * console.log(util.inspect(server.listeners('connection'))); |
| | | * // Prints: [ [Function] ] |
| | | * ``` |
| | | * @since v0.1.26 |
| | | */ |
| | | listeners<E extends string | symbol>(eventName: EventNames<T, E>): Listener<T, E>[]; |
| | | /** |
| | | * Alias for `emitter.removeListener()`. |
| | | * @since v10.0.0 |
| | | */ |
| | | off<E extends string | symbol>(eventName: EventNames<T, E>, listener: Listener<T, E>): this; |
| | | /** |
| | | * Adds the `listener` function to the end of the listeners array for the |
| | | * event named `eventName`. No checks are made to see if the `listener` has |
| | | * already been added. Multiple calls passing the same combination of `eventName` |
| | | * and `listener` will result in the `listener` being added, and called, multiple |
| | | * times. |
| | | * |
| | | * ```js |
| | | * server.on('connection', (stream) => { |
| | | * console.log('someone connected!'); |
| | | * }); |
| | | * ``` |
| | | * |
| | | * Returns a reference to the `EventEmitter`, so that calls can be chained. |
| | | * |
| | | * By default, event listeners are invoked in the order they are added. The |
| | | * `emitter.prependListener()` method can be used as an alternative to add the |
| | | * event listener to the beginning of the listeners array. |
| | | * |
| | | * ```js |
| | | * import { EventEmitter } from 'node:events'; |
| | | * const myEE = new EventEmitter(); |
| | | * myEE.on('foo', () => console.log('a')); |
| | | * myEE.prependListener('foo', () => console.log('b')); |
| | | * myEE.emit('foo'); |
| | | * // Prints: |
| | | * // b |
| | | * // a |
| | | * ``` |
| | | * @since v0.1.101 |
| | | * @param eventName The name of the event. |
| | | * @param listener The callback function |
| | | */ |
| | | on<E extends string | symbol>(eventName: EventNames<T, E>, listener: Listener<T, E>): this; |
| | | /** |
| | | * Adds a **one-time** `listener` function for the event named `eventName`. The |
| | | * next time `eventName` is triggered, this listener is removed and then invoked. |
| | | * |
| | | * ```js |
| | | * server.once('connection', (stream) => { |
| | | * console.log('Ah, we have our first user!'); |
| | | * }); |
| | | * ``` |
| | | * |
| | | * Returns a reference to the `EventEmitter`, so that calls can be chained. |
| | | * |
| | | * By default, event listeners are invoked in the order they are added. The |
| | | * `emitter.prependOnceListener()` method can be used as an alternative to add the |
| | | * event listener to the beginning of the listeners array. |
| | | * |
| | | * ```js |
| | | * import { EventEmitter } from 'node:events'; |
| | | * const myEE = new EventEmitter(); |
| | | * myEE.once('foo', () => console.log('a')); |
| | | * myEE.prependOnceListener('foo', () => console.log('b')); |
| | | * myEE.emit('foo'); |
| | | * // Prints: |
| | | * // b |
| | | * // a |
| | | * ``` |
| | | * @since v0.3.0 |
| | | * @param eventName The name of the event. |
| | | * @param listener The callback function |
| | | */ |
| | | once<E extends string | symbol>(eventName: EventNames<T, E>, listener: Listener<T, E>): this; |
| | | /** |
| | | * Adds the `listener` function to the _beginning_ of the listeners array for the |
| | | * event named `eventName`. No checks are made to see if the `listener` has |
| | | * already been added. Multiple calls passing the same combination of `eventName` |
| | | * and `listener` will result in the `listener` being added, and called, multiple |
| | | * times. |
| | | * |
| | | * ```js |
| | | * server.prependListener('connection', (stream) => { |
| | | * console.log('someone connected!'); |
| | | * }); |
| | | * ``` |
| | | * |
| | | * Returns a reference to the `EventEmitter`, so that calls can be chained. |
| | | * @since v6.0.0 |
| | | * @param eventName The name of the event. |
| | | * @param listener The callback function |
| | | */ |
| | | prependListener<E extends string | symbol>(eventName: EventNames<T, E>, listener: Listener<T, E>): this; |
| | | /** |
| | | * Adds a **one-time** `listener` function for the event named `eventName` to the |
| | | * _beginning_ of the listeners array. The next time `eventName` is triggered, this |
| | | * listener is removed, and then invoked. |
| | | * |
| | | * ```js |
| | | * server.prependOnceListener('connection', (stream) => { |
| | | * console.log('Ah, we have our first user!'); |
| | | * }); |
| | | * ``` |
| | | * |
| | | * Returns a reference to the `EventEmitter`, so that calls can be chained. |
| | | * @since v6.0.0 |
| | | * @param eventName The name of the event. |
| | | * @param listener The callback function |
| | | */ |
| | | prependOnceListener<E extends string | symbol>(eventName: EventNames<T, E>, listener: Listener<T, E>): this; |
| | | /** |
| | | * Returns a copy of the array of listeners for the event named `eventName`, |
| | | * including any wrappers (such as those created by `.once()`). |
| | | * |
| | | * ```js |
| | | * import { EventEmitter } from 'node:events'; |
| | | * const emitter = new EventEmitter(); |
| | | * emitter.once('log', () => console.log('log once')); |
| | | * |
| | | * // Returns a new Array with a function `onceWrapper` which has a property |
| | | * // `listener` which contains the original listener bound above |
| | | * const listeners = emitter.rawListeners('log'); |
| | | * const logFnWrapper = listeners[0]; |
| | | * |
| | | * // Logs "log once" to the console and does not unbind the `once` event |
| | | * logFnWrapper.listener(); |
| | | * |
| | | * // Logs "log once" to the console and removes the listener |
| | | * logFnWrapper(); |
| | | * |
| | | * emitter.on('log', () => console.log('log persistently')); |
| | | * // Will return a new Array with a single function bound by `.on()` above |
| | | * const newListeners = emitter.rawListeners('log'); |
| | | * |
| | | * // Logs "log persistently" twice |
| | | * newListeners[0](); |
| | | * emitter.emit('log'); |
| | | * ``` |
| | | * @since v9.4.0 |
| | | */ |
| | | rawListeners<E extends string | symbol>(eventName: EventNames<T, E>): Listener<T, E>[]; |
| | | /** |
| | | * Removes all listeners, or those of the specified `eventName`. |
| | | * |
| | | * It is bad practice to remove listeners added elsewhere in the code, |
| | | * particularly when the `EventEmitter` instance was created by some other |
| | | * component or module (e.g. sockets or file streams). |
| | | * |
| | | * Returns a reference to the `EventEmitter`, so that calls can be chained. |
| | | * @since v0.1.26 |
| | | */ |
| | | removeAllListeners<E extends string | symbol>(eventName?: EventNames<T, E>): this; |
| | | /** |
| | | * Removes the specified `listener` from the listener array for the event named |
| | | * `eventName`. |
| | | * |
| | | * ```js |
| | | * const callback = (stream) => { |
| | | * console.log('someone connected!'); |
| | | * }; |
| | | * server.on('connection', callback); |
| | | * // ... |
| | | * server.removeListener('connection', callback); |
| | | * ``` |
| | | * |
| | | * `removeListener()` will remove, at most, one instance of a listener from the |
| | | * listener array. If any single listener has been added multiple times to the |
| | | * listener array for the specified `eventName`, then `removeListener()` must be |
| | | * called multiple times to remove each instance. |
| | | * |
| | | * Once an event is emitted, all listeners attached to it at the |
| | | * time of emitting are called in order. This implies that any |
| | | * `removeListener()` or `removeAllListeners()` calls _after_ emitting and |
| | | * _before_ the last listener finishes execution will not remove them from |
| | | * `emit()` in progress. Subsequent events behave as expected. |
| | | * |
| | | * ```js |
| | | * import { EventEmitter } from 'node:events'; |
| | | * class MyEmitter extends EventEmitter {} |
| | | * const myEmitter = new MyEmitter(); |
| | | * |
| | | * const callbackA = () => { |
| | | * console.log('A'); |
| | | * myEmitter.removeListener('event', callbackB); |
| | | * }; |
| | | * |
| | | * const callbackB = () => { |
| | | * console.log('B'); |
| | | * }; |
| | | * |
| | | * myEmitter.on('event', callbackA); |
| | | * |
| | | * myEmitter.on('event', callbackB); |
| | | * |
| | | * // callbackA removes listener callbackB but it will still be called. |
| | | * // Internal listener array at time of emit [callbackA, callbackB] |
| | | * myEmitter.emit('event'); |
| | | * // Prints: |
| | | * // A |
| | | * // B |
| | | * |
| | | * // callbackB is now removed. |
| | | * // Internal listener array [callbackA] |
| | | * myEmitter.emit('event'); |
| | | * // Prints: |
| | | * // A |
| | | * ``` |
| | | * |
| | | * Because listeners are managed using an internal array, calling this will |
| | | * change the position indexes of any listener registered _after_ the listener |
| | | * being removed. This will not impact the order in which listeners are called, |
| | | * but it means that any copies of the listener array as returned by |
| | | * the `emitter.listeners()` method will need to be recreated. |
| | | * |
| | | * When a single function has been added as a handler multiple times for a single |
| | | * event (as in the example below), `removeListener()` will remove the most |
| | | * recently added instance. In the example the `once('ping')` |
| | | * listener is removed: |
| | | * |
| | | * ```js |
| | | * import { EventEmitter } from 'node:events'; |
| | | * const ee = new EventEmitter(); |
| | | * |
| | | * function pong() { |
| | | * console.log('pong'); |
| | | * } |
| | | * |
| | | * ee.on('ping', pong); |
| | | * ee.once('ping', pong); |
| | | * ee.removeListener('ping', pong); |
| | | * |
| | | * ee.emit('ping'); |
| | | * ee.emit('ping'); |
| | | * ``` |
| | | * |
| | | * Returns a reference to the `EventEmitter`, so that calls can be chained. |
| | | * @since v0.1.26 |
| | | */ |
| | | removeListener<E extends string | symbol>(eventName: EventNames<T, E>, listener: Listener<T, E>): this; |
| | | /** |
| | | * By default `EventEmitter`s will print a warning if more than `10` listeners are |
| | | * added for a particular event. This is a useful default that helps finding |
| | | * memory leaks. The `emitter.setMaxListeners()` method allows the limit to be |
| | | * modified for this specific `EventEmitter` instance. The value can be set to |
| | | * `Infinity` (or `0`) to indicate an unlimited number of listeners. |
| | | * |
| | | * Returns a reference to the `EventEmitter`, so that calls can be chained. |
| | | * @since v0.3.5 |
| | | */ |
| | | setMaxListeners(n: number): this; |
| | | } |
| | | interface EventEmitter<T extends EventMap<T> = any> extends NodeJS.EventEmitter<T> {} |
| | | global { |
| | | namespace NodeJS { |
| | | interface EventEmitter<T extends EventMap<T> = any> { |
| | | /** |
| | | * The `Symbol.for('nodejs.rejection')` method is called in case a |
| | | * promise rejection happens when emitting an event and |
| | | * `captureRejections` is enabled on the emitter. |
| | | * It is possible to use `events.captureRejectionSymbol` in |
| | | * place of `Symbol.for('nodejs.rejection')`. |
| | | * |
| | | * ```js |
| | | * import { EventEmitter, captureRejectionSymbol } from 'node:events'; |
| | | * |
| | | * class MyClass extends EventEmitter { |
| | | * constructor() { |
| | | * super({ captureRejections: true }); |
| | | * } |
| | | * |
| | | * [captureRejectionSymbol](err, event, ...args) { |
| | | * console.log('rejection happened for', event, 'with', err, ...args); |
| | | * this.destroy(err); |
| | | * } |
| | | * |
| | | * destroy(err) { |
| | | * // Tear the resource down here. |
| | | * } |
| | | * } |
| | | * ``` |
| | | * @since v13.4.0, v12.16.0 |
| | | */ |
| | | [EventEmitter.captureRejectionSymbol]?(error: Error, event: string | symbol, ...args: any[]): void; |
| | | /** |
| | | * Alias for `emitter.on(eventName, listener)`. |
| | | * @since v0.1.26 |
| | | */ |
| | | addListener<E extends string | symbol>(eventName: EventNames<T, E>, listener: Listener<T, E>): this; |
| | | /** |
| | | * Synchronously calls each of the listeners registered for the event named |
| | | * `eventName`, in the order they were registered, passing the supplied arguments |
| | | * to each. |
| | | * |
| | | * Returns `true` if the event had listeners, `false` otherwise. |
| | | * |
| | | * ```js |
| | | * import { EventEmitter } from 'node:events'; |
| | | * const myEmitter = new EventEmitter(); |
| | | * |
| | | * // First listener |
| | | * myEmitter.on('event', function firstListener() { |
| | | * console.log('Helloooo! first listener'); |
| | | * }); |
| | | * // Second listener |
| | | * myEmitter.on('event', function secondListener(arg1, arg2) { |
| | | * console.log(`event with parameters ${arg1}, ${arg2} in second listener`); |
| | | * }); |
| | | * // Third listener |
| | | * myEmitter.on('event', function thirdListener(...args) { |
| | | * const parameters = args.join(', '); |
| | | * console.log(`event with parameters ${parameters} in third listener`); |
| | | * }); |
| | | * |
| | | * console.log(myEmitter.listeners('event')); |
| | | * |
| | | * myEmitter.emit('event', 1, 2, 3, 4, 5); |
| | | * |
| | | * // Prints: |
| | | * // [ |
| | | * // [Function: firstListener], |
| | | * // [Function: secondListener], |
| | | * // [Function: thirdListener] |
| | | * // ] |
| | | * // Helloooo! first listener |
| | | * // event with parameters 1, 2 in second listener |
| | | * // event with parameters 1, 2, 3, 4, 5 in third listener |
| | | * ``` |
| | | * @since v0.1.26 |
| | | */ |
| | | emit<E extends string | symbol>(eventName: EventNames<T, E>, ...args: Args<T, E>): boolean; |
| | | /** |
| | | * Returns an array listing the events for which the emitter has registered |
| | | * listeners. |
| | | * |
| | | * ```js |
| | | * import { EventEmitter } from 'node:events'; |
| | | * |
| | | * const myEE = new EventEmitter(); |
| | | * myEE.on('foo', () => {}); |
| | | * myEE.on('bar', () => {}); |
| | | * |
| | | * const sym = Symbol('symbol'); |
| | | * myEE.on(sym, () => {}); |
| | | * |
| | | * console.log(myEE.eventNames()); |
| | | * // Prints: [ 'foo', 'bar', Symbol(symbol) ] |
| | | * ``` |
| | | * @since v6.0.0 |
| | | */ |
| | | eventNames(): (string | symbol)[]; |
| | | /** |
| | | * Returns the current max listener value for the `EventEmitter` which is either |
| | | * set by `emitter.setMaxListeners(n)` or defaults to |
| | | * `events.defaultMaxListeners`. |
| | | * @since v1.0.0 |
| | | */ |
| | | getMaxListeners(): number; |
| | | /** |
| | | * Returns the number of listeners listening for the event named `eventName`. |
| | | * If `listener` is provided, it will return how many times the listener is found |
| | | * in the list of the listeners of the event. |
| | | * @since v3.2.0 |
| | | * @param eventName The name of the event being listened for |
| | | * @param listener The event handler function |
| | | */ |
| | | listenerCount<E extends string | symbol>( |
| | | eventName: EventNames<T, E>, |
| | | listener?: Listener<T, E>, |
| | | ): number; |
| | | /** |
| | | * Returns a copy of the array of listeners for the event named `eventName`. |
| | | * |
| | | * ```js |
| | | * server.on('connection', (stream) => { |
| | | * console.log('someone connected!'); |
| | | * }); |
| | | * console.log(util.inspect(server.listeners('connection'))); |
| | | * // Prints: [ [Function] ] |
| | | * ``` |
| | | * @since v0.1.26 |
| | | */ |
| | | listeners<E extends string | symbol>(eventName: EventNames<T, E>): Listener<T, E>[]; |
| | | /** |
| | | * Alias for `emitter.removeListener()`. |
| | | * @since v10.0.0 |
| | | */ |
| | | off<E extends string | symbol>(eventName: EventNames<T, E>, listener: Listener<T, E>): this; |
| | | /** |
| | | * Adds the `listener` function to the end of the listeners array for the |
| | | * event named `eventName`. No checks are made to see if the `listener` has |
| | | * already been added. Multiple calls passing the same combination of `eventName` |
| | | * and `listener` will result in the `listener` being added, and called, multiple |
| | | * times. |
| | | * |
| | | * ```js |
| | | * server.on('connection', (stream) => { |
| | | * console.log('someone connected!'); |
| | | * }); |
| | | * ``` |
| | | * |
| | | * Returns a reference to the `EventEmitter`, so that calls can be chained. |
| | | * |
| | | * By default, event listeners are invoked in the order they are added. The |
| | | * `emitter.prependListener()` method can be used as an alternative to add the |
| | | * event listener to the beginning of the listeners array. |
| | | * |
| | | * ```js |
| | | * import { EventEmitter } from 'node:events'; |
| | | * const myEE = new EventEmitter(); |
| | | * myEE.on('foo', () => console.log('a')); |
| | | * myEE.prependListener('foo', () => console.log('b')); |
| | | * myEE.emit('foo'); |
| | | * // Prints: |
| | | * // b |
| | | * // a |
| | | * ``` |
| | | * @since v0.1.101 |
| | | * @param eventName The name of the event. |
| | | * @param listener The callback function |
| | | */ |
| | | on<E extends string | symbol>(eventName: EventNames<T, E>, listener: Listener<T, E>): this; |
| | | /** |
| | | * Adds a **one-time** `listener` function for the event named `eventName`. The |
| | | * next time `eventName` is triggered, this listener is removed and then invoked. |
| | | * |
| | | * ```js |
| | | * server.once('connection', (stream) => { |
| | | * console.log('Ah, we have our first user!'); |
| | | * }); |
| | | * ``` |
| | | * |
| | | * Returns a reference to the `EventEmitter`, so that calls can be chained. |
| | | * |
| | | * By default, event listeners are invoked in the order they are added. The |
| | | * `emitter.prependOnceListener()` method can be used as an alternative to add the |
| | | * event listener to the beginning of the listeners array. |
| | | * |
| | | * ```js |
| | | * import { EventEmitter } from 'node:events'; |
| | | * const myEE = new EventEmitter(); |
| | | * myEE.once('foo', () => console.log('a')); |
| | | * myEE.prependOnceListener('foo', () => console.log('b')); |
| | | * myEE.emit('foo'); |
| | | * // Prints: |
| | | * // b |
| | | * // a |
| | | * ``` |
| | | * @since v0.3.0 |
| | | * @param eventName The name of the event. |
| | | * @param listener The callback function |
| | | */ |
| | | once<E extends string | symbol>(eventName: EventNames<T, E>, listener: Listener<T, E>): this; |
| | | /** |
| | | * Adds the `listener` function to the _beginning_ of the listeners array for the |
| | | * event named `eventName`. No checks are made to see if the `listener` has |
| | | * already been added. Multiple calls passing the same combination of `eventName` |
| | | * and `listener` will result in the `listener` being added, and called, multiple |
| | | * times. |
| | | * |
| | | * ```js |
| | | * server.prependListener('connection', (stream) => { |
| | | * console.log('someone connected!'); |
| | | * }); |
| | | * ``` |
| | | * |
| | | * Returns a reference to the `EventEmitter`, so that calls can be chained. |
| | | * @since v6.0.0 |
| | | * @param eventName The name of the event. |
| | | * @param listener The callback function |
| | | */ |
| | | prependListener<E extends string | symbol>(eventName: EventNames<T, E>, listener: Listener<T, E>): this; |
| | | /** |
| | | * Adds a **one-time** `listener` function for the event named `eventName` to the |
| | | * _beginning_ of the listeners array. The next time `eventName` is triggered, this |
| | | * listener is removed, and then invoked. |
| | | * |
| | | * ```js |
| | | * server.prependOnceListener('connection', (stream) => { |
| | | * console.log('Ah, we have our first user!'); |
| | | * }); |
| | | * ``` |
| | | * |
| | | * Returns a reference to the `EventEmitter`, so that calls can be chained. |
| | | * @since v6.0.0 |
| | | * @param eventName The name of the event. |
| | | * @param listener The callback function |
| | | */ |
| | | prependOnceListener<E extends string | symbol>( |
| | | eventName: EventNames<T, E>, |
| | | listener: Listener<T, E>, |
| | | ): this; |
| | | /** |
| | | * Returns a copy of the array of listeners for the event named `eventName`, |
| | | * including any wrappers (such as those created by `.once()`). |
| | | * |
| | | * ```js |
| | | * import { EventEmitter } from 'node:events'; |
| | | * const emitter = new EventEmitter(); |
| | | * emitter.once('log', () => console.log('log once')); |
| | | * |
| | | * // Returns a new Array with a function `onceWrapper` which has a property |
| | | * // `listener` which contains the original listener bound above |
| | | * const listeners = emitter.rawListeners('log'); |
| | | * const logFnWrapper = listeners[0]; |
| | | * |
| | | * // Logs "log once" to the console and does not unbind the `once` event |
| | | * logFnWrapper.listener(); |
| | | * |
| | | * // Logs "log once" to the console and removes the listener |
| | | * logFnWrapper(); |
| | | * |
| | | * emitter.on('log', () => console.log('log persistently')); |
| | | * // Will return a new Array with a single function bound by `.on()` above |
| | | * const newListeners = emitter.rawListeners('log'); |
| | | * |
| | | * // Logs "log persistently" twice |
| | | * newListeners[0](); |
| | | * emitter.emit('log'); |
| | | * ``` |
| | | * @since v9.4.0 |
| | | */ |
| | | rawListeners<E extends string | symbol>(eventName: EventNames<T, E>): Listener<T, E>[]; |
| | | /** |
| | | * Removes all listeners, or those of the specified `eventName`. |
| | | * |
| | | * It is bad practice to remove listeners added elsewhere in the code, |
| | | * particularly when the `EventEmitter` instance was created by some other |
| | | * component or module (e.g. sockets or file streams). |
| | | * |
| | | * Returns a reference to the `EventEmitter`, so that calls can be chained. |
| | | * @since v0.1.26 |
| | | */ |
| | | // eslint-disable-next-line @definitelytyped/no-unnecessary-generics |
| | | removeAllListeners<E extends string | symbol>(eventName?: EventNames<T, E>): this; |
| | | /** |
| | | * Removes the specified `listener` from the listener array for the event named |
| | | * `eventName`. |
| | | * |
| | | * ```js |
| | | * const callback = (stream) => { |
| | | * console.log('someone connected!'); |
| | | * }; |
| | | * server.on('connection', callback); |
| | | * // ... |
| | | * server.removeListener('connection', callback); |
| | | * ``` |
| | | * |
| | | * `removeListener()` will remove, at most, one instance of a listener from the |
| | | * listener array. If any single listener has been added multiple times to the |
| | | * listener array for the specified `eventName`, then `removeListener()` must be |
| | | * called multiple times to remove each instance. |
| | | * |
| | | * Once an event is emitted, all listeners attached to it at the |
| | | * time of emitting are called in order. This implies that any |
| | | * `removeListener()` or `removeAllListeners()` calls _after_ emitting and |
| | | * _before_ the last listener finishes execution will not remove them from |
| | | * `emit()` in progress. Subsequent events behave as expected. |
| | | * |
| | | * ```js |
| | | * import { EventEmitter } from 'node:events'; |
| | | * class MyEmitter extends EventEmitter {} |
| | | * const myEmitter = new MyEmitter(); |
| | | * |
| | | * const callbackA = () => { |
| | | * console.log('A'); |
| | | * myEmitter.removeListener('event', callbackB); |
| | | * }; |
| | | * |
| | | * const callbackB = () => { |
| | | * console.log('B'); |
| | | * }; |
| | | * |
| | | * myEmitter.on('event', callbackA); |
| | | * |
| | | * myEmitter.on('event', callbackB); |
| | | * |
| | | * // callbackA removes listener callbackB but it will still be called. |
| | | * // Internal listener array at time of emit [callbackA, callbackB] |
| | | * myEmitter.emit('event'); |
| | | * // Prints: |
| | | * // A |
| | | * // B |
| | | * |
| | | * // callbackB is now removed. |
| | | * // Internal listener array [callbackA] |
| | | * myEmitter.emit('event'); |
| | | * // Prints: |
| | | * // A |
| | | * ``` |
| | | * |
| | | * Because listeners are managed using an internal array, calling this will |
| | | * change the position indexes of any listener registered _after_ the listener |
| | | * being removed. This will not impact the order in which listeners are called, |
| | | * but it means that any copies of the listener array as returned by |
| | | * the `emitter.listeners()` method will need to be recreated. |
| | | * |
| | | * When a single function has been added as a handler multiple times for a single |
| | | * event (as in the example below), `removeListener()` will remove the most |
| | | * recently added instance. In the example the `once('ping')` |
| | | * listener is removed: |
| | | * |
| | | * ```js |
| | | * import { EventEmitter } from 'node:events'; |
| | | * const ee = new EventEmitter(); |
| | | * |
| | | * function pong() { |
| | | * console.log('pong'); |
| | | * } |
| | | * |
| | | * ee.on('ping', pong); |
| | | * ee.once('ping', pong); |
| | | * ee.removeListener('ping', pong); |
| | | * |
| | | * ee.emit('ping'); |
| | | * ee.emit('ping'); |
| | | * ``` |
| | | * |
| | | * Returns a reference to the `EventEmitter`, so that calls can be chained. |
| | | * @since v0.1.26 |
| | | */ |
| | | removeListener<E extends string | symbol>(eventName: EventNames<T, E>, listener: Listener<T, E>): this; |
| | | /** |
| | | * By default `EventEmitter`s will print a warning if more than `10` listeners are |
| | | * added for a particular event. This is a useful default that helps finding |
| | | * memory leaks. The `emitter.setMaxListeners()` method allows the limit to be |
| | | * modified for this specific `EventEmitter` instance. The value can be set to |
| | | * `Infinity` (or `0`) to indicate an unlimited number of listeners. |
| | | * |
| | | * Returns a reference to the `EventEmitter`, so that calls can be chained. |
| | | * @since v0.3.5 |
| | | */ |
| | | setMaxListeners(n: number): this; |
| | | } |
| | | } |
| | | } |
| | | namespace EventEmitter { |
| | | export { EventEmitter, EventEmitterEventMap, EventEmitterOptions }; |
| | |
| | | * ``` |
| | | * @since v15.2.0, v14.17.0 |
| | | */ |
| | | function getEventListeners(emitter: NodeJS.EventEmitter, name: string | symbol): ((...args: any[]) => void)[]; |
| | | function getEventListeners(emitter: EventEmitter, name: string | symbol): ((...args: any[]) => void)[]; |
| | | function getEventListeners(emitter: EventTarget, name: string): ((...args: any[]) => void)[]; |
| | | /** |
| | | * Returns the currently set max amount of listeners. |
| | |
| | | * ``` |
| | | * @since v19.9.0 |
| | | */ |
| | | function getMaxListeners(emitter: NodeJS.EventEmitter | EventTarget): number; |
| | | function getMaxListeners(emitter: EventEmitter | EventTarget): number; |
| | | /** |
| | | * A class method that returns the number of listeners for the given `eventName` |
| | | * registered on the given `emitter`. |
| | | * Returns the number of registered listeners for the event named `eventName`. |
| | | * |
| | | * ```js |
| | | * import { EventEmitter, listenerCount } from 'node:events'; |
| | | * For `EventEmitter`s this behaves exactly the same as calling `.listenerCount` |
| | | * on the emitter. |
| | | * |
| | | * const myEmitter = new EventEmitter(); |
| | | * myEmitter.on('event', () => {}); |
| | | * myEmitter.on('event', () => {}); |
| | | * console.log(listenerCount(myEmitter, 'event')); |
| | | * // Prints: 2 |
| | | * ``` |
| | | * For `EventTarget`s this is the only way to obtain the listener count. This can |
| | | * be useful for debugging and diagnostic purposes. |
| | | * @since v0.9.12 |
| | | * @deprecated Use `emitter.listenerCount()` instead. |
| | | * @param emitter The emitter to query |
| | | * @param eventName The event name |
| | | */ |
| | | function listenerCount(emitter: NodeJS.EventEmitter, eventName: string | symbol): number; |
| | | function listenerCount(emitter: EventEmitter, eventName: string | symbol): number; |
| | | function listenerCount(emitter: EventTarget, eventName: string): number; |
| | | interface OnOptions extends Abortable { |
| | | /** |
| | | * Names of events that will end the iteration. |
| | |
| | | * @returns `AsyncIterator` that iterates `eventName` events emitted by the `emitter` |
| | | */ |
| | | function on( |
| | | emitter: NodeJS.EventEmitter, |
| | | emitter: EventEmitter, |
| | | eventName: string | symbol, |
| | | options?: OnOptions, |
| | | ): NodeJS.AsyncIterator<any[]>; |
| | |
| | | * @since v11.13.0, v10.16.0 |
| | | */ |
| | | function once( |
| | | emitter: NodeJS.EventEmitter, |
| | | emitter: EventEmitter, |
| | | eventName: string | symbol, |
| | | options?: OnceOptions, |
| | | ): Promise<any[]>; |
| | |
| | | * max for all newly created `EventTarget` and `EventEmitter` objects. |
| | | * objects. |
| | | */ |
| | | function setMaxListeners(n: number, ...eventTargets: ReadonlyArray<NodeJS.EventEmitter | EventTarget>): void; |
| | | function setMaxListeners(n: number, ...eventTargets: ReadonlyArray<EventEmitter | EventTarget>): void; |
| | | /** |
| | | * This is the interface from which event-emitting Node.js APIs inherit in the types package. |
| | | * **It is not intended for consumer use.** |
| | |
| | | type InternalEventTargetEventProperties<T> = { |
| | | [K in keyof T & string as `on${K}`]: ((ev: T[K]) => void) | null; |
| | | }; |
| | | } |
| | | global { |
| | | import _ = EventEmitter; |
| | | namespace NodeJS { |
| | | interface EventEmitter<T extends EventMap<T> = any> extends _<T> {} |
| | | } |
| | | } |
| | | export = EventEmitter; |
| | | } |