export async function GET() { const encoder = new TextEncoder(); const stream = new ReadableStream({ start(controller) { let closed = false; emitter.incrementTargets?.(); let keepAlive; const cleanup = () => { if (!closed) { closed = true; clearInterval(keepAlive); emitter.off('event', listener); emitter.decrementTargets?.(); try { controller.close(); } catch { // ignore if the controller is already closed } } }; const send = (data) => { if (closed) return; try { controller.enqueue(encoder.encode(`data: ${JSON.stringify(data)}\n\n`)); } catch { cleanup(); } }; const listener = (event) => send(event); emitter.on('event', listener); for (const queued of emitter.getQueue?.() || []) { send(queued); } keepAlive = setInterval(() => { try { controller.enqueue(encoder.encode(':\n\n')); } catch { cleanup(); } }, 15_000); controller.signal?.addEventListener('abort', cleanup); }, cancel() { this.onClose?.(); } }); return new Response(stream, { headers: { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', Connection: 'keep-alive' } }); }