diff options
Diffstat (limited to 'packages/cli/src')
| -rw-r--r-- | packages/cli/src/utils/readStdin.ts | 24 | ||||
| -rw-r--r-- | packages/cli/src/utils/sandbox.ts | 54 |
2 files changed, 57 insertions, 21 deletions
diff --git a/packages/cli/src/utils/readStdin.ts b/packages/cli/src/utils/readStdin.ts index d890aa2c..2e005526 100644 --- a/packages/cli/src/utils/readStdin.ts +++ b/packages/cli/src/utils/readStdin.ts @@ -9,19 +9,31 @@ export async function readStdin(): Promise<string> { let data = ''; process.stdin.setEncoding('utf8'); - process.stdin.on('readable', () => { + const onReadable = () => { let chunk; while ((chunk = process.stdin.read()) !== null) { data += chunk; } - }); + }; - process.stdin.on('end', () => { + const onEnd = () => { + cleanup(); resolve(data); - }); + }; - process.stdin.on('error', (err) => { + const onError = (err: Error) => { + cleanup(); reject(err); - }); + }; + + const cleanup = () => { + process.stdin.removeListener('readable', onReadable); + process.stdin.removeListener('end', onEnd); + process.stdin.removeListener('error', onError); + }; + + process.stdin.on('readable', onReadable); + process.stdin.on('end', onEnd); + process.stdin.on('error', onError); }); } diff --git a/packages/cli/src/utils/sandbox.ts b/packages/cli/src/utils/sandbox.ts index f33cb480..e583f0ff 100644 --- a/packages/cli/src/utils/sandbox.ts +++ b/packages/cli/src/utils/sandbox.ts @@ -536,28 +536,28 @@ async function pullImage(sandbox: string, image: string): Promise<boolean> { const pullProcess = spawn(sandbox, args, { stdio: 'pipe' }); let stderrData = ''; - if (pullProcess.stdout) { - pullProcess.stdout.on('data', (data) => { - console.info(data.toString().trim()); // Show pull progress - }); - } - if (pullProcess.stderr) { - pullProcess.stderr.on('data', (data) => { - stderrData += data.toString(); - console.error(data.toString().trim()); // Show pull errors/info from the command itself - }); - } - pullProcess.on('error', (err) => { + const onStdoutData = (data: Buffer) => { + console.info(data.toString().trim()); // Show pull progress + }; + + const onStderrData = (data: Buffer) => { + stderrData += data.toString(); + console.error(data.toString().trim()); // Show pull errors/info from the command itself + }; + + const onError = (err: Error) => { console.warn( `Failed to start '${sandbox} pull ${image}' command: ${err.message}`, ); + cleanup(); resolve(false); - }); + }; - pullProcess.on('close', (code) => { + const onClose = (code: number | null) => { if (code === 0) { console.info(`Successfully pulled image ${image}.`); + cleanup(); resolve(true); } else { console.warn( @@ -566,9 +566,33 @@ async function pullImage(sandbox: string, image: string): Promise<boolean> { if (stderrData.trim()) { // Details already printed by the stderr listener above } + cleanup(); resolve(false); } - }); + }; + + const cleanup = () => { + if (pullProcess.stdout) { + pullProcess.stdout.removeListener('data', onStdoutData); + } + if (pullProcess.stderr) { + pullProcess.stderr.removeListener('data', onStderrData); + } + pullProcess.removeListener('error', onError); + pullProcess.removeListener('close', onClose); + if (pullProcess.connected) { + pullProcess.disconnect(); + } + }; + + if (pullProcess.stdout) { + pullProcess.stdout.on('data', onStdoutData); + } + if (pullProcess.stderr) { + pullProcess.stderr.on('data', onStderrData); + } + pullProcess.on('error', onError); + pullProcess.on('close', onClose); }); } |
