summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarvin Hagemeister <marvin@deno.com>2024-07-31 12:00:01 +0200
committerGitHub <noreply@github.com>2024-07-31 12:00:01 +0200
commit1e2581e57b46e5e7512ceb5637d6007db67c3ed4 (patch)
treec084c0233e9e55810d5ca0ff858d1346f1b2e899
parentcd59fc53a528603112addfe8b10fe4e30d04e7f0 (diff)
fix(node/timers/promises): add scheduler APIs (#24802)
This PR adds the experimental `scheduler` APIs in Node's `timers/promises` module. See https://nodejs.org/api/timers.html#timerspromisesschedulerwaitdelay-options Fixes https://github.com/denoland/deno/issues/24800
-rw-r--r--ext/node/polyfills/timers/promises.ts7
-rw-r--r--tests/unit_node/timers_test.ts23
2 files changed, 30 insertions, 0 deletions
diff --git a/ext/node/polyfills/timers/promises.ts b/ext/node/polyfills/timers/promises.ts
index b01b343df..2ab2384dc 100644
--- a/ext/node/polyfills/timers/promises.ts
+++ b/ext/node/polyfills/timers/promises.ts
@@ -6,6 +6,13 @@ export const setTimeout = promisify(timers.setTimeout),
setImmediate = promisify(timers.setImmediate),
setInterval = promisify(timers.setInterval);
+export const scheduler = {
+ async wait(delay: number, options?: { signal?: AbortSignal }): Promise<void> {
+ return await setTimeout(delay, undefined, options);
+ },
+ yield: setImmediate,
+};
+
export default {
setTimeout,
setImmediate,
diff --git a/tests/unit_node/timers_test.ts b/tests/unit_node/timers_test.ts
index 90c6fb150..868ba21d6 100644
--- a/tests/unit_node/timers_test.ts
+++ b/tests/unit_node/timers_test.ts
@@ -66,6 +66,29 @@ Deno.test("[node/timers/promises setTimeout]", () => {
return p;
});
+Deno.test("[node/timers/promises scheduler.wait]", async () => {
+ const { scheduler } = timersPromises;
+ let resolved = false;
+ timers.setTimeout(() => (resolved = true), 20);
+ const p = scheduler.wait(20);
+
+ assert(p instanceof Promise);
+ await p;
+ assert(resolved);
+});
+
+Deno.test("[node/timers/promises scheduler.yield]", async () => {
+ const { scheduler } = timersPromises;
+ let resolved = false;
+ timers.setImmediate(() => resolved = true);
+
+ const p = scheduler.yield();
+ assert(p instanceof Promise);
+ await p;
+
+ assert(resolved);
+});
+
// Regression test for https://github.com/denoland/deno/issues/17981
Deno.test("[node/timers refresh cancelled timer]", () => {
const { setTimeout, clearTimeout } = timers;