repo_description: Process execution for humans
repo_topics: binary child-process exec execute javascript nodejs shell spawn spawned-processes streams
code: 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)';
  