@@ -455,6 +455,14 @@ export class WebStandardStreamableHTTPServerTransport implements Transport {
455455
456456 const encoder = new TextEncoder ( ) ;
457457 let streamController : ReadableStreamDefaultController < Uint8Array > ;
458+ let keepAliveInterval : ReturnType < typeof setInterval > | undefined ;
459+
460+ const clearKeepAlive = ( ) => {
461+ if ( keepAliveInterval !== undefined ) {
462+ clearInterval ( keepAliveInterval ) ;
463+ keepAliveInterval = undefined ;
464+ }
465+ } ;
458466
459467 // Create a ReadableStream with a controller we can use to push SSE events
460468 const readable = new ReadableStream < Uint8Array > ( {
@@ -463,6 +471,7 @@ export class WebStandardStreamableHTTPServerTransport implements Transport {
463471 } ,
464472 cancel : ( ) => {
465473 // Stream was cancelled by client
474+ clearKeepAlive ( ) ;
466475 this . _streamMapping . delete ( this . _standaloneSseStreamId ) ;
467476 }
468477 } ) ;
@@ -483,6 +492,7 @@ export class WebStandardStreamableHTTPServerTransport implements Transport {
483492 controller : streamController ! ,
484493 encoder,
485494 cleanup : ( ) => {
495+ clearKeepAlive ( ) ;
486496 this . _streamMapping . delete ( this . _standaloneSseStreamId ) ;
487497 try {
488498 streamController ! . close ( ) ;
@@ -492,6 +502,14 @@ export class WebStandardStreamableHTTPServerTransport implements Transport {
492502 }
493503 } ) ;
494504
505+ keepAliveInterval = setInterval ( ( ) => {
506+ try {
507+ streamController ! . enqueue ( encoder . encode ( ': keep-alive\n\n' ) ) ;
508+ } catch {
509+ clearKeepAlive ( ) ;
510+ }
511+ } , 15_000 ) ;
512+
495513 return new Response ( readable , { headers } ) ;
496514 }
497515
0 commit comments