123456789101112131415161718192021222324 |
- // Like Bash, we await both subprocesses. This is unlike some other shells which only await the destination subprocess.
- // Like Bash with the `pipefail` option, if either subprocess fails, the whole pipe fails.
- // Like Bash, if both subprocesses fail, we return the failure of the destination.
- // This ensures both subprocesses' errors are present, using `error.pipedFrom`.
- export const waitForBothSubprocesses = async subprocessPromises => {
- const [
- {status: sourceStatus, reason: sourceReason, value: sourceResult = sourceReason},
- {status: destinationStatus, reason: destinationReason, value: destinationResult = destinationReason},
- ] = await subprocessPromises;
- if (!destinationResult.pipedFrom.includes(sourceResult)) {
- destinationResult.pipedFrom.push(sourceResult);
- }
- if (destinationStatus === 'rejected') {
- throw destinationResult;
- }
- if (sourceStatus === 'rejected') {
- throw sourceResult;
- }
- return destinationResult;
- };
|