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; }