()
| 113 | let killed = false; |
| 114 | |
| 115 | const killProc = async (): Promise<void> => { |
| 116 | if (killed) return; |
| 117 | killed = true; |
| 118 | try { |
| 119 | await proc.kill('SIGTERM'); |
| 120 | } catch { |
| 121 | /* process already gone */ |
| 122 | } |
| 123 | const exited = proc |
| 124 | .wait() |
| 125 | .then(() => true) |
| 126 | .catch(() => true); |
| 127 | const raced = await Promise.race([ |
| 128 | exited, |
| 129 | new Promise<false>((resolve) => { |
| 130 | setTimeout(() => { |
| 131 | resolve(false); |
| 132 | }, SIGTERM_GRACE_MS); |
| 133 | }), |
| 134 | ]); |
| 135 | if (!raced && proc.exitCode === null) { |
| 136 | try { |
| 137 | await proc.kill('SIGKILL'); |
| 138 | } catch { |
| 139 | /* ignore */ |
| 140 | } |
| 141 | } |
| 142 | await disposeProcess(proc); |
| 143 | }; |
| 144 | |
| 145 | const onAbort = (): void => { |
| 146 | aborted = true; |
no test coverage detected