diff --git a/js/process.ts b/js/process.ts index 0a1393ed099a7ec0b166d1f5b1037b86f252acad..50df88268697f5c3753c48f999149e516b6777d1 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 6cba1a1b7a8dface22205701fbab8e26298c4828..ca2a4a64aed78d1b80bd489a62e85bedcae0753d 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(); +});