aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/node_timers.exports.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/bun.js/node_timers.exports.js')
-rw-r--r--src/bun.js/node_timers.exports.js88
1 files changed, 78 insertions, 10 deletions
diff --git a/src/bun.js/node_timers.exports.js b/src/bun.js/node_timers.exports.js
index d46916ac5..d1f3e81e7 100644
--- a/src/bun.js/node_timers.exports.js
+++ b/src/bun.js/node_timers.exports.js
@@ -1,3 +1,7 @@
+// This implementation isn't 100% correct
+// Ref/unref does not impact whether the process is kept alive
+
+var clear = Symbol("clear");
class Timeout {
#id;
#refCount = 1;
@@ -17,6 +21,15 @@ class Timeout {
return this.#refCount > 0;
}
+ [clear]() {
+ this.#refCount = 0;
+ var clearFunction = this.#clearFunction;
+ if (clearFunction) {
+ this.#clearFunction = null;
+ clearFunction(this.#id);
+ }
+ }
+
unref() {
this.#refCount -= 1;
var clearFunction = this.#clearFunction;
@@ -26,23 +39,78 @@ class Timeout {
}
}
}
-export const setInterval = globalThis.setInterval;
-export const setImmediate = globalThis.queueMicrotask;
-export const setTimeout = globalThis.setTimeout;
-export const clearInterval = globalThis.clearInterval;
+var {
+ setTimeout: setTimeout_,
+ setImmediate: setImmediate_,
+ clearTimeout: clearTimeout_,
+ setInterval: setInterval_,
+ clearInterval: clearInterval_,
+} = globalThis;
-// not implemented
-export const clearImmediate = () => {};
+export function setImmediate(callback, ...args) {
+ if (typeof callback !== "function") {
+ throw new TypeError("callback must be a function");
+ }
+ var cleared = false;
+ function clearImmediate(id) {
+ cleared = true;
+ }
+
+ const wrapped = function (callback, args) {
+ if (cleared) {
+ return;
+ }
+ cleared = true;
+ try {
+ callback(...args);
+ } catch (e) {
+ reportError(e);
+ } finally {
+ }
+ };
-export const clearTimeout = globalThis.clearTimeout;
-export const queueMicrotask = globalThis.queueMicrotask;
+ return new Timeout(setImmediate_(wrapped, callback, args), clearImmediate);
+}
+
+export function setTimeout(callback, delay, ...args) {
+ if (typeof callback !== "function") {
+ throw new TypeError("callback must be a function");
+ }
+
+ return new Timeout(setTimeout_.apply(globalThis, arguments), clearTimeout_);
+}
+
+export function setInterval(callback, delay, ...args) {
+ if (typeof callback !== "function") {
+ throw new TypeError("callback must be a function");
+ }
+
+ return new Timeout(setInterval_.apply(globalThis, arguments), clearInterval_);
+}
+
+export function clearTimeout(id) {
+ if (id && typeof id === "object" && id[clear]) {
+ id[clear]();
+ return;
+ }
+
+ clearTimeout_(id);
+}
+
+export function clearInterval(id) {
+ if (id && typeof id === "object" && id[clear]) {
+ id[clear]();
+ return;
+ }
+
+ clearInterval_(id);
+}
export default {
setInterval,
- queueMicrotask,
setImmediate,
setTimeout,
clearInterval,
- clearImmediate,
clearTimeout,
+ [Symbol.for("CommonJS")]: 0,
};