| 1 | module os |
| 2 | |
| 3 | fn signal_str(signal Signal) string { |
| 4 | mut result := signal.str().to_upper() |
| 5 | result = 'SIG${result}' |
| 6 | return result |
| 7 | } |
| 8 | |
| 9 | fn signal_from_str(str JS.String) Signal { |
| 10 | s := string(str) |
| 11 | return match s { |
| 12 | 'SIGHUP' { |
| 13 | Signal.hup |
| 14 | } |
| 15 | 'SIGINT' { |
| 16 | Signal.int |
| 17 | } |
| 18 | 'SIGQUIT' { |
| 19 | Signal.quit |
| 20 | } |
| 21 | 'SIGILL' { |
| 22 | Signal.ill |
| 23 | } |
| 24 | 'SIGTRAP' { |
| 25 | Signal.trap |
| 26 | } |
| 27 | 'SIGABRT' { |
| 28 | Signal.abrt |
| 29 | } |
| 30 | 'SIGBUS' { |
| 31 | Signal.bus |
| 32 | } |
| 33 | 'SIGFPE' { |
| 34 | Signal.fpe |
| 35 | } |
| 36 | 'SIGKILL' { |
| 37 | Signal.kill |
| 38 | } |
| 39 | 'SIGUSR1' { |
| 40 | Signal.usr1 |
| 41 | } |
| 42 | 'SIGSEGV' { |
| 43 | Signal.segv |
| 44 | } |
| 45 | 'SIGUSR2' { |
| 46 | Signal.usr2 |
| 47 | } |
| 48 | 'SIGPIPE' { |
| 49 | Signal.pipe |
| 50 | } |
| 51 | 'SIGALRM' { |
| 52 | Signal.alrm |
| 53 | } |
| 54 | 'SIGTERM' { |
| 55 | Signal.term |
| 56 | } |
| 57 | 'SIGSTKFLT' { |
| 58 | Signal.stkflt |
| 59 | } |
| 60 | 'SIGCHLD' { |
| 61 | Signal.chld |
| 62 | } |
| 63 | 'SIGCONT' { |
| 64 | Signal.cont |
| 65 | } |
| 66 | 'SIGSTOP' { |
| 67 | Signal.stop |
| 68 | } |
| 69 | 'SIGTSTP' { |
| 70 | Signal.tstp |
| 71 | } |
| 72 | 'SIGTTIN' { |
| 73 | Signal.ttin |
| 74 | } |
| 75 | 'SIGTTOU' { |
| 76 | Signal.ttou |
| 77 | } |
| 78 | 'SIGURG' { |
| 79 | Signal.urg |
| 80 | } |
| 81 | 'SIGXCPU' { |
| 82 | Signal.xcpu |
| 83 | } |
| 84 | 'SIGXFSZ' { |
| 85 | Signal.xfsz |
| 86 | } |
| 87 | 'SIGVTALRM' { |
| 88 | Signal.vtalrm |
| 89 | } |
| 90 | 'SIGPROF' { |
| 91 | Signal.prof |
| 92 | } |
| 93 | 'SIGWINCH' { |
| 94 | Signal.winch |
| 95 | } |
| 96 | 'SIGPOLL' { |
| 97 | Signal.poll |
| 98 | } |
| 99 | 'SIGPWR' { |
| 100 | Signal.pwr |
| 101 | } |
| 102 | 'SIGSYS' { |
| 103 | Signal.sys |
| 104 | } |
| 105 | else { |
| 106 | panic('unknown signal: ${s}') |
| 107 | } |
| 108 | } |
| 109 | } |
| 110 | |
| 111 | // signal will assign `handler` callback to be called when `signum` signal is received. |
| 112 | // |
| 113 | // # Behaviour on different backends: |
| 114 | // - NodeJS: Will use `process.on` and add `handler` to the listeners list for `signum` to happen |
| 115 | // - Browser: Will use `window.addEventListener` for handling signal |
| 116 | // |
| 117 | // TODO: Add signal events implementation for browser backend |
| 118 | pub fn signal_opt(signum Signal, handler SignalHandler) !SignalHandler { |
| 119 | signame := signal_str(signum) |
| 120 | _ := signame |
| 121 | $if js_node { |
| 122 | #$process.on(signame.str,function (sig) { handler(os__signal_from_str(sig));}); |
| 123 | |
| 124 | return handler |
| 125 | } $else $if js_browser { |
| 126 | #let event = new CustomEvent(signame.str, {detail: signum}); |
| 127 | #window.addEventListener(signame.str, function (e) { handler(e.detail); }); |
| 128 | |
| 129 | return handler |
| 130 | } $else { |
| 131 | return error('signal handlers are not supported on bare JS') |
| 132 | } |
| 133 | } |
| 134 | |