47 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import {finished} from 'node:stream/promises';
 | |
| import {isStreamAbort} from '../resolve/wait-stream.js';
 | |
| 
 | |
| export const safeWaitForSubprocessStdin = async subprocessStdin => {
 | |
| 	if (subprocessStdin === undefined) {
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	try {
 | |
| 		await waitForSubprocessStdin(subprocessStdin);
 | |
| 	} catch {}
 | |
| };
 | |
| 
 | |
| export const safeWaitForSubprocessStdout = async subprocessStdout => {
 | |
| 	if (subprocessStdout === undefined) {
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	try {
 | |
| 		await waitForSubprocessStdout(subprocessStdout);
 | |
| 	} catch {}
 | |
| };
 | |
| 
 | |
| export const waitForSubprocessStdin = async subprocessStdin => {
 | |
| 	await finished(subprocessStdin, {cleanup: true, readable: false, writable: true});
 | |
| };
 | |
| 
 | |
| export const waitForSubprocessStdout = async subprocessStdout => {
 | |
| 	await finished(subprocessStdout, {cleanup: true, readable: true, writable: false});
 | |
| };
 | |
| 
 | |
| // When `readable` or `writable` aborts/errors, awaits the subprocess, for the reason mentioned above
 | |
| export const waitForSubprocess = async (subprocess, error) => {
 | |
| 	await subprocess;
 | |
| 	if (error) {
 | |
| 		throw error;
 | |
| 	}
 | |
| };
 | |
| 
 | |
| export const destroyOtherStream = (stream, isOpen, error) => {
 | |
| 	if (error && !isStreamAbort(error)) {
 | |
| 		stream.destroy(error);
 | |
| 	} else if (isOpen) {
 | |
| 		stream.destroy();
 | |
| 	}
 | |
| };
 |