{"id":"4983ed1a1d0959a1","repo":"socketio/socket.io","slug":"string-ev-is-a-reserved-event-name-4983ed","errorCode":null,"errorMessage":"\"${String(ev)}\" is a reserved event name","messagePattern":"\"(.+?)\" is a reserved event name","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/socket.io/lib/broadcast-operator.ts","lineNumber":214,"sourceCode":"   * io.to(\"room-101\").emit(\"foo\", \"bar\");\n   *\n   * // with an acknowledgement expected from all connected clients\n   * io.timeout(1000).emit(\"some-event\", (err, responses) => {\n   *   if (err) {\n   *     // some clients did not acknowledge the event in the given delay\n   *   } else {\n   *     console.log(responses); // one response per client\n   *   }\n   * });\n   *\n   * @return Always true\n   */\n  public emit<Ev extends EventNames<EmitEvents>>(\n    ev: Ev,\n    ...args: EventParams<EmitEvents, Ev>\n  ): boolean {\n    if (RESERVED_EVENTS.has(ev)) {\n      throw new Error(`\"${String(ev)}\" is a reserved event name`);\n    }\n    // set up packet object\n    const data = [ev, ...args];\n    const packet = {\n      type: PacketType.EVENT,\n      data: data,\n    };\n\n    const withAck = typeof data[data.length - 1] === \"function\";\n\n    if (!withAck) {\n      this.adapter.broadcast(packet, {\n        rooms: this.rooms,\n        except: this.exceptRooms,\n        flags: this.flags,\n      });\n\n      return true;","sourceCodeStart":196,"sourceCodeEnd":232,"githubUrl":"https://github.com/socketio/socket.io/blob/ae7fb46e08c5ed964b4a1ea8b1703e816511598e/packages/socket.io/lib/broadcast-operator.ts#L196-L232","documentation":"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.","triggerScenarios":"Calling io.emit('connect'), io.to(room).emit('disconnect'), io.except(room).emit('newListener'), or any broadcast emit with a reserved event name.","commonSituations":"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.","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."],"exampleFix":"// before\nio.emit('disconnect', reason);\n\n// after\nio.emit('user:left', reason);","handlingStrategy":"validation","validationCode":"import { RESERVED_EVENTS } from 'socket.io';\nfunction assertNotReserved(ev){ if(RESERVED_EVENTS.has(ev)) throw new Error(ev+' is reserved'); }","typeGuard":"function isEmittable(ev){ return !['connect','connect_error','disconnect','disconnecting','newListener','removeListener'].includes(ev); }","tryCatchPattern":null,"preventionTips":["Never io.emit() a reserved lifecycle event name.","Choose custom event names for announcements.","Validate dynamic names against RESERVED_EVENTS before broadcasting."],"tags":["server","broadcast","reserved-events"],"analyzedSha":"ae7fb46e08c5ed964b4a1ea8b1703e816511598e","analyzedAt":"2026-08-03T19:08:14.127Z","schemaVersion":2}