Hierarchy

  • EventEmitter
    • MultiUserServer

Constructors

Properties

enableAudio: boolean = true
enableUpdateTimeout: boolean = false

Enable timing out server update iterations if they take too long to compute, defaults to false. If set to true, update iterations will silently timeout and not being processed.

Needs to be set in the constructor, later changes will not affect the update timeout behaviour.

nextNetworkId: number = 0

Next networkId, equivalent to .length of properties

nextUserId: number = 0

Next userId, equivalent to .length of users

serverCommandsQueue: {
    [key: string]: ServerCommandWithTimeout;
} = {}

Type declaration

  • [key: string]: ServerCommandWithTimeout
serverName: string = 'DefaultImplementation'
transforms: Float32Array = ...

Contains object transforms of all networked objects

unusedNetworkIds: number[] = []

Unused networkIds less than nextNetworkId

unusedUserIds: number[] = []

Unused userIds less than nextUserId

updateInterval: undefined | Timer
updatesPerSecond: number = 30

Number of server updates required per second

Default 30.

Needs to be set in the constructor, later changes will not affect the update rate

users: Map<number, User> = ...

Contains the object ids and any other data belonging to each user

writePermissions: Uint32Array = ...

Contains write permission flags

captureRejectionSymbol: typeof captureRejectionSymbol

Value: Symbol.for('nodejs.rejection')

See how to write a custom rejection handler.

Since

v13.4.0, v12.16.0

captureRejections: boolean

Value: boolean

Change the default captureRejections option on all new EventEmitter objects.

Since

v13.4.0, v12.16.0

defaultMaxListeners: number

By default, a maximum of 10 listeners can be registered for any single event. This limit can be changed for individual EventEmitter instances using the emitter.setMaxListeners(n) method. To change the default for allEventEmitter instances, the events.defaultMaxListenersproperty can be used. If this value is not a positive number, a RangeErroris thrown.

Take caution when setting the events.defaultMaxListeners because the change affects allEventEmitter instances, including those created before the change is made. However, calling emitter.setMaxListeners(n) still has precedence over events.defaultMaxListeners.

This is not a hard limit. The EventEmitter instance will allow more listeners to be added but will output a trace warning to stderr indicating that a "possible EventEmitter memory leak" has been detected. For any singleEventEmitter, 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));
});

The --trace-warnings command-line flag can be used to display the stack trace for such warnings.

The emitted warning can be inspected with process.on('warning') and will have the additional emitter, type, and count properties, referring to the event emitter instance, the event's name and the number of attached listeners, respectively. Its name property is set to 'MaxListenersExceededWarning'.

Since

v0.11.2

errorMonitor: typeof errorMonitor

This symbol shall be used to install a listener for only monitoring 'error'events. Listeners installed using this symbol are called before the regular'error' listeners are called.

Installing a listener using this symbol does not change the behavior once an'error' event is emitted. Therefore, the process will still crash if no regular 'error' listener is installed.

Since

v13.6.0, v12.17.0

Methods

  • Private

    Private method to add a user to the internal user storage. You shouldn't touch this one.

    Parameters

    • id: number

      {number} user counter

    • peer: PeerBase

      {PeerBase} peer object

    • transforms: Float32Array

      {Float32Array} user transforms

    Returns User

  • Parameters

    • serverCommand: {
          data: {
              [key: string]: any;
          };
          name: ServerCommandName;
      }

    Returns Promise<void>

  • Internal function to set a single object's transform.

    Warning: This function does not check write permissions.

    Parameters

    • o: number

      Object index

    • transform: Float32Array

      A src array for the transform

    • srcOffset: number

      Where to start reading in transform

    Returns void

  • Internal function to check if the child class is a MultiUserServer. This function will exist on the Child Classes => we know the server is a valid child of the MultiUserServer class

    Returns boolean

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

    Parameters

    • eventName: string | symbol
    • listener: ((...args) => void)
        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns MultiUserServer

    Since

    v0.1.26

  • Add networked objects to internal objects storage and set the write permission for these objects accordingly.

    Parameters

    • transforms: Float32Array

      Initial transform of the object

    • writePermission: number

      Mask of which users are allowed to write the transforms of the objects

    Returns number[]

    The networkIds for the new objects

  • Add a user with initial transforms of his owned objects

    Parameters

    • transforms: Float32Array

      Initial transforms for user owned objects

    • peer: PeerBase

      Peer connection of this user

    Returns User

    user internal user representation class

  • Call this function if you want to disconnect a player from your server. This will close the underlying websocket and WebRTC connection and then trigger the onUserLeave callback, so you don't need to handle this case different from your normal user leave flow.

    Parameters

    • playerId: string

      {string} peer id of the client to disconnect

    Returns Promise<void>

  • Synchronously calls each of the listeners registered for the event namedeventName, 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

    Parameters

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

    Returns boolean

    Since

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

    Returns (string | symbol)[]

    Since

    v6.0.0

  • Returns the current max listener value for the EventEmitter which is either set by emitter.setMaxListeners(n) or defaults to defaultMaxListeners.

    Returns number

    Since

    v1.0.0

  • Get an array with all users except the one with the id provided in the parameter. Useful, if you want to

    Parameters

    • userId: number

      {number}

    Returns User[]

  • Returns the number of listeners listening for the event named eventName. If listener is provided, it will return how many times the listener is found in the list of the listeners of the event.

    Parameters

    • eventName: string | symbol

      The name of the event being listened for

    • Optional listener: Function

      The event handler function

    Returns number

    Since

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

    Parameters

    • eventName: string | symbol

    Returns Function[]

    Since

    v0.1.26

  • Call this function if you want to mute/unmute a player for all other players on your server.

    Parameters

    • playerId: string

      {string} peer id of the client to disconnect

    • mute: boolean

      {boolean} toggle mute on/off

    Returns Promise<void>

  • Alias for emitter.removeListener().

    Parameters

    • eventName: string | symbol
    • listener: ((...args) => void)
        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns MultiUserServer

    Since

    v10.0.0

  • Adds the listener function to the end of the listeners array for the event named eventName. No checks are made to see if the listener has already been added. Multiple calls passing the same combination of eventNameand listener will result in the listener being added, and called, multiple times.

    server.on('connection', (stream) => {
    console.log('someone connected!');
    });

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

    By default, event listeners are invoked in the order they are added. Theemitter.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

    Parameters

    • eventName: string | symbol

      The name of the event.

    • listener: ((...args) => void)

      The callback function

        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns MultiUserServer

    Since

    v0.1.101

  • Function which will be called whenever a player starts or stops speaking You are free to add your own logic, for example sending an event to the clients and display a speaking identifier there.

    Parameters

    • peer: PeerBase

      {PeerBase}

    • isSpeaking: boolean

      {boolean}

    Returns void

  • Called when data is received from one user via the RTCDataChannel. This function is usually not touched, as the logic remains the same for every server. If the timestamp from the message is higher that the user's lastMessageTimestamp, we set the internal transforms with the user mask, which are the first 4 bytes of the provided ArrayBuffer, reserved for the U32 timestamp, then it's always 4 bytes * number of objects, which hold the object id and 8 * 4 * count bytes for the object's transforms represented by dual quaternion, where the first 4 are the rotation and the second 4 are the translation.

    For example, with a ArrayBuffer holding 2 objects, We will call S = TimeStampBytes, I1 = objectId 1 bytes, I2 = objectId 2 bytes, T1 = translation of object 1 and T2 = translations of object 2, the array buffer content would look like this: [SSSS.I1I1I1I1.I2I2I2I2.T1T1T1T1.T1T1T1T1.T1T1T1T1.T1T1T1T1.T1T1T1T1. T1T1T1T1.T1T1T1T1.T1T1T1T1.T2T2T2T2.T2T2T2T2.T2T2T2T2.T2T2T2T2.T2T2T2T2 T2T2T2T2.T2T2T2T2.T2T2T2T2]

    Parameters

    • user: User

      {User}

    • data: ArrayBuffer

      {ArrayBuffer}

    Returns void

  • Called when a user wants to join. This function should handle the creation of transforms and forwarding them to the instance's addUser event. Below is an example code:

    onUserJoin(e:JoinEvent){
    let objectCount = 1;
    // we have 2 objects, one for the head, and the other one for the body
    if (e.data.body) {
    objectCount +=1;
    }
    e.transforms = new Float32Array(8 * objectCount);
    for (let i = 0; i < objectCount; ++i) {
    e.transforms[i * 8 + 3] = 1;
    }

    const user = super.onUserJoin(e);
    console.log('Joined:', e.peer.id);
    // let all other users know that a player joined
    const otherUsers = Array.from(this.users.values()).filter(
    (u) => u.id != user.id
    );

    this.sendEvent(
    'user-joined',
    { networkIds: user.objects, id: user.id },
    otherUsers
    );
    // set id of the user to the internal used id,
    this.sendEvent('set-id', { id: user.id }, [user]);

    // now send a user joined event for each already connected user we want to
    // track
    for (const u of this.users.values()) {
    if (u.id == user.id) continue;
    this.sendEvent('user-joined', { networkIds: u.objects, id: u.id }, [
    user,
    ]);
    }

    return user;
    }

    On the client side, the event handler for the user-joined event would look like this

    onEvent(e) {
    switch (e.type) {
    case 'user-joined':
    console.log('Spawning', e);

    // here we add 2 new objects to the scene with our
    // previously defined player mesh and player body meshes and materials
    const head = this.engine.scene.addObject();
    head.addComponent('mesh', {
    mesh: this.playerMesh,
    material: this.playerMaterial,
    });
    head.addComponent('networked', {
    networkId: e.data.networkIds[0],
    mode: 'receive',
    });

    const body = this.engine.scene.addObject();
    body.addComponent('mesh', {
    mesh: this.playerBodyMesh,
    material: this.playerBodyMaterial,
    });
    body.addComponent('networked', {
    networkId: e.data.networkIds[0],
    mode: 'receive',
    });

    const userObjects = {
    head: {
    object: head,
    id: e.data.networkIds[0],
    },
    body: {
    object: body,
    id: e.data.networkIds[1]
    }
    };
    // to be able to delete the objects later
    // we need to keep a reference to them
    this.remoteUsers.set(e.data.id, userObjects);
    break;
    case 'user-left':
    console.log('Player left:', e);
    const remoteUser = this.remoteUsers.get(e.data.id);
    Object.values(remoteUser).forEach(({object, id}) => {
    networkManager.removeObject(id);
    object.destroy();
    });
    break;
    default:
    console.log('Unknown event:', e);
    }
    }

    Parameters

    • e: JoinEvent

      Information about the user that is joining

    Returns User

    A new user or null if user is not allowed to join

  • Called when a user left. Here you should clean up any resource. Usually you should also notify the remaining players that the user has left. For general clean up, you can use this class's onUserLeave function via supre, which calls {@link MultiUserServer.removeUser} function and deletes the user and his tracked objects from the internal storage. FOr example:

    onUserLeave(e: LeaveEvent){
    const id = e.user.id;
    const networkIds = e.user.objects;
    super.onUserLeave(e);
    this.sendEvent(
    'user-left',
    { networkIds, id },
    Array.from(this.users.values())
    );
    }

    On the client side you would need to implement an event listener for the user-leave event and remove all the object which belong to the user from the network manager and also from the scene

    Parameters

    • e: LeaveEvent

      Information about the user that left

    Returns void

  • Called when a custom event was sent from the client via websockets to the server. Here the custom game logic and event handling should be implemented by the custom server. For example in this case, if the client sends a custom WebSocketEvent with the type send-message and the data: {message: 'example message}, this message will be broadcasted to the clients


    onWsMessageEvent(e: WebSocketEvent, peer: PeerBase) {
    switch (e.type) {
    case 'send-message':
    this.sendEvent(
    'receive-message',
    { userId: peer.user?.id, message: e.data.message },
    // send event to all users except myself
    this.getOtherUsers(peer.user?.id as number)
    );
    break;
    }
    }

    @param {WebSocketEvent} e The event @param {PeerBase} peer The peer from whom the event was sent

    Parameters

    Returns void

  • Adds a one-timelistener function for the event named eventName. The next time eventName is triggered, this listener is removed and then invoked.

    server.once('connection', (stream) => {
    console.log('Ah, we have our first user!');
    });

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

    By default, event listeners are invoked in the order they are added. Theemitter.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

    Parameters

    • eventName: string | symbol

      The name of the event.

    • listener: ((...args) => void)

      The callback function

        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns MultiUserServer

    Since

    v0.3.0

  • Adds the listener function to the beginning of the listeners array for the event named eventName. No checks are made to see if the listener has already been added. Multiple calls passing the same combination of eventNameand listener will result in the listener being added, and called, multiple times.

    server.prependListener('connection', (stream) => {
    console.log('someone connected!');
    });

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

    Parameters

    • eventName: string | symbol

      The name of the event.

    • listener: ((...args) => void)

      The callback function

        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns MultiUserServer

    Since

    v6.0.0

  • Adds a one-timelistener function for the event named eventName to the beginning of the listeners array. The next time eventName is triggered, this listener is removed, and then invoked.

    server.prependOnceListener('connection', (stream) => {
    console.log('Ah, we have our first user!');
    });

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

    Parameters

    • eventName: string | symbol

      The name of the event.

    • listener: ((...args) => void)

      The callback function

        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns MultiUserServer

    Since

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

    Parameters

    • eventName: string | symbol

    Returns Function[]

    Since

    v9.4.0

  • Removes all listeners, or those of the specified eventName.

    It is bad practice to remove listeners added elsewhere in the code, particularly when the EventEmitter instance was created by some other component or module (e.g. sockets or file streams).

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

    Parameters

    • Optional event: string | symbol

    Returns MultiUserServer

    Since

    v0.1.26

  • Removes the specified listener from the listener array for the event namedeventName.

    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback);

    removeListener() will remove, at most, one instance of a listener from the listener array. If any single listener has been added multiple times to the listener array for the specified eventName, then removeListener() must be called multiple times to remove each instance.

    Once an event is emitted, all listeners attached to it at the time of emitting are called in order. This implies that anyremoveListener() 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

    Because listeners are managed using an internal array, calling this will change the position indices of any listener registered after the listener being removed. This will not impact the order in which listeners are called, but it means that any copies of the listener array as returned by the emitter.listeners() method will need to be recreated.

    When a single function has been added as a handler multiple times for a single event (as in the example below), removeListener() will remove the most recently added instance. In the example the once('ping')listener is removed:

    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

    • eventName: string | symbol
    • listener: ((...args) => void)
        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns MultiUserServer

    Since

    v0.1.26

  • Remove a user and all his objects from the internal storage. If we have zero users connected, stop update interval to save server resources.

    Parameters

    • user: User

      {User} user object we want to remove

    Returns void

  • Send a custom event

    Parameters

    • type: string

      Name of the event

    • data: {
          [key: string]: any;
      }

      Custom data to send with the event

      • [key: string]: any
    • users: User[] = ...

      Which users to send the event to. Leave empty to send to all users.

    Returns void

  • By default EventEmitters will print a warning if more than 10 listeners are added for a particular event. This is a useful default that helps finding memory leaks. The emitter.setMaxListeners() method allows the limit to be modified for this specific EventEmitter instance. The value can be set toInfinity (or 0) to indicate an unlimited number of listeners.

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

    Parameters

    • n: number

    Returns MultiUserServer

    Since

    v0.3.5

  • Handle a request by user to set objectIds transforms to transforms.

    Parameters

    • userMask: number

      Permission mask of the user setting the transforms, Server for full authority.

    • objectIds: number[]

      NetworkIds of the objects to set

    • transforms: Float32Array

      Transformations to set

    Returns void

  • Called at update rate to update the server world sends queued events via Websockets to each user and also sends the current transforms to each user via RTCDataChannel. Also, we set the audio position for each user, if audio is enabled and an audio buffer exists on the user object.

    Usually you should not modify this function, but rather call it in your deriving class via super:

    update(){
    super.update();
    // you can add your custom logic which needs to run every server update
    // here
    }

    Returns void

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

    For EventEmitters this behaves exactly the same as calling .listeners on 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] ]
    }

    Parameters

    • emitter: EventEmitter | _DOMEventTarget
    • name: string | symbol

    Returns Function[]

    Since

    v15.2.0, v14.17.0

  • A class method that returns the number of listeners for the given eventNameregistered 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

    Parameters

    • emitter: EventEmitter

      The emitter to query

    • eventName: string | symbol

      The event name

    Returns number

    Since

    v0.9.12

    Deprecated

    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

    Returns an AsyncIterator that iterates eventName events. It will throw if the EventEmitter emits 'error'. It removes all listeners when exiting the loop. The value returned by each iteration is an array composed of the emitted event arguments.

    An AbortSignal can be used to cancel waiting on events:

    import { on, EventEmitter } from 'node:events';
    import process from 'node:process';

    const ac = new AbortController();

    (async () => {
    const ee = new EventEmitter();

    // Emit later on
    process.nextTick(() => {
    ee.emit('foo', 'bar');
    ee.emit('foo', 42);
    });

    for await (const event of on(ee, 'foo', { signal: ac.signal })) {
    // The execution of this inner block is synchronous and it
    // processes one event at a time (even with await). Do not use
    // if concurrent execution is required.
    console.log(event); // prints ['bar'] [42]
    }
    // Unreachable here
    })();

    process.nextTick(() => ac.abort());

    Parameters

    • emitter: EventEmitter
    • eventName: string

      The name of the event being listened for

    • Optional options: StaticEventEmitterOptions

    Returns AsyncIterableIterator<any>

    that iterates eventName events emitted by the emitter

    Since

    v13.6.0, v12.16.0

  • Creates a Promise that is fulfilled when the EventEmitter emits the given event or that is rejected if the EventEmitter emits 'error' while waiting. The Promise will resolve with an array of all the arguments emitted to the given event.

    This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error' event semantics and does not listen to the 'error' event.

    import { once, EventEmitter } from 'node:events';
    import process from 'node:process';

    const ee = new EventEmitter();

    process.nextTick(() => {
    ee.emit('myevent', 42);
    });

    const [value] = await once(ee, 'myevent');
    console.log(value);

    const err = new Error('kaboom');
    process.nextTick(() => {
    ee.emit('error', err);
    });

    try {
    await once(ee, 'myevent');
    } catch (err) {
    console.error('error happened', err);
    }

    The special handling of the 'error' event is only used when events.once()is used to wait for another event. If events.once() is used to wait for the 'error' event itself, then it is treated as any other kind of event without special handling:

    import { EventEmitter, once } from 'node:events';

    const ee = new EventEmitter();

    once(ee, 'error')
    .then(([err]) => console.log('ok', err.message))
    .catch((err) => console.error('error', err.message));

    ee.emit('error', new Error('boom'));

    // Prints: ok boom

    An AbortSignal can be used to cancel waiting for the event:

    import { EventEmitter, once } from 'node:events';

    const ee = new EventEmitter();
    const ac = new AbortController();

    async function foo(emitter, event, signal) {
    try {
    await once(emitter, event, { signal });
    console.log('event emitted!');
    } catch (error) {
    if (error.name === 'AbortError') {
    console.error('Waiting for the event was canceled!');
    } else {
    console.error('There was an error', error.message);
    }
    }
    }

    foo(ee, 'foo', ac.signal);
    ac.abort(); // Abort waiting for the event
    ee.emit('foo'); // Prints: Waiting for the event was canceled!

    Parameters

    • emitter: _NodeEventTarget
    • eventName: string | symbol
    • Optional options: StaticEventEmitterOptions

    Returns Promise<any[]>

    Since

    v11.13.0, v10.16.0

  • Parameters

    • emitter: _DOMEventTarget
    • eventName: string
    • Optional options: StaticEventEmitterOptions

    Returns Promise<any[]>

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

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

    setMaxListeners(5, target, emitter);

    Parameters

    • Optional n: number

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

    • Rest ...eventTargets: (EventEmitter | _DOMEventTarget)[]

    Returns void

    Since

    v15.4.0

Generated using TypeDoc