fix(node): improved exit hook
This commit is contained in:
parent
e22571b7c1
commit
b3b29a1c67
1 changed files with 17 additions and 16 deletions
|
@ -4,32 +4,33 @@ let installed = false
|
|||
let handled = false
|
||||
|
||||
const callbacks = new Set<() => void>()
|
||||
// eslint-disable-next-line func-call-spacing
|
||||
const myHandlers = new Map<string, () => void>()
|
||||
|
||||
function exit(shouldManuallyExit: boolean, signal: number, event: string) {
|
||||
return function eventHandler() {
|
||||
function register(shouldManuallyExit: boolean, signal: number, event: string) {
|
||||
function eventHandler() {
|
||||
if (handled) {
|
||||
return
|
||||
}
|
||||
|
||||
handled = true
|
||||
|
||||
const exitCode = 128 + signal
|
||||
|
||||
for (const callback of callbacks) {
|
||||
callback()
|
||||
}
|
||||
|
||||
for (const [event, handler] of myHandlers) {
|
||||
process.off(event, handler)
|
||||
}
|
||||
|
||||
if (shouldManuallyExit) {
|
||||
// if the user has some custom handlers after us, we don't want to exit the process
|
||||
|
||||
const listeners = process.rawListeners(event)
|
||||
const idx = listeners.indexOf(eventHandler)
|
||||
|
||||
if (idx === listeners.length - 1) {
|
||||
process.exit(exitCode)
|
||||
}
|
||||
// send the signal again and let node handle it
|
||||
process.kill(process.pid, signal)
|
||||
}
|
||||
}
|
||||
|
||||
process.on(event, eventHandler)
|
||||
myHandlers.set(event, eventHandler)
|
||||
}
|
||||
|
||||
export function beforeExit(fn: () => void): () => void {
|
||||
|
@ -39,10 +40,10 @@ export function beforeExit(fn: () => void): () => void {
|
|||
if (!installed) {
|
||||
installed = true
|
||||
|
||||
process.on('beforeExit', exit(true, -128, 'beforeExit'))
|
||||
process.on('SIGINT', exit(true, 2, 'SIGINT'))
|
||||
process.on('SIGTERM', exit(true, 15, 'SIGINT'))
|
||||
process.on('exit', exit(false, 15, 'exit'))
|
||||
register(true, 0, 'beforeExit')
|
||||
register(true, 2, 'SIGINT')
|
||||
register(true, 15, 'SIGTERM')
|
||||
register(false, 15, 'exit')
|
||||
}
|
||||
|
||||
callbacks.add(fn)
|
||||
|
|
Loading…
Reference in a new issue