aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/node_timers.exports.js
blob: d1f3e81e7e5627b5be47bd1a16f8372acb2bd9c3 (plain) (blame)
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
// 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;
  #clearFunction;

  constructor(id, clearFunction) {
    this.#id = id;
    this.#refCount = 1;
    this.#clearFunction = clearFunction;
  }

  ref() {
    this.#refCount += 1;
  }

  hasRef() {
    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;
    if (clearFunction && this.#refCount === 0) {
      this.#clearFunction = null;
      clearFunction(this.#id);
    }
  }
}
var {
  setTimeout: setTimeout_,
  setImmediate: setImmediate_,
  clearTimeout: clearTimeout_,
  setInterval: setInterval_,
  clearInterval: clearInterval_,
} = globalThis;

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 {
    }
  };

  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,
  setImmediate,
  setTimeout,
  clearInterval,
  clearTimeout,
  [Symbol.for("CommonJS")]: 0,
};