From 07683bcc03231aba479f3c1d3ab13446b9187917 Mon Sep 17 00:00:00 2001 From: Prateek Date: Sat, 14 Feb 2026 17:34:10 +0530 Subject: [PATCH] fix: clear cached init on failure + clean up SSE intervals on stream close - services.ts: Clear _aoServicesInit on rejection so subsequent calls retry instead of permanently returning a failed promise - events/route.ts: Clear both intervals in the updates catch block (matching heartbeat behavior) to stop polling after disconnect Co-Authored-By: Claude Opus 4.6 --- packages/web/src/app/api/events/route.ts | 4 +++- packages/web/src/lib/services.ts | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/web/src/app/api/events/route.ts b/packages/web/src/app/api/events/route.ts index b0348fc95..5606ed4b2 100644 --- a/packages/web/src/app/api/events/route.ts +++ b/packages/web/src/app/api/events/route.ts @@ -73,7 +73,9 @@ export async function GET(): Promise { controller.enqueue(encoder.encode(`data: ${JSON.stringify(event)}\n\n`)); } } catch { - // Silently skip failed polls — next interval will retry + // enqueue failure means the stream is closed — clean up both intervals + clearInterval(updates); + clearInterval(heartbeat); } })(); }, 5000); diff --git a/packages/web/src/lib/services.ts b/packages/web/src/lib/services.ts index 5d160bd49..2f30ec4dd 100644 --- a/packages/web/src/lib/services.ts +++ b/packages/web/src/lib/services.ts @@ -34,7 +34,12 @@ export function getServices(): Promise { return Promise.resolve(globalForServices._aoServices); } if (!globalForServices._aoServicesInit) { - globalForServices._aoServicesInit = initServices(); + globalForServices._aoServicesInit = initServices().catch((err) => { + // Clear the cached promise so the next call retries instead of + // permanently returning a rejected promise. + globalForServices._aoServicesInit = undefined; + throw err; + }); } return globalForServices._aoServicesInit; }