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 09:56:49 -07:00
committed by GitHub
co-authored by Claude Opus 4.8
parent 6f0277db52
commit e2502ec80f
+18 -16
View File
@@ -2159,22 +2159,24 @@
if (primaryModel && primaryResponseMessageId) { if (primaryModel && primaryResponseMessageId) {
const chatEventEmitter = await getChatEventEmitter(primaryModel.id, _chatId); const chatEventEmitter = await getChatEventEmitter(primaryModel.id, _chatId);
scrollToBottom(); try {
await sendMessageSocket( scrollToBottom();
primaryModel, await sendMessageSocket(
messages && messages.length > 0 primaryModel,
? messages messages && messages.length > 0
: createMessagesList(_history, primaryResponseMessageId), ? messages
_history, : createMessagesList(_history, primaryResponseMessageId),
primaryResponseMessageId, _history,
_chatId, primaryResponseMessageId,
{ _chatId,
messageIdsMap: selectedModelIds.length > 1 ? messageIdsMap : undefined, {
regenerationPrompt messageIdsMap: selectedModelIds.length > 1 ? messageIdsMap : undefined,
} regenerationPrompt
); }
);
if (chatEventEmitter) clearInterval(chatEventEmitter); } finally {
if (chatEventEmitter) clearInterval(chatEventEmitter);
}
} }
}; };