{"id":"981159f63de0d6b9","repo":"socketio/socket.io","slug":"string-ev-is-a-reserved-event-name-981159","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/namespace.ts","lineNumber":544,"sourceCode":"   *   }\n   * });\n   *\n   * myNamespace.on(\"ping\", (cb) => {\n   *   cb(\"pong\");\n   * });\n   *\n   * @param ev - the event name\n   * @param args - an array of arguments, which may include an acknowledgement callback at the end\n   */\n  public serverSideEmit<Ev extends EventNames<ServerSideEvents>>(\n    ev: Ev,\n    ...args: EventParams<\n      DecorateAcknowledgementsWithTimeoutAndMultipleResponses<ServerSideEvents>,\n      Ev\n    >\n  ): boolean {\n    if (RESERVED_EVENTS.has(ev)) {\n      throw new Error(`\"${String(ev)}\" is a reserved event name`);\n    }\n    args.unshift(ev);\n    this.adapter.serverSideEmit(args);\n    return true;\n  }\n\n  /**\n   * Sends a message and expect an acknowledgement from the other Socket.IO servers of the cluster.\n   *\n   * @example\n   * const myNamespace = io.of(\"/my-namespace\");\n   *\n   * try {\n   *   const responses = await myNamespace.serverSideEmitWithAck(\"ping\");\n   *   console.log(responses); // one response per server (except the current one)\n   * } catch (e) {\n   *   // some servers did not acknowledge the event in the given delay\n   * }","sourceCodeStart":526,"sourceCodeEnd":562,"githubUrl":"https://github.com/socketio/socket.io/blob/ae7fb46e08c5ed964b4a1ea8b1703e816511598e/packages/socket.io/lib/namespace.ts#L526-L562","documentation":"Thrown by Namespace.serverSideEmit() when the event name is in the namespace's RESERVED_EVENTS set (connect, connection, new_namespace, defined at namespace.ts:64). serverSideEmit forwards events to other Socket.IO servers in the cluster; the reserved names are used for namespace lifecycle and would collide with internal multi-server coordination if user-emit.","triggerScenarios":"Calling io.of('/ns').serverSideEmit('connect'), serverSideEmit('connection'), or serverSideEmit('new_namespace').","commonSituations":"Using serverSideEmit to broadcast a 'connection' notification to peer servers; reusing namespace lifecycle event names for custom cluster messages; or confusion with socket.emit reserved events (different set).","solutions":["Rename the server-to-server event to a non-reserved name (e.g. 'peer:connected').","Remember the namespace reserved set is {connect, connection, new_namespace} (note 'connection' — distinct from the socket-level reserved list).","Validate dynamic event names against this set before calling serverSideEmit."],"exampleFix":"// before\nio.of('/admin').serverSideEmit('connection', info);\n\n// after\nio.of('/admin').serverSideEmit('peer:joined', info);","handlingStrategy":"validation","validationCode":"const NS_RESERVED = new Set(['connect','connection','new_namespace']);\nfunction assertNotReserved(ev){ if(NS_RESERVED.has(ev)) throw new Error(ev+' is reserved'); }","typeGuard":"function isServerSideEmittable(ev){ return !['connect','connection','new_namespace'].includes(ev); }","tryCatchPattern":null,"preventionTips":["Remember namespace serverSideEmit reserves {connect, connection, new_namespace} (note 'connection').","Use a custom event name for cross-server messages.","Guard dynamic event names before serverSideEmit()."],"tags":["server","namespace","reserved-events","cluster","server-side-emit"],"analyzedSha":"ae7fb46e08c5ed964b4a1ea8b1703e816511598e","analyzedAt":"2026-08-03T19:08:14.127Z","schemaVersion":2}