v/vlib/os/signal.js.v

134 lines
2.1 KiB
V

module os
fn signal_str(signal Signal) string {
mut result := signal.str().to_upper()
result = 'SIG$result'
return result
}
fn signal_from_str(str JS.String) Signal {
s := string(str)
return match s {
'SIGHUP' {
Signal.hup
}
'SIGINT' {
Signal.int
}
'SIGQUIT' {
Signal.quit
}
'SIGILL' {
Signal.ill
}
'SIGTRAP' {
Signal.trap
}
'SIGABRT' {
Signal.abrt
}
'SIGBUS' {
Signal.bus
}
'SIGFPE' {
Signal.fpe
}
'SIGKILL' {
Signal.kill
}
'SIGUSR1' {
Signal.usr1
}
'SIGSEGV' {
Signal.segv
}
'SIGUSR2' {
Signal.usr2
}
'SIGPIPE' {
Signal.pipe
}
'SIGALRM' {
Signal.alrm
}
'SIGTERM' {
Signal.term
}
'SIGSTKFLT' {
Signal.stkflt
}
'SIGCHLD' {
Signal.chld
}
'SIGCONT' {
Signal.cont
}
'SIGSTOP' {
Signal.stop
}
'SIGTSTP' {
Signal.tstp
}
'SIGTTIN' {
Signal.ttin
}
'SIGTTOU' {
Signal.ttou
}
'SIGURG' {
Signal.urg
}
'SIGXCPU' {
Signal.xcpu
}
'SIGXFSZ' {
Signal.xfsz
}
'SIGVTALRM' {
Signal.vtalrm
}
'SIGPROF' {
Signal.prof
}
'SIGWINCH' {
Signal.winch
}
'SIGPOLL' {
Signal.poll
}
'SIGPWR' {
Signal.pwr
}
'SIGSYS' {
Signal.sys
}
else {
panic('unknown signal: $s')
}
}
}
// signal will assign `handler` callback to be called when `signum` signal is received.
//
// # Behaviour on different backends:
// - NodeJS: Will use `process.on` and add `handler` to the listeners list for `signum` to happen
// - Browser: Will use `window.addEventListener` for handling signal
//
// TODO: Add signal events implementation for browser backend
pub fn signal_opt(signum Signal, handler SignalHandler) ?SignalHandler {
signame := signal_str(signum)
_ := signame
$if js_node {
#$process.on(signame.str,function (sig) { handler(os__signal_from_str(sig));});
return handler
} $else $if js_browser {
#let event = new CustomEvent(signame.str, {detail: signum});
#window.addEventListener(signame.str, function (e) { handler(e.detail); });
return handler
} $else {
return error('signal handlers are not supported on bare JS')
}
}