From 4895309fa71de1fc1514dfd38de30202d227a308 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 4d1fffa29..92d8a541a 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -608,22 +608,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 @@ -658,17 +664,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 + }); } });