| | | 1 | | import type { ProcessExit } from './ports/IProcessRunner.js'; |
| | | 2 | | |
| | | 3 | | /** |
| | | 4 | | * Exit codes used by exec mode. They follow GNU `env` and `docker run`, so a |
| | | 5 | | * caller can tell an Envilder failure apart from the child's own exit code. |
| | | 6 | | */ |
| | 9 | 7 | | export const EXEC_ENVILDER_FAILURE = 125; |
| | 9 | 8 | | export const EXEC_COMMAND_NOT_EXECUTABLE = 126; |
| | 9 | 9 | | export const EXEC_COMMAND_NOT_FOUND = 127; |
| | | 10 | | |
| | 9 | 11 | | const SIGNAL_EXIT_BASE = 128; |
| | 9 | 12 | | const UNKNOWN_CHILD_FAILURE = 1; |
| | | 13 | | |
| | | 14 | | /** |
| | | 15 | | * Translates how the child ended into the exit code Envilder must return: |
| | | 16 | | * the child's own code, or `128 + n` when it was killed by signal `n`. |
| | | 17 | | */ |
| | | 18 | | export function exitCodeForChild( |
| | | 19 | | exit: ProcessExit, |
| | | 20 | | signalNumber: (signal: NodeJS.Signals) => number, |
| | | 21 | | ): number { |
| | 53 | 22 | | if (exit.code !== null) { |
| | 46 | 23 | | return exit.code; |
| | | 24 | | } |
| | 7 | 25 | | if (exit.signal !== null) { |
| | 7 | 26 | | return SIGNAL_EXIT_BASE + signalNumber(exit.signal); |
| | | 27 | | } |
| | 0 | 28 | | return UNKNOWN_CHILD_FAILURE; |
| | | 29 | | } |