deno.land / x / deno@v1.28.2 / runtime / js / 40_signals.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
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
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license."use strict";
((window) => { const core = window.Deno.core; const ops = core.ops; const { Set, SymbolFor, TypeError, } = window.__bootstrap.primordials;
function bindSignal(signo) { return ops.op_signal_bind(signo); }
function pollSignal(rid) { const promise = core.opAsync("op_signal_poll", rid); core.unrefOp(promise[SymbolFor("Deno.core.internalPromiseId")]); return promise; }
function unbindSignal(rid) { ops.op_signal_unbind(rid); }
// Stores signal listeners and resource data. This has type of // `Record<string, { rid: number | undefined, listeners: Set<() => void> }` const signalData = {};
/** Gets the signal handlers and resource data of the given signal */ function getSignalData(signo) { return signalData[signo] ?? (signalData[signo] = { rid: undefined, listeners: new Set() }); }
function checkSignalListenerType(listener) { if (typeof listener !== "function") { throw new TypeError( `Signal listener must be a function. "${typeof listener}" is given.`, ); } }
function addSignalListener(signo, listener) { checkSignalListenerType(listener);
const sigData = getSignalData(signo); sigData.listeners.add(listener);
if (!sigData.rid) { // If signal resource doesn't exist, create it. // The program starts listening to the signal sigData.rid = bindSignal(signo); loop(sigData); } }
function removeSignalListener(signo, listener) { checkSignalListenerType(listener);
const sigData = getSignalData(signo); sigData.listeners.delete(listener);
if (sigData.listeners.size === 0 && sigData.rid) { unbindSignal(sigData.rid); sigData.rid = undefined; } }
async function loop(sigData) { while (sigData.rid) { if (await pollSignal(sigData.rid)) { return; } for (const listener of sigData.listeners) { listener(); } } }
window.__bootstrap.signals = { addSignalListener, removeSignalListener, };})(this);
deno

Version Info

Tagged at
a year ago