From d43a4be0d291d2cb1fb4f5a9353b509e87f849eb Mon Sep 17 00:00:00 2001 From: DanSnow Date: Sat, 1 Dec 2018 02:44:05 +0800 Subject: [PATCH] Add Process.output (#1235) --- js/process.ts | 21 +++++++++++++++++++-- js/process_test.ts | 11 +++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/js/process.ts b/js/process.ts index 0a1393ed09..50df882686 100644 --- a/js/process.ts +++ b/js/process.ts @@ -2,9 +2,11 @@ import * as dispatch from "./dispatch"; import * as flatbuffers from "./flatbuffers"; import * as msg from "gen/msg_generated"; -import { assert, unreachable } from "./util"; -import { close, File } from "./files"; + +import { File, close } from "./files"; import { ReadCloser, WriteCloser } from "./io"; +import { readAll } from "./buffer"; +import { assert, unreachable } from "./util"; /** How to handle subsubprocess stdio. * @@ -59,6 +61,21 @@ export class Process { return await runStatus(this.rid); } + /** Buffer the stdout and return it as Uint8Array after EOF. + * You must have set stdout to "piped" in when creating the process. + * This calls close() on stdout after its done. + */ + async output(): Promise { + if (!this.stdout) { + throw new Error("Process.output: stdout is undefined"); + } + try { + return await readAll(this.stdout); + } finally { + this.stdout.close(); + } + } + close(): void { close(this.rid); } diff --git a/js/process_test.ts b/js/process_test.ts index 6cba1a1b7a..ca2a4a64ae 100644 --- a/js/process_test.ts +++ b/js/process_test.ts @@ -176,3 +176,14 @@ testPerm({ run: true }, async function runStderrPiped() { assertEqual(status.signal, undefined); p.close(); }); + +testPerm({ run: true }, async function runOutput() { + const p = run({ + args: ["python", "-c", "import sys; sys.stdout.write('hello')"], + stdout: "piped" + }); + const output = await p.output(); + const s = new TextDecoder().decode(output); + assertEqual(s, "hello"); + p.close(); +});