-
Notifications
You must be signed in to change notification settings - Fork 5.5k
/
Copy pathtimers.ts
117 lines (108 loc) · 2.84 KB
/
timers.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
import { primordials } from "ext:core/mod.js";
const {
MapPrototypeGet,
MapPrototypeDelete,
ObjectDefineProperty,
Promise,
SafeArrayIterator,
} = 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);
}
ObjectDefineProperty(setTimeout, promisify.custom, {
__proto__: null,
value: (timeout: number, ...args: unknown[]) => {
return new Promise((cb) =>
setTimeout(cb, timeout, ...new SafeArrayIterator(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, ...new SafeArrayIterator(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 const promises = {
setTimeout: promisify(setTimeout),
setImmediate: promisify(setImmediate),
setInterval: promisify(setInterval),
};
promises.scheduler = {
async wait(
delay: number,
options?: { signal?: AbortSignal },
): Promise<void> {
return await promises.setTimeout(delay, undefined, options);
},
yield: promises.setImmediate,
};
export default {
setTimeout,
clearTimeout,
setInterval,
clearInterval,
setImmediate,
setUnrefTimeout,
clearImmediate,
promises,
};