1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-24 08:09:08 -05:00
denoland-deno/ext/node/polyfills/timers.ts
Nathan Whitaker 529f79505d
fix(ext/node): Add Immediate class to mirror NodeJS.Immediate (#22808)
Fixes #21660

Adds a basic `Immediate` class to mirror `NodeJS.Immediate`, and changes
`setImmediate` and `clearImmediate` to return and accept (respectively)
`Immediate` objects.

Note that for now {ref,unref,hasRef} are effectively stubs, as deno_core
doesn't really natively support immediates (they're currently modeled as
timers with delay of 0). Eventually we probably want to actually
implement these properly.
2024-03-08 15:58:43 -08:00

97 lines
2.4 KiB
TypeScript

// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
// TODO(petamoriken): enable prefer-primordials for node polyfills
// deno-lint-ignore-file prefer-primordials
import { primordials } from "ext:core/mod.js";
const {
MapPrototypeGet,
MapPrototypeDelete,
} = primordials;
import {
activeTimers,
Immediate,
setUnrefTimeout,
Timeout,
} from "ext:deno_node/internal/timers.mjs";
import { validateFunction } from "ext:deno_node/internal/validators.mjs";
import { promisify } from "ext:deno_node/internal/util.mjs";
export { setUnrefTimeout } from "ext:deno_node/internal/timers.mjs";
import * as timers from "ext:deno_web/02_timers.js";
const clearTimeout_ = timers.clearTimeout;
const clearInterval_ = timers.clearInterval;
export function setTimeout(
callback: (...args: unknown[]) => void,
timeout?: number,
...args: unknown[]
) {
validateFunction(callback, "callback");
return new Timeout(callback, timeout, args, false, true);
}
Object.defineProperty(setTimeout, promisify.custom, {
value: (timeout: number, ...args: unknown[]) => {
return new Promise((cb) => setTimeout(cb, timeout, ...args));
},
enumerable: true,
});
export function clearTimeout(timeout?: Timeout | number) {
if (timeout == null) {
return;
}
const id = +timeout;
const timer = MapPrototypeGet(activeTimers, id);
if (timer) {
timeout._destroyed = true;
MapPrototypeDelete(activeTimers, id);
}
clearTimeout_(id);
}
export function setInterval(
callback: (...args: unknown[]) => void,
timeout?: number,
...args: unknown[]
) {
validateFunction(callback, "callback");
return new Timeout(callback, timeout, args, true, true);
}
export function clearInterval(timeout?: Timeout | number | string) {
if (timeout == null) {
return;
}
const id = +timeout;
const timer = MapPrototypeGet(activeTimers, id);
if (timer) {
timeout._destroyed = true;
MapPrototypeDelete(activeTimers, id);
}
clearInterval_(id);
}
export function setImmediate(
cb: (...args: unknown[]) => void,
...args: unknown[]
): Timeout {
return new Immediate(cb, ...args);
}
export function clearImmediate(immediate: Immediate) {
if (immediate == null) {
return;
}
// FIXME(nathanwhit): will probably change once
// deno_core has proper support for immediates
clearTimeout_(immediate._immediateId);
}
export default {
setTimeout,
clearTimeout,
setInterval,
clearInterval,
setImmediate,
setUnrefTimeout,
clearImmediate,
};