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
- Rename the broadcast event to a non-reserved name (e.g. 'announcement:connected').
- If signaling room membership changes, use socket.join/leave events or a custom event rather than 'connect'/'disconnect'.
- 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
- Never io.emit() a reserved lifecycle event name.
- Choose custom event names for announcements.
- Validate dynamic names against RESERVED_EVENTS before broadcasting.
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
- "${String(ev)}" is a reserved event name
- "${String(ev)}" is a reserved event name
- "${String(ev)}" is a reserved event name
- "${ev.toString()}" is a reserved event name
- No adapter for this namespace, are you trying to get the lis
AI-assisted analysis of socketio/socket.io@ae7fb46e08 (2026-08-03).
Data as JSON: /data/errors/4983ed1a1d0959a1.json.
Report an issue: GitHub.