From 3d29b86d441757b27c70fb968bb142b4041ced7f Mon Sep 17 00:00:00 2001 From: zx07 Date: Sun, 15 Feb 2026 12:51:37 +0800 Subject: [PATCH] feat: enhance disconnect handling and request tracking in chatCore.js (#126) Co-authored-by: zx --- open-sse/handlers/chatCore.js | 15 ++++++++++++++- open-sse/utils/streamHandler.js | 6 +++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/open-sse/handlers/chatCore.js b/open-sse/handlers/chatCore.js index 51541b3..16815d8 100644 --- a/open-sse/handlers/chatCore.js +++ b/open-sse/handlers/chatCore.js @@ -417,7 +417,20 @@ export async function handleChatCore({ body, modelInfo, credentials, log, onCred log?.debug?.("REQUEST", `${provider.toUpperCase()} | ${model} | ${msgCount} msgs`); // Create stream controller for disconnect detection - const streamController = createStreamController({ onDisconnect, log, provider, model }); + const streamController = createStreamController({ + onDisconnect: (reason) => { + // Track request finished (disconnected) + trackPendingRequest(model, provider, connectionId, false); + if (onDisconnect) onDisconnect(reason); + }, + onError: (error) => { + // Track request finished (error/zombie) + trackPendingRequest(model, provider, connectionId, false); + }, + log, + provider, + model + }); // Execute request using executor (handles URL building, headers, fallback, transform) let providerResponse; diff --git a/open-sse/utils/streamHandler.js b/open-sse/utils/streamHandler.js index f9d8b06..5e90adc 100644 --- a/open-sse/utils/streamHandler.js +++ b/open-sse/utils/streamHandler.js @@ -13,7 +13,7 @@ function getTimeString() { * @param {string} options.provider - Provider name * @param {string} options.model - Model name */ -export function createStreamController({ onDisconnect, log, provider, model } = {}) { +export function createStreamController({ onDisconnect, onError, log, provider, model } = {}) { const abortController = new AbortController(); const startTime = Date.now(); let disconnected = false; @@ -61,6 +61,9 @@ export function createStreamController({ onDisconnect, log, provider, model } = // Call on error handleError: (error) => { + if (disconnected) return; + disconnected = true; + if (abortTimeout) { clearTimeout(abortTimeout); abortTimeout = null; @@ -72,6 +75,7 @@ export function createStreamController({ onDisconnect, log, provider, model } = } logStream(`error: ${error.message}`); + onError?.(error); }, abort: () => abortController.abort()