@@ -438,6 +438,14 @@ export class WebStandardStreamableHTTPServerTransport implements Transport {
438438
439439 const encoder = new TextEncoder ( ) ;
440440 let streamController : ReadableStreamDefaultController < Uint8Array > ;
441+ let keepAliveInterval : ReturnType < typeof setInterval > | undefined ;
442+
443+ const clearKeepAlive = ( ) => {
444+ if ( keepAliveInterval !== undefined ) {
445+ clearInterval ( keepAliveInterval ) ;
446+ keepAliveInterval = undefined ;
447+ }
448+ } ;
441449
442450 // Create a ReadableStream with a controller we can use to push SSE events
443451 const readable = new ReadableStream < Uint8Array > ( {
@@ -446,6 +454,7 @@ export class WebStandardStreamableHTTPServerTransport implements Transport {
446454 } ,
447455 cancel : ( ) => {
448456 // Stream was cancelled by client
457+ clearKeepAlive ( ) ;
449458 this . _streamMapping . delete ( this . _standaloneSseStreamId ) ;
450459 }
451460 } ) ;
@@ -466,6 +475,7 @@ export class WebStandardStreamableHTTPServerTransport implements Transport {
466475 controller : streamController ! ,
467476 encoder,
468477 cleanup : ( ) => {
478+ clearKeepAlive ( ) ;
469479 this . _streamMapping . delete ( this . _standaloneSseStreamId ) ;
470480 try {
471481 streamController ! . close ( ) ;
@@ -475,6 +485,14 @@ export class WebStandardStreamableHTTPServerTransport implements Transport {
475485 }
476486 } ) ;
477487
488+ keepAliveInterval = setInterval ( ( ) => {
489+ try {
490+ streamController ! . enqueue ( encoder . encode ( ': keep-alive\n\n' ) ) ;
491+ } catch {
492+ clearKeepAlive ( ) ;
493+ }
494+ } , 15_000 ) ;
495+
478496 return new Response ( readable , { headers } ) ;
479497 }
480498
0 commit comments