import {makeEarlyError} from '../return/result.js'; import {abortSourceStream, endDestinationStream} from '../io/pipeline.js'; // When passing invalid arguments to `source.pipe()`, throw asynchronously. // We also abort both subprocesses. export const handlePipeArgumentsError = ({ sourceStream, sourceError, destinationStream, destinationError, fileDescriptors, sourceOptions, startTime, }) => { const error = getPipeArgumentsError({ sourceStream, sourceError, destinationStream, destinationError, }); if (error !== undefined) { throw createNonCommandError({ error, fileDescriptors, sourceOptions, startTime, }); } }; const getPipeArgumentsError = ({sourceStream, sourceError, destinationStream, destinationError}) => { if (sourceError !== undefined && destinationError !== undefined) { return destinationError; } if (destinationError !== undefined) { abortSourceStream(sourceStream); return destinationError; } if (sourceError !== undefined) { endDestinationStream(destinationStream); return sourceError; } }; // Specific error return value when passing invalid arguments to `subprocess.pipe()` or when using `unpipeSignal` export const createNonCommandError = ({error, fileDescriptors, sourceOptions, startTime}) => makeEarlyError({ error, command: PIPE_COMMAND_MESSAGE, escapedCommand: PIPE_COMMAND_MESSAGE, fileDescriptors, options: sourceOptions, startTime, isSync: false, }); const PIPE_COMMAND_MESSAGE = 'source.pipe(destination)';