From 5289c69271fed638571580bfb120c41bd6ea4372 Mon Sep 17 00:00:00 2001 From: Tom Alcorn Date: Tue, 18 Jun 2024 14:47:05 -0700 Subject: fix(ext/web): fix `AbortSignal.timeout()` leak (#23842) Fixes #20663. --------- Co-authored-by: Asher Gomez Co-authored-by: Divy Srivastava --- ext/web/03_abort_signal.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'ext') diff --git a/ext/web/03_abort_signal.js b/ext/web/03_abort_signal.js index 053b89bdf..81844d53f 100644 --- a/ext/web/03_abort_signal.js +++ b/ext/web/03_abort_signal.js @@ -3,7 +3,7 @@ // @ts-check /// -import { primordials } from "ext:core/mod.js"; +import { core, primordials } from "ext:core/mod.js"; const { ArrayPrototypeEvery, ArrayPrototypePush, @@ -33,7 +33,7 @@ import { listenerCount, setIsTrusted, } from "./02_event.js"; -import { refTimer, setTimeout, unrefTimer } from "./02_timers.js"; +import { clearTimeout, refTimer, unrefTimer } from "./02_timers.js"; // Since WeakSet is not a iterable, WeakRefSet class is provided to store and // iterate objects. @@ -118,14 +118,17 @@ class AbortSignal extends EventTarget { ); const signal = new AbortSignal(illegalConstructorKey); - signal[timerId] = setTimeout( + signal[timerId] = core.queueSystemTimer( + undefined, + false, + millis, () => { + clearTimeout(signal[timerId]); signal[timerId] = null; signal[signalAbort]( new DOMException("Signal timed out.", "TimeoutError"), ); }, - millis, ); unrefTimer(signal[timerId]); return signal; -- cgit v1.2.3