Skip to content

Commit 5fcb451

Browse files
Fix prefer-const lint: use closure-local keepAliveTimer in replayEvents
1 parent a28c292 commit 5fcb451

File tree

1 file changed

+19
-19
lines changed

1 file changed

+19
-19
lines changed

packages/server/src/server/streamableHttp.ts

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)