From 1c4763732afb4f4d92699bb185ff1151861ce0a1 Mon Sep 17 00:00:00 2001 From: baileympearson <23407842+baileympearson@users.noreply.github.com> Date: Mon, 17 Mar 2025 19:22:55 +0000 Subject: [PATCH] [create-pull-request] automated change --- docs/Next/assets/highlight.css | 8 +- docs/Next/assets/navigation.js | 2 +- docs/Next/assets/search.js | 2 +- docs/Next/classes/AbstractCursor.html | 68 ++++----- docs/Next/classes/Admin.html | 2 +- docs/Next/classes/AggregationCursor.html | 76 +++++----- docs/Next/classes/BulkOperationBase.html | 4 +- docs/Next/classes/CancellationToken.html | 62 ++++---- docs/Next/classes/ChangeStream.html | 62 ++++---- docs/Next/classes/ClientEncryption.html | 60 ++++---- docs/Next/classes/ClientSession.html | 62 ++++---- docs/Next/classes/Collection.html | 12 +- docs/Next/classes/Db.html | 6 +- docs/Next/classes/ExplainableCursor.html | 68 ++++----- docs/Next/classes/FindCursor.html | 72 ++++----- docs/Next/classes/GridFSBucket.html | 62 ++++---- docs/Next/classes/GridFSBucketReadStream.html | 142 +++++++++--------- .../Next/classes/GridFSBucketWriteStream.html | 120 +++++++-------- docs/Next/classes/ListCollectionsCursor.html | 68 ++++----- docs/Next/classes/ListIndexesCursor.html | 68 ++++----- .../Next/classes/ListSearchIndexesCursor.html | 76 +++++----- docs/Next/classes/MongoClient.html | 68 ++++----- docs/Next/classes/MongoCredentials.html | 18 +-- docs/Next/classes/OrderedBulkOperation.html | 4 +- docs/Next/classes/RunCommandCursor.html | 68 ++++----- docs/Next/classes/TypedEventEmitter.html | 62 ++++---- docs/Next/classes/UnorderedBulkOperation.html | 4 +- .../configureExplicitResourceManagement.html | 2 +- docs/Next/index.html | 21 ++- docs/Next/interfaces/AWSCredentials.html | 7 + .../interfaces/AWSEncryptionKeyOptions.html | 8 +- .../AWSKMSProviderConfiguration.html | 8 +- .../interfaces/AbstractCursorOptions.html | 6 +- docs/Next/interfaces/AggregateOptions.html | 2 +- .../interfaces/AggregationCursorOptions.html | 6 +- .../interfaces/AuthMechanismProperties.html | 21 ++- .../interfaces/AutoEncryptionOptions.html | 24 +-- .../interfaces/AzureEncryptionKeyOptions.html | 8 +- .../interfaces/BSON.DeserializeOptions.html | 2 +- .../Next/interfaces/BSONSerializeOptions.html | 2 +- docs/Next/interfaces/BulkWriteOptions.html | 2 +- docs/Next/interfaces/ChangeStreamOptions.html | 2 +- .../interfaces/ClientBulkWriteOptions.html | 2 +- ...ncryptionCreateDataKeyProviderOptions.html | 6 +- .../ClientEncryptionEncryptOptions.html | 14 +- .../interfaces/ClientEncryptionOptions.html | 22 +-- ...ptionRewrapManyDataKeyProviderOptions.html | 4 +- ...ientEncryptionRewrapManyDataKeyResult.html | 4 +- docs/Next/interfaces/CollectionOptions.html | 2 +- .../interfaces/CommandOperationOptions.html | 2 +- .../interfaces/CountDocumentsOptions.html | 2 +- docs/Next/interfaces/CountOptions.html | 2 +- .../interfaces/CreateCollectionOptions.html | 2 +- .../Next/interfaces/CreateIndexesOptions.html | 2 +- docs/Next/interfaces/CredentialProviders.html | 3 + docs/Next/interfaces/DataKey.html | 4 +- docs/Next/interfaces/DbOptions.html | 2 +- docs/Next/interfaces/DbStatsOptions.html | 2 +- docs/Next/interfaces/DeleteOptions.html | 2 +- .../interfaces/DropCollectionOptions.html | 2 +- .../EstimatedDocumentCountOptions.html | 2 +- docs/Next/interfaces/ExplainOptions.html | 2 +- .../interfaces/FindOneAndDeleteOptions.html | 2 +- .../interfaces/FindOneAndReplaceOptions.html | 2 +- .../interfaces/FindOneAndUpdateOptions.html | 2 +- docs/Next/interfaces/FindOptions.html | 2 +- .../interfaces/GCPEncryptionKeyOptions.html | 14 +- .../interfaces/IndexInformationOptions.html | 6 +- docs/Next/interfaces/InsertOneOptions.html | 2 +- .../interfaces/KMIPEncryptionKeyOptions.html | 8 +- .../KMIPKMSProviderConfiguration.html | 4 +- docs/Next/interfaces/KMSProviders.html | 12 +- .../interfaces/ListCollectionsOptions.html | 4 +- .../Next/interfaces/ListDatabasesOptions.html | 2 +- .../LocalKMSProviderConfiguration.html | 4 +- docs/Next/interfaces/MongoClientOptions.html | 2 +- .../interfaces/MongoCredentialsOptions.html | 4 +- docs/Next/interfaces/MongoOptions.html | 2 +- docs/Next/interfaces/OperationOptions.html | 2 +- docs/Next/interfaces/RangeOptions.html | 10 +- docs/Next/interfaces/RenameOptions.html | 2 +- docs/Next/interfaces/ReplaceOptions.html | 2 +- docs/Next/interfaces/TransactionOptions.html | 2 +- docs/Next/interfaces/UpdateOptions.html | 2 +- .../interfaces/ValidateCollectionOptions.html | 2 +- docs/Next/modules.html | 3 + docs/Next/types/AWSCredentialProvider.html | 4 + docs/Next/types/Abortable.html | 2 +- .../types/AutoEncryptionExtraOptions.html | 2 +- .../Next/types/AutoEncryptionLoggerLevel.html | 2 +- .../types/AzureKMSProviderConfiguration.html | 2 +- docs/Next/types/ClientBulkWriteModel.html | 2 +- .../ClientEncryptionDataKeyProvider.html | 2 +- .../types/GCPKMSProviderConfiguration.html | 2 +- docs/Next/types/RunCursorCommandOptions.html | 4 +- docs/Next/types/ServerEvents.html | 2 +- .../AutoEncryptionLoggerLevel-1.html | 2 +- docs/Next/variables/CursorTimeoutMode-1.html | 4 +- docs/categories/index.xml | 2 +- docs/index.html | 2 +- docs/index.xml | 2 +- docs/tags/index.xml | 2 +- 102 files changed, 847 insertions(+), 818 deletions(-) create mode 100644 docs/Next/interfaces/AWSCredentials.html create mode 100644 docs/Next/interfaces/CredentialProviders.html create mode 100644 docs/Next/types/AWSCredentialProvider.html diff --git a/docs/Next/assets/highlight.css b/docs/Next/assets/highlight.css index 7dd8a693450..1daba588bc3 100644 --- a/docs/Next/assets/highlight.css +++ b/docs/Next/assets/highlight.css @@ -7,10 +7,10 @@ --dark-hl-2: #569CD6; --light-hl-3: #A31515; --dark-hl-3: #CE9178; - --light-hl-4: #008000; - --dark-hl-4: #6A9955; - --light-hl-5: #0070C1; - --dark-hl-5: #4FC1FF; + --light-hl-4: #0070C1; + --dark-hl-4: #4FC1FF; + --light-hl-5: #008000; + --dark-hl-5: #6A9955; --light-hl-6: #001080; --dark-hl-6: #9CDCFE; --light-hl-7: #AF00DB; diff --git a/docs/Next/assets/navigation.js b/docs/Next/assets/navigation.js index 2ca85798226..e318a8f6e3c 100644 --- a/docs/Next/assets/navigation.js +++ b/docs/Next/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "data:application/octet-stream;base64,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" \ No newline at end of file +window.navigationData = "data:application/octet-stream;base64,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" \ No newline at end of file diff --git a/docs/Next/assets/search.js b/docs/Next/assets/search.js index 041ca4c704e..80c8928dbc3 100644 --- a/docs/Next/assets/search.js +++ b/docs/Next/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/docs/Next/classes/AbstractCursor.html b/docs/Next/classes/AbstractCursor.html index aa891d22f4e..dc5548331da 100644 --- a/docs/Next/classes/AbstractCursor.html +++ b/docs/Next/classes/AbstractCursor.html @@ -75,7 +75,7 @@ that a "possible EventEmitter memory leak" has been detected. For any single EventEmitter, the emitter.getMaxListeners() and emitter.setMaxListeners() methods can be used to temporarily avoid this warning:

-
import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
}); +
import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});

The --trace-warnings command-line flag can be used to display the @@ -113,13 +113,13 @@

Parameters

  • Optionaloptions: {
        timeoutMS?: number;
    }
    • OptionaltimeoutMS?: number

Returns Promise<void>

  • 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.

    -
    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 +
    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

    Type Parameters

    • EventKey extends string | number | symbol

    Parameters

    Returns boolean

    v0.1.26

  • Returns an array listing the events for which the emitter has registered listeners. The values in the array are strings or Symbols.

    -
    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) ] +
    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) ]

    Returns string[]

    v6.0.0

    @@ -137,7 +137,7 @@ in the list of the listeners of the event.

    Type Parameters

    • EventKey extends string | number | symbol

    Parameters

    Returns number

    v3.2.0

  • Returns a copy of the array of listeners for the event named eventName.

    -
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ] +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ]

    Type Parameters

    • EventKey extends string | number | symbol

    Parameters

    Returns CursorEvents[EventKey][]

    v0.1.26

    @@ -148,18 +148,18 @@

Returns AbstractCursor<T, AbstractCursorEvents>

Note Cursors use null internally to indicate that there are no more documents in the cursor. Providing a mapping function that maps values to null will result in the cursor closing itself before it has finished iterating all documents. This will not result in a memory leak, just surprising behavior. For example:

-
const cursor = collection.find({});
cursor.map(() => null);

const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection. +
const cursor = collection.find({});
cursor.map(() => null);

const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection.

Other falsey values are allowed:

-
const cursor = collection.find({});
cursor.map(() => '');

const documents = await cursor.toArray();
// documents is now an array of empty strings +
const cursor = collection.find({});
cursor.map(() => '');

const documents = await cursor.toArray();
// documents is now an array of empty strings

Note for Typescript Users: adding a transform changes the return type of the iteration of this cursor, it does not return a new instance of a cursor. This means when calling map, you should always assign the result to a new variable in order to get a correctly typed cursor variable. Take note of the following example:

-
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[] +
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[]
  • Returns a copy of the array of listeners for the event named eventName, including any wrappers (such as those created by .once()).

    -
    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'); +
    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');

    Type Parameters

    • EventKey extends string | number | symbol

    Parameters

    Returns CursorEvents[EventKey][]

    Type Parameters

    • EventKey extends string | number | symbol

    Parameters

    • Optionalevent: string | symbol | EventKey

    Returns this

    v0.1.26

  • A class method that returns the number of listeners for the given eventName registered on the given emitter.

    -
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2 +
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2

    Parameters

    • emitter: EventEmitter<DefaultEventMap>

      The emitter to query

    • eventName: string | symbol

      The event name

    Returns number

    v0.9.12

    Since v3.2.0 - Use listenerCount instead.

    -
  • 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 +
  • 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

    Returns an AsyncIterator that iterates eventName events. It will throw @@ -470,11 +470,11 @@

    Parameters

    • emitter: EventEmitter<DefaultEventMap>
    • eventName: string | symbol
    • Optionaloptions: StaticEventEmitterIteratorOptions

    Returns AsyncIterator<any[], any, any>

    An AsyncIterator that iterates eventName events emitted by the emitter

    @@ -485,21 +485,21 @@
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter); +
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter);

    Parameters

    • Optionaln: number

      A non-negative number. The maximum number of listeners per EventTarget event.

      diff --git a/docs/Next/classes/Admin.html b/docs/Next/classes/Admin.html index 0416fc83d16..6e5dcb824b2 100644 --- a/docs/Next/classes/Admin.html +++ b/docs/Next/classes/Admin.html @@ -1,7 +1,7 @@ Admin | mongodb

      Class Admin

      The Admin class is an internal class that allows convenient access to the admin functionality and commands for MongoDB.

      ADMIN Cannot directly be instantiated

      -
      import { MongoClient } from 'mongodb';

      const client = new MongoClient('mongodb://localhost:27017');
      const admin = client.db().admin();
      const dbInfo = await admin.listDatabases();
      for (const db of dbInfo.databases) {
      console.log(db.name);
      } +
      import { MongoClient } from 'mongodb';

      const client = new MongoClient('mongodb://localhost:27017');
      const admin = client.db().admin();
      const dbInfo = await admin.listDatabases();
      for (const db of dbInfo.databases) {
      console.log(db.name);
      }

      Methods

      buildInfo diff --git a/docs/Next/classes/AggregationCursor.html b/docs/Next/classes/AggregationCursor.html index b6769945377..ec491105196 100644 --- a/docs/Next/classes/AggregationCursor.html +++ b/docs/Next/classes/AggregationCursor.html @@ -94,7 +94,7 @@ that a "possible EventEmitter memory leak" has been detected. For any single EventEmitter, the emitter.getMaxListeners() and emitter.setMaxListeners() methods can be used to temporarily avoid this warning:

      -
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.setMaxListeners(emitter.getMaxListeners() + 1);
      emitter.once('event', () => {
      // do stuff
      emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
      }); +
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.setMaxListeners(emitter.getMaxListeners() + 1);
      emitter.once('event', () => {
      // do stuff
      emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
      });

      The --trace-warnings command-line flag can be used to display the @@ -125,10 +125,10 @@

    • Alias for emitter.on(eventName, listener).

      Parameters

      Returns this

      v0.1.26

  • Add a stage to the aggregation pipeline

    -

    Parameters

    Returns this

    const documents = await users.aggregate().addStage({ $match: { name: /Mike/ } }).toArray();
    +

    Parameters

    Returns this

    const documents = await users.aggregate().addStage({ $match: { name: /Mike/ } }).toArray();
     
    -
    const documents = await users.aggregate()
    .addStage<{ name: string }>({ $project: { name: true } })
    .toArray(); // type of documents is { name: string }[] +
    const documents = await users.aggregate()
    .addStage<{ name: string }>({ $project: { name: true } })
    .toArray(); // type of documents is { name: string }[]
  • Type Parameters

    Parameters

    Returns AggregationCursor<T>

  • 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.

    -
    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 +
    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

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns boolean

    v0.1.26

  • Returns an array listing the events for which the emitter has registered listeners. The values in the array are strings or Symbols.

    -
    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) ] +
    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) ]

    Returns string[]

    v6.0.0

    @@ -170,7 +170,7 @@

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns number

    v3.2.0

  • Returns a copy of the array of listeners for the event named eventName.

    -
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ] +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ]

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns AbstractCursorEvents[EventKey][]

    v0.1.26

    @@ -182,18 +182,18 @@

Returns AggregationCursor<T>

Note Cursors use null internally to indicate that there are no more documents in the cursor. Providing a mapping function that maps values to null will result in the cursor closing itself before it has finished iterating all documents. This will not result in a memory leak, just surprising behavior. For example:

-
const cursor = collection.find({});
cursor.map(() => null);

const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection. +
const cursor = collection.find({});
cursor.map(() => null);

const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection.

Other falsey values are allowed:

-
const cursor = collection.find({});
cursor.map(() => '');

const documents = await cursor.toArray();
// documents is now an array of empty strings +
const cursor = collection.find({});
cursor.map(() => '');

const documents = await cursor.toArray();
// documents is now an array of empty strings

Note for Typescript Users: adding a transform changes the return type of the iteration of this cursor, it does not return a new instance of a cursor. This means when calling map, you should always assign the result to a new variable in order to get a correctly typed cursor variable. Take note of the following example:

-
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[] +
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[]
  • Returns a copy of the array of listeners for the event named eventName, including any wrappers (such as those created by .once()).

    -
    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'); +
    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');

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns AbstractCursorEvents[EventKey][]

    Type Parameters

    • EventKey extends "close"

    Parameters

    • Optionalevent: string | symbol | EventKey

    Returns this

    v0.1.26

  • A class method that returns the number of listeners for the given eventName registered on the given emitter.

    -
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2 +
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2

    Parameters

    • emitter: EventEmitter<DefaultEventMap>

      The emitter to query

    • eventName: string | symbol

      The event name

    Returns number

    v0.9.12

    Since v3.2.0 - Use listenerCount instead.

    -
  • 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 +
  • 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

    Returns an AsyncIterator that iterates eventName events. It will throw @@ -521,11 +521,11 @@

    Parameters

    • emitter: EventEmitter<DefaultEventMap>
    • eventName: string | symbol
    • Optionaloptions: StaticEventEmitterIteratorOptions

    Returns AsyncIterator<any[], any, any>

    An AsyncIterator that iterates eventName events emitted by the emitter

    @@ -536,21 +536,21 @@
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter); +
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter);

    Parameters

    • Optionaln: number

      A non-negative number. The maximum number of listeners per EventTarget event.

      diff --git a/docs/Next/classes/BulkOperationBase.html b/docs/Next/classes/BulkOperationBase.html index 15483d66b58..bd987a558b7 100644 --- a/docs/Next/classes/BulkOperationBase.html +++ b/docs/Next/classes/BulkOperationBase.html @@ -11,11 +11,11 @@ raw

Properties

isOrdered: boolean
operationId?: number

Accessors

Methods

  • Builds a find operation for an update/updateOne/delete/deleteOne/replaceOne. Returns a builder object used to complete the definition of the operation.

    -

    Parameters

    Returns FindOperators

    const bulkOp = collection.initializeOrderedBulkOp();

    // Add an updateOne to the bulkOp
    bulkOp.find({ a: 1 }).updateOne({ $set: { b: 2 } });

    // Add an updateMany to the bulkOp
    bulkOp.find({ c: 3 }).update({ $set: { d: 4 } });

    // Add an upsert
    bulkOp.find({ e: 5 }).upsert().updateOne({ $set: { f: 6 } });

    // Add a deletion
    bulkOp.find({ g: 7 }).deleteOne();

    // Add a multi deletion
    bulkOp.find({ h: 8 }).delete();

    // Add a replaceOne
    bulkOp.find({ i: 9 }).replaceOne({writeConcern: { j: 10 }});

    // Update using a pipeline (requires Mongodb 4.2 or higher)
    bulk.find({ k: 11, y: { $exists: true }, z: { $exists: true } }).updateOne([
    { $set: { total: { $sum: [ '$y', '$z' ] } } }
    ]);

    // All of the ops will now be executed
    await bulkOp.execute(); +

    Parameters

    Returns FindOperators

    const bulkOp = collection.initializeOrderedBulkOp();

    // Add an updateOne to the bulkOp
    bulkOp.find({ a: 1 }).updateOne({ $set: { b: 2 } });

    // Add an updateMany to the bulkOp
    bulkOp.find({ c: 3 }).update({ $set: { d: 4 } });

    // Add an upsert
    bulkOp.find({ e: 5 }).upsert().updateOne({ $set: { f: 6 } });

    // Add a deletion
    bulkOp.find({ g: 7 }).deleteOne();

    // Add a multi deletion
    bulkOp.find({ h: 8 }).delete();

    // Add a replaceOne
    bulkOp.find({ i: 9 }).replaceOne({writeConcern: { j: 10 }});

    // Update using a pipeline (requires Mongodb 4.2 or higher)
    bulk.find({ k: 11, y: { $exists: true }, z: { $exists: true } }).updateOne([
    { $set: { total: { $sum: [ '$y', '$z' ] } } }
    ]);

    // All of the ops will now be executed
    await bulkOp.execute();
  • Add a single insert document to the bulk operation

    -

    Parameters

    Returns BulkOperationBase

    const bulkOp = collection.initializeOrderedBulkOp();

    // Adds three inserts to the bulkOp.
    bulkOp
    .insert({ a: 1 })
    .insert({ b: 2 })
    .insert({ c: 3 });
    await bulkOp.execute(); +

    Parameters

    Returns BulkOperationBase

    const bulkOp = collection.initializeOrderedBulkOp();

    // Adds three inserts to the bulkOp.
    bulkOp
    .insert({ a: 1 })
    .insert({ b: 2 })
    .insert({ c: 3 });
    await bulkOp.execute();
  • Specifies a raw operation to perform in the bulk write.

    diff --git a/docs/Next/classes/CancellationToken.html b/docs/Next/classes/CancellationToken.html index 23a60e76400..e3d129d00e6 100644 --- a/docs/Next/classes/CancellationToken.html +++ b/docs/Next/classes/CancellationToken.html @@ -46,7 +46,7 @@ that a "possible EventEmitter memory leak" has been detected. For any single EventEmitter, the emitter.getMaxListeners() and emitter.setMaxListeners() methods can be used to temporarily avoid this warning:

    -
    import { EventEmitter } from 'node:events';
    const emitter = new EventEmitter();
    emitter.setMaxListeners(emitter.getMaxListeners() + 1);
    emitter.once('event', () => {
    // do stuff
    emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
    }); +
    import { EventEmitter } from 'node:events';
    const emitter = new EventEmitter();
    emitter.setMaxListeners(emitter.getMaxListeners() + 1);
    emitter.once('event', () => {
    // do stuff
    emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
    });

    The --trace-warnings command-line flag can be used to display the @@ -70,13 +70,13 @@

  • 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.

    -
    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 +
    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

    Type Parameters

    • EventKey extends "cancel"

    Parameters

    • event: symbol | EventKey
    • Rest...args: Parameters<{
          cancel(): void;
      }[EventKey]>

    Returns boolean

    v0.1.26

  • Returns an array listing the events for which the emitter has registered listeners. The values in the array are strings or Symbols.

    -
    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) ] +
    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) ]

    Returns string[]

    v6.0.0

    @@ -88,7 +88,7 @@ in the list of the listeners of the event.

    Type Parameters

    • EventKey extends "cancel"

    Parameters

    Returns number

    v3.2.0

  • Returns a copy of the array of listeners for the event named eventName.

    -
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ] +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ]

    Type Parameters

    • EventKey extends "cancel"

    Parameters

    Returns {
        cancel(): void;
    }[EventKey][]

    v0.1.26

    @@ -108,7 +108,7 @@

    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.

    -
    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 +
    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

    Type Parameters

    • EventKey extends "cancel"

    Parameters

    • event: EventKey
    • listener: {
          cancel(): void;
      }[EventKey]

      The callback function

      @@ -123,7 +123,7 @@

      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.

      -
      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 +
      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

      Parameters

      • event: CommonEvents
      • listener: ((eventName: string | symbol, listener: GenericListener) => void)

        The callback function

        @@ -138,7 +138,7 @@

        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.

        -
        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 +
        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

        Parameters

        • event: string | symbol
        • listener: GenericListener

          The callback function

          @@ -151,7 +151,7 @@

          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.

          -
          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 +
          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

          Type Parameters

          • EventKey extends "cancel"

          Parameters

          • event: EventKey
          • listener: {
                cancel(): void;
            }[EventKey]

            The callback function

            @@ -164,7 +164,7 @@

            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.

            -
            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 +
            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

            Parameters

            • event: CommonEvents
            • listener: ((eventName: string | symbol, listener: GenericListener) => void)

              The callback function

              @@ -177,7 +177,7 @@

              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.

              -
              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 +
              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

              Parameters

              • event: string | symbol
              • listener: GenericListener

                The callback function

                @@ -238,7 +238,7 @@

              Returns this

              v6.0.0

  • Returns a copy of the array of listeners for the event named eventName, including any wrappers (such as those created by .once()).

    -
    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'); +
    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');

    Type Parameters

    • EventKey extends "cancel"

    Parameters

    Returns {
        cancel(): void;
    }[EventKey][]

    v9.4.0

    @@ -249,7 +249,7 @@

    Returns a reference to the EventEmitter, so that calls can be chained.

    Type Parameters

    • EventKey extends "cancel"

    Parameters

    • Optionalevent: string | symbol | EventKey

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -259,7 +259,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -270,13 +270,13 @@

    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:

    -
    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'); +
    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.

    Type Parameters

    • EventKey extends "cancel"

    Parameters

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -286,7 +286,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -297,13 +297,13 @@

    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:

    -
    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'); +
    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.

    Parameters

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -313,7 +313,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -324,7 +324,7 @@

    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:

    -
    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'); +
    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.

    @@ -345,7 +345,7 @@ two issues by listening to the event such that stopImmediatePropagation does not prevent the listener from running.

    Returns a disposable so that it may be unsubscribed from more easily.

    -
    import { addAbortListener } from 'node:events';

    function example(signal) {
    let disposable;
    try {
    signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
    disposable = addAbortListener(signal, (e) => {
    // Do something when signal is aborted.
    });
    } finally {
    disposable?.[Symbol.dispose]();
    }
    } +
    import { addAbortListener } from 'node:events';

    function example(signal) {
    let disposable;
    try {
    signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
    disposable = addAbortListener(signal, (e) => {
    // Do something when signal is aborted.
    });
    } finally {
    disposable?.[Symbol.dispose]();
    }
    }

    Parameters

    • signal: AbortSignal
    • resource: ((event: Event) => void)
        • (event): void
        • Parameters

          • event: Event

          Returns void

    Returns Disposable

    Disposable that removes the abort listener.

    @@ -355,7 +355,7 @@ the emitter.

    For EventTargets this is the only way to get the event listeners for the event target. This is useful for debugging and diagnostic purposes.

    -
    import { getEventListeners, EventEmitter } from 'node:events';

    {
    const ee = new EventEmitter();
    const listener = () => console.log('Events are fun');
    ee.on('foo', listener);
    console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
    }
    {
    const et = new EventTarget();
    const listener = () => console.log('Events are fun');
    et.addEventListener('foo', listener);
    console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
    } +
    import { getEventListeners, EventEmitter } from 'node:events';

    {
    const ee = new EventEmitter();
    const listener = () => console.log('Events are fun');
    ee.on('foo', listener);
    console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
    }
    {
    const et = new EventTarget();
    const listener = () => console.log('Events are fun');
    et.addEventListener('foo', listener);
    console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
    }

    Parameters

    • emitter: EventEmitter<DefaultEventMap> | EventTarget
    • name: string | symbol

    Returns Function[]

    v15.2.0, v14.17.0

    @@ -365,19 +365,19 @@

    For EventTargets this is the only way to get the max event listeners for the event target. If the number of event handlers on a single EventTarget exceeds the max set, the EventTarget will print a warning.

    -
    import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';

    {
    const ee = new EventEmitter();
    console.log(getMaxListeners(ee)); // 10
    setMaxListeners(11, ee);
    console.log(getMaxListeners(ee)); // 11
    }
    {
    const et = new EventTarget();
    console.log(getMaxListeners(et)); // 10
    setMaxListeners(11, et);
    console.log(getMaxListeners(et)); // 11
    } +
    import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';

    {
    const ee = new EventEmitter();
    console.log(getMaxListeners(ee)); // 10
    setMaxListeners(11, ee);
    console.log(getMaxListeners(ee)); // 11
    }
    {
    const et = new EventTarget();
    console.log(getMaxListeners(et)); // 10
    setMaxListeners(11, et);
    console.log(getMaxListeners(et)); // 11
    }

    Parameters

    • emitter: EventEmitter<DefaultEventMap> | EventTarget

    Returns number

    v19.9.0

  • A class method that returns the number of listeners for the given eventName registered on the given emitter.

    -
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2 +
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2

    Parameters

    • emitter: EventEmitter<DefaultEventMap>

      The emitter to query

    • eventName: string | symbol

      The event name

    Returns number

    v0.9.12

    Since v3.2.0 - Use listenerCount instead.

    -
  • 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 +
  • 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

    Returns an AsyncIterator that iterates eventName events. It will throw @@ -385,11 +385,11 @@

    Parameters

    • emitter: EventEmitter<DefaultEventMap>
    • eventName: string | symbol
    • Optionaloptions: StaticEventEmitterIteratorOptions

    Returns AsyncIterator<any[], any, any>

    An AsyncIterator that iterates eventName events emitted by the emitter

    @@ -400,21 +400,21 @@
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter); +
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter);

    Parameters

    • Optionaln: number

      A non-negative number. The maximum number of listeners per EventTarget event.

      diff --git a/docs/Next/classes/ChangeStream.html b/docs/Next/classes/ChangeStream.html index 70dd8207742..81295485edf 100644 --- a/docs/Next/classes/ChangeStream.html +++ b/docs/Next/classes/ChangeStream.html @@ -78,7 +78,7 @@ that a "possible EventEmitter memory leak" has been detected. For any single EventEmitter, the emitter.getMaxListeners() and emitter.setMaxListeners() methods can be used to temporarily avoid this warning:

      -
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.setMaxListeners(emitter.getMaxListeners() + 1);
      emitter.once('event', () => {
      // do stuff
      emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
      }); +
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.setMaxListeners(emitter.getMaxListeners() + 1);
      emitter.once('event', () => {
      // do stuff
      emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
      });

      The --trace-warnings command-line flag can be used to display the @@ -106,13 +106,13 @@

      Returns Promise<void>

  • 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.

    -
    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 +
    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

    Type Parameters

    Parameters

    Returns boolean

    v0.1.26

  • Returns an array listing the events for which the emitter has registered listeners. The values in the array are strings or Symbols.

    -
    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) ] +
    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) ]

    Returns string[]

    v6.0.0

    @@ -125,7 +125,7 @@ in the list of the listeners of the event.

    Type Parameters

    Parameters

    Returns number

    v3.2.0

  • Returns a copy of the array of listeners for the event named eventName.

    -
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ] +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ]

    Type Parameters

    Parameters

    Returns ChangeStreamEvents<TSchema, TChange>[EventKey][]

    v0.1.26

    @@ -146,7 +146,7 @@

    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.

    -
    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 +
    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

    Type Parameters

    Parameters

    • event: EventKey
    • listener: ChangeStreamEvents<TSchema, TChange>[EventKey]

      The callback function

      @@ -161,7 +161,7 @@

      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.

      -
      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 +
      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

      Parameters

      • event: CommonEvents
      • listener: ((eventName: string | symbol, listener: GenericListener) => void)

        The callback function

        @@ -176,7 +176,7 @@

        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.

        -
        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 +
        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

        Parameters

        • event: string | symbol
        • listener: GenericListener

          The callback function

          @@ -189,7 +189,7 @@

          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.

          -
          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 +
          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

          Type Parameters

          Parameters

          • event: EventKey
          • listener: ChangeStreamEvents<TSchema, TChange>[EventKey]

            The callback function

            @@ -202,7 +202,7 @@

            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.

            -
            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 +
            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

            Parameters

            • event: CommonEvents
            • listener: ((eventName: string | symbol, listener: GenericListener) => void)

              The callback function

              @@ -215,7 +215,7 @@

              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.

              -
              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 +
              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

              Parameters

              • event: string | symbol
              • listener: GenericListener

                The callback function

                @@ -276,7 +276,7 @@

              Returns this

              v6.0.0

  • Returns a copy of the array of listeners for the event named eventName, including any wrappers (such as those created by .once()).

    -
    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'); +
    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');

    Type Parameters

    Parameters

    Returns ChangeStreamEvents<TSchema, TChange>[EventKey][]

    v9.4.0

    @@ -287,7 +287,7 @@

    Returns a reference to the EventEmitter, so that calls can be chained.

    Type Parameters

    Parameters

    • Optionalevent: string | symbol | EventKey

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -297,7 +297,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -308,13 +308,13 @@

    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:

    -
    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'); +
    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.

    Type Parameters

    Parameters

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -324,7 +324,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -335,13 +335,13 @@

    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:

    -
    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'); +
    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.

    Parameters

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -351,7 +351,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -362,7 +362,7 @@

    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:

    -
    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'); +
    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.

    @@ -388,7 +388,7 @@ two issues by listening to the event such that stopImmediatePropagation does not prevent the listener from running.

    Returns a disposable so that it may be unsubscribed from more easily.

    -
    import { addAbortListener } from 'node:events';

    function example(signal) {
    let disposable;
    try {
    signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
    disposable = addAbortListener(signal, (e) => {
    // Do something when signal is aborted.
    });
    } finally {
    disposable?.[Symbol.dispose]();
    }
    } +
    import { addAbortListener } from 'node:events';

    function example(signal) {
    let disposable;
    try {
    signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
    disposable = addAbortListener(signal, (e) => {
    // Do something when signal is aborted.
    });
    } finally {
    disposable?.[Symbol.dispose]();
    }
    }

    Parameters

    • signal: AbortSignal
    • resource: ((event: Event) => void)
        • (event): void
        • Parameters

          • event: Event

          Returns void

    Returns Disposable

    Disposable that removes the abort listener.

    @@ -398,7 +398,7 @@ the emitter.

    For EventTargets this is the only way to get the event listeners for the event target. This is useful for debugging and diagnostic purposes.

    -
    import { getEventListeners, EventEmitter } from 'node:events';

    {
    const ee = new EventEmitter();
    const listener = () => console.log('Events are fun');
    ee.on('foo', listener);
    console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
    }
    {
    const et = new EventTarget();
    const listener = () => console.log('Events are fun');
    et.addEventListener('foo', listener);
    console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
    } +
    import { getEventListeners, EventEmitter } from 'node:events';

    {
    const ee = new EventEmitter();
    const listener = () => console.log('Events are fun');
    ee.on('foo', listener);
    console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
    }
    {
    const et = new EventTarget();
    const listener = () => console.log('Events are fun');
    et.addEventListener('foo', listener);
    console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
    }

    Parameters

    • emitter: EventEmitter<DefaultEventMap> | EventTarget
    • name: string | symbol

    Returns Function[]

    v15.2.0, v14.17.0

    @@ -408,19 +408,19 @@

    For EventTargets this is the only way to get the max event listeners for the event target. If the number of event handlers on a single EventTarget exceeds the max set, the EventTarget will print a warning.

    -
    import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';

    {
    const ee = new EventEmitter();
    console.log(getMaxListeners(ee)); // 10
    setMaxListeners(11, ee);
    console.log(getMaxListeners(ee)); // 11
    }
    {
    const et = new EventTarget();
    console.log(getMaxListeners(et)); // 10
    setMaxListeners(11, et);
    console.log(getMaxListeners(et)); // 11
    } +
    import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';

    {
    const ee = new EventEmitter();
    console.log(getMaxListeners(ee)); // 10
    setMaxListeners(11, ee);
    console.log(getMaxListeners(ee)); // 11
    }
    {
    const et = new EventTarget();
    console.log(getMaxListeners(et)); // 10
    setMaxListeners(11, et);
    console.log(getMaxListeners(et)); // 11
    }

    Parameters

    • emitter: EventEmitter<DefaultEventMap> | EventTarget

    Returns number

    v19.9.0

  • A class method that returns the number of listeners for the given eventName registered on the given emitter.

    -
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2 +
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2

    Parameters

    • emitter: EventEmitter<DefaultEventMap>

      The emitter to query

    • eventName: string | symbol

      The event name

    Returns number

    v0.9.12

    Since v3.2.0 - Use listenerCount instead.

    -
  • 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 +
  • 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

    Returns an AsyncIterator that iterates eventName events. It will throw @@ -428,11 +428,11 @@

    Parameters

    • emitter: EventEmitter<DefaultEventMap>
    • eventName: string | symbol
    • Optionaloptions: StaticEventEmitterIteratorOptions

    Returns AsyncIterator<any[], any, any>

    An AsyncIterator that iterates eventName events emitted by the emitter

    @@ -443,21 +443,21 @@
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter); +
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter);

    Parameters

    • Optionaln: number

      A non-negative number. The maximum number of listeners per EventTarget event.

      diff --git a/docs/Next/classes/ClientEncryption.html b/docs/Next/classes/ClientEncryption.html index 8b1dc6d5e22..f54a6ae9b0d 100644 --- a/docs/Next/classes/ClientEncryption.html +++ b/docs/Next/classes/ClientEncryption.html @@ -1,5 +1,5 @@ ClientEncryption | mongodb

      Class ClientEncryption

      The public interface for explicit in-use encryption

      -

      Constructors

      Constructors

      • Create a new encryption instance

        -

        Parameters

        Returns ClientEncryption

        new ClientEncryption(mongoClient, {
        keyVaultNamespace: 'client.encryption',
        kmsProviders: {
        local: {
        key: masterKey // The master key used for encryption/decryption. A 96-byte long Buffer
        }
        }
        }); +

        Parameters

        Returns ClientEncryption

        new ClientEncryption(mongoClient, {
        keyVaultNamespace: 'client.encryption',
        kmsProviders: {
        local: {
        key: masterKey // The master key used for encryption/decryption. A 96-byte long Buffer
        }
        }
        });
        -
        new ClientEncryption(mongoClient, {
        keyVaultNamespace: 'client.encryption',
        kmsProviders: {
        aws: {
        accessKeyId: AWS_ACCESS_KEY,
        secretAccessKey: AWS_SECRET_KEY
        }
        }
        }); +
        new ClientEncryption(mongoClient, {
        keyVaultNamespace: 'client.encryption',
        kmsProviders: {
        aws: {
        accessKeyId: AWS_ACCESS_KEY,
        secretAccessKey: AWS_SECRET_KEY
        }
        }
        });
        -

      Accessors

      Methods

      Accessors

      Methods

      • Adds a keyAltName to a key identified by the provided _id.

        This method resolves to/returns the old key value (prior to adding the new altKeyName).

        Parameters

        • _id: Binary

          The id of the document to update.

        • keyAltName: string

          a keyAltName to search for a key

        Returns Promise<null | WithId<DataKey>>

        Returns a promise that either resolves to a DataKey if a document matches the key or null if no documents match the id. The promise rejects with an error if an error is thrown.

        -
        // adding an keyAltName to a data key
        const id = new Binary(); // id is a bson binary subtype 4 object
        const keyAltName = 'keyAltName';
        const oldKey = await clientEncryption.addKeyAltName(id, keyAltName);
        if (!oldKey) {
        // null is returned if there is no matching document with an id matching the supplied id
        } +
        // adding an keyAltName to a data key
        const id = new Binary(); // id is a bson binary subtype 4 object
        const keyAltName = 'keyAltName';
        const oldKey = await clientEncryption.addKeyAltName(id, keyAltName);
        if (!oldKey) {
        // null is returned if there is no matching document with an id matching the supplied id
        }
        -
      • Creates a data key used for explicit encryption and inserts it into the key vault namespace

        +

        Parameters

        Returns Promise<UUID>

        // Using async/await to create a local key
        const dataKeyId = await clientEncryption.createDataKey('local');
        -
        // Using async/await to create an aws key
        const dataKeyId = await clientEncryption.createDataKey('aws', {
        masterKey: {
        region: 'us-east-1',
        key: 'xxxxxxxxxxxxxx' // CMK ARN here
        }
        }); +
        // Using async/await to create an aws key
        const dataKeyId = await clientEncryption.createDataKey('aws', {
        masterKey: {
        region: 'us-east-1',
        key: 'xxxxxxxxxxxxxx' // CMK ARN here
        }
        });
        -
        // Using async/await to create an aws key with a keyAltName
        const dataKeyId = await clientEncryption.createDataKey('aws', {
        masterKey: {
        region: 'us-east-1',
        key: 'xxxxxxxxxxxxxx' // CMK ARN here
        },
        keyAltNames: [ 'mySpecialKey' ]
        }); +
        // Using async/await to create an aws key with a keyAltName
        const dataKeyId = await clientEncryption.createDataKey('aws', {
        masterKey: {
        region: 'us-east-1',
        key: 'xxxxxxxxxxxxxx' // CMK ARN here
        },
        keyAltNames: [ 'mySpecialKey' ]
        });
        -
      • Explicitly decrypt a provided encrypted value

        Type Parameters

        • T = any

        Parameters

        • value: Binary

          An encrypted value

        Returns Promise<T>

        a Promise that either resolves with the decrypted value, or rejects with an error

        -
        // Decrypting value with async/await API
        async function decryptMyValue(value) {
        return clientEncryption.decrypt(value);
        } +
        // Decrypting value with async/await API
        async function decryptMyValue(value) {
        return clientEncryption.decrypt(value);
        }
        -
      • Deletes the key with the provided id from the keyvault, if it exists.

        -

        Parameters

        Returns Promise<DeleteResult>

        // delete a key by _id
        const id = new Binary(); // id is a bson binary subtype 4 object
        const { deletedCount } = await clientEncryption.deleteKey(id);

        if (deletedCount != null && deletedCount > 0) {
        // successful deletion
        } +
      • Deletes the key with the provided id from the keyvault, if it exists.

        +

        Parameters

        Returns Promise<DeleteResult>

        // delete a key by _id
        const id = new Binary(); // id is a bson binary subtype 4 object
        const { deletedCount } = await clientEncryption.deleteKey(id);

        if (deletedCount != null && deletedCount > 0) {
        // successful deletion
        }
        -
      • Explicitly encrypt a provided value. Note that either options.keyId or options.keyAltName must be specified. Specifying both options.keyId and options.keyAltName is considered an error.

        Parameters

        Returns Promise<Binary>

        a Promise that either resolves with the encrypted value, or rejects with an error.

        -
        // Encryption with async/await api
        async function encryptMyData(value) {
        const keyId = await clientEncryption.createDataKey('local');
        return clientEncryption.encrypt(value, { keyId, algorithm: 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic' });
        } +
        // Encryption with async/await api
        async function encryptMyData(value) {
        const keyId = await clientEncryption.createDataKey('local');
        return clientEncryption.encrypt(value, { keyId, algorithm: 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic' });
        }
        -
        // Encryption using a keyAltName
        async function encryptMyData(value) {
        await clientEncryption.createDataKey('local', { keyAltNames: 'mySpecialKey' });
        return clientEncryption.encrypt(value, { keyAltName: 'mySpecialKey', algorithm: 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic' });
        } +
        // Encryption using a keyAltName
        async function encryptMyData(value) {
        await clientEncryption.createDataKey('local', { keyAltNames: 'mySpecialKey' });
        return clientEncryption.encrypt(value, { keyAltName: 'mySpecialKey', algorithm: 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic' });
        }
        -
      • Finds a key in the keyvault with the specified _id.

        Returns a promise that either resolves to a DataKey if a document matches the key or null if no documents match the id. The promise rejects with an error if an error is thrown.

        -

        Parameters

        Returns Promise<null | DataKey>

        // getting a key by id
        const id = new Binary(); // id is a bson binary subtype 4 object
        const key = await clientEncryption.getKey(id);
        if (!key) {
        // key is null if there was no matching key
        } +

        Parameters

        Returns Promise<null | DataKey>

        // getting a key by id
        const id = new Binary(); // id is a bson binary subtype 4 object
        const key = await clientEncryption.getKey(id);
        if (!key) {
        // key is null if there was no matching key
        }
        -
      • Finds a key in the keyvault which has the specified keyAltName.

        Parameters

        • keyAltName: string

          a keyAltName to search for a key

        Returns Promise<null | WithId<DataKey>>

        Returns a promise that either resolves to a DataKey if a document matches the key or null if no documents match the keyAltName. The promise rejects with an error if an error is thrown.

        -
        // get a key by alt name
        const keyAltName = 'keyAltName';
        const key = await clientEncryption.getKeyByAltName(keyAltName);
        if (!key) {
        // key is null if there is no matching key
        } +
        // get a key by alt name
        const keyAltName = 'keyAltName';
        const key = await clientEncryption.getKeyByAltName(keyAltName);
        if (!key) {
        // key is null if there is no matching key
        }
        -
      • Adds a keyAltName to a key identified by the provided _id.

        This method resolves to/returns the old key value (prior to removing the new altKeyName).

        If the removed keyAltName is the last keyAltName for that key, the altKeyNames property is unset from the document.

        Parameters

        • _id: Binary

          The id of the document to update.

        • keyAltName: string

          a keyAltName to search for a key

        Returns Promise<null | WithId<DataKey>>

        Returns a promise that either resolves to a DataKey if a document matches the key or null if no documents match the id. The promise rejects with an error if an error is thrown.

        -
        // removing a key alt name from a data key
        const id = new Binary(); // id is a bson binary subtype 4 object
        const keyAltName = 'keyAltName';
        const oldKey = await clientEncryption.removeKeyAltName(id, keyAltName);

        if (!oldKey) {
        // null is returned if there is no matching document with an id matching the supplied id
        } +
        // removing a key alt name from a data key
        const id = new Binary(); // id is a bson binary subtype 4 object
        const keyAltName = 'keyAltName';
        const oldKey = await clientEncryption.removeKeyAltName(id, keyAltName);

        if (!oldKey) {
        // null is returned if there is no matching document with an id matching the supplied id
        }
        -
      • Searches the keyvault for any data keys matching the provided filter. If there are matches, rewrapManyDataKey then attempts to re-wrap the data keys using the provided options.

        +
      • Searches the keyvault for any data keys matching the provided filter. If there are matches, rewrapManyDataKey then attempts to re-wrap the data keys using the provided options.

        If no matches are found, then no bulk write is performed.

        -

        Returns Promise<{
            bulkWriteResult?: BulkWriteResult;
        }>

        // rewrapping all data data keys (using a filter that matches all documents)
        const filter = {};

        const result = await clientEncryption.rewrapManyDataKey(filter);
        if (result.bulkWriteResult != null) {
        // keys were re-wrapped, results will be available in the bulkWrite object.
        } +

        Returns Promise<{
            bulkWriteResult?: BulkWriteResult;
        }>

        // rewrapping all data data keys (using a filter that matches all documents)
        const filter = {};

        const result = await clientEncryption.rewrapManyDataKey(filter);
        if (result.bulkWriteResult != null) {
        // keys were re-wrapped, results will be available in the bulkWrite object.
        }
        -
        // attempting to rewrap all data keys with no matches
        const filter = { _id: new Binary() } // assume _id matches no documents in the database
        const result = await clientEncryption.rewrapManyDataKey(filter);

        if (result.bulkWriteResult == null) {
        // no keys matched, `bulkWriteResult` does not exist on the result object
        } +
        // attempting to rewrap all data keys with no matches
        const filter = { _id: new Binary() } // assume _id matches no documents in the database
        const result = await clientEncryption.rewrapManyDataKey(filter);

        if (result.bulkWriteResult == null) {
        // no keys matched, `bulkWriteResult` does not exist on the result object
        }
        -
      +
diff --git a/docs/Next/classes/ClientSession.html b/docs/Next/classes/ClientSession.html index 245e7c3614d..c1609a133a9 100644 --- a/docs/Next/classes/ClientSession.html +++ b/docs/Next/classes/ClientSession.html @@ -75,7 +75,7 @@ that a "possible EventEmitter memory leak" has been detected. For any single EventEmitter, the emitter.getMaxListeners() and emitter.setMaxListeners() methods can be used to temporarily avoid this warning:

-
import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
}); +
import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});

The --trace-warnings command-line flag can be used to display the @@ -108,7 +108,7 @@

  • OptionaltimeoutMS?: number

Returns Promise<void>

  • 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.

    -
    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 +
    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

    Type Parameters

    • EventKey extends "ended"

    Parameters

    Returns boolean

    v0.1.26

    @@ -120,7 +120,7 @@

    Parameters

    Returns boolean

  • Returns an array listing the events for which the emitter has registered listeners. The values in the array are strings or Symbols.

    -
    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) ] +
    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) ]

    Returns string[]

    v6.0.0

    @@ -134,7 +134,7 @@ in the list of the listeners of the event.

    Type Parameters

    • EventKey extends "ended"

    Parameters

    Returns number

    v3.2.0

  • Returns a copy of the array of listeners for the event named eventName.

    -
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ] +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ]

    Type Parameters

    • EventKey extends "ended"

    Parameters

    Returns ClientSessionEvents[EventKey][]

    v0.1.26

    @@ -154,7 +154,7 @@

    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.

    -
    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 +
    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

    Type Parameters

    • EventKey extends "ended"

    Parameters

    • event: EventKey
    • listener: ClientSessionEvents[EventKey]

      The callback function

      @@ -169,7 +169,7 @@

      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.

      -
      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 +
      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

      Parameters

      • event: CommonEvents
      • listener: ((eventName: string | symbol, listener: GenericListener) => void)

        The callback function

        @@ -184,7 +184,7 @@

        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.

        -
        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 +
        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

        Parameters

        • event: string | symbol
        • listener: GenericListener

          The callback function

          @@ -197,7 +197,7 @@

          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.

          -
          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 +
          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

          Type Parameters

          • EventKey extends "ended"

          Parameters

          • event: EventKey
          • listener: ClientSessionEvents[EventKey]

            The callback function

            @@ -210,7 +210,7 @@

            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.

            -
            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 +
            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

            Parameters

            • event: CommonEvents
            • listener: ((eventName: string | symbol, listener: GenericListener) => void)

              The callback function

              @@ -223,7 +223,7 @@

              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.

              -
              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 +
              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

              Parameters

              • event: string | symbol
              • listener: GenericListener

                The callback function

                @@ -284,7 +284,7 @@

              Returns this

              v6.0.0

  • Returns a copy of the array of listeners for the event named eventName, including any wrappers (such as those created by .once()).

    -
    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'); +
    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');

    Type Parameters

    • EventKey extends "ended"

    Parameters

    Returns ClientSessionEvents[EventKey][]

    v9.4.0

    @@ -295,7 +295,7 @@

    Returns a reference to the EventEmitter, so that calls can be chained.

    Type Parameters

    • EventKey extends "ended"

    Parameters

    • Optionalevent: string | symbol | EventKey

    Returns this

    v0.1.26

  • A class method that returns the number of listeners for the given eventName registered on the given emitter.

    -
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2 +
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2

    Parameters

    • emitter: EventEmitter<DefaultEventMap>

      The emitter to query

    • eventName: string | symbol

      The event name

    Returns number

    v0.9.12

    Since v3.2.0 - Use listenerCount instead.

    -
  • 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 +
  • 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

    Returns an AsyncIterator that iterates eventName events. It will throw @@ -467,11 +467,11 @@

    Parameters

    • emitter: EventEmitter<DefaultEventMap>
    • eventName: string | symbol
    • Optionaloptions: StaticEventEmitterIteratorOptions

    Returns AsyncIterator<any[], any, any>

    An AsyncIterator that iterates eventName events emitted by the emitter

    @@ -482,21 +482,21 @@
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter); +
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter);

    Parameters

    • Optionaln: number

      A non-negative number. The maximum number of listeners per EventTarget event.

      diff --git a/docs/Next/classes/Collection.html b/docs/Next/classes/Collection.html index 09d60682bb9..eed29d3a701 100644 --- a/docs/Next/classes/Collection.html +++ b/docs/Next/classes/Collection.html @@ -1,7 +1,7 @@ Collection | mongodb

      Class Collection<TSchema>

      The Collection class is an internal class that embodies a MongoDB collection allowing for insert/find/update/delete and other command operation on that MongoDB collection.

      COLLECTION Cannot directly be instantiated

      -
      import { MongoClient } from 'mongodb';

      interface Pet {
      name: string;
      kind: 'dog' | 'cat' | 'fish';
      }

      const client = new MongoClient('mongodb://localhost:27017');
      const pets = client.db().collection<Pet>('pets');

      const petCursor = pets.find();

      for await (const pet of petCursor) {
      console.log(`${pet.name} is a ${pet.kind}!`);
      } +
      import { MongoClient } from 'mongodb';

      interface Pet {
      name: string;
      kind: 'dog' | 'cat' | 'fish';
      }

      const client = new MongoClient('mongodb://localhost:27017');
      const pets = client.db().collection<Pet>('pets');

      const petCursor = pets.find();

      for await (const pet of petCursor) {
      console.log(`${pet.name} is a ${pet.kind}!`);
      }

      Type Parameters

      Accessors

      bsonOptions @@ -125,7 +125,7 @@
  • Creates an index on the db and collection collection.

    Parameters

    Returns Promise<string>

    const collection = client.db('foo').collection('bar');

    await collection.createIndex({ a: 1, b: -1 });

    // Alternate syntax for { c: 1, d: -1 } that ensures order of indexes
    await collection.createIndex([ [c, 1], [d, -1] ]);

    // Equivalent to { e: 1 }
    await collection.createIndex('e');

    // Equivalent to { f: 1, g: 1 }
    await collection.createIndex(['f', 'g'])

    // Equivalent to { h: 1, i: -1 }
    await collection.createIndex([ { h: 1 }, { i: -1 } ]);

    // Equivalent to { j: 1, k: -1, l: 2d }
    await collection.createIndex(['j', ['k', -1], { l: '2d' }]) +

Returns Promise<string>

const collection = client.db('foo').collection('bar');

await collection.createIndex({ a: 1, b: -1 });

// Alternate syntax for { c: 1, d: -1 } that ensures order of indexes
await collection.createIndex([ [c, 1], [d, -1] ]);

// Equivalent to { e: 1 }
await collection.createIndex('e');

// Equivalent to { f: 1, g: 1 }
await collection.createIndex(['f', 'g'])

// Equivalent to { h: 1, i: -1 }
await collection.createIndex([ { h: 1 }, { i: -1 } ]);

// Equivalent to { j: 1, k: -1, l: 2d }
await collection.createIndex(['j', ['k', -1], { l: '2d' }])
  • Creates multiple indexes in the collection, this method is only supported for @@ -135,7 +135,7 @@ Index specifications are defined here.

    Parameters

    Returns Promise<string[]>

    const collection = client.db('foo').collection('bar');
    await collection.createIndexes([
    // Simple index on field fizz
    {
    key: { fizz: 1 },
    }
    // wildcard index
    {
    key: { '$**': 1 }
    },
    // named index on darmok and jalad
    {
    key: { darmok: 1, jalad: -1 }
    name: 'tanagra'
    }
    ]); +

Returns Promise<string[]>

const collection = client.db('foo').collection('bar');
await collection.createIndexes([
// Simple index on field fizz
{
key: { fizz: 1 },
}
// wildcard index
{
key: { '$**': 1 }
},
// named index on darmok and jalad
{
key: { darmok: 1, jalad: -1 }
name: 'tanagra'
}
]);
diff --git a/docs/Next/classes/Db.html b/docs/Next/classes/Db.html index b347ab7c697..c9451c5c326 100644 --- a/docs/Next/classes/Db.html +++ b/docs/Next/classes/Db.html @@ -1,5 +1,5 @@ Db | mongodb

Class Db

The Db class is a class that represents a MongoDB Database.

-
import { MongoClient } from 'mongodb';

interface Pet {
name: string;
kind: 'dog' | 'cat' | 'fish';
}

const client = new MongoClient('mongodb://localhost:27017');
const db = client.db();

// Create a collection that validates our union
await db.createCollection<Pet>('pets', {
validator: { $expr: { $in: ['$kind', ['dog', 'cat', 'fish']] } }
}) +
import { MongoClient } from 'mongodb';

interface Pet {
name: string;
kind: 'dog' | 'cat' | 'fish';
}

const client = new MongoClient('mongodb://localhost:27017');
const db = client.db();

// Create a collection that validates our union
await db.createCollection<Pet>('pets', {
validator: { $expr: { $in: ['$kind', ['dog', 'cat', 'fish']] } }
})

Constructors

constructor @@ -133,14 +133,14 @@

In iterator mode, if a next() call throws a timeout error, it will attempt to resume the change stream. The next call can just be retried after this succeeds.

-
const changeStream = collection.watch([], { timeoutMS: 100 });
try {
await changeStream.next();
} catch (e) {
if (e instanceof MongoOperationTimeoutError && !changeStream.closed) {
await changeStream.next();
}
throw e;
} +
const changeStream = collection.watch([], { timeoutMS: 100 });
try {
await changeStream.next();
} catch (e) {
if (e instanceof MongoOperationTimeoutError && !changeStream.closed) {
await changeStream.next();
}
throw e;
}

In emitter mode, if the change stream goes timeoutMS without emitting a change event, it will emit an error event that returns a MongoOperationTimeoutError, but will not close the change stream unless the resume attempt fails. There is no need to re-establish change listeners as this will automatically continue emitting change events once the resume attempt completes.

-
const changeStream = collection.watch([], { timeoutMS: 100 });
changeStream.on('change', console.log);
changeStream.on('error', e => {
if (e instanceof MongoOperationTimeoutError && !changeStream.closed) {
// do nothing
} else {
changeStream.close();
}
}); +
const changeStream = collection.watch([], { timeoutMS: 100 });
changeStream.on('change', console.log);
changeStream.on('error', e => {
if (e instanceof MongoOperationTimeoutError && !changeStream.closed) {
// do nothing
} else {
changeStream.close();
}
});
diff --git a/docs/Next/classes/ExplainableCursor.html b/docs/Next/classes/ExplainableCursor.html index 67406f35a2f..ee95e489c99 100644 --- a/docs/Next/classes/ExplainableCursor.html +++ b/docs/Next/classes/ExplainableCursor.html @@ -78,7 +78,7 @@ that a "possible EventEmitter memory leak" has been detected. For any single EventEmitter, the emitter.getMaxListeners() and emitter.setMaxListeners() methods can be used to temporarily avoid this warning:

-
import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
}); +
import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});

The --trace-warnings command-line flag can be used to display the @@ -116,13 +116,13 @@

Parameters

  • Optionaloptions: {
        timeoutMS?: number;
    }
    • OptionaltimeoutMS?: number

Returns Promise<void>

  • 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.

    -
    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 +
    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

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns boolean

    v0.1.26

  • Returns an array listing the events for which the emitter has registered listeners. The values in the array are strings or Symbols.

    -
    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) ] +
    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) ]

    Returns string[]

    v6.0.0

    @@ -141,7 +141,7 @@ in the list of the listeners of the event.

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns number

    v3.2.0

  • Returns a copy of the array of listeners for the event named eventName.

    -
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ] +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ]

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns AbstractCursorEvents[EventKey][]

    v0.1.26

    @@ -152,18 +152,18 @@

Returns AbstractCursor<T, AbstractCursorEvents>

Note Cursors use null internally to indicate that there are no more documents in the cursor. Providing a mapping function that maps values to null will result in the cursor closing itself before it has finished iterating all documents. This will not result in a memory leak, just surprising behavior. For example:

-
const cursor = collection.find({});
cursor.map(() => null);

const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection. +
const cursor = collection.find({});
cursor.map(() => null);

const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection.

Other falsey values are allowed:

-
const cursor = collection.find({});
cursor.map(() => '');

const documents = await cursor.toArray();
// documents is now an array of empty strings +
const cursor = collection.find({});
cursor.map(() => '');

const documents = await cursor.toArray();
// documents is now an array of empty strings

Note for Typescript Users: adding a transform changes the return type of the iteration of this cursor, it does not return a new instance of a cursor. This means when calling map, you should always assign the result to a new variable in order to get a correctly typed cursor variable. Take note of the following example:

-
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[] +
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[]
  • Returns a copy of the array of listeners for the event named eventName, including any wrappers (such as those created by .once()).

    -
    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'); +
    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');

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns AbstractCursorEvents[EventKey][]

    Type Parameters

    • EventKey extends "close"

    Parameters

    • Optionalevent: string | symbol | EventKey

    Returns this

    v0.1.26

  • A class method that returns the number of listeners for the given eventName registered on the given emitter.

    -
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2 +
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2

    Parameters

    • emitter: EventEmitter<DefaultEventMap>

      The emitter to query

    • eventName: string | symbol

      The event name

    Returns number

    v0.9.12

    Since v3.2.0 - Use listenerCount instead.

    -
  • 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 +
  • 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

    Returns an AsyncIterator that iterates eventName events. It will throw @@ -474,11 +474,11 @@

    Parameters

    • emitter: EventEmitter<DefaultEventMap>
    • eventName: string | symbol
    • Optionaloptions: StaticEventEmitterIteratorOptions

    Returns AsyncIterator<any[], any, any>

    An AsyncIterator that iterates eventName events emitted by the emitter

    @@ -489,21 +489,21 @@
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter); +
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter);

    Parameters

    • Optionaln: number

      A non-negative number. The maximum number of listeners per EventTarget event.

      diff --git a/docs/Next/classes/FindCursor.html b/docs/Next/classes/FindCursor.html index 70a0148231a..40c2df6efc4 100644 --- a/docs/Next/classes/FindCursor.html +++ b/docs/Next/classes/FindCursor.html @@ -93,7 +93,7 @@ that a "possible EventEmitter memory leak" has been detected. For any single EventEmitter, the emitter.getMaxListeners() and emitter.setMaxListeners() methods can be used to temporarily avoid this warning:

      -
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.setMaxListeners(emitter.getMaxListeners() + 1);
      emitter.once('event', () => {
      // do stuff
      emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
      }); +
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.setMaxListeners(emitter.getMaxListeners() + 1);
      emitter.once('event', () => {
      // do stuff
      emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
      });

      The --trace-warnings command-line flag can be used to display the @@ -142,13 +142,13 @@

  • 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.

    -
    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 +
    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

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns boolean

    v0.1.26

  • Returns an array listing the events for which the emitter has registered listeners. The values in the array are strings or Symbols.

    -
    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) ] +
    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) ]

    Returns string[]

    v6.0.0

    @@ -175,7 +175,7 @@ in the list of the listeners of the event.

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns number

    v3.2.0

  • Returns a copy of the array of listeners for the event named eventName.

    -
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ] +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ]

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns AbstractCursorEvents[EventKey][]

    v0.1.26

    @@ -186,18 +186,18 @@

Returns FindCursor<T>

Note Cursors use null internally to indicate that there are no more documents in the cursor. Providing a mapping function that maps values to null will result in the cursor closing itself before it has finished iterating all documents. This will not result in a memory leak, just surprising behavior. For example:

-
const cursor = collection.find({});
cursor.map(() => null);

const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection. +
const cursor = collection.find({});
cursor.map(() => null);

const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection.

Other falsey values are allowed:

-
const cursor = collection.find({});
cursor.map(() => '');

const documents = await cursor.toArray();
// documents is now an array of empty strings +
const cursor = collection.find({});
cursor.map(() => '');

const documents = await cursor.toArray();
// documents is now an array of empty strings

Note for Typescript Users: adding a transform changes the return type of the iteration of this cursor, it does not return a new instance of a cursor. This means when calling map, you should always assign the result to a new variable in order to get a correctly typed cursor variable. Take note of the following example:

-
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[] +
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[]
  • Returns a copy of the array of listeners for the event named eventName, including any wrappers (such as those created by .once()).

    -
    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'); +
    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');

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns AbstractCursorEvents[EventKey][]

    Type Parameters

    • EventKey extends "close"

    Parameters

    • Optionalevent: string | symbol | EventKey

    Returns this

    v0.1.26

  • A class method that returns the number of listeners for the given eventName registered on the given emitter.

    -
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2 +
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2

    Parameters

    • emitter: EventEmitter<DefaultEventMap>

      The emitter to query

    • eventName: string | symbol

      The event name

    Returns number

    v0.9.12

    Since v3.2.0 - Use listenerCount instead.

    -
  • 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 +
  • 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

    Returns an AsyncIterator that iterates eventName events. It will throw @@ -537,11 +537,11 @@

    Parameters

    • emitter: EventEmitter<DefaultEventMap>
    • eventName: string | symbol
    • Optionaloptions: StaticEventEmitterIteratorOptions

    Returns AsyncIterator<any[], any, any>

    An AsyncIterator that iterates eventName events emitted by the emitter

    @@ -552,21 +552,21 @@
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter); +
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter);

    Parameters

    • Optionaln: number

      A non-negative number. The maximum number of listeners per EventTarget event.

      diff --git a/docs/Next/classes/GridFSBucket.html b/docs/Next/classes/GridFSBucket.html index 1a4b5d6b59c..02a74af7cf8 100644 --- a/docs/Next/classes/GridFSBucket.html +++ b/docs/Next/classes/GridFSBucket.html @@ -56,7 +56,7 @@ that a "possible EventEmitter memory leak" has been detected. For any single EventEmitter, the emitter.getMaxListeners() and emitter.setMaxListeners() methods can be used to temporarily avoid this warning:

      -
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.setMaxListeners(emitter.getMaxListeners() + 1);
      emitter.once('event', () => {
      // do stuff
      emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
      }); +
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.setMaxListeners(emitter.getMaxListeners() + 1);
      emitter.once('event', () => {
      // do stuff
      emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
      });

      The --trace-warnings command-line flag can be used to display the @@ -88,13 +88,13 @@

      Parameters

      • Optionaloptions: {
            timeoutMS: number;
        }
        • timeoutMS: number

      Returns Promise<void>

  • 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.

    -
    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 +
    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

    Type Parameters

    • EventKey extends "index"

    Parameters

    Returns boolean

    v0.1.26

  • Returns an array listing the events for which the emitter has registered listeners. The values in the array are strings or Symbols.

    -
    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) ] +
    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) ]

    Returns string[]

    v6.0.0

    @@ -107,7 +107,7 @@ in the list of the listeners of the event.

    Type Parameters

    • EventKey extends "index"

    Parameters

    Returns number

    v3.2.0

  • Returns a copy of the array of listeners for the event named eventName.

    -
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ] +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ]

    Type Parameters

    • EventKey extends "index"

    Parameters

    Returns GridFSBucketEvents[EventKey][]

    v0.1.26

    @@ -127,7 +127,7 @@

    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.

    -
    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 +
    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

    Type Parameters

    • EventKey extends "index"

    Parameters

    • event: EventKey
    • listener: GridFSBucketEvents[EventKey]

      The callback function

      @@ -142,7 +142,7 @@

      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.

      -
      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 +
      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

      Parameters

      • event: CommonEvents
      • listener: ((eventName: string | symbol, listener: GenericListener) => void)

        The callback function

        @@ -157,7 +157,7 @@

        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.

        -
        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 +
        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

        Parameters

        • event: string | symbol
        • listener: GenericListener

          The callback function

          @@ -170,7 +170,7 @@

          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.

          -
          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 +
          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

          Type Parameters

          • EventKey extends "index"

          Parameters

          • event: EventKey
          • listener: GridFSBucketEvents[EventKey]

            The callback function

            @@ -183,7 +183,7 @@

            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.

            -
            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 +
            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

            Parameters

            • event: CommonEvents
            • listener: ((eventName: string | symbol, listener: GenericListener) => void)

              The callback function

              @@ -196,7 +196,7 @@

              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.

              -
              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 +
              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

              Parameters

              • event: string | symbol
              • listener: GenericListener

                The callback function

                @@ -271,7 +271,7 @@

              Returns this

              v6.0.0

  • Returns a copy of the array of listeners for the event named eventName, including any wrappers (such as those created by .once()).

    -
    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'); +
    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');

    Type Parameters

    • EventKey extends "index"

    Parameters

    Returns GridFSBucketEvents[EventKey][]

    v9.4.0

    @@ -282,7 +282,7 @@

    Returns a reference to the EventEmitter, so that calls can be chained.

    Type Parameters

    • EventKey extends "index"

    Parameters

    • Optionalevent: string | symbol | EventKey

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -292,7 +292,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -303,13 +303,13 @@

    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:

    -
    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'); +
    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.

    Type Parameters

    • EventKey extends "index"

    Parameters

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -319,7 +319,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -330,13 +330,13 @@

    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:

    -
    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'); +
    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.

    Parameters

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -346,7 +346,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -357,7 +357,7 @@

    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:

    -
    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'); +
    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.

    @@ -381,7 +381,7 @@ two issues by listening to the event such that stopImmediatePropagation does not prevent the listener from running.

    Returns a disposable so that it may be unsubscribed from more easily.

    -
    import { addAbortListener } from 'node:events';

    function example(signal) {
    let disposable;
    try {
    signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
    disposable = addAbortListener(signal, (e) => {
    // Do something when signal is aborted.
    });
    } finally {
    disposable?.[Symbol.dispose]();
    }
    } +
    import { addAbortListener } from 'node:events';

    function example(signal) {
    let disposable;
    try {
    signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
    disposable = addAbortListener(signal, (e) => {
    // Do something when signal is aborted.
    });
    } finally {
    disposable?.[Symbol.dispose]();
    }
    }

    Parameters

    • signal: AbortSignal
    • resource: ((event: Event) => void)
        • (event): void
        • Parameters

          • event: Event

          Returns void

    Returns Disposable

    Disposable that removes the abort listener.

    @@ -391,7 +391,7 @@ the emitter.

    For EventTargets this is the only way to get the event listeners for the event target. This is useful for debugging and diagnostic purposes.

    -
    import { getEventListeners, EventEmitter } from 'node:events';

    {
    const ee = new EventEmitter();
    const listener = () => console.log('Events are fun');
    ee.on('foo', listener);
    console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
    }
    {
    const et = new EventTarget();
    const listener = () => console.log('Events are fun');
    et.addEventListener('foo', listener);
    console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
    } +
    import { getEventListeners, EventEmitter } from 'node:events';

    {
    const ee = new EventEmitter();
    const listener = () => console.log('Events are fun');
    ee.on('foo', listener);
    console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
    }
    {
    const et = new EventTarget();
    const listener = () => console.log('Events are fun');
    et.addEventListener('foo', listener);
    console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
    }

    Parameters

    • emitter: EventEmitter<DefaultEventMap> | EventTarget
    • name: string | symbol

    Returns Function[]

    v15.2.0, v14.17.0

    @@ -401,19 +401,19 @@

    For EventTargets this is the only way to get the max event listeners for the event target. If the number of event handlers on a single EventTarget exceeds the max set, the EventTarget will print a warning.

    -
    import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';

    {
    const ee = new EventEmitter();
    console.log(getMaxListeners(ee)); // 10
    setMaxListeners(11, ee);
    console.log(getMaxListeners(ee)); // 11
    }
    {
    const et = new EventTarget();
    console.log(getMaxListeners(et)); // 10
    setMaxListeners(11, et);
    console.log(getMaxListeners(et)); // 11
    } +
    import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';

    {
    const ee = new EventEmitter();
    console.log(getMaxListeners(ee)); // 10
    setMaxListeners(11, ee);
    console.log(getMaxListeners(ee)); // 11
    }
    {
    const et = new EventTarget();
    console.log(getMaxListeners(et)); // 10
    setMaxListeners(11, et);
    console.log(getMaxListeners(et)); // 11
    }

    Parameters

    • emitter: EventEmitter<DefaultEventMap> | EventTarget

    Returns number

    v19.9.0

  • A class method that returns the number of listeners for the given eventName registered on the given emitter.

    -
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2 +
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2

    Parameters

    • emitter: EventEmitter<DefaultEventMap>

      The emitter to query

    • eventName: string | symbol

      The event name

    Returns number

    v0.9.12

    Since v3.2.0 - Use listenerCount instead.

    -
  • 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 +
  • 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

    Returns an AsyncIterator that iterates eventName events. It will throw @@ -421,11 +421,11 @@

    Parameters

    • emitter: EventEmitter<DefaultEventMap>
    • eventName: string | symbol
    • Optionaloptions: StaticEventEmitterIteratorOptions

    Returns AsyncIterator<any[], any, any>

    An AsyncIterator that iterates eventName events emitted by the emitter

    @@ -436,21 +436,21 @@
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter); +
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter);

    Parameters

    • Optionaln: number

      A non-negative number. The maximum number of listeners per EventTarget event.

      diff --git a/docs/Next/classes/GridFSBucketReadStream.html b/docs/Next/classes/GridFSBucketReadStream.html index d99ae08305b..66080a66623 100644 --- a/docs/Next/classes/GridFSBucketReadStream.html +++ b/docs/Next/classes/GridFSBucketReadStream.html @@ -124,7 +124,7 @@ that a "possible EventEmitter memory leak" has been detected. For any single EventEmitter, the emitter.getMaxListeners() and emitter.setMaxListeners() methods can be used to temporarily avoid this warning:

      -
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.setMaxListeners(emitter.getMaxListeners() + 1);
      emitter.once('event', () => {
      // do stuff
      emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
      }); +
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.setMaxListeners(emitter.getMaxListeners() + 1);
      emitter.once('event', () => {
      // do stuff
      emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
      });

      The --trace-warnings command-line flag can be used to display the @@ -188,56 +188,56 @@

  • 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.

    -
    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 +
    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

    Parameters

    • event: "close"

    Returns boolean

    v0.1.26

  • 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.

    -
    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 +
    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

    Parameters

    • event: "data"
    • chunk: any

    Returns boolean

    v0.1.26

  • 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.

    -
    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 +
    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

    Parameters

    • event: "end"

    Returns boolean

    v0.1.26

  • 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.

    -
    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 +
    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

    Parameters

    • event: "error"
    • err: Error

    Returns boolean

    v0.1.26

  • 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.

    -
    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 +
    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

    Parameters

    • event: "pause"

    Returns boolean

    v0.1.26

  • 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.

    -
    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 +
    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

    Parameters

    • event: "readable"

    Returns boolean

    v0.1.26

  • 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.

    -
    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 +
    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

    Parameters

    • event: "resume"

    Returns boolean

    v0.1.26

  • 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.

    -
    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 +
    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

    Parameters

    • event: string | symbol
    • Rest...args: any[]

    Returns boolean

    v0.1.26

    @@ -247,7 +247,7 @@

    Parameters

    • end: number = 0

      Offset in bytes to stop reading at

    Returns this

  • Returns an array listing the events for which the emitter has registered listeners. The values in the array are strings or Symbols.

    -
    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) ] +
    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) ]

    Returns (string | symbol)[]

    v6.0.0

    @@ -296,7 +296,7 @@
  • The readable.isPaused() method returns the current operating state of the Readable. This is used primarily by the mechanism that underlies the readable.pipe() method. In most typical cases, there will be no reason to use this method directly.

    -
    const readable = new stream.Readable();

    readable.isPaused(); // === false
    readable.pause();
    readable.isPaused(); // === true
    readable.resume();
    readable.isPaused(); // === false +
    const readable = new stream.Readable();

    readable.isPaused(); // === false
    readable.pause();
    readable.isPaused(); // === true
    readable.resume();
    readable.isPaused(); // === false

    Returns boolean

    v0.11.14

    @@ -314,7 +314,7 @@
  • Optionallistener: Function

    The event handler function

Returns number

v3.2.0

  • Returns a copy of the array of listeners for the event named eventName.

    -
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ] +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ]

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol

    Returns Function[]

    v0.1.26

    @@ -335,7 +335,7 @@

    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.

    -
    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 +
    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

    Parameters

    • event: "close"
    • listener: (() => void)

      The callback function

      @@ -350,7 +350,7 @@

      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.

      -
      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 +
      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

      Parameters

      • event: "data"
      • listener: ((chunk: any) => void)

        The callback function

        @@ -365,7 +365,7 @@

        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.

        -
        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 +
        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

        Parameters

        • event: "end"
        • listener: (() => void)

          The callback function

          @@ -380,7 +380,7 @@

          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.

          -
          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 +
          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

          Parameters

          • event: "error"
          • listener: ((err: Error) => void)

            The callback function

            @@ -395,7 +395,7 @@

            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.

            -
            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 +
            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

            Parameters

            • event: "pause"
            • listener: (() => void)

              The callback function

              @@ -410,7 +410,7 @@

              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.

              -
              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 +
              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

              Parameters

              • event: "readable"
              • listener: (() => void)

                The callback function

                @@ -425,7 +425,7 @@

                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.

                -
                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 +
                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

                Parameters

                • event: "resume"
                • listener: (() => void)

                  The callback function

                  @@ -440,7 +440,7 @@

                  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.

                  -
                  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 +
                  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

                  Parameters

                  • event: string | symbol
                  • listener: ((...args: any[]) => void)

                    The callback function

                    @@ -453,7 +453,7 @@

                    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.

                    -
                    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 +
                    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

                    Parameters

                    • event: "close"
                    • listener: (() => void)

                      The callback function

                      @@ -466,7 +466,7 @@

                      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.

                      -
                      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 +
                      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

                      Parameters

                      • event: "data"
                      • listener: ((chunk: any) => void)

                        The callback function

                        @@ -479,7 +479,7 @@

                        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.

                        -
                        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 +
                        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

                        Parameters

                        • event: "end"
                        • listener: (() => void)

                          The callback function

                          @@ -492,7 +492,7 @@

                          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.

                          -
                          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 +
                          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

                          Parameters

                          • event: "error"
                          • listener: ((err: Error) => void)

                            The callback function

                            @@ -505,7 +505,7 @@

                            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.

                            -
                            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 +
                            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

                            Parameters

                            • event: "pause"
                            • listener: (() => void)

                              The callback function

                              @@ -518,7 +518,7 @@

                              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.

                              -
                              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 +
                              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

                              Parameters

                              • event: "readable"
                              • listener: (() => void)

                                The callback function

                                @@ -531,7 +531,7 @@

                                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.

                                -
                                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 +
                                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

                                Parameters

                                • event: "resume"
                                • listener: (() => void)

                                  The callback function

                                  @@ -544,7 +544,7 @@

                                  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.

                                  -
                                  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 +
                                  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

                                  Parameters

                                  • event: string | symbol
                                  • listener: ((...args: any[]) => void)

                                    The callback function

                                    @@ -552,7 +552,7 @@
  • The readable.pause() method will cause a stream in flowing mode to stop emitting 'data' events, switching out of flowing mode. Any data that becomes available will remain in the internal buffer.

    -
    const readable = getReadableStreamSomehow();
    readable.on('data', (chunk) => {
    console.log(`Received ${chunk.length} bytes of data.`);
    readable.pause();
    console.log('There will be no additional data for 1 second.');
    setTimeout(() => {
    console.log('Now data will start flowing again.');
    readable.resume();
    }, 1000);
    }); +
    const readable = getReadableStreamSomehow();
    readable.on('data', (chunk) => {
    console.log(`Received ${chunk.length} bytes of data.`);
    readable.pause();
    console.log('There will be no additional data for 1 second.');
    setTimeout(() => {
    console.log('Now data will start flowing again.');
    readable.resume();
    }, 1000);
    });

    The readable.pause() method has no effect if there is a 'readable' event listener.

    @@ -703,7 +703,7 @@
      • (...args): void
      • Parameters

        • Rest...args: any[]

        Returns void

Returns this

v6.0.0

  • Parameters

    • chunk: any
    • Optionalencoding: BufferEncoding

    Returns boolean

  • Returns a copy of the array of listeners for the event named eventName, including any wrappers (such as those created by .once()).

    -
    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'); +
    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');

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol

    Returns Function[]

    v9.4.0

    @@ -722,7 +722,7 @@

    The readable.read() method should only be called on Readable streams operating in paused mode. In flowing mode, readable.read() is called automatically until the internal buffer is fully drained.

    -
    const readable = getReadableStreamSomehow();

    // 'readable' may be triggered multiple times as data is buffered in
    readable.on('readable', () => {
    let chunk;
    console.log('Stream is readable (new data received in buffer)');
    // Use a loop to make sure we read all currently available data
    while (null !== (chunk = readable.read())) {
    console.log(`Read ${chunk.length} bytes of data...`);
    }
    });

    // 'end' will be triggered once when there is no more data available
    readable.on('end', () => {
    console.log('Reached end of stream.');
    }); +
    const readable = getReadableStreamSomehow();

    // 'readable' may be triggered multiple times as data is buffered in
    readable.on('readable', () => {
    let chunk;
    console.log('Stream is readable (new data received in buffer)');
    // Use a loop to make sure we read all currently available data
    while (null !== (chunk = readable.read())) {
    console.log(`Read ${chunk.length} bytes of data...`);
    }
    });

    // 'end' will be triggered once when there is no more data available
    readable.on('end', () => {
    console.log('Reached end of stream.');
    });

    Each call to readable.read() returns a chunk of data, or null. The chunks @@ -734,7 +734,7 @@ emitted when there is no more data to come.

    Therefore to read a file's whole contents from a readable, it is necessary to collect chunks across multiple 'readable' events:

    -
    const chunks = [];

    readable.on('readable', () => {
    let chunk;
    while (null !== (chunk = readable.read())) {
    chunks.push(chunk);
    }
    });

    readable.on('end', () => {
    const content = chunks.join('');
    }); +
    const chunks = [];

    readable.on('readable', () => {
    let chunk;
    while (null !== (chunk = readable.read())) {
    chunks.push(chunk);
    }
    });

    readable.on('end', () => {
    const content = chunks.join('');
    });

    A Readable stream in object mode will always return a single item from @@ -762,7 +762,7 @@

    Returns a reference to the EventEmitter, so that calls can be chained.

    Parameters

    • OptionaleventName: string | symbol

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -772,7 +772,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -783,13 +783,13 @@

    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:

    -
    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'); +
    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.

    Parameters

    • event: "close"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -799,7 +799,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -810,13 +810,13 @@

    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:

    -
    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'); +
    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.

    Parameters

    • event: "data"
    • listener: ((chunk: any) => void)
        • (chunk): void
        • Parameters

          • chunk: any

          Returns void

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -826,7 +826,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -837,13 +837,13 @@

    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:

    -
    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'); +
    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.

    Parameters

    • event: "end"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -853,7 +853,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -864,13 +864,13 @@

    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:

    -
    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'); +
    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.

    Parameters

    • event: "error"
    • listener: ((err: Error) => void)
        • (err): void
        • Parameters

          • err: Error

          Returns void

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -880,7 +880,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -891,13 +891,13 @@

    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:

    -
    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'); +
    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.

    Parameters

    • event: "pause"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -907,7 +907,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -918,13 +918,13 @@

    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:

    -
    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'); +
    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.

    Parameters

    • event: "readable"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -934,7 +934,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -945,13 +945,13 @@

    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:

    -
    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'); +
    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.

    Parameters

    • event: "resume"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -961,7 +961,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -972,7 +972,7 @@

    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:

    -
    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'); +
    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.

    @@ -995,7 +995,7 @@

    The Readable stream will properly handle multi-byte characters delivered through the stream that would otherwise become improperly decoded if simply pulled from the stream as Buffer objects.

    -
    const readable = getReadableStreamSomehow();
    readable.setEncoding('utf8');
    readable.on('data', (chunk) => {
    assert.equal(typeof chunk, 'string');
    console.log('Got %d characters of string data:', chunk.length);
    }); +
    const readable = getReadableStreamSomehow();
    readable.setEncoding('utf8');
    readable.on('data', (chunk) => {
    assert.equal(typeof chunk, 'string');
    console.log('Got %d characters of string data:', chunk.length);
    });

    Parameters

    • encoding: BufferEncoding

      The encoding to use.

      @@ -1031,7 +1031,7 @@

      If the destination is not specified, then all pipes are detached.

      If the destination is specified, but no pipe is set up for it, then the method does nothing.

      -
      import fs from 'node:fs';
      const readable = getReadableStreamSomehow();
      const writable = fs.createWriteStream('file.txt');
      // All the data from readable goes into 'file.txt',
      // but only for the first second.
      readable.pipe(writable);
      setTimeout(() => {
      console.log('Stop writing to file.txt.');
      readable.unpipe(writable);
      console.log('Manually close the file stream.');
      writable.end();
      }, 1000); +
      import fs from 'node:fs';
      const readable = getReadableStreamSomehow();
      const writable = fs.createWriteStream('file.txt');
      // All the data from readable goes into 'file.txt',
      // but only for the first second.
      readable.pipe(writable);
      setTimeout(() => {
      console.log('Stop writing to file.txt.');
      readable.unpipe(writable);
      console.log('Manually close the file stream.');
      writable.end();
      }, 1000);

      Parameters

      • Optionaldestination: WritableStream

        Optional specific stream to unpipe

        @@ -1048,7 +1048,7 @@ has been emitted or a runtime error will be thrown.

        Developers using stream.unshift() often should consider switching to use of a Transform stream instead. See the API for stream implementers section for more information.

        -
        // Pull off a header delimited by \n\n.
        // Use unshift() if we get too much.
        // Call the callback with (error, header, stream).
        import { StringDecoder } from 'node:string_decoder';
        function parseHeader(stream, callback) {
        stream.on('error', callback);
        stream.on('readable', onReadable);
        const decoder = new StringDecoder('utf8');
        let header = '';
        function onReadable() {
        let chunk;
        while (null !== (chunk = stream.read())) {
        const str = decoder.write(chunk);
        if (str.includes('\n\n')) {
        // Found the header boundary.
        const split = str.split(/\n\n/);
        header += split.shift();
        const remaining = split.join('\n\n');
        const buf = Buffer.from(remaining, 'utf8');
        stream.removeListener('error', callback);
        // Remove the 'readable' listener before unshifting.
        stream.removeListener('readable', onReadable);
        if (buf.length)
        stream.unshift(buf);
        // Now the body of the message can be read from the stream.
        callback(null, header, stream);
        return;
        }
        // Still reading the header.
        header += str;
        }
        }
        } +
        // Pull off a header delimited by \n\n.
        // Use unshift() if we get too much.
        // Call the callback with (error, header, stream).
        import { StringDecoder } from 'node:string_decoder';
        function parseHeader(stream, callback) {
        stream.on('error', callback);
        stream.on('readable', onReadable);
        const decoder = new StringDecoder('utf8');
        let header = '';
        function onReadable() {
        let chunk;
        while (null !== (chunk = stream.read())) {
        const str = decoder.write(chunk);
        if (str.includes('\n\n')) {
        // Found the header boundary.
        const split = str.split(/\n\n/);
        header += split.shift();
        const remaining = split.join('\n\n');
        const buf = Buffer.from(remaining, 'utf8');
        stream.removeListener('error', callback);
        // Remove the 'readable' listener before unshifting.
        stream.removeListener('readable', onReadable);
        if (buf.length)
        stream.unshift(buf);
        // Now the body of the message can be read from the stream.
        callback(null, header, stream);
        return;
        }
        // Still reading the header.
        header += str;
        }
        }
        }

        Unlike push, stream.unshift(chunk) will not @@ -1070,7 +1070,7 @@

        It will rarely be necessary to use readable.wrap() but the method has been provided as a convenience for interacting with older Node.js applications and libraries.

        -
        import { OldReader } from './old-api-module.js';
        import { Readable } from 'node:stream';
        const oreader = new OldReader();
        const myReader = new Readable().wrap(oreader);

        myReader.on('readable', () => {
        myReader.read(); // etc.
        }); +
        import { OldReader } from './old-api-module.js';
        import { Readable } from 'node:stream';
        const oreader = new OldReader();
        const myReader = new Readable().wrap(oreader);

        myReader.on('readable', () => {
        myReader.read(); // etc.
        });

        Parameters

        • stream: ReadableStream

          An "old style" readable stream

          @@ -1085,7 +1085,7 @@ two issues by listening to the event such that stopImmediatePropagation does not prevent the listener from running.

          Returns a disposable so that it may be unsubscribed from more easily.

          -
          import { addAbortListener } from 'node:events';

          function example(signal) {
          let disposable;
          try {
          signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
          disposable = addAbortListener(signal, (e) => {
          // Do something when signal is aborted.
          });
          } finally {
          disposable?.[Symbol.dispose]();
          }
          } +
          import { addAbortListener } from 'node:events';

          function example(signal) {
          let disposable;
          try {
          signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
          disposable = addAbortListener(signal, (e) => {
          // Do something when signal is aborted.
          });
          } finally {
          disposable?.[Symbol.dispose]();
          }
          }

          Parameters

          • signal: AbortSignal
          • resource: ((event: Event) => void)
              • (event): void
              • Parameters

                • event: Event

                Returns void

          Returns Disposable

          Disposable that removes the abort listener.

          @@ -1101,7 +1101,7 @@ the emitter.

          For EventTargets this is the only way to get the event listeners for the event target. This is useful for debugging and diagnostic purposes.

          -
          import { getEventListeners, EventEmitter } from 'node:events';

          {
          const ee = new EventEmitter();
          const listener = () => console.log('Events are fun');
          ee.on('foo', listener);
          console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
          }
          {
          const et = new EventTarget();
          const listener = () => console.log('Events are fun');
          et.addEventListener('foo', listener);
          console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
          } +
          import { getEventListeners, EventEmitter } from 'node:events';

          {
          const ee = new EventEmitter();
          const listener = () => console.log('Events are fun');
          ee.on('foo', listener);
          console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
          }
          {
          const et = new EventTarget();
          const listener = () => console.log('Events are fun');
          et.addEventListener('foo', listener);
          console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
          }

        Parameters

        • emitter: EventEmitter<DefaultEventMap> | EventTarget
        • name: string | symbol

        Returns Function[]

        v15.2.0, v14.17.0

        @@ -1111,21 +1111,21 @@

        For EventTargets this is the only way to get the max event listeners for the event target. If the number of event handlers on a single EventTarget exceeds the max set, the EventTarget will print a warning.

        -
        import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';

        {
        const ee = new EventEmitter();
        console.log(getMaxListeners(ee)); // 10
        setMaxListeners(11, ee);
        console.log(getMaxListeners(ee)); // 11
        }
        {
        const et = new EventTarget();
        console.log(getMaxListeners(et)); // 10
        setMaxListeners(11, et);
        console.log(getMaxListeners(et)); // 11
        } +
        import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';

        {
        const ee = new EventEmitter();
        console.log(getMaxListeners(ee)); // 10
        setMaxListeners(11, ee);
        console.log(getMaxListeners(ee)); // 11
        }
        {
        const et = new EventTarget();
        console.log(getMaxListeners(et)); // 10
        setMaxListeners(11, et);
        console.log(getMaxListeners(et)); // 11
        }

        Parameters

        • emitter: EventEmitter<DefaultEventMap> | EventTarget

        Returns number

        v19.9.0

  • Returns whether the stream has been read from or cancelled.

    Parameters

    • stream: Readable | ReadableStream

    Returns boolean

    v16.8.0

  • A class method that returns the number of listeners for the given eventName registered on the given emitter.

    -
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2 +
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2

    Parameters

    • emitter: EventEmitter<DefaultEventMap>

      The emitter to query

    • eventName: string | symbol

      The event name

    Returns number

    v0.9.12

    Since v3.2.0 - Use listenerCount instead.

    -
  • 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 +
  • 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

    Returns an AsyncIterator that iterates eventName events. It will throw @@ -1133,11 +1133,11 @@

    Parameters

    • emitter: EventEmitter<DefaultEventMap>
    • eventName: string | symbol
    • Optionaloptions: StaticEventEmitterIteratorOptions

    Returns AsyncIterator<any[], any, any>

    An AsyncIterator that iterates eventName events emitted by the emitter

    @@ -1148,21 +1148,21 @@
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter); +
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter);

    Parameters

    • Optionaln: number

      A non-negative number. The maximum number of listeners per EventTarget event.

      diff --git a/docs/Next/classes/GridFSBucketWriteStream.html b/docs/Next/classes/GridFSBucketWriteStream.html index e2d37a70722..296cf071007 100644 --- a/docs/Next/classes/GridFSBucketWriteStream.html +++ b/docs/Next/classes/GridFSBucketWriteStream.html @@ -136,7 +136,7 @@ that a "possible EventEmitter memory leak" has been detected. For any single EventEmitter, the emitter.getMaxListeners() and emitter.setMaxListeners() methods can be used to temporarily avoid this warning:

      -
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.setMaxListeners(emitter.getMaxListeners() + 1);
      emitter.once('event', () => {
      // do stuff
      emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
      }); +
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.setMaxListeners(emitter.getMaxListeners() + 1);
      emitter.once('event', () => {
      // do stuff
      emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
      });

      The --trace-warnings command-line flag can be used to display the @@ -200,49 +200,49 @@

  • 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.

    -
    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 +
    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

    Parameters

    • event: "close"

    Returns boolean

    v0.1.26

  • 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.

    -
    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 +
    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

    Parameters

    • event: "drain"

    Returns boolean

    v0.1.26

  • 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.

    -
    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 +
    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

    Parameters

    • event: "error"
    • err: Error

    Returns boolean

    v0.1.26

  • 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.

    -
    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 +
    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

    Parameters

    • event: "finish"

    Returns boolean

    v0.1.26

  • 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.

    -
    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 +
    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

    Parameters

    • event: "pipe"
    • src: Readable

    Returns boolean

    v0.1.26

  • 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.

    -
    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 +
    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

    Parameters

    • event: "unpipe"
    • src: Readable

    Returns boolean

    v0.1.26

  • 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.

    -
    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 +
    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

    Parameters

    • event: string | symbol
    • Rest...args: any[]

    Returns boolean

    v0.1.26

    @@ -251,13 +251,13 @@ final additional chunk of data to be written immediately before closing the stream.

    Calling the write method after calling end will raise an error.

    -
    // Write 'hello, ' and then end with 'world!'.
    import fs from 'node:fs';
    const file = fs.createWriteStream('example.txt');
    file.write('hello, ');
    file.end('world!');
    // Writing more now is not allowed! +
    // Write 'hello, ' and then end with 'world!'.
    import fs from 'node:fs';
    const file = fs.createWriteStream('example.txt');
    file.write('hello, ');
    file.end('world!');
    // Writing more now is not allowed!

    Parameters

    • Optionalcb: (() => void)
        • (): void
        • Returns void

    Returns this

    v0.9.4

  • Parameters

    • chunk: any
    • Optionalcb: (() => void)
        • (): void
        • Returns void

    Returns this

  • Parameters

    • chunk: any
    • encoding: BufferEncoding
    • Optionalcb: (() => void)
        • (): void
        • Returns void

    Returns this

  • Returns an array listing the events for which the emitter has registered listeners. The values in the array are strings or Symbols.

    -
    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) ] +
    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) ]

    Returns (string | symbol)[]

    v6.0.0

    @@ -271,7 +271,7 @@
  • Optionallistener: Function

    The event handler function

Returns number

v3.2.0

  • Returns a copy of the array of listeners for the event named eventName.

    -
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ] +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ]

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol

    Returns Function[]

    v0.1.26

    @@ -287,7 +287,7 @@

    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.

    -
    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 +
    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

    Parameters

    • event: "close"
    • listener: (() => void)

      The callback function

      @@ -302,7 +302,7 @@

      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.

      -
      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 +
      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

      Parameters

      • event: "drain"
      • listener: (() => void)

        The callback function

        @@ -317,7 +317,7 @@

        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.

        -
        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 +
        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

        Parameters

        • event: "error"
        • listener: ((err: Error) => void)

          The callback function

          @@ -332,7 +332,7 @@

          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.

          -
          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 +
          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

          Parameters

          • event: "finish"
          • listener: (() => void)

            The callback function

            @@ -347,7 +347,7 @@

            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.

            -
            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 +
            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

            Parameters

            • event: "pipe"
            • listener: ((src: Readable) => void)

              The callback function

              @@ -362,7 +362,7 @@

              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.

              -
              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 +
              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

              Parameters

              • event: "unpipe"
              • listener: ((src: Readable) => void)

                The callback function

                @@ -377,7 +377,7 @@

                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.

                -
                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 +
                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

                Parameters

                • event: string | symbol
                • listener: ((...args: any[]) => void)

                  The callback function

                  @@ -390,7 +390,7 @@

                  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.

                  -
                  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 +
                  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

                  Parameters

                  • event: "close"
                  • listener: (() => void)

                    The callback function

                    @@ -403,7 +403,7 @@

                    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.

                    -
                    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 +
                    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

                    Parameters

                    • event: "drain"
                    • listener: (() => void)

                      The callback function

                      @@ -416,7 +416,7 @@

                      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.

                      -
                      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 +
                      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

                      Parameters

                      • event: "error"
                      • listener: ((err: Error) => void)

                        The callback function

                        @@ -429,7 +429,7 @@

                        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.

                        -
                        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 +
                        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

                        Parameters

                        • event: "finish"
                        • listener: (() => void)

                          The callback function

                          @@ -442,7 +442,7 @@

                          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.

                          -
                          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 +
                          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

                          Parameters

                          • event: "pipe"
                          • listener: ((src: Readable) => void)

                            The callback function

                            @@ -455,7 +455,7 @@

                            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.

                            -
                            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 +
                            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

                            Parameters

                            • event: "unpipe"
                            • listener: ((src: Readable) => void)

                              The callback function

                              @@ -468,7 +468,7 @@

                              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.

                              -
                              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 +
                              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

                              Parameters

                              • event: string | symbol
                              • listener: ((...args: any[]) => void)

                                The callback function

                                @@ -601,7 +601,7 @@
                                  • (...args): void
                                  • Parameters

                                    • Rest...args: any[]

                                    Returns void

                              Returns this

                              v6.0.0

  • Returns a copy of the array of listeners for the event named eventName, including any wrappers (such as those created by .once()).

    -
    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'); +
    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');

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol

    Returns Function[]

    v9.4.0

    @@ -612,7 +612,7 @@

    Returns a reference to the EventEmitter, so that calls can be chained.

    Parameters

    • OptionaleventName: string | symbol

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -622,7 +622,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -633,13 +633,13 @@

    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:

    -
    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'); +
    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.

    Parameters

    • event: "close"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -649,7 +649,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -660,13 +660,13 @@

    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:

    -
    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'); +
    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.

    Parameters

    • event: "drain"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -676,7 +676,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -687,13 +687,13 @@

    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:

    -
    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'); +
    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.

    Parameters

    • event: "error"
    • listener: ((err: Error) => void)
        • (err): void
        • Parameters

          • err: Error

          Returns void

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -703,7 +703,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -714,13 +714,13 @@

    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:

    -
    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'); +
    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.

    Parameters

    • event: "finish"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -730,7 +730,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -741,13 +741,13 @@

    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:

    -
    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'); +
    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.

    Parameters

    • event: "pipe"
    • listener: ((src: Readable) => void)
        • (src): void
        • Parameters

          • src: Readable

          Returns void

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -757,7 +757,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -768,13 +768,13 @@

    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:

    -
    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'); +
    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.

    Parameters

    • event: "unpipe"
    • listener: ((src: Readable) => void)
        • (src): void
        • Parameters

          • src: Readable

          Returns void

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -784,7 +784,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -795,7 +795,7 @@

    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:

    -
    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'); +
    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.

    @@ -819,7 +819,7 @@

    If the writable.cork() method is called multiple times on a stream, the same number of calls to writable.uncork() must be called to flush the buffered data.

    -
    stream.cork();
    stream.write('some ');
    stream.cork();
    stream.write('data ');
    process.nextTick(() => {
    stream.uncork();
    // The data will not be flushed until uncork() is called a second time.
    stream.uncork();
    }); +
    stream.cork();
    stream.write('some ');
    stream.cork();
    stream.write('data ');
    process.nextTick(() => {
    stream.uncork();
    // The data will not be flushed until uncork() is called a second time.
    stream.uncork();
    });

    See also: writable.cork().

    @@ -851,7 +851,7 @@

    If the data to be written can be generated or fetched on demand, it is recommended to encapsulate the logic into a Readable and use pipe. However, if calling write() is preferred, it is possible to respect backpressure and avoid memory issues using the 'drain' event:

    -
    function write(data, cb) {
    if (!stream.write(data)) {
    stream.once('drain', cb);
    } else {
    process.nextTick(cb);
    }
    }

    // Wait for cb to be called before doing any other write.
    write('hello', () => {
    console.log('Write completed, do more writes now.');
    }); +
    function write(data, cb) {
    if (!stream.write(data)) {
    stream.once('drain', cb);
    } else {
    process.nextTick(cb);
    }
    }

    // Wait for cb to be called before doing any other write.
    write('hello', () => {
    console.log('Write completed, do more writes now.');
    });

    A Writable stream in object mode will always ignore the encoding argument.

    @@ -870,7 +870,7 @@ two issues by listening to the event such that stopImmediatePropagation does not prevent the listener from running.

    Returns a disposable so that it may be unsubscribed from more easily.

    -
    import { addAbortListener } from 'node:events';

    function example(signal) {
    let disposable;
    try {
    signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
    disposable = addAbortListener(signal, (e) => {
    // Do something when signal is aborted.
    });
    } finally {
    disposable?.[Symbol.dispose]();
    }
    } +
    import { addAbortListener } from 'node:events';

    function example(signal) {
    let disposable;
    try {
    signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
    disposable = addAbortListener(signal, (e) => {
    // Do something when signal is aborted.
    });
    } finally {
    disposable?.[Symbol.dispose]();
    }
    }

    Parameters

    • signal: AbortSignal
    • resource: ((event: Event) => void)
        • (event): void
        • Parameters

          • event: Event

          Returns void

    Returns Disposable

    Disposable that removes the abort listener.

    @@ -882,7 +882,7 @@ the emitter.

    For EventTargets this is the only way to get the event listeners for the event target. This is useful for debugging and diagnostic purposes.

    -
    import { getEventListeners, EventEmitter } from 'node:events';

    {
    const ee = new EventEmitter();
    const listener = () => console.log('Events are fun');
    ee.on('foo', listener);
    console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
    }
    {
    const et = new EventTarget();
    const listener = () => console.log('Events are fun');
    et.addEventListener('foo', listener);
    console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
    } +
    import { getEventListeners, EventEmitter } from 'node:events';

    {
    const ee = new EventEmitter();
    const listener = () => console.log('Events are fun');
    ee.on('foo', listener);
    console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
    }
    {
    const et = new EventTarget();
    const listener = () => console.log('Events are fun');
    et.addEventListener('foo', listener);
    console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
    }

    Parameters

    • emitter: EventEmitter<DefaultEventMap> | EventTarget
    • name: string | symbol

    Returns Function[]

    v15.2.0, v14.17.0

    @@ -892,19 +892,19 @@

    For EventTargets this is the only way to get the max event listeners for the event target. If the number of event handlers on a single EventTarget exceeds the max set, the EventTarget will print a warning.

    -
    import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';

    {
    const ee = new EventEmitter();
    console.log(getMaxListeners(ee)); // 10
    setMaxListeners(11, ee);
    console.log(getMaxListeners(ee)); // 11
    }
    {
    const et = new EventTarget();
    console.log(getMaxListeners(et)); // 10
    setMaxListeners(11, et);
    console.log(getMaxListeners(et)); // 11
    } +
    import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';

    {
    const ee = new EventEmitter();
    console.log(getMaxListeners(ee)); // 10
    setMaxListeners(11, ee);
    console.log(getMaxListeners(ee)); // 11
    }
    {
    const et = new EventTarget();
    console.log(getMaxListeners(et)); // 10
    setMaxListeners(11, et);
    console.log(getMaxListeners(et)); // 11
    }

    Parameters

    • emitter: EventEmitter<DefaultEventMap> | EventTarget

    Returns number

    v19.9.0

  • A class method that returns the number of listeners for the given eventName registered on the given emitter.

    -
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2 +
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2

    Parameters

    • emitter: EventEmitter<DefaultEventMap>

      The emitter to query

    • eventName: string | symbol

      The event name

    Returns number

    v0.9.12

    Since v3.2.0 - Use listenerCount instead.

    -
  • 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 +
  • 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

    Returns an AsyncIterator that iterates eventName events. It will throw @@ -912,11 +912,11 @@

    Parameters

    • emitter: EventEmitter<DefaultEventMap>
    • eventName: string | symbol
    • Optionaloptions: StaticEventEmitterIteratorOptions

    Returns AsyncIterator<any[], any, any>

    An AsyncIterator that iterates eventName events emitted by the emitter

    @@ -927,21 +927,21 @@
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter); +
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter);

    Parameters

    • Optionaln: number

      A non-negative number. The maximum number of listeners per EventTarget event.

      diff --git a/docs/Next/classes/ListCollectionsCursor.html b/docs/Next/classes/ListCollectionsCursor.html index bcedf716e55..b8c12bda081 100644 --- a/docs/Next/classes/ListCollectionsCursor.html +++ b/docs/Next/classes/ListCollectionsCursor.html @@ -79,7 +79,7 @@ that a "possible EventEmitter memory leak" has been detected. For any single EventEmitter, the emitter.getMaxListeners() and emitter.setMaxListeners() methods can be used to temporarily avoid this warning:

      -
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.setMaxListeners(emitter.getMaxListeners() + 1);
      emitter.once('event', () => {
      // do stuff
      emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
      }); +
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.setMaxListeners(emitter.getMaxListeners() + 1);
      emitter.once('event', () => {
      // do stuff
      emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
      });

      The --trace-warnings command-line flag can be used to display the @@ -117,13 +117,13 @@

      Parameters

      • Optionaloptions: {
            timeoutMS?: number;
        }
        • OptionaltimeoutMS?: number

      Returns Promise<void>

  • 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.

    -
    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 +
    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

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns boolean

    v0.1.26

  • Returns an array listing the events for which the emitter has registered listeners. The values in the array are strings or Symbols.

    -
    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) ] +
    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) ]

    Returns string[]

    v6.0.0

    @@ -141,7 +141,7 @@ in the list of the listeners of the event.

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns number

    v3.2.0

  • Returns a copy of the array of listeners for the event named eventName.

    -
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ] +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ]

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns AbstractCursorEvents[EventKey][]

    v0.1.26

    @@ -152,18 +152,18 @@
      • (doc): T
      • Parameters

        • doc: T

        Returns T

Returns AbstractCursor<T, AbstractCursorEvents>

Note Cursors use null internally to indicate that there are no more documents in the cursor. Providing a mapping function that maps values to null will result in the cursor closing itself before it has finished iterating all documents. This will not result in a memory leak, just surprising behavior. For example:

-
const cursor = collection.find({});
cursor.map(() => null);

const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection. +
const cursor = collection.find({});
cursor.map(() => null);

const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection.

Other falsey values are allowed:

-
const cursor = collection.find({});
cursor.map(() => '');

const documents = await cursor.toArray();
// documents is now an array of empty strings +
const cursor = collection.find({});
cursor.map(() => '');

const documents = await cursor.toArray();
// documents is now an array of empty strings

Note for Typescript Users: adding a transform changes the return type of the iteration of this cursor, it does not return a new instance of a cursor. This means when calling map, you should always assign the result to a new variable in order to get a correctly typed cursor variable. Take note of the following example:

-
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[] +
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[]
  • Returns a copy of the array of listeners for the event named eventName, including any wrappers (such as those created by .once()).

    -
    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'); +
    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');

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns AbstractCursorEvents[EventKey][]

    Type Parameters

    • EventKey extends "close"

    Parameters

    • Optionalevent: string | symbol | EventKey

    Returns this

    v0.1.26

  • A class method that returns the number of listeners for the given eventName registered on the given emitter.

    -
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2 +
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2

    Parameters

    • emitter: EventEmitter<DefaultEventMap>

      The emitter to query

    • eventName: string | symbol

      The event name

    Returns number

    v0.9.12

    Since v3.2.0 - Use listenerCount instead.

    -
  • 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 +
  • 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

    Returns an AsyncIterator that iterates eventName events. It will throw @@ -474,11 +474,11 @@

    Parameters

    • emitter: EventEmitter<DefaultEventMap>
    • eventName: string | symbol
    • Optionaloptions: StaticEventEmitterIteratorOptions

    Returns AsyncIterator<any[], any, any>

    An AsyncIterator that iterates eventName events emitted by the emitter

    @@ -489,21 +489,21 @@
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter); +
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter);

    Parameters

    • Optionaln: number

      A non-negative number. The maximum number of listeners per EventTarget event.

      diff --git a/docs/Next/classes/ListIndexesCursor.html b/docs/Next/classes/ListIndexesCursor.html index 84eb7c7c7f8..2860d1aa938 100644 --- a/docs/Next/classes/ListIndexesCursor.html +++ b/docs/Next/classes/ListIndexesCursor.html @@ -78,7 +78,7 @@ that a "possible EventEmitter memory leak" has been detected. For any single EventEmitter, the emitter.getMaxListeners() and emitter.setMaxListeners() methods can be used to temporarily avoid this warning:

      -
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.setMaxListeners(emitter.getMaxListeners() + 1);
      emitter.once('event', () => {
      // do stuff
      emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
      }); +
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.setMaxListeners(emitter.getMaxListeners() + 1);
      emitter.once('event', () => {
      // do stuff
      emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
      });

      The --trace-warnings command-line flag can be used to display the @@ -116,13 +116,13 @@

      Parameters

      • Optionaloptions: {
            timeoutMS?: number;
        }
        • OptionaltimeoutMS?: number

      Returns Promise<void>

  • 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.

    -
    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 +
    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

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns boolean

    v0.1.26

  • Returns an array listing the events for which the emitter has registered listeners. The values in the array are strings or Symbols.

    -
    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) ] +
    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) ]

    Returns string[]

    v6.0.0

    @@ -140,7 +140,7 @@ in the list of the listeners of the event.

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns number

    v3.2.0

  • Returns a copy of the array of listeners for the event named eventName.

    -
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ] +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ]

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns AbstractCursorEvents[EventKey][]

    v0.1.26

    @@ -151,18 +151,18 @@
      • (doc): T
      • Parameters

        • doc: any

        Returns T

Returns AbstractCursor<T, AbstractCursorEvents>

Note Cursors use null internally to indicate that there are no more documents in the cursor. Providing a mapping function that maps values to null will result in the cursor closing itself before it has finished iterating all documents. This will not result in a memory leak, just surprising behavior. For example:

-
const cursor = collection.find({});
cursor.map(() => null);

const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection. +
const cursor = collection.find({});
cursor.map(() => null);

const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection.

Other falsey values are allowed:

-
const cursor = collection.find({});
cursor.map(() => '');

const documents = await cursor.toArray();
// documents is now an array of empty strings +
const cursor = collection.find({});
cursor.map(() => '');

const documents = await cursor.toArray();
// documents is now an array of empty strings

Note for Typescript Users: adding a transform changes the return type of the iteration of this cursor, it does not return a new instance of a cursor. This means when calling map, you should always assign the result to a new variable in order to get a correctly typed cursor variable. Take note of the following example:

-
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[] +
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[]
  • Returns a copy of the array of listeners for the event named eventName, including any wrappers (such as those created by .once()).

    -
    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'); +
    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');

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns AbstractCursorEvents[EventKey][]

    Type Parameters

    • EventKey extends "close"

    Parameters

    • Optionalevent: string | symbol | EventKey

    Returns this

    v0.1.26

  • A class method that returns the number of listeners for the given eventName registered on the given emitter.

    -
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2 +
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2

    Parameters

    • emitter: EventEmitter<DefaultEventMap>

      The emitter to query

    • eventName: string | symbol

      The event name

    Returns number

    v0.9.12

    Since v3.2.0 - Use listenerCount instead.

    -
  • 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 +
  • 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

    Returns an AsyncIterator that iterates eventName events. It will throw @@ -473,11 +473,11 @@

    Parameters

    • emitter: EventEmitter<DefaultEventMap>
    • eventName: string | symbol
    • Optionaloptions: StaticEventEmitterIteratorOptions

    Returns AsyncIterator<any[], any, any>

    An AsyncIterator that iterates eventName events emitted by the emitter

    @@ -488,21 +488,21 @@
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter); +
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter);

    Parameters

    • Optionaln: number

      A non-negative number. The maximum number of listeners per EventTarget event.

      diff --git a/docs/Next/classes/ListSearchIndexesCursor.html b/docs/Next/classes/ListSearchIndexesCursor.html index 7a9df6a3b4e..a9eea0a2784 100644 --- a/docs/Next/classes/ListSearchIndexesCursor.html +++ b/docs/Next/classes/ListSearchIndexesCursor.html @@ -90,7 +90,7 @@ that a "possible EventEmitter memory leak" has been detected. For any single EventEmitter, the emitter.getMaxListeners() and emitter.setMaxListeners() methods can be used to temporarily avoid this warning:

      -
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.setMaxListeners(emitter.getMaxListeners() + 1);
      emitter.once('event', () => {
      // do stuff
      emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
      }); +
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.setMaxListeners(emitter.getMaxListeners() + 1);
      emitter.once('event', () => {
      // do stuff
      emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
      });

      The --trace-warnings command-line flag can be used to display the @@ -121,10 +121,10 @@

    • Alias for emitter.on(eventName, listener).

      Parameters

      Returns this

      v0.1.26

  • Add a stage to the aggregation pipeline

    -

    Parameters

    Returns this

    const documents = await users.aggregate().addStage({ $match: { name: /Mike/ } }).toArray();
    +

    Parameters

    Returns this

    const documents = await users.aggregate().addStage({ $match: { name: /Mike/ } }).toArray();
     
    -
    const documents = await users.aggregate()
    .addStage<{ name: string }>({ $project: { name: true } })
    .toArray(); // type of documents is { name: string }[] +
    const documents = await users.aggregate()
    .addStage<{ name: string }>({ $project: { name: true } })
    .toArray(); // type of documents is { name: string }[]
  • Type Parameters

    Parameters

    Returns AggregationCursor<T>

  • 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.

    -
    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 +
    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

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns boolean

    v0.1.26

  • Returns an array listing the events for which the emitter has registered listeners. The values in the array are strings or Symbols.

    -
    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) ] +
    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) ]

    Returns string[]

    v6.0.0

    @@ -166,7 +166,7 @@

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns number

    v3.2.0

  • Returns a copy of the array of listeners for the event named eventName.

    -
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ] +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ]

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns AbstractCursorEvents[EventKey][]

    v0.1.26

    @@ -178,18 +178,18 @@

Returns AggregationCursor<T>

Note Cursors use null internally to indicate that there are no more documents in the cursor. Providing a mapping function that maps values to null will result in the cursor closing itself before it has finished iterating all documents. This will not result in a memory leak, just surprising behavior. For example:

-
const cursor = collection.find({});
cursor.map(() => null);

const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection. +
const cursor = collection.find({});
cursor.map(() => null);

const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection.

Other falsey values are allowed:

-
const cursor = collection.find({});
cursor.map(() => '');

const documents = await cursor.toArray();
// documents is now an array of empty strings +
const cursor = collection.find({});
cursor.map(() => '');

const documents = await cursor.toArray();
// documents is now an array of empty strings

Note for Typescript Users: adding a transform changes the return type of the iteration of this cursor, it does not return a new instance of a cursor. This means when calling map, you should always assign the result to a new variable in order to get a correctly typed cursor variable. Take note of the following example:

-
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[] +
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[]
  • Returns a copy of the array of listeners for the event named eventName, including any wrappers (such as those created by .once()).

    -
    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'); +
    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');

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns AbstractCursorEvents[EventKey][]

    Type Parameters

    • EventKey extends "close"

    Parameters

    • Optionalevent: string | symbol | EventKey

    Returns this

    v0.1.26

  • A class method that returns the number of listeners for the given eventName registered on the given emitter.

    -
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2 +
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2

    Parameters

    • emitter: EventEmitter<DefaultEventMap>

      The emitter to query

    • eventName: string | symbol

      The event name

    Returns number

    v0.9.12

    Since v3.2.0 - Use listenerCount instead.

    -
  • 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 +
  • 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

    Returns an AsyncIterator that iterates eventName events. It will throw @@ -517,11 +517,11 @@

    Parameters

    • emitter: EventEmitter<DefaultEventMap>
    • eventName: string | symbol
    • Optionaloptions: StaticEventEmitterIteratorOptions

    Returns AsyncIterator<any[], any, any>

    An AsyncIterator that iterates eventName events emitted by the emitter

    @@ -532,21 +532,21 @@
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter); +
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • 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.

    -
    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 +
    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

    Type Parameters

    • EventKey extends
          | "error"
          | "timeout"
          | "close"
          | "open"
          | "serverOpening"
          | "serverClosed"
          | "serverDescriptionChanged"
          | "topologyOpening"
          | "topologyClosed"
          | "topologyDescriptionChanged"
          | "connectionPoolCreated"
          | "connectionPoolClosed"
          | "connectionPoolCleared"
          | "connectionPoolReady"
          | "connectionCreated"
          | "connectionReady"
          | "connectionClosed"
          | "connectionCheckOutStarted"
          | "connectionCheckOutFailed"
          | "connectionCheckedOut"
          | "connectionCheckedIn"
          | "commandStarted"
          | "commandSucceeded"
          | "commandFailed"
          | "serverHeartbeatStarted"
          | "serverHeartbeatSucceeded"
          | "serverHeartbeatFailed"

    Parameters

    Returns boolean

    v0.1.26

  • Returns an array listing the events for which the emitter has registered listeners. The values in the array are strings or Symbols.

    -
    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) ] +
    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) ]

    Returns string[]

    v6.0.0

    @@ -136,7 +136,7 @@

    Type Parameters

    • EventKey extends
          | "error"
          | "timeout"
          | "close"
          | "open"
          | "serverOpening"
          | "serverClosed"
          | "serverDescriptionChanged"
          | "topologyOpening"
          | "topologyClosed"
          | "topologyDescriptionChanged"
          | "connectionPoolCreated"
          | "connectionPoolClosed"
          | "connectionPoolCleared"
          | "connectionPoolReady"
          | "connectionCreated"
          | "connectionReady"
          | "connectionClosed"
          | "connectionCheckOutStarted"
          | "connectionCheckOutFailed"
          | "connectionCheckedOut"
          | "connectionCheckedIn"
          | "commandStarted"
          | "commandSucceeded"
          | "commandFailed"
          | "serverHeartbeatStarted"
          | "serverHeartbeatSucceeded"
          | "serverHeartbeatFailed"

    Parameters

    Returns number

    v3.2.0

  • Returns a copy of the array of listeners for the event named eventName, including any wrappers (such as those created by .once()).

    -
    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'); +
    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');

    Type Parameters

    • EventKey extends
          | "error"
          | "timeout"
          | "close"
          | "open"
          | "serverOpening"
          | "serverClosed"
          | "serverDescriptionChanged"
          | "topologyOpening"
          | "topologyClosed"
          | "topologyDescriptionChanged"
          | "connectionPoolCreated"
          | "connectionPoolClosed"
          | "connectionPoolCleared"
          | "connectionPoolReady"
          | "connectionCreated"
          | "connectionReady"
          | "connectionClosed"
          | "connectionCheckOutStarted"
          | "connectionCheckOutFailed"
          | "connectionCheckedOut"
          | "connectionCheckedIn"
          | "commandStarted"
          | "commandSucceeded"
          | "commandFailed"
          | "serverHeartbeatStarted"
          | "serverHeartbeatSucceeded"
          | "serverHeartbeatFailed"

    Parameters

    Returns MongoClientEvents[EventKey][]

    Type Parameters

    • EventKey extends
          | "error"
          | "timeout"
          | "close"
          | "open"
          | "serverOpening"
          | "serverClosed"
          | "serverDescriptionChanged"
          | "topologyOpening"
          | "topologyClosed"
          | "topologyDescriptionChanged"
          | "connectionPoolCreated"
          | "connectionPoolClosed"
          | "connectionPoolCleared"
          | "connectionPoolReady"
          | "connectionCreated"
          | "connectionReady"
          | "connectionClosed"
          | "connectionCheckOutStarted"
          | "connectionCheckOutFailed"
          | "connectionCheckedOut"
          | "connectionCheckedIn"
          | "commandStarted"
          | "commandSucceeded"
          | "commandFailed"
          | "serverHeartbeatStarted"
          | "serverHeartbeatSucceeded"
          | "serverHeartbeatFailed"

    Parameters

    • Optionalevent: string | symbol | EventKey

    Returns this

    v0.1.26

  • A class method that returns the number of listeners for the given eventName registered on the given emitter.

    -
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2 +
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2

    Parameters

    • emitter: EventEmitter<DefaultEventMap>

      The emitter to query

    • eventName: string | symbol

      The event name

    Returns number

    v0.9.12

    Since v3.2.0 - Use listenerCount instead.

    -
  • 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 +
  • 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

    Returns an AsyncIterator that iterates eventName events. It will throw @@ -471,11 +471,11 @@

    Parameters

    • emitter: EventEmitter<DefaultEventMap>
    • eventName: string | symbol
    • Optionaloptions: StaticEventEmitterIteratorOptions

    Returns AsyncIterator<any[], any, any>

    An AsyncIterator that iterates eventName events emitted by the emitter

    @@ -486,21 +486,21 @@
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter); +
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

diff --git a/docs/Next/classes/OrderedBulkOperation.html b/docs/Next/classes/OrderedBulkOperation.html index 8b78ff1d07f..9d995b002f5 100644 --- a/docs/Next/classes/OrderedBulkOperation.html +++ b/docs/Next/classes/OrderedBulkOperation.html @@ -11,11 +11,11 @@ raw

Properties

isOrdered: boolean
operationId?: number

Accessors

Methods

  • Builds a find operation for an update/updateOne/delete/deleteOne/replaceOne. Returns a builder object used to complete the definition of the operation.

    -

    Parameters

    Returns FindOperators

    const bulkOp = collection.initializeOrderedBulkOp();

    // Add an updateOne to the bulkOp
    bulkOp.find({ a: 1 }).updateOne({ $set: { b: 2 } });

    // Add an updateMany to the bulkOp
    bulkOp.find({ c: 3 }).update({ $set: { d: 4 } });

    // Add an upsert
    bulkOp.find({ e: 5 }).upsert().updateOne({ $set: { f: 6 } });

    // Add a deletion
    bulkOp.find({ g: 7 }).deleteOne();

    // Add a multi deletion
    bulkOp.find({ h: 8 }).delete();

    // Add a replaceOne
    bulkOp.find({ i: 9 }).replaceOne({writeConcern: { j: 10 }});

    // Update using a pipeline (requires Mongodb 4.2 or higher)
    bulk.find({ k: 11, y: { $exists: true }, z: { $exists: true } }).updateOne([
    { $set: { total: { $sum: [ '$y', '$z' ] } } }
    ]);

    // All of the ops will now be executed
    await bulkOp.execute(); +

    Parameters

    Returns FindOperators

    const bulkOp = collection.initializeOrderedBulkOp();

    // Add an updateOne to the bulkOp
    bulkOp.find({ a: 1 }).updateOne({ $set: { b: 2 } });

    // Add an updateMany to the bulkOp
    bulkOp.find({ c: 3 }).update({ $set: { d: 4 } });

    // Add an upsert
    bulkOp.find({ e: 5 }).upsert().updateOne({ $set: { f: 6 } });

    // Add a deletion
    bulkOp.find({ g: 7 }).deleteOne();

    // Add a multi deletion
    bulkOp.find({ h: 8 }).delete();

    // Add a replaceOne
    bulkOp.find({ i: 9 }).replaceOne({writeConcern: { j: 10 }});

    // Update using a pipeline (requires Mongodb 4.2 or higher)
    bulk.find({ k: 11, y: { $exists: true }, z: { $exists: true } }).updateOne([
    { $set: { total: { $sum: [ '$y', '$z' ] } } }
    ]);

    // All of the ops will now be executed
    await bulkOp.execute();
  • Add a single insert document to the bulk operation

    -

    Parameters

    Returns BulkOperationBase

    const bulkOp = collection.initializeOrderedBulkOp();

    // Adds three inserts to the bulkOp.
    bulkOp
    .insert({ a: 1 })
    .insert({ b: 2 })
    .insert({ c: 3 });
    await bulkOp.execute(); +

    Parameters

    Returns BulkOperationBase

    const bulkOp = collection.initializeOrderedBulkOp();

    // Adds three inserts to the bulkOp.
    bulkOp
    .insert({ a: 1 })
    .insert({ b: 2 })
    .insert({ c: 3 });
    await bulkOp.execute();
  • Specifies a raw operation to perform in the bulk write.

    diff --git a/docs/Next/classes/RunCommandCursor.html b/docs/Next/classes/RunCommandCursor.html index e9523ca32fa..4a6d161f488 100644 --- a/docs/Next/classes/RunCommandCursor.html +++ b/docs/Next/classes/RunCommandCursor.html @@ -80,7 +80,7 @@ that a "possible EventEmitter memory leak" has been detected. For any single EventEmitter, the emitter.getMaxListeners() and emitter.setMaxListeners() methods can be used to temporarily avoid this warning:

    -
    import { EventEmitter } from 'node:events';
    const emitter = new EventEmitter();
    emitter.setMaxListeners(emitter.getMaxListeners() + 1);
    emitter.once('event', () => {
    // do stuff
    emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
    }); +
    import { EventEmitter } from 'node:events';
    const emitter = new EventEmitter();
    emitter.setMaxListeners(emitter.getMaxListeners() + 1);
    emitter.once('event', () => {
    // do stuff
    emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
    });

    The --trace-warnings command-line flag can be used to display the @@ -115,13 +115,13 @@

    Parameters

    • Optionaloptions: {
          timeoutMS?: number;
      }
      • OptionaltimeoutMS?: number

    Returns Promise<void>

  • 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.

    -
    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 +
    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

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns boolean

    v0.1.26

  • Returns an array listing the events for which the emitter has registered listeners. The values in the array are strings or Symbols.

    -
    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) ] +
    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) ]

    Returns string[]

    v6.0.0

    @@ -139,7 +139,7 @@ in the list of the listeners of the event.

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns number

    v3.2.0

  • Returns a copy of the array of listeners for the event named eventName.

    -
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ] +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ]

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns AbstractCursorEvents[EventKey][]

    v0.1.26

    @@ -150,18 +150,18 @@
      • (doc): T
      • Parameters

        • doc: any

        Returns T

Returns AbstractCursor<T, AbstractCursorEvents>

Note Cursors use null internally to indicate that there are no more documents in the cursor. Providing a mapping function that maps values to null will result in the cursor closing itself before it has finished iterating all documents. This will not result in a memory leak, just surprising behavior. For example:

-
const cursor = collection.find({});
cursor.map(() => null);

const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection. +
const cursor = collection.find({});
cursor.map(() => null);

const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection.

Other falsey values are allowed:

-
const cursor = collection.find({});
cursor.map(() => '');

const documents = await cursor.toArray();
// documents is now an array of empty strings +
const cursor = collection.find({});
cursor.map(() => '');

const documents = await cursor.toArray();
// documents is now an array of empty strings

Note for Typescript Users: adding a transform changes the return type of the iteration of this cursor, it does not return a new instance of a cursor. This means when calling map, you should always assign the result to a new variable in order to get a correctly typed cursor variable. Take note of the following example:

-
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[] +
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[]
  • Returns a copy of the array of listeners for the event named eventName, including any wrappers (such as those created by .once()).

    -
    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'); +
    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');

    Type Parameters

    • EventKey extends "close"

    Parameters

    Returns AbstractCursorEvents[EventKey][]

    Type Parameters

    • EventKey extends "close"

    Parameters

    • Optionalevent: string | symbol | EventKey

    Returns this

    v0.1.26

  • A class method that returns the number of listeners for the given eventName registered on the given emitter.

    -
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2 +
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2

    Parameters

    • emitter: EventEmitter<DefaultEventMap>

      The emitter to query

    • eventName: string | symbol

      The event name

    Returns number

    v0.9.12

    Since v3.2.0 - Use listenerCount instead.

    -
  • 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 +
  • 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

    Returns an AsyncIterator that iterates eventName events. It will throw @@ -477,11 +477,11 @@

    Parameters

    • emitter: EventEmitter<DefaultEventMap>
    • eventName: string | symbol
    • Optionaloptions: StaticEventEmitterIteratorOptions

    Returns AsyncIterator<any[], any, any>

    An AsyncIterator that iterates eventName events emitted by the emitter

    @@ -492,21 +492,21 @@
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter); +
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter);

    Parameters

    • Optionaln: number

      A non-negative number. The maximum number of listeners per EventTarget event.

      diff --git a/docs/Next/classes/TypedEventEmitter.html b/docs/Next/classes/TypedEventEmitter.html index 734f797aa16..5aa5bf66b52 100644 --- a/docs/Next/classes/TypedEventEmitter.html +++ b/docs/Next/classes/TypedEventEmitter.html @@ -47,7 +47,7 @@ that a "possible EventEmitter memory leak" has been detected. For any single EventEmitter, the emitter.getMaxListeners() and emitter.setMaxListeners() methods can be used to temporarily avoid this warning:

      -
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.setMaxListeners(emitter.getMaxListeners() + 1);
      emitter.once('event', () => {
      // do stuff
      emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
      }); +
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.setMaxListeners(emitter.getMaxListeners() + 1);
      emitter.once('event', () => {
      // do stuff
      emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
      });

      The --trace-warnings command-line flag can be used to display the @@ -71,13 +71,13 @@

  • 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.

    -
    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 +
    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

    Type Parameters

    • EventKey extends string | number | symbol

    Parameters

    Returns boolean

    v0.1.26

  • Returns an array listing the events for which the emitter has registered listeners. The values in the array are strings or Symbols.

    -
    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) ] +
    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) ]

    Returns string[]

    v6.0.0

    @@ -89,7 +89,7 @@ in the list of the listeners of the event.

    Type Parameters

    • EventKey extends string | number | symbol

    Parameters

    Returns number

    v3.2.0

  • Returns a copy of the array of listeners for the event named eventName.

    -
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ] +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ]

    Type Parameters

    • EventKey extends string | number | symbol

    Parameters

    Returns Events[EventKey][]

    v0.1.26

    @@ -109,7 +109,7 @@

    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.

    -
    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 +
    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

    Type Parameters

    • EventKey extends string | number | symbol

    Parameters

    • event: EventKey
    • listener: Events[EventKey]

      The callback function

      @@ -124,7 +124,7 @@

      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.

      -
      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 +
      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

      Parameters

      • event: CommonEvents
      • listener: ((eventName: string | symbol, listener: GenericListener) => void)

        The callback function

        @@ -139,7 +139,7 @@

        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.

        -
        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 +
        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

        Parameters

        • event: string | symbol
        • listener: GenericListener

          The callback function

          @@ -152,7 +152,7 @@

          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.

          -
          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 +
          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

          Type Parameters

          • EventKey extends string | number | symbol

          Parameters

          • event: EventKey
          • listener: Events[EventKey]

            The callback function

            @@ -165,7 +165,7 @@

            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.

            -
            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 +
            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

            Parameters

            • event: CommonEvents
            • listener: ((eventName: string | symbol, listener: GenericListener) => void)

              The callback function

              @@ -178,7 +178,7 @@

              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.

              -
              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 +
              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

              Parameters

              • event: string | symbol
              • listener: GenericListener

                The callback function

                @@ -239,7 +239,7 @@

              Returns this

              v6.0.0

  • Returns a copy of the array of listeners for the event named eventName, including any wrappers (such as those created by .once()).

    -
    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'); +
    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');

    Type Parameters

    • EventKey extends string | number | symbol

    Parameters

    Returns Events[EventKey][]

    v9.4.0

    @@ -250,7 +250,7 @@

    Returns a reference to the EventEmitter, so that calls can be chained.

    Type Parameters

    • EventKey extends string | number | symbol

    Parameters

    • Optionalevent: string | symbol | EventKey

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -260,7 +260,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -271,13 +271,13 @@

    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:

    -
    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'); +
    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.

    Type Parameters

    • EventKey extends string | number | symbol

    Parameters

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -287,7 +287,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -298,13 +298,13 @@

    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:

    -
    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'); +
    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.

    Parameters

    Returns this

    v0.1.26

  • Removes the specified listener from the listener array for the event named eventName.

    -
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    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 @@ -314,7 +314,7 @@

    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 fromemit() in progress. Subsequent events behave as expected.

    -
    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 +
    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 @@ -325,7 +325,7 @@

    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:

    -
    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'); +
    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.

    @@ -346,7 +346,7 @@ two issues by listening to the event such that stopImmediatePropagation does not prevent the listener from running.

    Returns a disposable so that it may be unsubscribed from more easily.

    -
    import { addAbortListener } from 'node:events';

    function example(signal) {
    let disposable;
    try {
    signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
    disposable = addAbortListener(signal, (e) => {
    // Do something when signal is aborted.
    });
    } finally {
    disposable?.[Symbol.dispose]();
    }
    } +
    import { addAbortListener } from 'node:events';

    function example(signal) {
    let disposable;
    try {
    signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
    disposable = addAbortListener(signal, (e) => {
    // Do something when signal is aborted.
    });
    } finally {
    disposable?.[Symbol.dispose]();
    }
    }

    Parameters

    • signal: AbortSignal
    • resource: ((event: Event) => void)
        • (event): void
        • Parameters

          • event: Event

          Returns void

    Returns Disposable

    Disposable that removes the abort listener.

    @@ -356,7 +356,7 @@ the emitter.

    For EventTargets this is the only way to get the event listeners for the event target. This is useful for debugging and diagnostic purposes.

    -
    import { getEventListeners, EventEmitter } from 'node:events';

    {
    const ee = new EventEmitter();
    const listener = () => console.log('Events are fun');
    ee.on('foo', listener);
    console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
    }
    {
    const et = new EventTarget();
    const listener = () => console.log('Events are fun');
    et.addEventListener('foo', listener);
    console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
    } +
    import { getEventListeners, EventEmitter } from 'node:events';

    {
    const ee = new EventEmitter();
    const listener = () => console.log('Events are fun');
    ee.on('foo', listener);
    console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
    }
    {
    const et = new EventTarget();
    const listener = () => console.log('Events are fun');
    et.addEventListener('foo', listener);
    console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
    }

    Parameters

    • emitter: EventEmitter<DefaultEventMap> | EventTarget
    • name: string | symbol

    Returns Function[]

    v15.2.0, v14.17.0

    @@ -366,19 +366,19 @@

    For EventTargets this is the only way to get the max event listeners for the event target. If the number of event handlers on a single EventTarget exceeds the max set, the EventTarget will print a warning.

    -
    import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';

    {
    const ee = new EventEmitter();
    console.log(getMaxListeners(ee)); // 10
    setMaxListeners(11, ee);
    console.log(getMaxListeners(ee)); // 11
    }
    {
    const et = new EventTarget();
    console.log(getMaxListeners(et)); // 10
    setMaxListeners(11, et);
    console.log(getMaxListeners(et)); // 11
    } +
    import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';

    {
    const ee = new EventEmitter();
    console.log(getMaxListeners(ee)); // 10
    setMaxListeners(11, ee);
    console.log(getMaxListeners(ee)); // 11
    }
    {
    const et = new EventTarget();
    console.log(getMaxListeners(et)); // 10
    setMaxListeners(11, et);
    console.log(getMaxListeners(et)); // 11
    }

    Parameters

    • emitter: EventEmitter<DefaultEventMap> | EventTarget

    Returns number

    v19.9.0

  • A class method that returns the number of listeners for the given eventName registered on the given emitter.

    -
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2 +
    import { EventEmitter, listenerCount } from 'node:events';

    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2

    Parameters

    • emitter: EventEmitter<DefaultEventMap>

      The emitter to query

    • eventName: string | symbol

      The event name

    Returns number

    v0.9.12

    Since v3.2.0 - Use listenerCount instead.

    -
  • 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 +
  • 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

    Returns an AsyncIterator that iterates eventName events. It will throw @@ -386,11 +386,11 @@

    Parameters

    • emitter: EventEmitter<DefaultEventMap>
    • eventName: string | symbol
    • Optionaloptions: StaticEventEmitterIteratorOptions

    Returns AsyncIterator<any[], any, any>

    An AsyncIterator that iterates eventName events emitted by the emitter

    @@ -401,21 +401,21 @@
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter); +
  • Parameters

    • emitter: EventTarget
    • eventName: string
    • Optionaloptions: StaticEventEmitterOptions

    Returns Promise<any[]>

  • import { setMaxListeners, EventEmitter } from 'node:events';

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter);

    Parameters

    • Optionaln: number

      A non-negative number. The maximum number of listeners per EventTarget event.

      diff --git a/docs/Next/classes/UnorderedBulkOperation.html b/docs/Next/classes/UnorderedBulkOperation.html index b83ddb43ff1..4fb682237dc 100644 --- a/docs/Next/classes/UnorderedBulkOperation.html +++ b/docs/Next/classes/UnorderedBulkOperation.html @@ -11,11 +11,11 @@ raw

Properties

isOrdered: boolean
operationId?: number

Accessors

Methods

  • Builds a find operation for an update/updateOne/delete/deleteOne/replaceOne. Returns a builder object used to complete the definition of the operation.

    -

    Parameters

    Returns FindOperators

    const bulkOp = collection.initializeOrderedBulkOp();

    // Add an updateOne to the bulkOp
    bulkOp.find({ a: 1 }).updateOne({ $set: { b: 2 } });

    // Add an updateMany to the bulkOp
    bulkOp.find({ c: 3 }).update({ $set: { d: 4 } });

    // Add an upsert
    bulkOp.find({ e: 5 }).upsert().updateOne({ $set: { f: 6 } });

    // Add a deletion
    bulkOp.find({ g: 7 }).deleteOne();

    // Add a multi deletion
    bulkOp.find({ h: 8 }).delete();

    // Add a replaceOne
    bulkOp.find({ i: 9 }).replaceOne({writeConcern: { j: 10 }});

    // Update using a pipeline (requires Mongodb 4.2 or higher)
    bulk.find({ k: 11, y: { $exists: true }, z: { $exists: true } }).updateOne([
    { $set: { total: { $sum: [ '$y', '$z' ] } } }
    ]);

    // All of the ops will now be executed
    await bulkOp.execute(); +

    Parameters

    Returns FindOperators

    const bulkOp = collection.initializeOrderedBulkOp();

    // Add an updateOne to the bulkOp
    bulkOp.find({ a: 1 }).updateOne({ $set: { b: 2 } });

    // Add an updateMany to the bulkOp
    bulkOp.find({ c: 3 }).update({ $set: { d: 4 } });

    // Add an upsert
    bulkOp.find({ e: 5 }).upsert().updateOne({ $set: { f: 6 } });

    // Add a deletion
    bulkOp.find({ g: 7 }).deleteOne();

    // Add a multi deletion
    bulkOp.find({ h: 8 }).delete();

    // Add a replaceOne
    bulkOp.find({ i: 9 }).replaceOne({writeConcern: { j: 10 }});

    // Update using a pipeline (requires Mongodb 4.2 or higher)
    bulk.find({ k: 11, y: { $exists: true }, z: { $exists: true } }).updateOne([
    { $set: { total: { $sum: [ '$y', '$z' ] } } }
    ]);

    // All of the ops will now be executed
    await bulkOp.execute();
  • Add a single insert document to the bulk operation

    -

    Parameters

    Returns BulkOperationBase

    const bulkOp = collection.initializeOrderedBulkOp();

    // Adds three inserts to the bulkOp.
    bulkOp
    .insert({ a: 1 })
    .insert({ b: 2 })
    .insert({ c: 3 });
    await bulkOp.execute(); +

    Parameters

    Returns BulkOperationBase

    const bulkOp = collection.initializeOrderedBulkOp();

    // Adds three inserts to the bulkOp.
    bulkOp
    .insert({ a: 1 })
    .insert({ b: 2 })
    .insert({ c: 3 });
    await bulkOp.execute();
  • Specifies a raw operation to perform in the bulk write.

    diff --git a/docs/Next/functions/configureExplicitResourceManagement.html b/docs/Next/functions/configureExplicitResourceManagement.html index 556f6eaef8c..c480185578e 100644 --- a/docs/Next/functions/configureExplicitResourceManagement.html +++ b/docs/Next/functions/configureExplicitResourceManagement.html @@ -5,7 +5,7 @@ is defined, in which case it is necessary to call this method directly. This can happen if the application is polyfilling Symbol.asyncDispose.

    Example:

    -
    import { configureExplicitResourceManagement, MongoClient } from 'mongodb/lib/beta';

    Symbol.asyncDispose ??= Symbol('dispose');
    load();

    await using client = new MongoClient(...); +
    import { configureExplicitResourceManagement, MongoClient } from 'mongodb/lib/beta';

    Symbol.asyncDispose ??= Symbol('dispose');
    load();

    await using client = new MongoClient(...);

    Returns void

diff --git a/docs/Next/index.html b/docs/Next/index.html index 07c8dcda7a4..861d8dca011 100644 --- a/docs/Next/index.html +++ b/docs/Next/index.html @@ -84,8 +84,7 @@ Core Server (i.e. SERVER) project are public.

For issues with, questions about, or feedback for the Node.js driver, please look into our support channels. Please do not email any of the driver developers directly with issues or questions - you're more likely to get an answer on the MongoDB Community Forums.

Change history can be found in HISTORY.md.

-

The driver currently supports 3.6+ servers.

-

** 3.6 support is deprecated and support will be removed in a future version **

+

The driver currently supports 4.0+ servers.

For exhaustive server and runtime version compatibility matrices, please refer to the following links:

  • MongoDB
  • @@ -161,7 +160,7 @@

    Additionally, our Typescript types are compatible with the ECMAScript standard for our minimum supported Node version. Currently, our Typescript targets es2021.

    The recommended way to get started using the Node.js 5.x driver is by using the npm (Node Package Manager) to install the dependency in your project.

    After you've created your own project using npm init, you can run:

    -
    npm install mongodb
    # or ...
    yarn add mongodb +
    npm install mongodb
     

    This will download the MongoDB driver and add a dependency entry in your package.json file.

    @@ -222,7 +221,7 @@
  • specifying the DNS resolution ordering with the --dns-resolution-order Node.js command line argument (e.g. node --dns-resolution-order=ipv4first)
-
const { MongoClient } = require('mongodb');
// or as an es module:
// import { MongoClient } from 'mongodb'

// Connection URL
const url = 'mongodb://localhost:27017';
const client = new MongoClient(url);

// Database Name
const dbName = 'myProject';

async function main() {
// Use connect method to connect to the server
await client.connect();
console.log('Connected successfully to server');
const db = client.db(dbName);
const collection = db.collection('documents');

// the following code examples can be pasted here...

return 'done.';
}

main()
.then(console.log)
.catch(console.error)
.finally(() => client.close()); +
const { MongoClient } = require('mongodb');
// or as an es module:
// import { MongoClient } from 'mongodb'

// Connection URL
const url = 'mongodb://localhost:27017';
const client = new MongoClient(url);

// Database Name
const dbName = 'myProject';

async function main() {
// Use connect method to connect to the server
await client.connect();
console.log('Connected successfully to server');
const db = client.db(dbName);
const collection = db.collection('documents');

// the following code examples can be pasted here...

return 'done.';
}

main()
.then(console.log)
.catch(console.error)
.finally(() => client.close());

Run your app from the command line with:

@@ -232,34 +231,34 @@

The application should print Connected successfully to server to the console.

Add to app.js the following function which uses the insertMany method to add three documents to the documents collection.

-
const insertResult = await collection.insertMany([{ a: 1 }, { a: 2 }, { a: 3 }]);
console.log('Inserted documents =>', insertResult); +
const insertResult = await collection.insertMany([{ a: 1 }, { a: 2 }, { a: 3 }]);
console.log('Inserted documents =>', insertResult);

The insertMany command returns an object with information about the insert operations.

Add a query that returns all the documents.

-
const findResult = await collection.find({}).toArray();
console.log('Found documents =>', findResult); +
const findResult = await collection.find({}).toArray();
console.log('Found documents =>', findResult);

This query returns all the documents in the documents collection. If you add this below the insertMany example, you'll see the documents you've inserted.

Add a query filter to find only documents which meet the query criteria.

-
const filteredDocs = await collection.find({ a: 3 }).toArray();
console.log('Found documents filtered by { a: 3 } =>', filteredDocs); +
const filteredDocs = await collection.find({ a: 3 }).toArray();
console.log('Found documents filtered by { a: 3 } =>', filteredDocs);

Only the documents which match 'a' : 3 should be returned.

The following operation updates a document in the documents collection.

-
const updateResult = await collection.updateOne({ a: 3 }, { $set: { b: 1 } });
console.log('Updated documents =>', updateResult); +
const updateResult = await collection.updateOne({ a: 3 }, { $set: { b: 1 } });
console.log('Updated documents =>', updateResult);

The method updates the first document where the field a is equal to 3 by adding a new field b to the document set to 1. updateResult contains information about whether there was a matching document to update or not.

Remove the document where the field a is equal to 3.

-
const deleteResult = await collection.deleteMany({ a: 3 });
console.log('Deleted documents =>', deleteResult); +
const deleteResult = await collection.deleteMany({ a: 3 });
console.log('Deleted documents =>', deleteResult);

Indexes can improve your application's performance. The following function creates an index on the a field in the documents collection.

-
const indexName = await collection.createIndex({ a: 1 });
console.log('index name =', indexName); +
const indexName = await collection.createIndex({ a: 1 });
console.log('index name =', indexName);

For more detailed information, see the indexing strategies page.

@@ -268,7 +267,7 @@ We guarantee instanceof checks will pass according to semver guidelines, but errors may be sub-classed or their messages may change at any time, even patch releases, as we see fit to increase the helpfulness of the errors.

Any new errors we add to the driver will directly extend an existing error class and no existing error will be moved to a different parent class outside of a major release. This means instanceof will always be able to accurately capture the errors that our driver throws.

-
const client = new MongoClient(url);
await client.connect();
const collection = client.db().collection('collection');

try {
await collection.insertOne({ _id: 1 });
await collection.insertOne({ _id: 1 }); // duplicate key error
} catch (error) {
if (error instanceof MongoServerError) {
console.log(`Error worth logging: ${error}`); // special case for some reason
}
throw error; // still want to crash
} +
const client = new MongoClient(url);
await client.connect();
const collection = client.db().collection('collection');

try {
await collection.insertOne({ _id: 1 });
await collection.insertOne({ _id: 1 }); // duplicate key error
} catch (error) {
if (error instanceof MongoServerError) {
console.log(`Error worth logging: ${error}`); // special case for some reason
}
throw error; // still want to crash
}

If you need to test with a change from the latest main branch, our mongodb npm package has nightly versions released under the nightly tag.

diff --git a/docs/Next/interfaces/AWSCredentials.html b/docs/Next/interfaces/AWSCredentials.html new file mode 100644 index 00000000000..99f269593da --- /dev/null +++ b/docs/Next/interfaces/AWSCredentials.html @@ -0,0 +1,7 @@ +AWSCredentials | mongodb

Interface AWSCredentials

Copy of the AwsCredentialIdentityProvider interface from smithy/types, +the return type of the aws-sdk's fromNodeProviderChain().provider().

+
interface AWSCredentials {
    accessKeyId: string;
    expiration?: Date;
    secretAccessKey: string;
    sessionToken?: string;
}

Properties

accessKeyId: string
expiration?: Date
secretAccessKey: string
sessionToken?: string
diff --git a/docs/Next/interfaces/AWSEncryptionKeyOptions.html b/docs/Next/interfaces/AWSEncryptionKeyOptions.html index f3f8931a037..c11bab2483b 100644 --- a/docs/Next/interfaces/AWSEncryptionKeyOptions.html +++ b/docs/Next/interfaces/AWSEncryptionKeyOptions.html @@ -1,8 +1,8 @@ AWSEncryptionKeyOptions | mongodb

Interface AWSEncryptionKeyOptions

Configuration options for making an AWS encryption key

-
interface AWSEncryptionKeyOptions {
    endpoint?: string;
    key: string;
    region: string;
}

Properties

interface AWSEncryptionKeyOptions {
    endpoint?: string;
    key: string;
    region: string;
}

Properties

Properties

endpoint?: string

An alternate host to send KMS requests to. May include port number.

-
key: string

The Amazon Resource Name (ARN) to the AWS customer master key (CMK)

-
region: string

The AWS region of the KMS

-
+
key: string

The Amazon Resource Name (ARN) to the AWS customer master key (CMK)

+
region: string

The AWS region of the KMS

+
diff --git a/docs/Next/interfaces/AWSKMSProviderConfiguration.html b/docs/Next/interfaces/AWSKMSProviderConfiguration.html index d9ab7125d9c..b3c25009742 100644 --- a/docs/Next/interfaces/AWSKMSProviderConfiguration.html +++ b/docs/Next/interfaces/AWSKMSProviderConfiguration.html @@ -1,8 +1,8 @@ -AWSKMSProviderConfiguration | mongodb

Interface AWSKMSProviderConfiguration

interface AWSKMSProviderConfiguration {
    accessKeyId: string;
    secretAccessKey: string;
    sessionToken?: string;
}

Properties

accessKeyId +AWSKMSProviderConfiguration | mongodb

Interface AWSKMSProviderConfiguration

interface AWSKMSProviderConfiguration {
    accessKeyId: string;
    secretAccessKey: string;
    sessionToken?: string;
}

Properties

accessKeyId: string

The access key used for the AWS KMS provider

-
secretAccessKey: string

The secret access key used for the AWS KMS provider

-
sessionToken?: string

An optional AWS session token that will be used as the +

secretAccessKey: string

The secret access key used for the AWS KMS provider

+
sessionToken?: string

An optional AWS session token that will be used as the X-Amz-Security-Token header for AWS requests.

-
+
diff --git a/docs/Next/interfaces/AbstractCursorOptions.html b/docs/Next/interfaces/AbstractCursorOptions.html index fd4195b0fde..02a5a97688b 100644 --- a/docs/Next/interfaces/AbstractCursorOptions.html +++ b/docs/Next/interfaces/AbstractCursorOptions.html @@ -56,7 +56,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). @@ -75,10 +75,10 @@

const cursor = collection.find({}, {timeoutMS: 100, timeoutMode: 'iteration'});
for await (const doc of cursor) {
// process doc
// This will throw a timeout error if any of the iterator's `next()` calls takes more than 100ms, but
// will continue to iterate successfully otherwise, regardless of the number of batches.
} +
const cursor = collection.find({}, {timeoutMS: 100, timeoutMode: 'iteration'});
for await (const doc of cursor) {
// process doc
// This will throw a timeout error if any of the iterator's `next()` calls takes more than 100ms, but
// will continue to iterate successfully otherwise, regardless of the number of batches.
}
-
const cursor = collection.find({}, { timeoutMS: 1000, timeoutMode: 'cursorLifetime' });
const docs = await cursor.toArray(); // This entire line will throw a timeout error if all batches are not fetched and returned within 1000ms. +
const cursor = collection.find({}, { timeoutMS: 1000, timeoutMode: 'cursorLifetime' });
const docs = await cursor.toArray(); // This entire line will throw a timeout error if all batches are not fetched and returned within 1000ms.
timeoutMS?: number

Specifies the time an operation will run until it throws a timeout error. See AbstractCursorOptions.timeoutMode for more details on how this option applies to cursors.

diff --git a/docs/Next/interfaces/AggregateOptions.html b/docs/Next/interfaces/AggregateOptions.html index ea370d7be8d..2d91bf418e5 100644 --- a/docs/Next/interfaces/AggregateOptions.html +++ b/docs/Next/interfaces/AggregateOptions.html @@ -70,7 +70,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/AggregationCursorOptions.html b/docs/Next/interfaces/AggregationCursorOptions.html index 8580fac5932..eb9ea84d14c 100644 --- a/docs/Next/interfaces/AggregationCursorOptions.html +++ b/docs/Next/interfaces/AggregationCursorOptions.html @@ -80,7 +80,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). @@ -103,10 +103,10 @@

const cursor = collection.find({}, {timeoutMS: 100, timeoutMode: 'iteration'});
for await (const doc of cursor) {
// process doc
// This will throw a timeout error if any of the iterator's `next()` calls takes more than 100ms, but
// will continue to iterate successfully otherwise, regardless of the number of batches.
} +
const cursor = collection.find({}, {timeoutMS: 100, timeoutMode: 'iteration'});
for await (const doc of cursor) {
// process doc
// This will throw a timeout error if any of the iterator's `next()` calls takes more than 100ms, but
// will continue to iterate successfully otherwise, regardless of the number of batches.
}
-
const cursor = collection.find({}, { timeoutMS: 1000, timeoutMode: 'cursorLifetime' });
const docs = await cursor.toArray(); // This entire line will throw a timeout error if all batches are not fetched and returned within 1000ms. +
const cursor = collection.find({}, { timeoutMS: 1000, timeoutMode: 'cursorLifetime' });
const docs = await cursor.toArray(); // This entire line will throw a timeout error if all batches are not fetched and returned within 1000ms.
timeoutMS?: number

Specifies the time an operation will run until it throws a timeout error. See AbstractCursorOptions.timeoutMode for more details on how this option applies to cursors.

diff --git a/docs/Next/interfaces/AuthMechanismProperties.html b/docs/Next/interfaces/AuthMechanismProperties.html index 3da4b749883..cd7283cc7e0 100644 --- a/docs/Next/interfaces/AuthMechanismProperties.html +++ b/docs/Next/interfaces/AuthMechanismProperties.html @@ -1,4 +1,5 @@ -AuthMechanismProperties | mongodb

Interface AuthMechanismProperties

interface AuthMechanismProperties {
    ALLOWED_HOSTS?: string[];
    AWS_SESSION_TOKEN?: string;
    CANONICALIZE_HOST_NAME?: GSSAPICanonicalizationValue;
    ENVIRONMENT?:
        | "azure"
        | "gcp"
        | "test"
        | "k8s";
    OIDC_CALLBACK?: OIDCCallbackFunction;
    OIDC_HUMAN_CALLBACK?: OIDCCallbackFunction;
    SERVICE_HOST?: string;
    SERVICE_NAME?: string;
    SERVICE_REALM?: string;
    TOKEN_RESOURCE?: string;
}

Hierarchy (view full)

Properties

ALLOWED_HOSTS? +AuthMechanismProperties | mongodb

Interface AuthMechanismProperties

interface AuthMechanismProperties {
    ALLOWED_HOSTS?: string[];
    AWS_CREDENTIAL_PROVIDER?: AWSCredentialProvider;
    AWS_SESSION_TOKEN?: string;
    CANONICALIZE_HOST_NAME?: GSSAPICanonicalizationValue;
    ENVIRONMENT?:
        | "azure"
        | "gcp"
        | "test"
        | "k8s";
    OIDC_CALLBACK?: OIDCCallbackFunction;
    OIDC_HUMAN_CALLBACK?: OIDCCallbackFunction;
    SERVICE_HOST?: string;
    SERVICE_NAME?: string;
    SERVICE_REALM?: string;
    TOKEN_RESOURCE?: string;
}

Hierarchy (view full)

Properties

ALLOWED_HOSTS?: string[]

Allowed hosts that OIDC auth can connect to.

-
AWS_SESSION_TOKEN?: string
CANONICALIZE_HOST_NAME?: GSSAPICanonicalizationValue
ENVIRONMENT?:
    | "azure"
    | "gcp"
    | "test"
    | "k8s"

The OIDC environment. Note that 'test' is for internal use only.

-
OIDC_CALLBACK?: OIDCCallbackFunction

A user provided OIDC machine callback function.

-
OIDC_HUMAN_CALLBACK?: OIDCCallbackFunction

A user provided OIDC human interacted callback function.

-
SERVICE_HOST?: string
SERVICE_NAME?: string
SERVICE_REALM?: string
TOKEN_RESOURCE?: string

The resource token for OIDC auth in Azure and GCP.

-
+
AWS_CREDENTIAL_PROVIDER?: AWSCredentialProvider

A custom AWS credential provider to use. An example using the AWS SDK default provider chain:

+
const client = new MongoClient(process.env.MONGODB_URI, {
authMechanismProperties: {
AWS_CREDENTIAL_PROVIDER: fromNodeProviderChain()
}
}); +
+ +

Using a custom function that returns AWS credentials:

+
const client = new MongoClient(process.env.MONGODB_URI, {
authMechanismProperties: {
AWS_CREDENTIAL_PROVIDER: async () => {
return {
accessKeyId: process.env.ACCESS_KEY_ID,
secretAccessKey: process.env.SECRET_ACCESS_KEY
}
}
}
}); +
+ +
AWS_SESSION_TOKEN?: string
CANONICALIZE_HOST_NAME?: GSSAPICanonicalizationValue
ENVIRONMENT?:
    | "azure"
    | "gcp"
    | "test"
    | "k8s"

The OIDC environment. Note that 'test' is for internal use only.

+
OIDC_CALLBACK?: OIDCCallbackFunction

A user provided OIDC machine callback function.

+
OIDC_HUMAN_CALLBACK?: OIDCCallbackFunction

A user provided OIDC human interacted callback function.

+
SERVICE_HOST?: string
SERVICE_NAME?: string
SERVICE_REALM?: string
TOKEN_RESOURCE?: string

The resource token for OIDC auth in Azure and GCP.

+
diff --git a/docs/Next/interfaces/AutoEncryptionOptions.html b/docs/Next/interfaces/AutoEncryptionOptions.html index 69750663e87..74705711dbb 100644 --- a/docs/Next/interfaces/AutoEncryptionOptions.html +++ b/docs/Next/interfaces/AutoEncryptionOptions.html @@ -1,5 +1,6 @@ -AutoEncryptionOptions | mongodb

Interface AutoEncryptionOptions

interface AutoEncryptionOptions {
    bypassAutoEncryption?: boolean;
    bypassQueryAnalysis?: boolean;
    encryptedFieldsMap?: Document;
    extraOptions?: {
        cryptSharedLibPath?: string;
        cryptSharedLibRequired?: boolean;
        mongocryptdBypassSpawn?: boolean;
        mongocryptdSpawnArgs?: string[];
        mongocryptdSpawnPath?: string;
        mongocryptdURI?: string;
    };
    keyVaultClient?: MongoClient;
    keyVaultNamespace?: string;
    kmsProviders?: KMSProviders;
    options?: {
        logger?: ((level: AutoEncryptionLoggerLevel, message: string) => void);
    };
    proxyOptions?: ProxyOptions;
    schemaMap?: Document;
    tlsOptions?: CSFLEKMSTlsOptions;
}

Properties

bypassAutoEncryption? +AutoEncryptionOptions | mongodb

Interface AutoEncryptionOptions

interface AutoEncryptionOptions {
    bypassAutoEncryption?: boolean;
    bypassQueryAnalysis?: boolean;
    credentialProviders?: CredentialProviders;
    encryptedFieldsMap?: Document;
    extraOptions?: {
        cryptSharedLibPath?: string;
        cryptSharedLibRequired?: boolean;
        mongocryptdBypassSpawn?: boolean;
        mongocryptdSpawnArgs?: string[];
        mongocryptdSpawnPath?: string;
        mongocryptdURI?: string;
    };
    keyVaultClient?: MongoClient;
    keyVaultNamespace?: string;
    kmsProviders?: KMSProviders;
    options?: {
        logger?: ((level: AutoEncryptionLoggerLevel, message: string) => void);
    };
    proxyOptions?: ProxyOptions;
    schemaMap?: Document;
    tlsOptions?: CSFLEKMSTlsOptions;
}

Properties

bypassAutoEncryption?: boolean

Allows the user to bypass auto encryption, maintaining implicit decryption

-
bypassQueryAnalysis?: boolean

Allows users to bypass query analysis

-
encryptedFieldsMap?: Document

Supply a schema for the encrypted fields in the document

-
extraOptions?: {
    cryptSharedLibPath?: string;
    cryptSharedLibRequired?: boolean;
    mongocryptdBypassSpawn?: boolean;
    mongocryptdSpawnArgs?: string[];
    mongocryptdSpawnPath?: string;
    mongocryptdURI?: string;
}

Type declaration

bypassQueryAnalysis?: boolean

Allows users to bypass query analysis

+
credentialProviders?: CredentialProviders

Configuration options for custom credential providers.

+
encryptedFieldsMap?: Document

Supply a schema for the encrypted fields in the document

+
extraOptions?: {
    cryptSharedLibPath?: string;
    cryptSharedLibRequired?: boolean;
    mongocryptdBypassSpawn?: boolean;
    mongocryptdSpawnArgs?: string[];
    mongocryptdSpawnPath?: string;
    mongocryptdURI?: string;
}

Type declaration

  • OptionalcryptSharedLibPath?: string

    Full path to a MongoDB Crypt shared library to be used (instead of mongocryptd).

    This needs to be the path to the file itself, not a directory. It can be an absolute or relative path. If the path is relative and its first component is $ORIGIN, it will be replaced by the directory @@ -36,14 +38,14 @@

  • OptionalmongocryptdSpawnPath?: string

    The path to the mongocryptd executable on the system

  • OptionalmongocryptdURI?: string

    A local process the driver communicates with to determine how to encrypt values in a command. Defaults to "mongodb://%2Fvar%2Fmongocryptd.sock" if domain sockets are available or "mongodb://localhost:27020" otherwise

    -
keyVaultClient?: MongoClient

A MongoClient used to fetch keys from a key vault

-
keyVaultNamespace?: string

The namespace where keys are stored in the key vault

-
kmsProviders?: KMSProviders

Configuration options that are used by specific KMS providers during key generation, encryption, and decryption.

-
options?: {
    logger?: ((level: AutoEncryptionLoggerLevel, message: string) => void);
}

Type declaration

  • Optionallogger?: ((level: AutoEncryptionLoggerLevel, message: string) => void)

    An optional hook to catch logging messages from the underlying encryption engine

    -
proxyOptions?: ProxyOptions
schemaMap?: Document

A map of namespaces to a local JSON schema for encryption

+
keyVaultClient?: MongoClient

A MongoClient used to fetch keys from a key vault

+
keyVaultNamespace?: string

The namespace where keys are stored in the key vault

+
kmsProviders?: KMSProviders

Configuration options that are used by specific KMS providers during key generation, encryption, and decryption.

+
options?: {
    logger?: ((level: AutoEncryptionLoggerLevel, message: string) => void);
}

Type declaration

  • Optionallogger?: ((level: AutoEncryptionLoggerLevel, message: string) => void)

    An optional hook to catch logging messages from the underlying encryption engine

    +
proxyOptions?: ProxyOptions
schemaMap?: Document

A map of namespaces to a local JSON schema for encryption

NOTE: Supplying options.schemaMap provides more security than relying on JSON Schemas obtained from the server. It protects against a malicious server advertising a false JSON Schema, which could trick the client into sending decrypted data that should be encrypted. Schemas supplied in the schemaMap only apply to configuring automatic encryption for Client-Side Field Level Encryption. Other validation rules in the JSON schema will not be enforced by the driver and will result in an error.

-
tlsOptions?: CSFLEKMSTlsOptions

The TLS options to use connecting to the KMS provider

-
+
tlsOptions?: CSFLEKMSTlsOptions

The TLS options to use connecting to the KMS provider

+
diff --git a/docs/Next/interfaces/AzureEncryptionKeyOptions.html b/docs/Next/interfaces/AzureEncryptionKeyOptions.html index df29ce3f80f..000c3610a32 100644 --- a/docs/Next/interfaces/AzureEncryptionKeyOptions.html +++ b/docs/Next/interfaces/AzureEncryptionKeyOptions.html @@ -1,8 +1,8 @@ AzureEncryptionKeyOptions | mongodb

Interface AzureEncryptionKeyOptions

Configuration options for making an Azure encryption key

-
interface AzureEncryptionKeyOptions {
    keyName: string;
    keyVaultEndpoint: string;
    keyVersion?: string;
}

Properties

interface AzureEncryptionKeyOptions {
    keyName: string;
    keyVaultEndpoint: string;
    keyVersion?: string;
}

Properties

keyName: string

Key name

-
keyVaultEndpoint: string

Key vault URL, typically <name>.vault.azure.net

-
keyVersion?: string

Key version

-
+
keyVaultEndpoint: string

Key vault URL, typically <name>.vault.azure.net

+
keyVersion?: string

Key version

+
diff --git a/docs/Next/interfaces/BSON.DeserializeOptions.html b/docs/Next/interfaces/BSON.DeserializeOptions.html index 1512065b1e1..ce7b3d1a05a 100644 --- a/docs/Next/interfaces/BSON.DeserializeOptions.html +++ b/docs/Next/interfaces/BSON.DeserializeOptions.html @@ -26,7 +26,7 @@

false

validation?: {
    utf8: boolean | Record<string, true> | Record<string, false>;
}

Allows for opt-out utf-8 validation for all keys or specified keys. Must be all true or all false.

-
// disables validation on all keys
validation: { utf8: false }

// enables validation only on specified keys a, b, and c
validation: { utf8: { a: true, b: true, c: true } }

// disables validation only on specified keys a, b
validation: { utf8: { a: false, b: false } } +
// disables validation on all keys
validation: { utf8: false }

// enables validation only on specified keys a, b, and c
validation: { utf8: { a: true, b: true, c: true } }

// disables validation only on specified keys a, b
validation: { utf8: { a: false, b: false } }
diff --git a/docs/Next/interfaces/BSONSerializeOptions.html b/docs/Next/interfaces/BSONSerializeOptions.html index 9cdd990ea8a..a127afd3e28 100644 --- a/docs/Next/interfaces/BSONSerializeOptions.html +++ b/docs/Next/interfaces/BSONSerializeOptions.html @@ -32,7 +32,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/BulkWriteOptions.html b/docs/Next/interfaces/BulkWriteOptions.html index 83f6212cb9a..590f9bc9702 100644 --- a/docs/Next/interfaces/BulkWriteOptions.html +++ b/docs/Next/interfaces/BulkWriteOptions.html @@ -65,7 +65,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/ChangeStreamOptions.html b/docs/Next/interfaces/ChangeStreamOptions.html index 790e0bb7398..8cb07ccc5ce 100644 --- a/docs/Next/interfaces/ChangeStreamOptions.html +++ b/docs/Next/interfaces/ChangeStreamOptions.html @@ -94,7 +94,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/ClientBulkWriteOptions.html b/docs/Next/interfaces/ClientBulkWriteOptions.html index afa8d2d6cff..1ecbaf92297 100644 --- a/docs/Next/interfaces/ClientBulkWriteOptions.html +++ b/docs/Next/interfaces/ClientBulkWriteOptions.html @@ -63,7 +63,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/ClientEncryptionCreateDataKeyProviderOptions.html b/docs/Next/interfaces/ClientEncryptionCreateDataKeyProviderOptions.html index 8e50e599f87..b04544f9557 100644 --- a/docs/Next/interfaces/ClientEncryptionCreateDataKeyProviderOptions.html +++ b/docs/Next/interfaces/ClientEncryptionCreateDataKeyProviderOptions.html @@ -1,8 +1,8 @@ ClientEncryptionCreateDataKeyProviderOptions | mongodb

Interface ClientEncryptionCreateDataKeyProviderOptions

Options to provide when creating a new data key.

-
interface ClientEncryptionCreateDataKeyProviderOptions {
    keyAltNames?: string[];
    keyMaterial?: Buffer | Binary;
    masterKey?:
        | AWSEncryptionKeyOptions
        | AzureEncryptionKeyOptions
        | GCPEncryptionKeyOptions
        | KMIPEncryptionKeyOptions;
}

Properties

interface ClientEncryptionCreateDataKeyProviderOptions {
    keyAltNames?: string[];
    keyMaterial?: Buffer | Binary;
    masterKey?:
        | AWSEncryptionKeyOptions
        | AzureEncryptionKeyOptions
        | GCPEncryptionKeyOptions
        | KMIPEncryptionKeyOptions;
}

Properties

keyAltNames?: string[]

An optional list of string alternate names used to reference a key. If a key is created with alternate names, then encryption may refer to the key by the unique alternate name instead of by _id.

-
keyMaterial?: Buffer | Binary

Identifies a new KMS-specific key used to encrypt the new data key

-
+
keyMaterial?: Buffer | Binary

Identifies a new KMS-specific key used to encrypt the new data key

+
diff --git a/docs/Next/interfaces/ClientEncryptionEncryptOptions.html b/docs/Next/interfaces/ClientEncryptionEncryptOptions.html index 1151c05943f..d7dc67a273b 100644 --- a/docs/Next/interfaces/ClientEncryptionEncryptOptions.html +++ b/docs/Next/interfaces/ClientEncryptionEncryptOptions.html @@ -1,14 +1,14 @@ ClientEncryptionEncryptOptions | mongodb

Interface ClientEncryptionEncryptOptions

Options to provide when encrypting data.

-
interface ClientEncryptionEncryptOptions {
    algorithm:
        | "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
        | "AEAD_AES_256_CBC_HMAC_SHA_512-Random"
        | "Indexed"
        | "Unindexed"
        | "Range";
    contentionFactor?: number | bigint;
    keyAltName?: string;
    keyId?: Binary;
    queryType?: "equality" | "range";
    rangeOptions?: RangeOptions;
}

Properties

interface ClientEncryptionEncryptOptions {
    algorithm:
        | "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
        | "AEAD_AES_256_CBC_HMAC_SHA_512-Random"
        | "Indexed"
        | "Unindexed"
        | "Range";
    contentionFactor?: number | bigint;
    keyAltName?: string;
    keyId?: Binary;
    queryType?: "equality" | "range";
    rangeOptions?: RangeOptions;
}

Properties

algorithm:
    | "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
    | "AEAD_AES_256_CBC_HMAC_SHA_512-Random"
    | "Indexed"
    | "Unindexed"
    | "Range"

The algorithm to use for encryption.

-
contentionFactor?: number | bigint

The contention factor.

-
keyAltName?: string

A unique string name corresponding to an already existing dataKey.

-
keyId?: Binary

The id of the Binary dataKey to use for encryption

-
queryType?: "equality" | "range"

The query type.

-
rangeOptions?: RangeOptions

The index options for a Queryable Encryption field supporting "range" queries.

-
+
contentionFactor?: number | bigint

The contention factor.

+
keyAltName?: string

A unique string name corresponding to an already existing dataKey.

+
keyId?: Binary

The id of the Binary dataKey to use for encryption

+
queryType?: "equality" | "range"

The query type.

+
rangeOptions?: RangeOptions

The index options for a Queryable Encryption field supporting "range" queries.

+
diff --git a/docs/Next/interfaces/ClientEncryptionOptions.html b/docs/Next/interfaces/ClientEncryptionOptions.html index c75ac7471cd..c5f71cf8c3f 100644 --- a/docs/Next/interfaces/ClientEncryptionOptions.html +++ b/docs/Next/interfaces/ClientEncryptionOptions.html @@ -1,24 +1,26 @@ ClientEncryptionOptions | mongodb

Interface ClientEncryptionOptions

Additional settings to provide when creating a new ClientEncryption instance.

-
interface ClientEncryptionOptions {
    keyVaultClient?: MongoClient;
    keyVaultNamespace: string;
    kmsProviders?: KMSProviders;
    proxyOptions?: ProxyOptions;
    timeoutMS?: number;
    tlsOptions?: CSFLEKMSTlsOptions;
}

Properties

interface ClientEncryptionOptions {
    credentialProviders?: CredentialProviders;
    keyVaultClient?: MongoClient;
    keyVaultNamespace: string;
    kmsProviders?: KMSProviders;
    proxyOptions?: ProxyOptions;
    timeoutMS?: number;
    tlsOptions?: CSFLEKMSTlsOptions;
}

Properties

keyVaultClient?: MongoClient

A MongoClient used to fetch keys from a key vault. Defaults to client.

-
keyVaultNamespace: string

The namespace of the key vault, used to store encryption keys

-
kmsProviders?: KMSProviders

Options for specific KMS providers to use

-
proxyOptions?: ProxyOptions

Options for specifying a Socks5 proxy to use for connecting to the KMS.

-
timeoutMS?: number

The timeout setting to be used for all the operations on ClientEncryption.

+

Properties

credentialProviders?: CredentialProviders

Options for user provided custom credential providers.

+
keyVaultClient?: MongoClient

A MongoClient used to fetch keys from a key vault. Defaults to client.

+
keyVaultNamespace: string

The namespace of the key vault, used to store encryption keys

+
kmsProviders?: KMSProviders

Options for specific KMS providers to use

+
proxyOptions?: ProxyOptions

Options for specifying a Socks5 proxy to use for connecting to the KMS.

+
timeoutMS?: number

The timeout setting to be used for all the operations on ClientEncryption.

When provided, timeoutMS is used as the timeout for each operation executed on the ClientEncryption object. For example:

-
const clientEncryption = new ClientEncryption(client, {
timeoutMS: 1_000
kmsProviders: { local: { key: '<KEY>' } }
});

// `1_000` is used as the timeout for createDataKey call
await clientEncryption.createDataKey('local'); +
const clientEncryption = new ClientEncryption(client, {
timeoutMS: 1_000
kmsProviders: { local: { key: '<KEY>' } }
});

// `1_000` is used as the timeout for createDataKey call
await clientEncryption.createDataKey('local');

If timeoutMS is configured on the provided client, the client's timeoutMS value will be used unless timeoutMS is also provided as a client encryption option.

-
const client = new MongoClient('<uri>', { timeoutMS: 2_000 });

// timeoutMS is set to 1_000 on clientEncryption
const clientEncryption = new ClientEncryption(client, {
timeoutMS: 1_000
kmsProviders: { local: { key: '<KEY>' } }
}); +
const client = new MongoClient('<uri>', { timeoutMS: 2_000 });

// timeoutMS is set to 1_000 on clientEncryption
const clientEncryption = new ClientEncryption(client, {
timeoutMS: 1_000
kmsProviders: { local: { key: '<KEY>' } }
});
-
tlsOptions?: CSFLEKMSTlsOptions

TLS options for kms providers to use.

-
+
tlsOptions?: CSFLEKMSTlsOptions

TLS options for kms providers to use.

+
diff --git a/docs/Next/interfaces/ClientEncryptionRewrapManyDataKeyProviderOptions.html b/docs/Next/interfaces/ClientEncryptionRewrapManyDataKeyProviderOptions.html index 38223837727..d2cf9ba15dc 100644 --- a/docs/Next/interfaces/ClientEncryptionRewrapManyDataKeyProviderOptions.html +++ b/docs/Next/interfaces/ClientEncryptionRewrapManyDataKeyProviderOptions.html @@ -1,3 +1,3 @@ -ClientEncryptionRewrapManyDataKeyProviderOptions | mongodb

Interface ClientEncryptionRewrapManyDataKeyProviderOptionsExperimental

interface ClientEncryptionRewrapManyDataKeyProviderOptions {
    masterKey?:
        | AWSEncryptionKeyOptions
        | AzureEncryptionKeyOptions
        | GCPEncryptionKeyOptions
        | KMIPEncryptionKeyOptions;
    provider: keyof KMSProviders;
}

Properties

masterKey? +ClientEncryptionRewrapManyDataKeyProviderOptions | mongodb

Interface ClientEncryptionRewrapManyDataKeyProviderOptionsExperimental

interface ClientEncryptionRewrapManyDataKeyProviderOptions {
    masterKey?:
        | AWSEncryptionKeyOptions
        | AzureEncryptionKeyOptions
        | GCPEncryptionKeyOptions
        | KMIPEncryptionKeyOptions;
    provider: keyof KMSProviders;
}

Properties

Properties

provider: keyof KMSProviders
+

Properties

provider: keyof KMSProviders
diff --git a/docs/Next/interfaces/ClientEncryptionRewrapManyDataKeyResult.html b/docs/Next/interfaces/ClientEncryptionRewrapManyDataKeyResult.html index e0ab9c63d2e..7a58fdd6ba3 100644 --- a/docs/Next/interfaces/ClientEncryptionRewrapManyDataKeyResult.html +++ b/docs/Next/interfaces/ClientEncryptionRewrapManyDataKeyResult.html @@ -1,3 +1,3 @@ -ClientEncryptionRewrapManyDataKeyResult | mongodb

Interface ClientEncryptionRewrapManyDataKeyResultExperimental

interface ClientEncryptionRewrapManyDataKeyResult {
    bulkWriteResult?: BulkWriteResult;
}

Properties

bulkWriteResult? +ClientEncryptionRewrapManyDataKeyResult | mongodb

Interface ClientEncryptionRewrapManyDataKeyResultExperimental

interface ClientEncryptionRewrapManyDataKeyResult {
    bulkWriteResult?: BulkWriteResult;
}

Properties

Properties

bulkWriteResult?: BulkWriteResult

The result of rewrapping data keys. If unset, no keys matched the filter.

-
+
diff --git a/docs/Next/interfaces/CollectionOptions.html b/docs/Next/interfaces/CollectionOptions.html index 711f15ebe56..b3a6d1a5883 100644 --- a/docs/Next/interfaces/CollectionOptions.html +++ b/docs/Next/interfaces/CollectionOptions.html @@ -35,7 +35,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/CommandOperationOptions.html b/docs/Next/interfaces/CommandOperationOptions.html index f29b5c65e6e..9c71480d74c 100644 --- a/docs/Next/interfaces/CommandOperationOptions.html +++ b/docs/Next/interfaces/CommandOperationOptions.html @@ -53,7 +53,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/CountDocumentsOptions.html b/docs/Next/interfaces/CountDocumentsOptions.html index 60c13e566f4..38de0b128fe 100644 --- a/docs/Next/interfaces/CountDocumentsOptions.html +++ b/docs/Next/interfaces/CountDocumentsOptions.html @@ -73,7 +73,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/CountOptions.html b/docs/Next/interfaces/CountOptions.html index 379d2a297eb..36dacd1503d 100644 --- a/docs/Next/interfaces/CountOptions.html +++ b/docs/Next/interfaces/CountOptions.html @@ -58,7 +58,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/CreateCollectionOptions.html b/docs/Next/interfaces/CreateCollectionOptions.html index 3a66c4fb789..bdf43b85890 100644 --- a/docs/Next/interfaces/CreateCollectionOptions.html +++ b/docs/Next/interfaces/CreateCollectionOptions.html @@ -82,7 +82,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/CreateIndexesOptions.html b/docs/Next/interfaces/CreateIndexesOptions.html index 8135c0afd29..6e2ee92f36e 100644 --- a/docs/Next/interfaces/CreateIndexesOptions.html +++ b/docs/Next/interfaces/CreateIndexesOptions.html @@ -80,7 +80,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/CredentialProviders.html b/docs/Next/interfaces/CredentialProviders.html new file mode 100644 index 00000000000..acf887ddef9 --- /dev/null +++ b/docs/Next/interfaces/CredentialProviders.html @@ -0,0 +1,3 @@ +CredentialProviders | mongodb

Interface CredentialProviders

Configuration options for custom credential providers for KMS requests.

+
interface CredentialProviders {
    aws?: AWSCredentialProvider;
}

Properties

Properties

diff --git a/docs/Next/interfaces/DataKey.html b/docs/Next/interfaces/DataKey.html index b933dc8a9fe..a864400c36e 100644 --- a/docs/Next/interfaces/DataKey.html +++ b/docs/Next/interfaces/DataKey.html @@ -1,5 +1,5 @@ DataKey | mongodb

Interface DataKey

The schema for a DataKey in the key vault collection.

-
interface DataKey {
    _id: UUID;
    creationDate: Date;
    keyAltNames?: string[];
    keyMaterial: Binary;
    masterKey: Document;
    status: number;
    updateDate: Date;
    version?: number;
}

Properties

_id +
interface DataKey {
    _id: UUID;
    creationDate: Date;
    keyAltNames?: string[];
    keyMaterial: Binary;
    masterKey: Document;
    status: number;
    updateDate: Date;
    version?: number;
}

Properties

_id: UUID
creationDate: Date
keyAltNames?: string[]
keyMaterial: Binary
masterKey: Document
status: number
updateDate: Date
version?: number
+

Properties

_id: UUID
creationDate: Date
keyAltNames?: string[]
keyMaterial: Binary
masterKey: Document
status: number
updateDate: Date
version?: number
diff --git a/docs/Next/interfaces/DbOptions.html b/docs/Next/interfaces/DbOptions.html index 52ca1bfb434..f010636e612 100644 --- a/docs/Next/interfaces/DbOptions.html +++ b/docs/Next/interfaces/DbOptions.html @@ -42,7 +42,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/DbStatsOptions.html b/docs/Next/interfaces/DbStatsOptions.html index 13f8cacaa68..fffd8f7a755 100644 --- a/docs/Next/interfaces/DbStatsOptions.html +++ b/docs/Next/interfaces/DbStatsOptions.html @@ -54,7 +54,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/DeleteOptions.html b/docs/Next/interfaces/DeleteOptions.html index 7239703a2eb..a12a4d07497 100644 --- a/docs/Next/interfaces/DeleteOptions.html +++ b/docs/Next/interfaces/DeleteOptions.html @@ -59,7 +59,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/DropCollectionOptions.html b/docs/Next/interfaces/DropCollectionOptions.html index 44d861ec9a1..25a773e1448 100644 --- a/docs/Next/interfaces/DropCollectionOptions.html +++ b/docs/Next/interfaces/DropCollectionOptions.html @@ -54,7 +54,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/EstimatedDocumentCountOptions.html b/docs/Next/interfaces/EstimatedDocumentCountOptions.html index 9c427fd95f6..ca74c6575b1 100644 --- a/docs/Next/interfaces/EstimatedDocumentCountOptions.html +++ b/docs/Next/interfaces/EstimatedDocumentCountOptions.html @@ -54,7 +54,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/ExplainOptions.html b/docs/Next/interfaces/ExplainOptions.html index c62aca5d3b5..4b11f7e9fb4 100644 --- a/docs/Next/interfaces/ExplainOptions.html +++ b/docs/Next/interfaces/ExplainOptions.html @@ -7,7 +7,7 @@

maxTimeMS can be configured to limit the amount of time the server spends executing an explain by providing an object:

-
// limits the `explain` command to no more than 2 seconds
collection.find({ name: 'john doe' }, {
explain: {
verbosity: 'queryPlanner',
maxTimeMS: 2000
}
}); +
// limits the `explain` command to no more than 2 seconds
collection.find({ name: 'john doe' }, {
explain: {
verbosity: 'queryPlanner',
maxTimeMS: 2000
}
});
interface ExplainOptions {
    explain?: ExplainVerbosityLike | ExplainCommandOptions;
}

Hierarchy (view full)

Properties

explain? diff --git a/docs/Next/interfaces/FindOneAndDeleteOptions.html b/docs/Next/interfaces/FindOneAndDeleteOptions.html index 678a460841f..c4943681ffb 100644 --- a/docs/Next/interfaces/FindOneAndDeleteOptions.html +++ b/docs/Next/interfaces/FindOneAndDeleteOptions.html @@ -62,7 +62,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/FindOneAndReplaceOptions.html b/docs/Next/interfaces/FindOneAndReplaceOptions.html index 26cdbc5323e..dcd9fb49ea4 100644 --- a/docs/Next/interfaces/FindOneAndReplaceOptions.html +++ b/docs/Next/interfaces/FindOneAndReplaceOptions.html @@ -66,7 +66,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/FindOneAndUpdateOptions.html b/docs/Next/interfaces/FindOneAndUpdateOptions.html index 4d1eef1104a..a57c04ee369 100644 --- a/docs/Next/interfaces/FindOneAndUpdateOptions.html +++ b/docs/Next/interfaces/FindOneAndUpdateOptions.html @@ -68,7 +68,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/FindOptions.html b/docs/Next/interfaces/FindOptions.html index 180816747c6..22f27bcd537 100644 --- a/docs/Next/interfaces/FindOptions.html +++ b/docs/Next/interfaces/FindOptions.html @@ -88,7 +88,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/GCPEncryptionKeyOptions.html b/docs/Next/interfaces/GCPEncryptionKeyOptions.html index 5b0908bcd9b..8bc47660012 100644 --- a/docs/Next/interfaces/GCPEncryptionKeyOptions.html +++ b/docs/Next/interfaces/GCPEncryptionKeyOptions.html @@ -1,14 +1,14 @@ GCPEncryptionKeyOptions | mongodb

Interface GCPEncryptionKeyOptions

Configuration options for making an AWS encryption key

-
interface GCPEncryptionKeyOptions {
    endpoint?: string;
    keyName: string;
    keyRing: string;
    keyVersion?: string;
    location: string;
    projectId: string;
}

Properties

interface GCPEncryptionKeyOptions {
    endpoint?: string;
    keyName: string;
    keyRing: string;
    keyVersion?: string;
    location: string;
    projectId: string;
}

Properties

endpoint?: string

KMS URL, defaults to https://www.googleapis.com/auth/cloudkms

-
keyName: string

Key name

-
keyRing: string

Key ring name

-
keyVersion?: string

Key version

-
location: string

Location name (e.g. "global")

-
projectId: string

GCP project ID

-
+
keyName: string

Key name

+
keyRing: string

Key ring name

+
keyVersion?: string

Key version

+
location: string

Location name (e.g. "global")

+
projectId: string

GCP project ID

+
diff --git a/docs/Next/interfaces/IndexInformationOptions.html b/docs/Next/interfaces/IndexInformationOptions.html index 15f1d62484c..c037f511c3b 100644 --- a/docs/Next/interfaces/IndexInformationOptions.html +++ b/docs/Next/interfaces/IndexInformationOptions.html @@ -68,7 +68,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). @@ -87,10 +87,10 @@

const cursor = collection.find({}, {timeoutMS: 100, timeoutMode: 'iteration'});
for await (const doc of cursor) {
// process doc
// This will throw a timeout error if any of the iterator's `next()` calls takes more than 100ms, but
// will continue to iterate successfully otherwise, regardless of the number of batches.
} +
const cursor = collection.find({}, {timeoutMS: 100, timeoutMode: 'iteration'});
for await (const doc of cursor) {
// process doc
// This will throw a timeout error if any of the iterator's `next()` calls takes more than 100ms, but
// will continue to iterate successfully otherwise, regardless of the number of batches.
}
-
const cursor = collection.find({}, { timeoutMS: 1000, timeoutMode: 'cursorLifetime' });
const docs = await cursor.toArray(); // This entire line will throw a timeout error if all batches are not fetched and returned within 1000ms. +
const cursor = collection.find({}, { timeoutMS: 1000, timeoutMode: 'cursorLifetime' });
const docs = await cursor.toArray(); // This entire line will throw a timeout error if all batches are not fetched and returned within 1000ms.
timeoutMS?: number

Specifies the time an operation will run until it throws a timeout error. See AbstractCursorOptions.timeoutMode for more details on how this option applies to cursors.

diff --git a/docs/Next/interfaces/InsertOneOptions.html b/docs/Next/interfaces/InsertOneOptions.html index df01d436ad5..e34272a8974 100644 --- a/docs/Next/interfaces/InsertOneOptions.html +++ b/docs/Next/interfaces/InsertOneOptions.html @@ -57,7 +57,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/KMIPEncryptionKeyOptions.html b/docs/Next/interfaces/KMIPEncryptionKeyOptions.html index 76b2eec10a7..7c1f351c018 100644 --- a/docs/Next/interfaces/KMIPEncryptionKeyOptions.html +++ b/docs/Next/interfaces/KMIPEncryptionKeyOptions.html @@ -1,10 +1,10 @@ KMIPEncryptionKeyOptions | mongodb

Interface KMIPEncryptionKeyOptions

Configuration options for making a KMIP encryption key

-
interface KMIPEncryptionKeyOptions {
    delegated?: boolean;
    endpoint?: string;
    keyId?: string;
}

Properties

interface KMIPEncryptionKeyOptions {
    delegated?: boolean;
    endpoint?: string;
    keyId?: string;
}

Properties

delegated?: boolean

If true, this key should be decrypted by the KMIP server.

Requires mongodb-client-encryption>=6.0.1.

-
endpoint?: string

Host with optional port.

-
keyId?: string

keyId is the KMIP Unique Identifier to a 96 byte KMIP Secret Data managed object.

+
endpoint?: string

Host with optional port.

+
keyId?: string

keyId is the KMIP Unique Identifier to a 96 byte KMIP Secret Data managed object.

If keyId is omitted, a random 96 byte KMIP Secret Data managed object will be created.

-
+
diff --git a/docs/Next/interfaces/KMIPKMSProviderConfiguration.html b/docs/Next/interfaces/KMIPKMSProviderConfiguration.html index c63310a4c63..2755c822532 100644 --- a/docs/Next/interfaces/KMIPKMSProviderConfiguration.html +++ b/docs/Next/interfaces/KMIPKMSProviderConfiguration.html @@ -1,5 +1,5 @@ -KMIPKMSProviderConfiguration | mongodb

Interface KMIPKMSProviderConfiguration

interface KMIPKMSProviderConfiguration {
    endpoint?: string;
}

Properties

endpoint? +KMIPKMSProviderConfiguration | mongodb

Interface KMIPKMSProviderConfiguration

interface KMIPKMSProviderConfiguration {
    endpoint?: string;
}

Properties

Properties

endpoint?: string

The output endpoint string. The endpoint consists of a hostname and port separated by a colon. E.g. "example.com:123". A port is always present.

-
+
diff --git a/docs/Next/interfaces/KMSProviders.html b/docs/Next/interfaces/KMSProviders.html index c4253b70b25..172ed3c192e 100644 --- a/docs/Next/interfaces/KMSProviders.html +++ b/docs/Next/interfaces/KMSProviders.html @@ -1,13 +1,13 @@ KMSProviders | mongodb

Interface KMSProviders

Configuration options that are used by specific KMS providers during key generation, encryption, and decryption.

Named KMS providers are not supported for automatic KMS credential fetching.

-
interface KMSProviders {
    aws?: AWSKMSProviderConfiguration | Record<string, never>;
    azure?: AzureKMSProviderConfiguration | Record<string, never>;
    gcp?: GCPKMSProviderConfiguration | Record<string, never>;
    kmip?: KMIPKMSProviderConfiguration;
    local?: LocalKMSProviderConfiguration;
    [key: `aws:${string}`]: AWSKMSProviderConfiguration;
    [key: `local:${string}`]: LocalKMSProviderConfiguration;
    [key: `kmip:${string}`]: KMIPKMSProviderConfiguration;
    [key: `azure:${string}`]: AzureKMSProviderConfiguration;
    [key: `gcp:${string}`]: GCPKMSProviderConfiguration;
}

Indexable

Properties

interface KMSProviders {
    aws?: AWSKMSProviderConfiguration | Record<string, never>;
    azure?: AzureKMSProviderConfiguration | Record<string, never>;
    gcp?: GCPKMSProviderConfiguration | Record<string, never>;
    kmip?: KMIPKMSProviderConfiguration;
    local?: LocalKMSProviderConfiguration;
    [key: `aws:${string}`]: AWSKMSProviderConfiguration;
    [key: `local:${string}`]: LocalKMSProviderConfiguration;
    [key: `kmip:${string}`]: KMIPKMSProviderConfiguration;
    [key: `azure:${string}`]: AzureKMSProviderConfiguration;
    [key: `gcp:${string}`]: GCPKMSProviderConfiguration;
}

Indexable

Properties

aws?: AWSKMSProviderConfiguration | Record<string, never>

Configuration options for using 'aws' as your KMS provider

-
azure?: AzureKMSProviderConfiguration | Record<string, never>

Configuration options for using 'azure' as your KMS provider

-
gcp?: GCPKMSProviderConfiguration | Record<string, never>

Configuration options for using 'gcp' as your KMS provider

-

Configuration options for using 'kmip' as your KMS provider

-

Configuration options for using 'local' as your KMS provider

-
+
azure?: AzureKMSProviderConfiguration | Record<string, never>

Configuration options for using 'azure' as your KMS provider

+
gcp?: GCPKMSProviderConfiguration | Record<string, never>

Configuration options for using 'gcp' as your KMS provider

+

Configuration options for using 'kmip' as your KMS provider

+

Configuration options for using 'local' as your KMS provider

+
diff --git a/docs/Next/interfaces/ListCollectionsOptions.html b/docs/Next/interfaces/ListCollectionsOptions.html index 12ad08e8475..d038560204d 100644 --- a/docs/Next/interfaces/ListCollectionsOptions.html +++ b/docs/Next/interfaces/ListCollectionsOptions.html @@ -59,7 +59,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). @@ -79,7 +79,7 @@

timeoutMS?: number

Specifies the time an operation will run until it throws a timeout error

diff --git a/docs/Next/interfaces/ListDatabasesOptions.html b/docs/Next/interfaces/ListDatabasesOptions.html index 000ab716691..50cc3ffc357 100644 --- a/docs/Next/interfaces/ListDatabasesOptions.html +++ b/docs/Next/interfaces/ListDatabasesOptions.html @@ -59,7 +59,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/LocalKMSProviderConfiguration.html b/docs/Next/interfaces/LocalKMSProviderConfiguration.html index 184fa47dbcb..59d2ec809f9 100644 --- a/docs/Next/interfaces/LocalKMSProviderConfiguration.html +++ b/docs/Next/interfaces/LocalKMSProviderConfiguration.html @@ -1,4 +1,4 @@ -LocalKMSProviderConfiguration | mongodb

Interface LocalKMSProviderConfiguration

interface LocalKMSProviderConfiguration {
    key: string | Uint8Array | Binary;
}

Properties

key +LocalKMSProviderConfiguration | mongodb

Interface LocalKMSProviderConfiguration

interface LocalKMSProviderConfiguration {
    key: string | Uint8Array | Binary;
}

Properties

Properties

key: string | Uint8Array | Binary

The master key used to encrypt/decrypt data keys. A 96-byte long Buffer or base64 encoded string.

-
+
diff --git a/docs/Next/interfaces/MongoClientOptions.html b/docs/Next/interfaces/MongoClientOptions.html index e0066a73053..a3f158946cc 100644 --- a/docs/Next/interfaces/MongoClientOptions.html +++ b/docs/Next/interfaces/MongoClientOptions.html @@ -222,7 +222,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/MongoCredentialsOptions.html b/docs/Next/interfaces/MongoCredentialsOptions.html index 19e6a15d673..3bc122ae9b8 100644 --- a/docs/Next/interfaces/MongoCredentialsOptions.html +++ b/docs/Next/interfaces/MongoCredentialsOptions.html @@ -1,7 +1,7 @@ -MongoCredentialsOptions | mongodb

Interface MongoCredentialsOptions

interface MongoCredentialsOptions {
    db?: string;
    mechanism?: AuthMechanism;
    mechanismProperties: AuthMechanismProperties;
    password: string;
    source: string;
    username?: string;
}

Properties

db? +MongoCredentialsOptions | mongodb

Interface MongoCredentialsOptions

interface MongoCredentialsOptions {
    db?: string;
    mechanism?: AuthMechanism;
    mechanismProperties: AuthMechanismProperties;
    password: string;
    source: string;
    username?: string;
}

Properties

db?: string
mechanism?: AuthMechanism
mechanismProperties: AuthMechanismProperties
password: string
source: string
username?: string
+

Properties

db?: string
mechanism?: AuthMechanism
mechanismProperties: AuthMechanismProperties
password: string
source: string
username?: string
diff --git a/docs/Next/interfaces/MongoOptions.html b/docs/Next/interfaces/MongoOptions.html index be954c3f6fe..fce91f4629c 100644 --- a/docs/Next/interfaces/MongoOptions.html +++ b/docs/Next/interfaces/MongoOptions.html @@ -179,7 +179,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/OperationOptions.html b/docs/Next/interfaces/OperationOptions.html index b86343dded5..7506e1970cc 100644 --- a/docs/Next/interfaces/OperationOptions.html +++ b/docs/Next/interfaces/OperationOptions.html @@ -36,7 +36,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/RangeOptions.html b/docs/Next/interfaces/RangeOptions.html index 3792b51977a..dd6acbd20db 100644 --- a/docs/Next/interfaces/RangeOptions.html +++ b/docs/Next/interfaces/RangeOptions.html @@ -1,13 +1,13 @@ RangeOptions | mongodb

Interface RangeOptions

RangeOptions specifies index options for a Queryable Encryption field supporting "range" queries. min, max, sparsity, trimFactor and range must match the values set in the encryptedFields of the destination collection. For double and decimal128, min/max/precision must all be set, or all be unset.

-
interface RangeOptions {
    max?: any;
    min?: any;
    precision?: number;
    sparsity?: bigint | Long;
    trimFactor?: number | Int32;
}

Properties

interface RangeOptions {
    max?: any;
    min?: any;
    precision?: number;
    sparsity?: bigint | Long;
    trimFactor?: number | Int32;
}

Properties

max?: any

max is the minimum value for the encrypted index. Required if precision is set.

-
min?: any

min is the minimum value for the encrypted index. Required if precision is set.

-
precision?: number
sparsity?: bigint | Long

sparsity may be used to tune performance. must be non-negative. When omitted, a default value is used.

-
trimFactor?: number | Int32

trimFactor may be used to tune performance. must be non-negative. When omitted, a default value is used.

-
+
min?: any

min is the minimum value for the encrypted index. Required if precision is set.

+
precision?: number
sparsity?: bigint | Long

sparsity may be used to tune performance. must be non-negative. When omitted, a default value is used.

+
trimFactor?: number | Int32

trimFactor may be used to tune performance. must be non-negative. When omitted, a default value is used.

+
diff --git a/docs/Next/interfaces/RenameOptions.html b/docs/Next/interfaces/RenameOptions.html index 1a155223dbe..18127b4c0de 100644 --- a/docs/Next/interfaces/RenameOptions.html +++ b/docs/Next/interfaces/RenameOptions.html @@ -57,7 +57,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/ReplaceOptions.html b/docs/Next/interfaces/ReplaceOptions.html index 498bad0387a..ca46047db1c 100644 --- a/docs/Next/interfaces/ReplaceOptions.html +++ b/docs/Next/interfaces/ReplaceOptions.html @@ -60,7 +60,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/TransactionOptions.html b/docs/Next/interfaces/TransactionOptions.html index 91f4e09e3d6..3169c0cc352 100644 --- a/docs/Next/interfaces/TransactionOptions.html +++ b/docs/Next/interfaces/TransactionOptions.html @@ -55,7 +55,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/UpdateOptions.html b/docs/Next/interfaces/UpdateOptions.html index 20496a34ccc..5b99accc16a 100644 --- a/docs/Next/interfaces/UpdateOptions.html +++ b/docs/Next/interfaces/UpdateOptions.html @@ -62,7 +62,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/interfaces/ValidateCollectionOptions.html b/docs/Next/interfaces/ValidateCollectionOptions.html index 9d2fdcb3384..e0d178c2af4 100644 --- a/docs/Next/interfaces/ValidateCollectionOptions.html +++ b/docs/Next/interfaces/ValidateCollectionOptions.html @@ -55,7 +55,7 @@ for more detail about what "unsafe" refers to in this context. If you need to maintain your own editable clone of the bytes returned for an extended life time of the process, it is recommended you allocate your own buffer and clone the contents:

-
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point +
const raw = await collection.findOne({}, { raw: true });
const myBuffer = Buffer.alloc(raw.byteLength);
myBuffer.set(raw, 0);
// Only save and use `myBuffer` beyond this point

Please note there is a known limitation where this option cannot be used at the MongoClient level (see NODE-3946). diff --git a/docs/Next/modules.html b/docs/Next/modules.html index adde2bc93ec..d2a7560159b 100644 --- a/docs/Next/modules.html +++ b/docs/Next/modules.html @@ -139,6 +139,7 @@ Auth AuthMechanismProperties AutoEncryptionOptions +AWSCredentials AWSEncryptionKeyOptions AWSKMSProviderConfiguration AzureEncryptionKeyOptions @@ -202,6 +203,7 @@ CountOptions CreateCollectionOptions CreateIndexesOptions +CredentialProviders CursorStreamOptions DataKey DbOptions @@ -301,6 +303,7 @@ AuthMechanism AutoEncryptionExtraOptions AutoEncryptionLoggerLevel +AWSCredentialProvider AzureKMSProviderConfiguration BatchType BitwiseFilter diff --git a/docs/Next/types/AWSCredentialProvider.html b/docs/Next/types/AWSCredentialProvider.html new file mode 100644 index 00000000000..435d6ccb496 --- /dev/null +++ b/docs/Next/types/AWSCredentialProvider.html @@ -0,0 +1,4 @@ +AWSCredentialProvider | mongodb

Type Alias AWSCredentialProvider

AWSCredentialProvider: (() => Promise<AWSCredentials>)
    +
  • +
+
diff --git a/docs/Next/types/Abortable.html b/docs/Next/types/Abortable.html index 40530fc6804..6f1c8cd05d8 100644 --- a/docs/Next/types/Abortable.html +++ b/docs/Next/types/Abortable.html @@ -7,7 +7,7 @@

AbortSignals are likely a best fit for human interactive interruption (ex. ctrl-C) where the frequency of cancellation is reasonably low. If a signal is programmatically aborted for 100s of operations you can empty the driver's connection pool.

-
const controller = new AbortController();
const { signal } = controller;
process.on('SIGINT', () => controller.abort(new Error('^C pressed')));

try {
const res = await fetch('...', { signal });
await collection.findOne(await res.json(), { signal });
catch (error) {
if (error === signal.reason) {
// signal abort error handling
}
} +
const controller = new AbortController();
const { signal } = controller;
process.on('SIGINT', () => controller.abort(new Error('^C pressed')));

try {
const res = await fetch('...', { signal });
await collection.findOne(await res.json(), { signal });
catch (error) {
if (error === signal.reason) {
// signal abort error handling
}
}
diff --git a/docs/Next/types/AutoEncryptionExtraOptions.html b/docs/Next/types/AutoEncryptionExtraOptions.html index 8b886422b52..473a3f65737 100644 --- a/docs/Next/types/AutoEncryptionExtraOptions.html +++ b/docs/Next/types/AutoEncryptionExtraOptions.html @@ -1,3 +1,3 @@ AutoEncryptionExtraOptions | mongodb

Type Alias AutoEncryptionExtraOptions

AutoEncryptionExtraOptions: NonNullable<AutoEncryptionOptions["extraOptions"]>

Extra options related to the mongocryptd process * Available in MongoDB 6.0 or higher.

-
+
diff --git a/docs/Next/types/AutoEncryptionLoggerLevel.html b/docs/Next/types/AutoEncryptionLoggerLevel.html index 04ab55e3851..1f748c92ed3 100644 --- a/docs/Next/types/AutoEncryptionLoggerLevel.html +++ b/docs/Next/types/AutoEncryptionLoggerLevel.html @@ -29,4 +29,4 @@ -
+
diff --git a/docs/Next/types/AzureKMSProviderConfiguration.html b/docs/Next/types/AzureKMSProviderConfiguration.html index fe9de091b7e..7604cf3954a 100644 --- a/docs/Next/types/AzureKMSProviderConfiguration.html +++ b/docs/Next/types/AzureKMSProviderConfiguration.html @@ -6,4 +6,4 @@ Defaults to "login.microsoftonline.com"

  • tenantId: string

    The tenant ID identifies the organization for the account

  • Type declaration

    • accessToken: string

      If present, an access token to authenticate with Azure.

      -
    +
    diff --git a/docs/Next/types/ClientBulkWriteModel.html b/docs/Next/types/ClientBulkWriteModel.html index f8d1b4addcb..928174543b2 100644 --- a/docs/Next/types/ClientBulkWriteModel.html +++ b/docs/Next/types/ClientBulkWriteModel.html @@ -1,5 +1,5 @@ ClientBulkWriteModel | mongodb

    Type Alias ClientBulkWriteModel<SchemaMap>

    ClientBulkWriteModel<SchemaMap>: {
        [Namespace in keyof SchemaMap]: AnyClientBulkWriteModel<SchemaMap[Namespace]> & {
            namespace: Namespace;
        }
    }[keyof SchemaMap]

    A mapping of namespace strings to collections schemas.

    -

    Type Parameters

    type MongoDBSchemas = {
    'db.books': Book;
    'db.authors': Author;
    }

    const model: ClientBulkWriteModel<MongoDBSchemas> = {
    namespace: 'db.books'
    name: 'insertOne',
    document: { title: 'Practical MongoDB Aggregations', authorName: 3 } // error `authorName` cannot be number
    }; +

    Type Parameters

    type MongoDBSchemas = {
    'db.books': Book;
    'db.authors': Author;
    }

    const model: ClientBulkWriteModel<MongoDBSchemas> = {
    namespace: 'db.books'
    name: 'insertOne',
    document: { title: 'Practical MongoDB Aggregations', authorName: 3 } // error `authorName` cannot be number
    };

    The type of the namespace field narrows other parts of the BulkWriteModel to use the correct schema for type assertions.

    diff --git a/docs/Next/types/ClientEncryptionDataKeyProvider.html b/docs/Next/types/ClientEncryptionDataKeyProvider.html index 23c9870a066..9c98f72723b 100644 --- a/docs/Next/types/ClientEncryptionDataKeyProvider.html +++ b/docs/Next/types/ClientEncryptionDataKeyProvider.html @@ -5,4 +5,4 @@ aws:<name>, gcp:<name>, local:<name>, kmip:<name>, azure:<name> where name is an alphanumeric string, underscores allowed. -
    +
    diff --git a/docs/Next/types/GCPKMSProviderConfiguration.html b/docs/Next/types/GCPKMSProviderConfiguration.html index c7cfd5e8672..090fce59f2c 100644 --- a/docs/Next/types/GCPKMSProviderConfiguration.html +++ b/docs/Next/types/GCPKMSProviderConfiguration.html @@ -3,4 +3,4 @@ Defaults to "oauth2.googleapis.com"

  • privateKey: string | Buffer

    A PKCS#8 encrypted key. This can either be a base64 string or a binary representation

  • Type declaration

    • accessToken: string

      If present, an access token to authenticate with GCP.

      -
    +
    diff --git a/docs/Next/types/RunCursorCommandOptions.html b/docs/Next/types/RunCursorCommandOptions.html index 41a0e3cc64e..f0788fba019 100644 --- a/docs/Next/types/RunCursorCommandOptions.html +++ b/docs/Next/types/RunCursorCommandOptions.html @@ -6,10 +6,10 @@ For non-tailable cursors, this value defaults to 'cursorLifetime' For tailable cursors, this value defaults to 'iteration' since tailable cursors, by definition can have an arbitrarily long lifetime.

    -
    const cursor = collection.find({}, {timeoutMS: 100, timeoutMode: 'iteration'});
    for await (const doc of cursor) {
    // process doc
    // This will throw a timeout error if any of the iterator's `next()` calls takes more than 100ms, but
    // will continue to iterate successfully otherwise, regardless of the number of batches.
    } +
    const cursor = collection.find({}, {timeoutMS: 100, timeoutMode: 'iteration'});
    for await (const doc of cursor) {
    // process doc
    // This will throw a timeout error if any of the iterator's `next()` calls takes more than 100ms, but
    // will continue to iterate successfully otherwise, regardless of the number of batches.
    }
    -
    const cursor = collection.find({}, { timeoutMS: 1000, timeoutMode: 'cursorLifetime' });
    const docs = await cursor.toArray(); // This entire line will throw a timeout error if all batches are not fetched and returned within 1000ms. +
    const cursor = collection.find({}, { timeoutMS: 1000, timeoutMode: 'cursorLifetime' });
    const docs = await cursor.toArray(); // This entire line will throw a timeout error if all batches are not fetched and returned within 1000ms.
  • Optional ExperimentaltimeoutMS?: number

    Specifies the time an operation will run until it throws a timeout error. Note that if diff --git a/docs/Next/types/ServerEvents.html b/docs/Next/types/ServerEvents.html index 7becdd55c9b..352d4a49f91 100644 --- a/docs/Next/types/ServerEvents.html +++ b/docs/Next/types/ServerEvents.html @@ -1 +1 @@ -ServerEvents | mongodb

    Type Alias ServerEvents

    ServerEvents: {
        closed(): void;
        descriptionReceived(description: ServerDescription): void;
        ended(): void;
        serverHeartbeatFailed(event: ServerHeartbeatFailedEvent): void;
        serverHeartbeatStarted(event: ServerHeartbeatStartedEvent): void;
        serverHeartbeatSucceeded(event: ServerHeartbeatSucceededEvent): void;
    } & ConnectionPoolEvents & EventEmitterWithState
    +ServerEvents | mongodb

    Type Alias ServerEvents

    ServerEvents: {
        closed(): void;
        descriptionReceived(description: ServerDescription): void;
        ended(): void;
        serverHeartbeatFailed(event: ServerHeartbeatFailedEvent): void;
        serverHeartbeatStarted(event: ServerHeartbeatStartedEvent): void;
        serverHeartbeatSucceeded(event: ServerHeartbeatSucceededEvent): void;
    } & ConnectionPoolEvents & EventEmitterWithState
    diff --git a/docs/Next/variables/AutoEncryptionLoggerLevel-1.html b/docs/Next/variables/AutoEncryptionLoggerLevel-1.html index 84b7f6995ff..28ccead4906 100644 --- a/docs/Next/variables/AutoEncryptionLoggerLevel-1.html +++ b/docs/Next/variables/AutoEncryptionLoggerLevel-1.html @@ -1 +1 @@ -AutoEncryptionLoggerLevel | mongodb

    Variable AutoEncryptionLoggerLevelConst

    AutoEncryptionLoggerLevel: Readonly<{
        Error: 1;
        FatalError: 0;
        Info: 3;
        Trace: 4;
        Warning: 2;
    }> = ...
    +AutoEncryptionLoggerLevel | mongodb

    Variable AutoEncryptionLoggerLevelConst

    AutoEncryptionLoggerLevel: Readonly<{
        Error: 1;
        FatalError: 0;
        Info: 3;
        Trace: 4;
        Warning: 2;
    }> = ...
    diff --git a/docs/Next/variables/CursorTimeoutMode-1.html b/docs/Next/variables/CursorTimeoutMode-1.html index 139ba963b3e..9b3fc5fa41e 100644 --- a/docs/Next/variables/CursorTimeoutMode-1.html +++ b/docs/Next/variables/CursorTimeoutMode-1.html @@ -6,10 +6,10 @@ For non-tailable cursors, this value defaults to 'cursorLifetime' For tailable cursors, this value defaults to 'iteration' since tailable cursors, by definition can have an arbitrarily long lifetime.

    -
    const cursor = collection.find({}, {timeoutMS: 100, timeoutMode: 'iteration'});
    for await (const doc of cursor) {
    // process doc
    // This will throw a timeout error if any of the iterator's `next()` calls takes more than 100ms, but
    // will continue to iterate successfully otherwise, regardless of the number of batches.
    } +
    const cursor = collection.find({}, {timeoutMS: 100, timeoutMode: 'iteration'});
    for await (const doc of cursor) {
    // process doc
    // This will throw a timeout error if any of the iterator's `next()` calls takes more than 100ms, but
    // will continue to iterate successfully otherwise, regardless of the number of batches.
    }
    -
    const cursor = collection.find({}, { timeoutMS: 1000, timeoutMode: 'cursorLifetime' });
    const docs = await cursor.toArray(); // This entire line will throw a timeout error if all batches are not fetched and returned within 1000ms. +
    const cursor = collection.find({}, { timeoutMS: 1000, timeoutMode: 'cursorLifetime' });
    const docs = await cursor.toArray(); // This entire line will throw a timeout error if all batches are not fetched and returned within 1000ms.
    diff --git a/docs/categories/index.xml b/docs/categories/index.xml index e8d6887ccb7..3f54c6ee7c1 100644 --- a/docs/categories/index.xml +++ b/docs/categories/index.xml @@ -4,7 +4,7 @@ Categories on MongoDB Node.js Driver /node-mongodb-native/categories/ Recent content in Categories on MongoDB Node.js Driver - Hugo + Hugo -- gohugo.io en-us diff --git a/docs/index.html b/docs/index.html index a6a778e7bac..9d50d269b26 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,7 +1,7 @@ - + diff --git a/docs/index.xml b/docs/index.xml index a7874ae5b97..12ceb7dcf4a 100644 --- a/docs/index.xml +++ b/docs/index.xml @@ -4,7 +4,7 @@ MongoDB Node.js Driver /node-mongodb-native/ Recent content on MongoDB Node.js Driver - Hugo + Hugo -- gohugo.io en-us diff --git a/docs/tags/index.xml b/docs/tags/index.xml index 666ebe0f57c..cfa1bc99ebb 100644 --- a/docs/tags/index.xml +++ b/docs/tags/index.xml @@ -4,7 +4,7 @@ Tags on MongoDB Node.js Driver /node-mongodb-native/tags/ Recent content in Tags on MongoDB Node.js Driver - Hugo + Hugo -- gohugo.io en-us