deno.land / std@0.167.0 / node / internal / timers.mjs

نووسراو ببینە
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
118
119
120
121
122
123
124
125
126
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.// Copyright Joyent and Node contributors. All rights reserved. MIT license.
import { inspect } from "./util/inspect.mjs";import { validateFunction, validateNumber } from "./validators.mjs";import { ERR_OUT_OF_RANGE } from "./errors.ts";import { emitWarning } from "../process.ts";
const setTimeout_ = globalThis.setTimeout;const clearTimeout_ = globalThis.clearTimeout;const setInterval_ = globalThis.setInterval;
// Timeout values > TIMEOUT_MAX are set to 1.export const TIMEOUT_MAX = 2 ** 31 - 1;
export const kTimerId = Symbol("timerId");export const kTimeout = Symbol("timeout");const kRefed = Symbol("refed");const createTimer = Symbol("createTimer");
// Timer constructor function.export function Timeout(callback, after, args, isRepeat, isRefed) { if (typeof after === "number" && after > TIMEOUT_MAX) { after = 1; } this._idleTimeout = after; this._onTimeout = callback; this._timerArgs = args; this._isRepeat = isRepeat; this[kRefed] = isRefed; this[kTimerId] = this[createTimer]();}
Timeout.prototype[createTimer] = function () { const callback = this._onTimeout; const cb = (...args) => callback.bind(this)(...args); const id = this._isRepeat ? setInterval_(cb, this._idleTimeout, ...this._timerArgs) : setTimeout_(cb, this._idleTimeout, ...this._timerArgs); if (!this[kRefed]) { Deno.unrefTimer(id); } return id;};
// Make sure the linked list only shows the minimal necessary information.Timeout.prototype[inspect.custom] = function (_, options) { return inspect(this, { ...options, // Only inspect one level. depth: 0, // It should not recurse. customInspect: false, });};
Timeout.prototype.refresh = function () { clearTimeout_(this[kTimerId]); this[kTimerId] = this[createTimer](); return this;};
Timeout.prototype.unref = function () { if (this[kRefed]) { this[kRefed] = false; Deno.unrefTimer(this[kTimerId]); } return this;};
Timeout.prototype.ref = function () { if (!this[kRefed]) { this[kRefed] = true; Deno.refTimer(this[kTimerId]); } return this;};
Timeout.prototype.hasRef = function () { return this[kRefed];};
Timeout.prototype[Symbol.toPrimitive] = function () { return this[kTimerId];};
/** * @param {number} msecs * @param {string} name * @returns */export function getTimerDuration(msecs, name) { validateNumber(msecs, name);
if (msecs < 0 || !Number.isFinite(msecs)) { throw new ERR_OUT_OF_RANGE(name, "a non-negative finite number", msecs); }
// Ensure that msecs fits into signed int32 if (msecs > TIMEOUT_MAX) { emitWarning( `${msecs} does not fit into a 32-bit signed integer.` + `\nTimer duration was truncated to ${TIMEOUT_MAX}.`, "TimeoutOverflowWarning", );
return TIMEOUT_MAX; }
return msecs;}
export function setUnrefTimeout(callback, timeout, ...args) { validateFunction(callback, "callback"); return new Timeout(callback, timeout, args, false, false);}
export default { getTimerDuration, kTimerId, kTimeout, setUnrefTimeout, Timeout, TIMEOUT_MAX,};
std

Version Info

Tagged at
a year ago