feat: enhance disconnect handling and request tracking in chatCore.js (#126)

Co-authored-by: zx <me@char.moe>
This commit is contained in:
zx07
2026-02-15 12:51:37 +08:00
committed by GitHub
parent ac7cedd27e
commit 3d29b86d44
2 changed files with 19 additions and 2 deletions

View File

@@ -417,7 +417,20 @@ export async function handleChatCore({ body, modelInfo, credentials, log, onCred
log?.debug?.("REQUEST", `${provider.toUpperCase()} | ${model} | ${msgCount} msgs`); log?.debug?.("REQUEST", `${provider.toUpperCase()} | ${model} | ${msgCount} msgs`);
// Create stream controller for disconnect detection // 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) // Execute request using executor (handles URL building, headers, fallback, transform)
let providerResponse; let providerResponse;

View File

@@ -13,7 +13,7 @@ function getTimeString() {
* @param {string} options.provider - Provider name * @param {string} options.provider - Provider name
* @param {string} options.model - Model 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 abortController = new AbortController();
const startTime = Date.now(); const startTime = Date.now();
let disconnected = false; let disconnected = false;
@@ -61,6 +61,9 @@ export function createStreamController({ onDisconnect, log, provider, model } =
// Call on error // Call on error
handleError: (error) => { handleError: (error) => {
if (disconnected) return;
disconnected = true;
if (abortTimeout) { if (abortTimeout) {
clearTimeout(abortTimeout); clearTimeout(abortTimeout);
abortTimeout = null; abortTimeout = null;
@@ -72,6 +75,7 @@ export function createStreamController({ onDisconnect, log, provider, model } =
} }
logStream(`error: ${error.message}`); logStream(`error: ${error.message}`);
onError?.(error);
}, },
abort: () => abortController.abort() abort: () => abortController.abort()