From c73cc39c61ac32fde6af1e0ac40d30a5d596eca8 Mon Sep 17 00:00:00 2001 From: MumuTW Date: Fri, 6 Mar 2026 10:56:32 +0000 Subject: [PATCH] fix: handle SSE transport send errors in stdio stderr handler (#1014) When the SSE connection is closed (e.g. client disconnects during rapid reconnection), webAppTransport.send() rejects with "Not connected". The stderr handler was calling send() without awaiting or catching the returned promise, causing unhandled rejections that crash the server. Add .catch() to both send() call sites in the stderr data handler so that errors from a closed SSE connection are silently ignored instead of crashing the process. Also move the cleanup logic in the MODULE_NOT_FOUND branch into .finally() so transports are cleaned up regardless of whether the notification send succeeded. --- server/src/index.ts | 60 ++++++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/server/src/index.ts b/server/src/index.ts index 4c86bd791..89cbf70ab 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -674,22 +674,28 @@ app.get( if (chunk.toString().includes("MODULE_NOT_FOUND")) { // Server command not found, remove transports const message = "Command not found, transports removed"; - webAppTransport.send({ - jsonrpc: "2.0", - method: "notifications/message", - params: { - level: "emergency", - logger: "proxy", - data: { - message, + webAppTransport + .send({ + jsonrpc: "2.0", + method: "notifications/message", + params: { + level: "emergency", + logger: "proxy", + data: { + message, + }, }, - }, - }); - webAppTransport.close(); - serverTransport.close(); - webAppTransports.delete(webAppTransport.sessionId); - serverTransports.delete(webAppTransport.sessionId); - sessionHeaderHolders.delete(webAppTransport.sessionId); + }) + .catch(() => { + // SSE connection already closed, ignore + }) + .finally(() => { + webAppTransport.close(); + serverTransport.close(); + webAppTransports.delete(webAppTransport.sessionId); + serverTransports.delete(webAppTransport.sessionId); + sessionHeaderHolders.delete(webAppTransport.sessionId); + }); console.error(message); } else { // Inspect message and attempt to assign a RFC 5424 Syslog Protocol level @@ -724,17 +730,21 @@ app.get( } else { level = "info"; } - webAppTransport.send({ - jsonrpc: "2.0", - method: "notifications/message", - params: { - level, - logger: "stdio", - data: { - message, + webAppTransport + .send({ + jsonrpc: "2.0", + method: "notifications/message", + params: { + level, + logger: "stdio", + data: { + message, + }, }, - }, - }); + }) + .catch(() => { + // SSE connection already closed, ignore + }); } });