( workspacePath: string, timeoutMs?: number, signal?: AbortSignal )
| 324 | } |
| 325 | |
| 326 | if (opts?.signal) { |
| 327 | if (opts.signal.aborted) { |
| 328 | terminate('abort'); |
| 329 | } else { |
| 330 | opts.signal.addEventListener('abort', abortHandler, { once: true }); |
| 331 | } |
| 332 | } |
| 333 | let finishing = false; |
| 334 | proc.on('close', (code, signal) => { |
| 335 | if (settled || finishing) return; |
| 336 | if (terminationReason !== null) { |
| 337 | waitForTerminatedGroup(); |
| 338 | return; |
| 339 | } |
| 340 | finishing = true; |
| 341 | clearTimers(); |
| 342 | removeAbortHandler(); |
| 343 | const exitCode = code ?? (signal === null ? 0 : 1); |
| 344 | const complete = (): void => { |
| 345 | if (settled) return; |
| 346 | settled = true; |
| 347 | resolve({ |
| 348 | stdout, |
| 349 | stderr, |
| 350 | exitCode, |
| 351 | elapsedMs: Date.now() - startedAt, |
no test coverage detected