{"version":3,"file":"post-exit-stdio-guard.d.ts","sourceRoot":"","sources":["../../../src/shared/post-exit-stdio-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,UAAU,yBAAyB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CACf;AAED,UAAU,mBAAmB;IAC5B,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC/B,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC/B,EAAE,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,UAAU,aAAa;IACtB,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;CAChD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAMpF;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,yBAAyB,GAAG,MAAM,IAAI,CA4DnH","sourcesContent":["import type { ChildProcess } from \"node:child_process\";\n\ninterface PostExitStdioGuardOptions {\n\tidleMs: number;\n\thardMs: number;\n}\n\ninterface ChildWithPipedStdio {\n\tstdout: ChildProcess[\"stdout\"];\n\tstderr: ChildProcess[\"stderr\"];\n\ton: ChildProcess[\"on\"];\n}\n\ninterface ChildWithKill {\n\tkill(signal?: NodeJS.Signals | number): boolean;\n}\n\nexport function trySignalChild(child: ChildWithKill, signal: NodeJS.Signals): boolean {\n\ttry {\n\t\treturn child.kill(signal);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function attachPostExitStdioGuard(child: ChildWithPipedStdio, options: PostExitStdioGuardOptions): () => void {\n\tconst { idleMs, hardMs } = options;\n\tlet exited = false;\n\tlet stdoutEnded = false;\n\tlet stderrEnded = false;\n\tlet idleTimer: NodeJS.Timeout | undefined;\n\tlet hardTimer: NodeJS.Timeout | undefined;\n\n\tconst destroyUnendedStdio = () => {\n\t\tif (!stdoutEnded) {\n\t\t\ttry {\n\t\t\t\tchild.stdout?.destroy();\n\t\t\t} catch {}\n\t\t}\n\t\tif (!stderrEnded) {\n\t\t\ttry {\n\t\t\t\tchild.stderr?.destroy();\n\t\t\t} catch {}\n\t\t}\n\t};\n\n\tconst clearTimers = () => {\n\t\tif (idleTimer) {\n\t\t\tclearTimeout(idleTimer);\n\t\t\tidleTimer = undefined;\n\t\t}\n\t\tif (hardTimer) {\n\t\t\tclearTimeout(hardTimer);\n\t\t\thardTimer = undefined;\n\t\t}\n\t};\n\n\tconst armIdleTimer = () => {\n\t\tif (!exited) return;\n\t\tif (idleTimer) clearTimeout(idleTimer);\n\t\tidleTimer = setTimeout(destroyUnendedStdio, idleMs);\n\t\tidleTimer.unref?.();\n\t};\n\n\tchild.stdout?.on(\"data\", armIdleTimer);\n\tchild.stderr?.on(\"data\", armIdleTimer);\n\tchild.stdout?.on(\"end\", () => {\n\t\tstdoutEnded = true;\n\t\tif (stdoutEnded && stderrEnded) clearTimers();\n\t});\n\tchild.stderr?.on(\"end\", () => {\n\t\tstderrEnded = true;\n\t\tif (stdoutEnded && stderrEnded) clearTimers();\n\t});\n\tchild.on(\"exit\", () => {\n\t\texited = true;\n\t\tarmIdleTimer();\n\t\tif (hardTimer) return;\n\t\thardTimer = setTimeout(destroyUnendedStdio, hardMs);\n\t\thardTimer.unref?.();\n\t});\n\tchild.on(\"close\", clearTimers);\n\tchild.on(\"error\", clearTimers);\n\n\treturn clearTimers;\n}\n"]}