From c8d8becc7898e65e0c66358b6e2c6775cf483521 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Mon, 26 Oct 2015 16:10:23 -0700 Subject: [PATCH 1/2] use process.stdout.write on server --- src/server/server.ts | 40 ++++++++++++++-------------------------- 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/src/server/server.ts b/src/server/server.ts index 26279959ad7..ff672ecaefc 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -156,36 +156,24 @@ namespace ts.server { var logger = createLoggerFromEnv(); let pending: string[] = []; - function queueMessage(s: string) { - pending.push(s); - if (pending.length === 1) { - drain(); + let canWrite = true; + function writeMessage(s: string) { + if (!canWrite) { + pending.push(s); + } + else { + canWrite = false; + process.stdout.write(new Buffer(s, "utf8"), () => { + canWrite = true; + if (pending.length) { + writeMessage(pending.shift()); + } + }) } } - function drain() { - Debug.assert(pending.length > 0); - writeBuffer(new Buffer(pending[0], "utf8"), 0); - } - - function writeBuffer(buffer: Buffer, offset: number) { - const toWrite = buffer.length - offset; - fs.write(1, buffer, offset, toWrite, undefined, (err, written, buffer) => { - if (toWrite > written) { - writeBuffer(buffer, offset + written); - } - else { - Debug.assert(pending.length > 0); - pending.shift(); - if (pending.length > 0) { - drain(); - } - } - }); - } - // Override sys.write because fs.writeSync is not reliable on Node 4 - ts.sys.write = (s: string) => queueMessage(s); + ts.sys.write = (s: string) => writeMessage(s); var ioSession = new IOSession(ts.sys, logger); process.on('uncaughtException', function(err: Error) { From 3313e5b96570953af30afaf6f0e8c09063fd949a Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Mon, 26 Oct 2015 16:54:33 -0700 Subject: [PATCH 2/2] addressed PR feedback --- src/server/server.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/server/server.ts b/src/server/server.ts index ff672ecaefc..f48be53520e 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -163,12 +163,14 @@ namespace ts.server { } else { canWrite = false; - process.stdout.write(new Buffer(s, "utf8"), () => { - canWrite = true; - if (pending.length) { - writeMessage(pending.shift()); - } - }) + process.stdout.write(new Buffer(s, "utf8"), setCanWriteFlagAndWriteMessageIfNecessary); + } + } + + function setCanWriteFlagAndWriteMessageIfNecessary() { + canWrite = true; + if (pending.length) { + writeMessage(pending.shift()); } }