From e2502ec80fffcbaeef775c8aabed6a35f03cb4d4 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Mon, 1 Jun 2026 18:56:49 +0200 Subject: [PATCH] fix: clear usage interval in finally so it cannot leak on send failure (#25478) getChatEventEmitter starts a setInterval emitting a `usage` socket event every second; clearInterval ran only after sendMessageSocket resolved, so any throw/reject left the interval firing for the page lifetime. Each failed send added another orphaned interval, inflating server-side usage accounting and growing CPU/memory over a session. Wrap the send in try/finally so the interval is always cleared, on both the happy path and any thrown/rejected path. The exception still propagates unchanged. Fixes #25465 Co-authored-by: Claude Opus 4.8 (1M context) --- src/lib/components/chat/Chat.svelte | 34 +++++++++++++++-------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index debcbacd36..ee495088d3 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -2159,22 +2159,24 @@ if (primaryModel && primaryResponseMessageId) { const chatEventEmitter = await getChatEventEmitter(primaryModel.id, _chatId); - scrollToBottom(); - await sendMessageSocket( - primaryModel, - messages && messages.length > 0 - ? messages - : createMessagesList(_history, primaryResponseMessageId), - _history, - primaryResponseMessageId, - _chatId, - { - messageIdsMap: selectedModelIds.length > 1 ? messageIdsMap : undefined, - regenerationPrompt - } - ); - - if (chatEventEmitter) clearInterval(chatEventEmitter); + try { + scrollToBottom(); + await sendMessageSocket( + primaryModel, + messages && messages.length > 0 + ? messages + : createMessagesList(_history, primaryResponseMessageId), + _history, + primaryResponseMessageId, + _chatId, + { + messageIdsMap: selectedModelIds.length > 1 ? messageIdsMap : undefined, + regenerationPrompt + } + ); + } finally { + if (chatEventEmitter) clearInterval(chatEventEmitter); + } } };