From 55316027c0dc802ac437b335a22b4b344ced7762 Mon Sep 17 00:00:00 2001 From: Chris Wanstrath <2+defunkt@users.noreply.github.com> Date: Fri, 27 Feb 2026 15:14:22 -0800 Subject: [PATCH] heartbeat --- src/server/api/events.ts | 6 +++++- src/tools/events.ts | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/server/api/events.ts b/src/server/api/events.ts index 526039c..f949e24 100644 --- a/src/server/api/events.ts +++ b/src/server/api/events.ts @@ -8,7 +8,11 @@ const router = Hype.router() // individual events so apps can react to specific lifecycle changes. router.sse('/stream', (send) => { const unsub = onEvent(event => send(event)) - return unsub + const heartbeat = setInterval(() => send('', 'ping'), 60_000) + return () => { + clearInterval(heartbeat) + unsub() + } }) export default router diff --git a/src/tools/events.ts b/src/tools/events.ts index 668a647..3c0292d 100644 --- a/src/tools/events.ts +++ b/src/tools/events.ts @@ -35,8 +35,10 @@ function ensureConnection() { buf = lines.pop()! for (const line of lines) { if (!line.startsWith('data: ')) continue + const payload = line.slice(6) + if (!payload) continue try { - const event: ToesEvent = JSON.parse(line.slice(6)) + const event: ToesEvent = JSON.parse(payload) _listeners.forEach(l => { if (l.types.includes(event.type)) l.callback(event) })