export interface IFlexChildShutdownOptions { dispose: () => Promise; closeDescriptors: () => void; getExitCode: () => number | undefined; setExitCode: (exitCodeArg: number) => void; forceExit: (exitCodeArg: number) => void; timeoutMs: number; } export const createFlexChildShutdown = ( optionsArg: IFlexChildShutdownOptions, ): ((fatalArg: boolean) => void) => { let shutdownTask: Promise | undefined; let watchdog: ReturnType | undefined; let descriptorsClosed = false; const closeDescriptors = (): void => { if (descriptorsClosed) return; optionsArg.closeDescriptors(); descriptorsClosed = true; }; return (fatalArg: boolean): void => { if (fatalArg) optionsArg.setExitCode(1); else if (optionsArg.getExitCode() === undefined) optionsArg.setExitCode(0); if (!watchdog) { watchdog = setTimeout(() => { watchdog = undefined; try { closeDescriptors(); } finally { optionsArg.forceExit(optionsArg.getExitCode() ?? 1); } }, optionsArg.timeoutMs); } if (shutdownTask) return; shutdownTask = optionsArg.dispose().then(() => { closeDescriptors(); if (watchdog) { clearTimeout(watchdog); watchdog = undefined; } }).catch(() => { optionsArg.setExitCode(1); try { closeDescriptors(); } catch { // The armed watchdog retries descriptor closure before forcing process exit. } }); }; };