Skip to content

Commit f31cc5f

Browse files
fix(http): remove AbortSignal event listeners when requests complete (#1332)
1 parent 759bf43 commit f31cc5f

File tree

4 files changed

+18
-4
lines changed

4 files changed

+18
-4
lines changed

.changeset/four-carrots-tap.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@smithy/fetch-http-handler": patch
3+
"@smithy/node-http-handler": patch
4+
---
5+
6+
remove abort signal event listeners after request completion

packages/fetch-http-handler/src/fetch-http-handler.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ export class FetchHttpHandler implements HttpHandler<FetchHttpHandlerConfig> {
127127
requestOptions.keepalive = keepAlive;
128128
}
129129

130+
let removeSignalEventListener = null as null | (() => void);
131+
130132
const fetchRequest = new Request(url, requestOptions);
131133
const raceOfPromises = [
132134
fetch(fetchRequest).then((response) => {
@@ -173,15 +175,17 @@ export class FetchHttpHandler implements HttpHandler<FetchHttpHandlerConfig> {
173175
};
174176
if (typeof (abortSignal as AbortSignal).addEventListener === "function") {
175177
// preferred.
176-
(abortSignal as AbortSignal).addEventListener("abort", onAbort);
178+
const signal = abortSignal as AbortSignal;
179+
signal.addEventListener("abort", onAbort, { once: true });
180+
removeSignalEventListener = () => signal.removeEventListener("abort", onAbort);
177181
} else {
178182
// backwards compatibility
179183
abortSignal.onabort = onAbort;
180184
}
181185
})
182186
);
183187
}
184-
return Promise.race(raceOfPromises);
188+
return Promise.race(raceOfPromises).finally(removeSignalEventListener);
185189
}
186190

187191
updateHttpClientConfig(key: keyof FetchHttpHandlerConfig, value: FetchHttpHandlerConfig[typeof key]): void {

packages/node-http-handler/src/node-http-handler.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,9 @@ or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler conf
252252
};
253253
if (typeof (abortSignal as AbortSignal).addEventListener === "function") {
254254
// preferred.
255-
(abortSignal as AbortSignal).addEventListener("abort", onAbort);
255+
const signal = abortSignal as AbortSignal;
256+
signal.addEventListener("abort", onAbort, { once: true });
257+
req.once("close", () => signal.removeEventListener("abort", onAbort));
256258
} else {
257259
// backwards compatibility
258260
abortSignal.onabort = onAbort;

packages/node-http-handler/src/node-http2-handler.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,9 @@ export class NodeHttp2Handler implements HttpHandler<NodeHttp2HandlerOptions> {
189189
};
190190
if (typeof (abortSignal as AbortSignal).addEventListener === "function") {
191191
// preferred.
192-
(abortSignal as AbortSignal).addEventListener("abort", onAbort);
192+
const signal = abortSignal as AbortSignal;
193+
signal.addEventListener("abort", onAbort, { once: true });
194+
req.once("close", () => signal.removeEventListener("abort", onAbort));
193195
} else {
194196
// backwards compatibility
195197
abortSignal.onabort = onAbort;

0 commit comments

Comments
 (0)