{"id":"ebb3025089142e8f","repo":"socketio/socket.io","slug":"acknowledgements-are-not-supported-ebb302","errorCode":null,"errorMessage":"Acknowledgements are not supported","messagePattern":"Acknowledgements are not supported","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/socket.io-redis-streams-emitter/lib/index.ts","lineNumber":388,"sourceCode":"        close,\n      },\n    });\n  }\n\n  /**\n   * Send a packet to the Socket.IO servers in the cluster\n   *\n   * @param ev - the event name\n   * @param args - any number of serializable arguments\n   */\n  public serverSideEmit<Ev extends EventNames<ServerSideEvents>>(\n    ev: Ev,\n    ...args: EventParams<ServerSideEvents, Ev>\n  ): void {\n    const withAck = args.length && typeof args[args.length - 1] === \"function\";\n\n    if (withAck) {\n      throw new Error(\"Acknowledgements are not supported\");\n    }\n\n    this.publish({\n      type: MessageType.SERVER_SIDE_EMIT,\n      data: {\n        packet: [ev, ...args],\n      },\n    });\n  }\n}\n\nfunction flattenPayload(message: ClusterMessage) {\n  const rawMessage = {\n    uid: message.uid,\n    nsp: message.nsp,\n    type: message.type.toString(),\n    data: undefined as string | undefined,\n  };","sourceCodeStart":370,"sourceCodeEnd":406,"githubUrl":"https://github.com/socketio/socket.io/blob/ae7fb46e08c5ed964b4a1ea8b1703e816511598e/packages/socket.io-redis-streams-emitter/lib/index.ts#L370-L406","documentation":"Thrown by the redis-streams-emitter's serverSideEmit() when the last argument is a function (acknowledgement callback). The standalone redis-streams emitter publishes fire-and-forget messages to a Redis stream with no reply channel, so it cannot collect or return acknowledgements from other servers.","triggerScenarios":"Calling emitter.serverSideEmit('event', arg, (response) => {...}) on the redis-streams emitter — passing a function as the final argument.","commonSituations":"Confusing the standalone emitter's serverSideEmit (no ack) with the main Socket.IO server's serverSideEmit (supports ack via the cluster adapter); copy-pasting an ack-style call.","solutions":["Drop the acknowledgement callback; use serverSideEmit for fire-and-forget only.","If acks are required, attach the RedisStreams adapter to the main Socket.IO server and use io.serverSideEmit()/serverSideEmitWithAck() instead of the standalone emitter."],"exampleFix":"// before\nemitter.serverSideEmit('sync', (ack) => { /* never resolves */ });\n\n// after\nemitter.serverSideEmit('sync');","handlingStrategy":"validation","validationCode":"function noAck(args){ return !(args.length && typeof args[args.length-1]==='function'); }","typeGuard":"function isAckFree(args){ return args.length===0 || typeof args[args.length-1]!=='function'; }","tryCatchPattern":null,"preventionTips":["Never pass a callback to the redis-streams emitter's serverSideEmit.","Use io.serverSideEmitWithAck with the RedisStreams adapter attached for ack-based flows.","Treat standalone emitters as fire-and-forget."],"tags":["emitter","redis","acknowledgement","cluster"],"analyzedSha":"ae7fb46e08c5ed964b4a1ea8b1703e816511598e","analyzedAt":"2026-08-03T19:08:14.127Z","schemaVersion":2}