Skip to content

Commit fe57d7e

Browse files
fix: proper stream cleanup and transport close on disconnect
1. createWebReadableStream: Add closed flag and cancel() callback to prevent double-close crashes when SSE streams end. This fixes the "Controller is already closed" error that occurs when the SDK calls response.body.cancel() on 202 responses. 2. DELETE handler: Call serverTransport.close() after terminateSession() to properly cleanup the transport and cancel pending reconnections. - terminateSession() notifies the server (sends DELETE request) - close() cleans up client-side resources (abort controller, timeouts) - Both are needed for a complete disconnect
1 parent 436e77e commit fe57d7e

1 file changed

Lines changed: 17 additions & 3 deletions

File tree

server/src/index.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -241,18 +241,31 @@ const authMiddleware = (
241241
* This is necessary for the EventSource polyfill which expects web streams
242242
*/
243243
const createWebReadableStream = (nodeStream: any): ReadableStream => {
244+
let closed = false;
244245
return new ReadableStream({
245246
start(controller) {
246247
nodeStream.on("data", (chunk: any) => {
247-
controller.enqueue(chunk);
248+
if (!closed) {
249+
controller.enqueue(chunk);
250+
}
248251
});
249252
nodeStream.on("end", () => {
250-
controller.close();
253+
if (!closed) {
254+
closed = true;
255+
controller.close();
256+
}
251257
});
252258
nodeStream.on("error", (err: any) => {
253-
controller.error(err);
259+
if (!closed) {
260+
closed = true;
261+
controller.error(err);
262+
}
254263
});
255264
},
265+
cancel() {
266+
closed = true;
267+
nodeStream.destroy();
268+
},
256269
});
257270
};
258271

@@ -526,6 +539,7 @@ app.delete(
526539
res.status(404).end("Transport not found for sessionId " + sessionId);
527540
} else {
528541
await serverTransport.terminateSession();
542+
await serverTransport.close();
529543
webAppTransports.delete(sessionId);
530544
serverTransports.delete(sessionId);
531545
sessionHeaderHolders.delete(sessionId);

0 commit comments

Comments
 (0)