Skip to content

Commit 0749d09

Browse files
committed
refactor: use AbortSignal.any() for mergeAbortSignals
1 parent 1609115 commit 0749d09

2 files changed

Lines changed: 14 additions & 19 deletions

File tree

src/api/providers/__tests__/request-config-builder.spec.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -298,19 +298,21 @@ describe("RequestConfigBuilder", () => {
298298
})
299299

300300
describe("static mergeAbortSignals", () => {
301-
test("should return primarySignal when secondarySignal is undefined", () => {
301+
test("should return merged signal when secondarySignal is undefined", () => {
302302
const controller = new AbortController()
303303
const result = RequestConfigBuilder.mergeAbortSignals(controller.signal)
304-
expect(result).toBe(controller.signal)
304+
// AbortSignal.any() always returns a new signal
305+
expect(result).not.toBe(controller.signal)
306+
expect(result.aborted).toBe(false)
305307
})
306308

307-
test("should return primarySignal when secondarySignal is already aborted", () => {
309+
test("should return merged signal when secondarySignal is already aborted", () => {
308310
const primaryController = new AbortController()
309311
const secondaryController = new AbortController()
310312
secondaryController.abort()
311313

312314
const result = RequestConfigBuilder.mergeAbortSignals(primaryController.signal, secondaryController.signal)
313-
expect(result).toBe(primaryController.signal)
315+
expect(result.aborted).toBe(true)
314316
})
315317

316318
test("should return merged signal when both signals are active", () => {
@@ -320,6 +322,7 @@ describe("RequestConfigBuilder", () => {
320322
const result = RequestConfigBuilder.mergeAbortSignals(primaryController.signal, secondaryController.signal)
321323
expect(result).not.toBe(primaryController.signal)
322324
expect(result).not.toBe(secondaryController.signal)
325+
expect(result.aborted).toBe(false)
323326
})
324327

325328
test("should abort merged signal when primarySignal is aborted", async () => {

src/api/providers/config-builder/request-config-builder.ts

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -108,28 +108,20 @@ export class RequestConfigBuilder<TOptions extends Record<string, any> = Record<
108108
}
109109

110110
/**
111-
* Merge multiple abort signals.
111+
* Merge multiple abort signals using the standard API.
112112
*
113-
* If any signal is aborted, the returned signal will be aborted.
113+
* Uses `AbortSignal.any()` which correctly handles the case where
114+
* any signal is already aborted.
114115
*
115116
* @param primarySignal - The primary abort signal
116117
* @param secondarySignal - Optional secondary abort signal
117-
* @returns A merged AbortSignal
118+
* @returns A merged AbortSignal that aborts when any input signal aborts
118119
*/
119120
static mergeAbortSignals(primarySignal: AbortSignal, secondarySignal?: AbortSignal): AbortSignal {
120-
if (!secondarySignal || secondarySignal.aborted) {
121-
return primarySignal
121+
if (!secondarySignal) {
122+
return AbortSignal.any([primarySignal])
122123
}
123124

124-
if (primarySignal.aborted) {
125-
return primarySignal
126-
}
127-
128-
const controller = new AbortController()
129-
130-
primarySignal.addEventListener("abort", () => controller.abort(), { once: true })
131-
secondarySignal.addEventListener("abort", () => controller.abort(), { once: true })
132-
133-
return controller.signal
125+
return AbortSignal.any([primarySignal, secondarySignal])
134126
}
135127
}

0 commit comments

Comments
 (0)