From e2a04d04a337443e86f56a413a7fce29f21d299f Mon Sep 17 00:00:00 2001 From: Kirill Date: Fri, 22 May 2026 18:37:55 +0500 Subject: [PATCH] fix: add safeWrite guard and error handler for SSE socket --- server/src/routes/sse.js | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/server/src/routes/sse.js b/server/src/routes/sse.js index e8b32dd..d96e125 100644 --- a/server/src/routes/sse.js +++ b/server/src/routes/sse.js @@ -104,22 +104,37 @@ export async function registerSseRoutes(fastify) { 'X-Accel-Buffering': 'no', }) + let closed = false + + function safeWrite(chunk) { + if (closed) return + try { + reply.raw.write(chunk) + } catch { + closed = true + cleanUp() + } + } + const userId = request.user.sub const admin = isAdminUser(request.user) - reply.raw.write(formatHeartbit()) + safeWrite(formatHeartbit()) const heartbitTimer = setInterval(() => { - reply.raw.write(formatHeartbit()) + safeWrite(formatHeartbit()) }, 30_000) - const cleanup = buildSseListeners(userId, admin, fastify.eventBus, (chunk) => { - reply.raw.write(chunk) - }) + const removeListeners = buildSseListeners(userId, admin, fastify.eventBus, safeWrite) - request.raw.on('close', () => { + function cleanUp() { + if (closed) return + closed = true clearInterval(heartbitTimer) - cleanup() - }) + removeListeners() + } + + request.raw.on('close', cleanUp) + request.raw.on('error', cleanUp) }) }