doc: add ESM version examples to events api doc
PR-URL: https://github.com/nodejs/node/pull/43226 Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
parent
dc53c29b97
commit
1737c7741f
@ -30,7 +30,19 @@ The following example shows a simple `EventEmitter` instance with a single
|
|||||||
listener. The `eventEmitter.on()` method is used to register listeners, while
|
listener. The `eventEmitter.on()` method is used to register listeners, while
|
||||||
the `eventEmitter.emit()` method is used to trigger the event.
|
the `eventEmitter.emit()` method is used to trigger the event.
|
||||||
|
|
||||||
```js
|
```mjs
|
||||||
|
import { EventEmitter } from 'node:events';
|
||||||
|
|
||||||
|
class MyEmitter extends EventEmitter {}
|
||||||
|
|
||||||
|
const myEmitter = new MyEmitter();
|
||||||
|
myEmitter.on('event', () => {
|
||||||
|
console.log('an event occurred!');
|
||||||
|
});
|
||||||
|
myEmitter.emit('event');
|
||||||
|
```
|
||||||
|
|
||||||
|
```cjs
|
||||||
const EventEmitter = require('node:events');
|
const EventEmitter = require('node:events');
|
||||||
|
|
||||||
class MyEmitter extends EventEmitter {}
|
class MyEmitter extends EventEmitter {}
|
||||||
@ -160,7 +172,18 @@ myEmitter.emit('error', new Error('whoops!'));
|
|||||||
It is possible to monitor `'error'` events without consuming the emitted error
|
It is possible to monitor `'error'` events without consuming the emitted error
|
||||||
by installing a listener using the symbol `events.errorMonitor`.
|
by installing a listener using the symbol `events.errorMonitor`.
|
||||||
|
|
||||||
```js
|
```mjs
|
||||||
|
import { EventEmitter, errorMonitor } from 'node:events';
|
||||||
|
|
||||||
|
const myEmitter = new EventEmitter();
|
||||||
|
myEmitter.on(errorMonitor, (err) => {
|
||||||
|
MyMonitoringTool.log(err);
|
||||||
|
});
|
||||||
|
myEmitter.emit('error', new Error('whoops!'));
|
||||||
|
// Still throws and crashes Node.js
|
||||||
|
```
|
||||||
|
|
||||||
|
```cjs
|
||||||
const { EventEmitter, errorMonitor } = require('node:events');
|
const { EventEmitter, errorMonitor } = require('node:events');
|
||||||
|
|
||||||
const myEmitter = new EventEmitter();
|
const myEmitter = new EventEmitter();
|
||||||
@ -208,7 +231,19 @@ ee2[Symbol.for('nodejs.rejection')] = console.log;
|
|||||||
Setting `events.captureRejections = true` will change the default for all
|
Setting `events.captureRejections = true` will change the default for all
|
||||||
new instances of `EventEmitter`.
|
new instances of `EventEmitter`.
|
||||||
|
|
||||||
```js
|
```mjs
|
||||||
|
import { EventEmitter } from 'node:events';
|
||||||
|
|
||||||
|
EventEmitter.captureRejections = true;
|
||||||
|
const ee1 = new EventEmitter();
|
||||||
|
ee1.on('something', async (value) => {
|
||||||
|
throw new Error('kaboom');
|
||||||
|
});
|
||||||
|
|
||||||
|
ee1.on('error', console.log);
|
||||||
|
```
|
||||||
|
|
||||||
|
```cjs
|
||||||
const events = require('node:events');
|
const events = require('node:events');
|
||||||
events.captureRejections = true;
|
events.captureRejections = true;
|
||||||
const ee1 = new events.EventEmitter();
|
const ee1 = new events.EventEmitter();
|
||||||
@ -237,7 +272,11 @@ changes:
|
|||||||
|
|
||||||
The `EventEmitter` class is defined and exposed by the `node:events` module:
|
The `EventEmitter` class is defined and exposed by the `node:events` module:
|
||||||
|
|
||||||
```js
|
```mjs
|
||||||
|
import { EventEmitter } from 'node:events';
|
||||||
|
```
|
||||||
|
|
||||||
|
```cjs
|
||||||
const EventEmitter = require('node:events');
|
const EventEmitter = require('node:events');
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -337,7 +376,40 @@ to each.
|
|||||||
|
|
||||||
Returns `true` if the event had listeners, `false` otherwise.
|
Returns `true` if the event had listeners, `false` otherwise.
|
||||||
|
|
||||||
```js
|
```mjs
|
||||||
|
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
|
||||||
|
```
|
||||||
|
|
||||||
|
```cjs
|
||||||
const EventEmitter = require('node:events');
|
const EventEmitter = require('node:events');
|
||||||
const myEmitter = new EventEmitter();
|
const myEmitter = new EventEmitter();
|
||||||
|
|
||||||
@ -381,8 +453,23 @@ added: v6.0.0
|
|||||||
Returns an array listing the events for which the emitter has registered
|
Returns an array listing the events for which the emitter has registered
|
||||||
listeners. The values in the array are strings or `Symbol`s.
|
listeners. The values in the array are strings or `Symbol`s.
|
||||||
|
|
||||||
```js
|
```mjs
|
||||||
|
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) ]
|
||||||
|
```
|
||||||
|
|
||||||
|
```cjs
|
||||||
const EventEmitter = require('node:events');
|
const EventEmitter = require('node:events');
|
||||||
|
|
||||||
const myEE = new EventEmitter();
|
const myEE = new EventEmitter();
|
||||||
myEE.on('foo', () => {});
|
myEE.on('foo', () => {});
|
||||||
myEE.on('bar', () => {});
|
myEE.on('bar', () => {});
|
||||||
@ -757,7 +844,26 @@ promise rejection happens when emitting an event and
|
|||||||
It is possible to use [`events.captureRejectionSymbol`][rejectionsymbol] in
|
It is possible to use [`events.captureRejectionSymbol`][rejectionsymbol] in
|
||||||
place of `Symbol.for('nodejs.rejection')`.
|
place of `Symbol.for('nodejs.rejection')`.
|
||||||
|
|
||||||
```js
|
```mjs
|
||||||
|
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.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```cjs
|
||||||
const { EventEmitter, captureRejectionSymbol } = require('node:events');
|
const { EventEmitter, captureRejectionSymbol } = require('node:events');
|
||||||
|
|
||||||
class MyClass extends EventEmitter {
|
class MyClass extends EventEmitter {
|
||||||
@ -853,7 +959,24 @@ the emitter.
|
|||||||
For `EventTarget`s this is the only way to get the event listeners for the
|
For `EventTarget`s this is the only way to get the event listeners for the
|
||||||
event target. This is useful for debugging and diagnostic purposes.
|
event target. This is useful for debugging and diagnostic purposes.
|
||||||
|
|
||||||
```js
|
```mjs
|
||||||
|
import { getEventListeners, EventEmitter } from 'node:events';
|
||||||
|
|
||||||
|
{
|
||||||
|
const ee = new EventEmitter();
|
||||||
|
const listener = () => console.log('Events are fun');
|
||||||
|
ee.on('foo', listener);
|
||||||
|
getEventListeners(ee, 'foo'); // [listener]
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const et = new EventTarget();
|
||||||
|
const listener = () => console.log('Events are fun');
|
||||||
|
et.addEventListener('foo', listener);
|
||||||
|
getEventListeners(et, 'foo'); // [listener]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```cjs
|
||||||
const { getEventListeners, EventEmitter } = require('node:events');
|
const { getEventListeners, EventEmitter } = require('node:events');
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -897,7 +1020,32 @@ This method is intentionally generic and works with the web platform
|
|||||||
[EventTarget][WHATWG-EventTarget] interface, which has no special
|
[EventTarget][WHATWG-EventTarget] interface, which has no special
|
||||||
`'error'` event semantics and does not listen to the `'error'` event.
|
`'error'` event semantics and does not listen to the `'error'` event.
|
||||||
|
|
||||||
```js
|
```mjs
|
||||||
|
import { once, EventEmitter } from 'node:events';
|
||||||
|
import process from 'node:process';
|
||||||
|
|
||||||
|
const ee = new EventEmitter();
|
||||||
|
|
||||||
|
process.nextTick(() => {
|
||||||
|
ee.emit('myevent', 42);
|
||||||
|
});
|
||||||
|
|
||||||
|
const [value] = await once(ee, 'myevent');
|
||||||
|
console.log(value);
|
||||||
|
|
||||||
|
const err = new Error('kaboom');
|
||||||
|
process.nextTick(() => {
|
||||||
|
ee.emit('error', err);
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
await once(ee, 'myevent');
|
||||||
|
} catch (err) {
|
||||||
|
console.log('error happened', err);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```cjs
|
||||||
const { once, EventEmitter } = require('node:events');
|
const { once, EventEmitter } = require('node:events');
|
||||||
|
|
||||||
async function run() {
|
async function run() {
|
||||||
@ -930,7 +1078,21 @@ is used to wait for another event. If `events.once()` is used to wait for the
|
|||||||
'`error'` event itself, then it is treated as any other kind of event without
|
'`error'` event itself, then it is treated as any other kind of event without
|
||||||
special handling:
|
special handling:
|
||||||
|
|
||||||
```js
|
```mjs
|
||||||
|
import { EventEmitter, once } from 'node:events';
|
||||||
|
|
||||||
|
const ee = new EventEmitter();
|
||||||
|
|
||||||
|
once(ee, 'error')
|
||||||
|
.then(([err]) => console.log('ok', err.message))
|
||||||
|
.catch((err) => console.log('error', err.message));
|
||||||
|
|
||||||
|
ee.emit('error', new Error('boom'));
|
||||||
|
|
||||||
|
// Prints: ok boom
|
||||||
|
```
|
||||||
|
|
||||||
|
```cjs
|
||||||
const { EventEmitter, once } = require('node:events');
|
const { EventEmitter, once } = require('node:events');
|
||||||
|
|
||||||
const ee = new EventEmitter();
|
const ee = new EventEmitter();
|
||||||
@ -946,7 +1108,31 @@ ee.emit('error', new Error('boom'));
|
|||||||
|
|
||||||
An {AbortSignal} can be used to cancel waiting for the event:
|
An {AbortSignal} can be used to cancel waiting for the event:
|
||||||
|
|
||||||
```js
|
```mjs
|
||||||
|
import { EventEmitter, once } from 'node:events';
|
||||||
|
|
||||||
|
const ee = new EventEmitter();
|
||||||
|
const ac = new AbortController();
|
||||||
|
|
||||||
|
async function foo(emitter, event, signal) {
|
||||||
|
try {
|
||||||
|
await once(emitter, event, { signal });
|
||||||
|
console.log('event emitted!');
|
||||||
|
} catch (error) {
|
||||||
|
if (error.name === 'AbortError') {
|
||||||
|
console.error('Waiting for the event was canceled!');
|
||||||
|
} else {
|
||||||
|
console.error('There was an error', error.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foo(ee, 'foo', ac.signal);
|
||||||
|
ac.abort(); // Abort waiting for the event
|
||||||
|
ee.emit('foo'); // Prints: Waiting for the event was canceled!
|
||||||
|
```
|
||||||
|
|
||||||
|
```cjs
|
||||||
const { EventEmitter, once } = require('node:events');
|
const { EventEmitter, once } = require('node:events');
|
||||||
|
|
||||||
const ee = new EventEmitter();
|
const ee = new EventEmitter();
|
||||||
@ -979,7 +1165,31 @@ because the `process.nextTick()` queue is drained before the `Promise` microtask
|
|||||||
queue, and because `EventEmitter` emits all events synchronously, it is possible
|
queue, and because `EventEmitter` emits all events synchronously, it is possible
|
||||||
for `events.once()` to miss an event.
|
for `events.once()` to miss an event.
|
||||||
|
|
||||||
```js
|
```mjs
|
||||||
|
import { EventEmitter, once } from 'node:events';
|
||||||
|
import process from 'node:process';
|
||||||
|
|
||||||
|
const myEE = new EventEmitter();
|
||||||
|
|
||||||
|
async function foo() {
|
||||||
|
await once(myEE, 'bar');
|
||||||
|
console.log('bar');
|
||||||
|
|
||||||
|
// This Promise will never resolve because the 'foo' event will
|
||||||
|
// have already been emitted before the Promise is created.
|
||||||
|
await once(myEE, 'foo');
|
||||||
|
console.log('foo');
|
||||||
|
}
|
||||||
|
|
||||||
|
process.nextTick(() => {
|
||||||
|
myEE.emit('bar');
|
||||||
|
myEE.emit('foo');
|
||||||
|
});
|
||||||
|
|
||||||
|
foo().then(() => console.log('done'));
|
||||||
|
```
|
||||||
|
|
||||||
|
```cjs
|
||||||
const { EventEmitter, once } = require('node:events');
|
const { EventEmitter, once } = require('node:events');
|
||||||
|
|
||||||
const myEE = new EventEmitter();
|
const myEE = new EventEmitter();
|
||||||
@ -1006,7 +1216,26 @@ To catch both events, create each of the Promises _before_ awaiting either
|
|||||||
of them, then it becomes possible to use `Promise.all()`, `Promise.race()`,
|
of them, then it becomes possible to use `Promise.all()`, `Promise.race()`,
|
||||||
or `Promise.allSettled()`:
|
or `Promise.allSettled()`:
|
||||||
|
|
||||||
```js
|
```mjs
|
||||||
|
import { EventEmitter, once } from 'node:events';
|
||||||
|
import process from 'node:process';
|
||||||
|
|
||||||
|
const myEE = new EventEmitter();
|
||||||
|
|
||||||
|
async function foo() {
|
||||||
|
await Promise.all([once(myEE, 'bar'), once(myEE, 'foo')]);
|
||||||
|
console.log('foo', 'bar');
|
||||||
|
}
|
||||||
|
|
||||||
|
process.nextTick(() => {
|
||||||
|
myEE.emit('bar');
|
||||||
|
myEE.emit('foo');
|
||||||
|
});
|
||||||
|
|
||||||
|
foo().then(() => console.log('done'));
|
||||||
|
```
|
||||||
|
|
||||||
|
```cjs
|
||||||
const { EventEmitter, once } = require('node:events');
|
const { EventEmitter, once } = require('node:events');
|
||||||
|
|
||||||
const myEE = new EventEmitter();
|
const myEE = new EventEmitter();
|
||||||
@ -1075,8 +1304,19 @@ deprecated: v3.2.0
|
|||||||
A class method that returns the number of listeners for the given `eventName`
|
A class method that returns the number of listeners for the given `eventName`
|
||||||
registered on the given `emitter`.
|
registered on the given `emitter`.
|
||||||
|
|
||||||
```js
|
```mjs
|
||||||
|
import { EventEmitter, listenerCount } from 'node:events';
|
||||||
|
|
||||||
|
const myEmitter = new EventEmitter();
|
||||||
|
myEmitter.on('event', () => {});
|
||||||
|
myEmitter.on('event', () => {});
|
||||||
|
console.log(listenerCount(myEmitter, 'event'));
|
||||||
|
// Prints: 2
|
||||||
|
```
|
||||||
|
|
||||||
|
```cjs
|
||||||
const { EventEmitter, listenerCount } = require('node:events');
|
const { EventEmitter, listenerCount } = require('node:events');
|
||||||
|
|
||||||
const myEmitter = new EventEmitter();
|
const myEmitter = new EventEmitter();
|
||||||
myEmitter.on('event', () => {});
|
myEmitter.on('event', () => {});
|
||||||
myEmitter.on('event', () => {});
|
myEmitter.on('event', () => {});
|
||||||
@ -1098,7 +1338,28 @@ added:
|
|||||||
* `signal` {AbortSignal} Can be used to cancel awaiting events.
|
* `signal` {AbortSignal} Can be used to cancel awaiting events.
|
||||||
* Returns: {AsyncIterator} that iterates `eventName` events emitted by the `emitter`
|
* Returns: {AsyncIterator} that iterates `eventName` events emitted by the `emitter`
|
||||||
|
|
||||||
```js
|
```mjs
|
||||||
|
import { on, EventEmitter } from 'node:events';
|
||||||
|
import process from 'node:process';
|
||||||
|
|
||||||
|
const ee = new EventEmitter();
|
||||||
|
|
||||||
|
// Emit later on
|
||||||
|
process.nextTick(() => {
|
||||||
|
ee.emit('foo', 'bar');
|
||||||
|
ee.emit('foo', 42);
|
||||||
|
});
|
||||||
|
|
||||||
|
for await (const event of on(ee, 'foo')) {
|
||||||
|
// The execution of this inner block is synchronous and it
|
||||||
|
// processes one event at a time (even with await). Do not use
|
||||||
|
// if concurrent execution is required.
|
||||||
|
console.log(event); // prints ['bar'] [42]
|
||||||
|
}
|
||||||
|
// Unreachable here
|
||||||
|
```
|
||||||
|
|
||||||
|
```cjs
|
||||||
const { on, EventEmitter } = require('node:events');
|
const { on, EventEmitter } = require('node:events');
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
@ -1127,8 +1388,36 @@ composed of the emitted event arguments.
|
|||||||
|
|
||||||
An {AbortSignal} can be used to cancel waiting on events:
|
An {AbortSignal} can be used to cancel waiting on events:
|
||||||
|
|
||||||
```js
|
```mjs
|
||||||
|
import { on, EventEmitter } from 'node:events';
|
||||||
|
import process from 'node:process';
|
||||||
|
|
||||||
|
const ac = new AbortController();
|
||||||
|
|
||||||
|
(async () => {
|
||||||
|
const ee = new EventEmitter();
|
||||||
|
|
||||||
|
// Emit later on
|
||||||
|
process.nextTick(() => {
|
||||||
|
ee.emit('foo', 'bar');
|
||||||
|
ee.emit('foo', 42);
|
||||||
|
});
|
||||||
|
|
||||||
|
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
|
||||||
|
// The execution of this inner block is synchronous and it
|
||||||
|
// processes one event at a time (even with await). Do not use
|
||||||
|
// if concurrent execution is required.
|
||||||
|
console.log(event); // prints ['bar'] [42]
|
||||||
|
}
|
||||||
|
// Unreachable here
|
||||||
|
})();
|
||||||
|
|
||||||
|
process.nextTick(() => ac.abort());
|
||||||
|
```
|
||||||
|
|
||||||
|
```cjs
|
||||||
const { on, EventEmitter } = require('node:events');
|
const { on, EventEmitter } = require('node:events');
|
||||||
|
|
||||||
const ac = new AbortController();
|
const ac = new AbortController();
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
@ -1164,7 +1453,16 @@ added: v15.4.0
|
|||||||
or {EventEmitter} instances. If none are specified, `n` is set as the default
|
or {EventEmitter} instances. If none are specified, `n` is set as the default
|
||||||
max for all newly created {EventTarget} and {EventEmitter} objects.
|
max for all newly created {EventTarget} and {EventEmitter} objects.
|
||||||
|
|
||||||
```js
|
```mjs
|
||||||
|
import { setMaxListeners, EventEmitter } from 'node:events';
|
||||||
|
|
||||||
|
const target = new EventTarget();
|
||||||
|
const emitter = new EventEmitter();
|
||||||
|
|
||||||
|
setMaxListeners(5, target, emitter);
|
||||||
|
```
|
||||||
|
|
||||||
|
```cjs
|
||||||
const {
|
const {
|
||||||
setMaxListeners,
|
setMaxListeners,
|
||||||
EventEmitter
|
EventEmitter
|
||||||
@ -1188,7 +1486,36 @@ Integrates `EventEmitter` with {AsyncResource} for `EventEmitter`s that
|
|||||||
require manual async tracking. Specifically, all events emitted by instances
|
require manual async tracking. Specifically, all events emitted by instances
|
||||||
of `events.EventEmitterAsyncResource` will run within its [async context][].
|
of `events.EventEmitterAsyncResource` will run within its [async context][].
|
||||||
|
|
||||||
```js
|
```mjs
|
||||||
|
import { EventEmitterAsyncResource } from 'node:events';
|
||||||
|
import { notStrictEqual, strictEqual } from 'node:assert';
|
||||||
|
import { executionAsyncId } from 'node:async_hooks';
|
||||||
|
|
||||||
|
// Async tracking tooling will identify this as 'Q'.
|
||||||
|
const ee1 = new EventEmitterAsyncResource({ name: 'Q' });
|
||||||
|
|
||||||
|
// 'foo' listeners will run in the EventEmitters async context.
|
||||||
|
ee1.on('foo', () => {
|
||||||
|
strictEqual(executionAsyncId(), ee1.asyncId);
|
||||||
|
strictEqual(triggerAsyncId(), ee1.triggerAsyncId);
|
||||||
|
});
|
||||||
|
|
||||||
|
const ee2 = new EventEmitter();
|
||||||
|
|
||||||
|
// 'foo' listeners on ordinary EventEmitters that do not track async
|
||||||
|
// context, however, run in the same async context as the emit().
|
||||||
|
ee2.on('foo', () => {
|
||||||
|
notStrictEqual(executionAsyncId(), ee2.asyncId);
|
||||||
|
notStrictEqual(triggerAsyncId(), ee2.triggerAsyncId);
|
||||||
|
});
|
||||||
|
|
||||||
|
Promise.resolve().then(() => {
|
||||||
|
ee1.emit('foo');
|
||||||
|
ee2.emit('foo');
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
```cjs
|
||||||
const { EventEmitterAsyncResource } = require('node:events');
|
const { EventEmitterAsyncResource } = require('node:events');
|
||||||
const { notStrictEqual, strictEqual } = require('node:assert');
|
const { notStrictEqual, strictEqual } = require('node:assert');
|
||||||
const { executionAsyncId } = require('node:async_hooks');
|
const { executionAsyncId } = require('node:async_hooks');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user