summaryrefslogtreecommitdiff
path: root/ext/web/02_timers.js
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2023-05-23 00:19:44 +0200
committerGitHub <noreply@github.com>2023-05-22 22:19:44 +0000
commit25232fa4e8ba2e9601699cff0cc9a6e6f03171ee (patch)
treec4cfedd12283b73319437e9aaccbbf8dd4c66796 /ext/web/02_timers.js
parent7b4c483aa159794cdb9d57d3252c2980fba45469 (diff)
fix(node): make sure "setImmediate" is not clamped to 4ms (#19213)
This commit changes implementation of "setImmediate" from "node:timers" module to 0ms timer that is never clamped to 4ms no matter how many nested calls there are. Closes https://github.com/denoland/deno/issues/19034
Diffstat (limited to 'ext/web/02_timers.js')
-rw-r--r--ext/web/02_timers.js18
1 files changed, 17 insertions, 1 deletions
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,
};