-
Notifications
You must be signed in to change notification settings - Fork 172
/
Copy pathsignal.js
45 lines (33 loc) · 972 Bytes
/
signal.js
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
const core = globalThis.__bootstrap;
const data = Object.create(null);
function getSigData(signum) {
return data[signum] ?? (data[signum] = { sh: undefined, listeners: new Set() });
}
function getSigNum(sig) {
const signum = core.signals[sig];
if (typeof signum === 'undefined') {
throw new Error(`invalid signal: ${sig}`);
}
return signum;
}
export function addSignalListener(sig, listener) {
const signum = getSigNum(sig);
const sd = getSigData(signum);
sd.listeners.add(listener);
if (!sd.sh) {
sd.sh = core.signal(signum, () => {
for (const listener of sd.listeners) {
listener();
}
});
}
}
export function removeSignalListener(sig, listener) {
const signum = getSigNum(sig);
const sd = getSigData(signum);
sd.listeners.delete(listener);
if (sd.listeners.size === 0 && sd.sh) {
sd.sh.close();
sd.sh = undefined;
}
}