mirror of
https://github.com/denoland/deno.git
synced 2024-11-27 16:10:57 -05:00
529f79505d
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.
97 lines
2.4 KiB
TypeScript
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,
|
|
};
|