socketio/socket.io · error · Error

"${String(ev)}" is a reserved event name

Error message

"${String(ev)}" is a reserved event name

What it means

Thrown by the server's BroadcastOperator.emit() (the return of io.to()/io.except()/io.of() etc.) when the event name is in RESERVED_EVENTS (connect, connect_error, disconnect, disconnecting, newListener, removeListener, as defined in socket-types.ts:39). These are reserved because they are lifecycle/EventEmitter events the server library emits internally.

Source

Thrown at packages/socket.io/lib/broadcast-operator.ts:214

   * io.to("room-101").emit("foo", "bar");
   *
   * // with an acknowledgement expected from all connected clients
   * io.timeout(1000).emit("some-event", (err, responses) => {
   *   if (err) {
   *     // some clients did not acknowledge the event in the given delay
   *   } else {
   *     console.log(responses); // one response per client
   *   }
   * });
   *
   * @return Always true
   */
  public emit<Ev extends EventNames<EmitEvents>>(
    ev: Ev,
    ...args: EventParams<EmitEvents, Ev>
  ): boolean {
    if (RESERVED_EVENTS.has(ev)) {
      throw new Error(`"${String(ev)}" is a reserved event name`);
    }
    // set up packet object
    const data = [ev, ...args];
    const packet = {
      type: PacketType.EVENT,
      data: data,
    };

    const withAck = typeof data[data.length - 1] === "function";

    if (!withAck) {
      this.adapter.broadcast(packet, {
        rooms: this.rooms,
        except: this.exceptRooms,
        flags: this.flags,
      });

      return true;

View on GitHub (pinned to ae7fb46e08)

Solutions

  1. Rename the broadcast event to a non-reserved name (e.g. 'announcement:connected').
  2. If signaling room membership changes, use socket.join/leave events or a custom event rather than 'connect'/'disconnect'.
  3. Validate dynamic event names against RESERVED_EVENTS before broadcasting.

Example fix

// before
io.emit('disconnect', reason);

// after
io.emit('user:left', reason);
Defensive patterns

Strategy: validation

Validate before calling

import { RESERVED_EVENTS } from 'socket.io';
function assertNotReserved(ev){ if(RESERVED_EVENTS.has(ev)) throw new Error(ev+' is reserved'); }

Type guard

function isEmittable(ev){ return !['connect','connect_error','disconnect','disconnecting','newListener','removeListener'].includes(ev); }

Prevention

When it happens

Trigger: Calling io.emit('connect'), io.to(room).emit('disconnect'), io.except(room).emit('newListener'), or any broadcast emit with a reserved event name.

Common situations: Broadcasting a 'disconnect'/'connect' notification to all clients; reusing a client-side event name that happens to be reserved server-side; or a new reserved event introduced in a major version.

Related errors


AI-assisted analysis of socketio/socket.io@ae7fb46e08 (2026-08-03). Data as JSON: /data/errors/4983ed1a1d0959a1.json. Report an issue: GitHub.