From b3b29a1c671b0fe204a072ec421d561885ee8bc0 Mon Sep 17 00:00:00 2001 From: alina sireneva Date: Mon, 1 Jul 2024 01:50:43 +0300 Subject: [PATCH] fix(node): improved exit hook --- .../src/common-internals-node/exit-hook.ts | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/packages/node/src/common-internals-node/exit-hook.ts b/packages/node/src/common-internals-node/exit-hook.ts index 3adbb349..8f1f4258 100644 --- a/packages/node/src/common-internals-node/exit-hook.ts +++ b/packages/node/src/common-internals-node/exit-hook.ts @@ -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 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)