@@ -548,35 +548,21 @@ export class WebStandardStreamableHTTPServerTransport implements Transport {
548548 // Create a ReadableStream with controller for SSE
549549 const encoder = new TextEncoder ( ) ;
550550 let streamController ! : ReadableStreamDefaultController < Uint8Array > ;
551- let replayedStreamId ! : string ;
552-
553- const mapping : StreamMapping = {
554- encoder,
555- cleanup : ( ) => {
556- if ( mapping . keepAliveTimer ) clearInterval ( mapping . keepAliveTimer ) ;
557- this . _streamMapping . delete ( replayedStreamId ) ;
558- try {
559- streamController . close ( ) ;
560- } catch {
561- // Controller might already be closed
562- }
563- }
564- } ;
551+ let keepAliveTimer : ReturnType < typeof setInterval > | undefined ;
565552
566553 const readable = new ReadableStream < Uint8Array > ( {
567554 start : controller => {
568555 streamController = controller ;
569- mapping . controller = controller ;
570556 } ,
571557 cancel : ( ) => {
572558 // Stream was cancelled by client
573- if ( mapping . keepAliveTimer ) clearInterval ( mapping . keepAliveTimer ) ;
559+ if ( keepAliveTimer ) clearInterval ( keepAliveTimer ) ;
574560 // Cleanup will be handled by the mapping
575561 }
576562 } ) ;
577563
578564 // Replay events - returns the streamId for backwards compatibility
579- replayedStreamId = await this . _eventStore . replayEventsAfter ( lastEventId , {
565+ const replayedStreamId = await this . _eventStore . replayEventsAfter ( lastEventId , {
580566 send : async ( eventId : string , message : JSONRPCMessage ) => {
581567 const success = this . writeSSEEvent ( streamController , encoder , message , eventId ) ;
582568 if ( ! success ) {
@@ -589,18 +575,32 @@ export class WebStandardStreamableHTTPServerTransport implements Transport {
589575 }
590576 } ) ;
591577
578+ const mapping : StreamMapping = {
579+ controller : streamController ,
580+ encoder,
581+ cleanup : ( ) => {
582+ if ( keepAliveTimer ) clearInterval ( keepAliveTimer ) ;
583+ this . _streamMapping . delete ( replayedStreamId ) ;
584+ try {
585+ streamController . close ( ) ;
586+ } catch {
587+ // Controller might already be closed
588+ }
589+ }
590+ } ;
592591 this . _streamMapping . set ( replayedStreamId , mapping ) ;
593592
594593 // Start keepalive timer for the replayed stream so reconnecting
595594 // clients remain protected from proxy idle timeouts
596595 if ( this . _keepAliveInterval !== undefined ) {
597- mapping . keepAliveTimer = setInterval ( ( ) => {
596+ keepAliveTimer = setInterval ( ( ) => {
598597 try {
599598 streamController . enqueue ( encoder . encode ( ': keepalive\n\n' ) ) ;
600599 } catch {
601- if ( mapping . keepAliveTimer ) clearInterval ( mapping . keepAliveTimer ) ;
600+ if ( keepAliveTimer ) clearInterval ( keepAliveTimer ) ;
602601 }
603602 } , this . _keepAliveInterval ) ;
603+ mapping . keepAliveTimer = keepAliveTimer ;
604604 }
605605
606606 return new Response ( readable , { headers } ) ;
0 commit comments