diff options
-rw-r--r-- | ext/node/polyfills/timers.ts | 7 | ||||
-rw-r--r-- | ext/web/02_timers.js | 18 |
2 files changed, 22 insertions, 3 deletions
diff --git a/ext/node/polyfills/timers.ts b/ext/node/polyfills/timers.ts index 9c688f242..e5e64529c 100644 --- a/ext/node/polyfills/timers.ts +++ b/ext/node/polyfills/timers.ts @@ -8,6 +8,7 @@ import * as timers from "ext:deno_web/02_timers.js"; const clearTimeout_ = timers.clearTimeout; const clearInterval_ = timers.clearInterval; +const setTimeoutUnclamped = timers.setTimeoutUnclamped; export function setTimeout( callback: (...args: unknown[]) => void, @@ -46,10 +47,12 @@ export function clearInterval(timeout?: Timeout | number | string) { } // TODO(bartlomieju): implement the 'NodeJS.Immediate' versions of the timers. // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/1163ead296d84e7a3c80d71e7c81ecbd1a130e9a/types/node/v12/globals.d.ts#L1120-L1131 -export const setImmediate = ( +export function setImmediate( cb: (...args: unknown[]) => void, ...args: unknown[] -): Timeout => setTimeout(cb, 0, ...args); +): Timeout { + return setTimeoutUnclamped(cb, 0, ...args); +} export const clearImmediate = clearTimeout; export default { diff --git a/ext/web/02_timers.js b/ext/web/02_timers.js index ed9f1c6fb..7603f6766 100644 --- a/ext/web/02_timers.js +++ b/ext/web/02_timers.js @@ -99,6 +99,9 @@ function initializeTimer( args, repeat, prevId, + // TODO(bartlomieju): remove this option, once `nextTick` and `setImmediate` + // in Node compat are cleaned up + respectNesting = true, ) { // 2. If previousId was given, let id be previousId; otherwise, let // previousId be an implementation-defined integer than is greater than zero @@ -131,7 +134,7 @@ function initializeTimer( // The nesting level of 5 and minimum of 4 ms are spec-mandated magic // constants. if (timeout < 0) timeout = 0; - if (timerNestingLevel > 5 && timeout < 4) timeout = 4; + if (timerNestingLevel > 5 && timeout < 4 && respectNesting) timeout = 4; // 9. Let task be a task that runs the following steps: const task = { @@ -343,6 +346,18 @@ function setInterval(callback, timeout = 0, ...args) { return initializeTimer(callback, timeout, args, true); } +// TODO(bartlomieju): remove this option, once `nextTick` and `setImmediate` +// in Node compat are cleaned up +function setTimeoutUnclamped(callback, timeout = 0, ...args) { + checkThis(this); + if (typeof callback !== "function") { + callback = webidl.converters.DOMString(callback); + } + timeout = webidl.converters.long(timeout); + + return initializeTimer(callback, timeout, args, false, undefined, false); +} + function clearTimeout(id = 0) { checkThis(this); id = webidl.converters.long(id); @@ -384,5 +399,6 @@ export { refTimer, setInterval, setTimeout, + setTimeoutUnclamped, unrefTimer, }; |