Skip to content

Commit ca51920

Browse files
committed
fix: clean abort event listener once it's called or response is returned
1 parent 1ddfd46 commit ca51920

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed

packages/fetch-mock/src/Router.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ export default class Router {
156156
// eslint-disable-next-line no-async-promise-executor
157157
return new Promise(async (resolve, reject) => {
158158
const { url, options, request, pendingPromises } = callLog;
159+
let eventListenerAbortController: AbortController | undefined;
159160
if (callLog.signal) {
160161
const abort = () => {
161162
// TODO may need to bring that flushy thing back.
@@ -191,7 +192,11 @@ export default class Router {
191192
if (callLog.signal.aborted) {
192193
abort();
193194
}
194-
callLog.signal.addEventListener('abort', abort);
195+
eventListenerAbortController = new AbortController();
196+
callLog.signal.addEventListener('abort', abort, {
197+
once: true,
198+
signal: eventListenerAbortController.signal,
199+
});
195200
}
196201

197202
if (this.needsToReadBody(request)) {
@@ -218,6 +223,8 @@ export default class Router {
218223
resolve(observableResponse);
219224
} catch (err) {
220225
reject(err);
226+
} finally {
227+
eventListenerAbortController?.abort();
221228
}
222229
} else {
223230
reject(

0 commit comments

Comments
 (0)