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) <noreply@anthropic.com>
This commit is contained in:
Classic298
2026-06-01 18:56:49 +02:00
committed by GitHub
parent 6f0277db52
commit e2502ec80f
+18 -16
View File
@@ -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);
}
}
};