From 02fdac48e801f218be8ea5102696e4a4c758343e Mon Sep 17 00:00:00 2001 From: Youzini-afk <13153778771cx@gmail.com> Date: Wed, 25 Mar 2026 15:22:56 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=89=80=E6=9C=89=20a?= =?UTF-8?q?bort()=20=E4=B8=8D=E4=BC=A0=20reason=20=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=9A=84'signal=20is=20aborted=20without=20reason'=E6=8F=90?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为 llm.js/embedding.js/vector-index.js/index.js 中所有 controller.abort() 添加具体原因: - 超时: 'LLM 请求超时 (60s)' / 'Embedding 请求超时 (45s)' - 信号传递: 转发原始 signal.reason --- embedding.js | 6 +++--- index.js | 4 ++-- llm.js | 6 +++--- vector-index.js | 6 +++--- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/embedding.js b/embedding.js index 1fcaf32..1281628 100644 --- a/embedding.js +++ b/embedding.js @@ -32,17 +32,17 @@ function createCombinedAbortSignal(...signals) { const controller = new AbortController(); for (const signal of validSignals) { if (signal.aborted) { - controller.abort(); + controller.abort(signal.reason); return controller.signal; } - signal.addEventListener('abort', () => controller.abort(), { once: true }); + signal.addEventListener('abort', () => controller.abort(signal.reason), { once: true }); } return controller.signal; } async function fetchWithTimeout(url, options = {}, timeoutMs = EMBEDDING_REQUEST_TIMEOUT_MS) { const controller = new AbortController(); - const timeout = setTimeout(() => controller.abort(), timeoutMs); + const timeout = setTimeout(() => controller.abort(new DOMException(`Embedding 请求超时 (${Math.round(timeoutMs / 1000)}s)`, 'AbortError')), timeoutMs); const signal = options.signal ? createCombinedAbortSignal(options.signal, controller.signal) : controller.signal; diff --git a/index.js b/index.js index d69dbd8..ba4aef3 100644 --- a/index.js +++ b/index.js @@ -798,7 +798,7 @@ async function fetchLocalWithTimeout( timeoutMs = LOCAL_VECTOR_TIMEOUT_MS, ) { const controller = new AbortController(); - const timeout = setTimeout(() => controller.abort(), timeoutMs); + const timeout = setTimeout(() => controller.abort(new DOMException(`本地请求超时 (${Math.round(timeoutMs / 1000)}s)`, 'AbortError')), timeoutMs); let signal = controller.signal; if (options.signal) { if ( @@ -808,7 +808,7 @@ async function fetchLocalWithTimeout( signal = AbortSignal.any([options.signal, controller.signal]); } else { signal = controller.signal; - options.signal.addEventListener("abort", () => controller.abort(), { + options.signal.addEventListener("abort", () => controller.abort(options.signal.reason), { once: true, }); } diff --git a/llm.js b/llm.js index 1f4b5c6..3063524 100644 --- a/llm.js +++ b/llm.js @@ -215,7 +215,7 @@ function buildJsonAttemptMessages(systemPrompt, userPrompt, attempt, reason = '' async function fetchWithTimeout(url, options = {}, timeoutMs = LLM_REQUEST_TIMEOUT_MS) { const controller = new AbortController(); - const timeout = setTimeout(() => controller.abort(), timeoutMs); + const timeout = setTimeout(() => controller.abort(new DOMException(`LLM 请求超时 (${Math.round(timeoutMs / 1000)}s)`, 'AbortError')), timeoutMs); const signal = options.signal ? createCombinedAbortSignal(options.signal, controller.signal) : controller.signal; @@ -243,10 +243,10 @@ function createCombinedAbortSignal(...signals) { const controller = new AbortController(); for (const signal of validSignals) { if (signal.aborted) { - controller.abort(); + controller.abort(signal.reason); return controller.signal; } - signal.addEventListener('abort', () => controller.abort(), { once: true }); + signal.addEventListener('abort', () => controller.abort(signal.reason), { once: true }); } return controller.signal; } diff --git a/vector-index.js b/vector-index.js index d1f198d..472470e 100644 --- a/vector-index.js +++ b/vector-index.js @@ -79,17 +79,17 @@ function createCombinedAbortSignal(...signals) { const controller = new AbortController(); for (const signal of validSignals) { if (signal.aborted) { - controller.abort(); + controller.abort(signal.reason); return controller.signal; } - signal.addEventListener("abort", () => controller.abort(), { once: true }); + signal.addEventListener("abort", () => controller.abort(signal.reason), { once: true }); } return controller.signal; } async function fetchWithTimeout(url, options = {}, timeoutMs = VECTOR_REQUEST_TIMEOUT_MS) { const controller = new AbortController(); - const timeout = setTimeout(() => controller.abort(), timeoutMs); + const timeout = setTimeout(() => controller.abort(new DOMException(`向量请求超时 (${Math.round(timeoutMs / 1000)}s)`, 'AbortError')), timeoutMs); const signal = options.signal ? createCombinedAbortSignal(options.signal, controller.signal) : controller.signal;