134 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			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')
 | 
						|
	}
 | 
						|
}
 |