From 2f653e3a11e0d179763c910aaf64cab8f829d297 Mon Sep 17 00:00:00 2001 From: Joshua Sundance Bailey Date: Thu, 11 Sep 2025 10:43:19 -0700 Subject: [PATCH 1/2] Fix: Prevent infinite recursion when closing streamable sessions --- src/services/streamable.ts | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/services/streamable.ts b/src/services/streamable.ts index 42ab0b0..f9a3559 100644 --- a/src/services/streamable.ts +++ b/src/services/streamable.ts @@ -77,20 +77,12 @@ export const startHTTPStreamableServer = async ( }); // Handle the server close event. - transport.onclose = async () => { + transport.onclose = () => { const sid = transport.sessionId; if (sid && activeTransports[sid]) { - try { - await server?.close(); - } catch (error) { - Logger.error("Error closing server", error); - } - - // delete used transport and server to avoid memory leak. delete activeTransports[sid]; } }; - // Create the server try { server = createServer(); From 39d056a39122c54c83a796889e3c3553c0f990ef Mon Sep 17 00:00:00 2001 From: Joshua Sundance Bailey Date: Fri, 12 Sep 2025 14:35:23 -0700 Subject: [PATCH 2/2] guard against memory leak --- src/services/streamable.ts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/services/streamable.ts b/src/services/streamable.ts index f9a3559..1aa1c07 100644 --- a/src/services/streamable.ts +++ b/src/services/streamable.ts @@ -77,9 +77,28 @@ export const startHTTPStreamableServer = async ( }); // Handle the server close event. - transport.onclose = () => { + let isTransportClosed = false; + let isServerClosed = false; + + transport.onclose = async () => { + if (isTransportClosed) { + Logger.warn("Transport already closed, skipping onclose handler to avoid infinite recursion"); + return; // Prevent re-entrancy + }; + + isTransportClosed = true; + const sid = transport.sessionId; if (sid && activeTransports[sid]) { + // Optionally close the server, but guard against recursion + if (!isServerClosed) { + try { + await server.close(); + isServerClosed = true; + } catch (error) { + Logger.error("Error closing server", error); + } + } delete activeTransports[sid]; } };