Skip to content

Commit 2fd1ec1

Browse files
committed
fix: add { once: true } to abort listeners, use ApiError for retry exhaustion
- combineSignals in MLXProvider, OllamaProvider, and OpenRouterClient now passes { once: true } to addEventListener so abort listeners are automatically removed after firing, preventing listener leaks. - OpenRouterClient retry-exhaustion fallback now throws ApiError instead of plain Error so callers receive a typed, retryable-flagged error.
1 parent 2f5025a commit 2fd1ec1

3 files changed

Lines changed: 7 additions & 7 deletions

File tree

src/providers/MLXProvider.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,8 +318,8 @@ export class MLXProvider implements LLMProvider {
318318
private combineSignals(signal1: AbortSignal, signal2: AbortSignal): AbortSignal {
319319
const controller = new AbortController();
320320
const abort = () => controller.abort();
321-
signal1.addEventListener('abort', abort);
322-
signal2.addEventListener('abort', abort);
321+
signal1.addEventListener('abort', abort, { once: true });
322+
signal2.addEventListener('abort', abort, { once: true });
323323
if (signal1.aborted || signal2.aborted) {
324324
controller.abort();
325325
}

src/providers/OllamaProvider.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -463,8 +463,8 @@ export class OllamaProvider implements LLMProvider {
463463
private combineSignals(signal1: AbortSignal, signal2: AbortSignal): AbortSignal {
464464
const controller = new AbortController();
465465
const abort = () => controller.abort();
466-
signal1.addEventListener('abort', abort);
467-
signal2.addEventListener('abort', abort);
466+
signal1.addEventListener('abort', abort, { once: true });
467+
signal2.addEventListener('abort', abort, { once: true });
468468
if (signal1.aborted || signal2.aborted) {
469469
controller.abort();
470470
}

src/providers/OpenRouterClient.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ export class OpenRouterClient {
194194
// All retries exhausted
195195
throw (
196196
lastError ??
197-
new Error("Failed to communicate with the AI service. Please try again.")
197+
new ApiError("Failed to communicate with the AI service. Please try again.", 'network_error', 0, true)
198198
);
199199
}
200200

@@ -340,8 +340,8 @@ export class OpenRouterClient {
340340
const controller = new AbortController();
341341

342342
const abort = () => controller.abort();
343-
signal1.addEventListener("abort", abort);
344-
signal2.addEventListener("abort", abort);
343+
signal1.addEventListener("abort", abort, { once: true });
344+
signal2.addEventListener("abort", abort, { once: true });
345345

346346
if (signal1.aborted || signal2.aborted) {
347347
controller.abort();

0 commit comments

Comments
 (0)