From 78ed651184ec7e1f74d7a71b594618725450d8f6 Mon Sep 17 00:00:00 2001 From: Inga Lovinde <52715130+inga-lovinde@users.noreply.github.com> Date: Wed, 1 Mar 2017 10:59:41 +0300 Subject: [PATCH] Refactored dotnetbuilderwrapper to use promises; fixed a bug causing incomplete data from wrapper --- BuildServer/lib/tasks/dotnetbuilderwrapper.ts | 41 +++++++++++++------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/BuildServer/lib/tasks/dotnetbuilderwrapper.ts b/BuildServer/lib/tasks/dotnetbuilderwrapper.ts index 4c5eda1..d3a970d 100644 --- a/BuildServer/lib/tasks/dotnetbuilderwrapper.ts +++ b/BuildServer/lib/tasks/dotnetbuilderwrapper.ts @@ -7,25 +7,40 @@ import { WritableStreamBuffer } from "stream-buffers"; import settings from "../../settings"; const wrapBuilder = (builder, input, onExit) => { - const resultBuffer = new WritableStreamBuffer(); - const errorBuffer = new WritableStreamBuffer(); - - builder.stdout.on("data", (data) => { - resultBuffer.write(data); + const stdoutPromise = new Promise((resolve, reject) => { + const streamBuffer = new WritableStreamBuffer(); + builder.stdout + .on("error", reject) + .pipe(streamBuffer) + .on("error", reject) + .on("finish", () => { + streamBuffer.end(); + resolve(streamBuffer.getContentsAsString()); + }); }); - builder.stderr.on("data", (data) => { - errorBuffer.write(data); + const stderrPromise = new Promise((resolve, reject) => { + const streamBuffer = new WritableStreamBuffer(); + builder.stderr + .on("error", reject) + .pipe(streamBuffer) + .on("error", reject) + .on("finish", () => { + streamBuffer.end(); + resolve(streamBuffer.getContentsAsString()); + }); }); - builder.on("exit", (code) => { - resultBuffer.end(); - errorBuffer.end(); - onExit(code, resultBuffer.getContentsAsString(), errorBuffer.getContentsAsString()); + const builderPromise = new Promise((resolve, reject) => { + builder.stdin.write(input); + builder.stdin.end(); + builder.on("exit", resolve); }); - builder.stdin.write(input); - builder.stdin.end(); + Promise.all([stdoutPromise, stderrPromise, builderPromise]).then((values) => { + const [result, builderError, code] = values; + onExit(code, result, builderError); + }).catch((err) => onExit(0, undefined, err)); }; export default ((params, processor) => () => {