Skip to content

Commit c3c66a4

Browse files
committed
Merge pull request #5354 from zhengbli/fixWriteSync
Change sys.write to async in tsserver
2 parents c4e5468 + bf1335b commit c3c66a4

File tree

1 file changed

+37
-5
lines changed

1 file changed

+37
-5
lines changed

src/server/server.ts

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace ts.server {
1111
input: process.stdin,
1212
output: process.stdout,
1313
terminal: false,
14-
});
14+
});
1515

1616
class Logger implements ts.server.Logger {
1717
fd = -1;
@@ -58,7 +58,7 @@ namespace ts.server {
5858
isVerbose() {
5959
return this.loggingEnabled() && (this.level == "verbose");
6060
}
61-
61+
6262

6363
msg(s: string, type = "Err") {
6464
if (this.fd < 0) {
@@ -89,18 +89,18 @@ namespace ts.server {
8989
}
9090

9191
exit() {
92-
this.projectService.log("Exiting...","Info");
92+
this.projectService.log("Exiting...", "Info");
9393
this.projectService.closeLog();
9494
process.exit(0);
9595
}
9696

9797
listen() {
98-
rl.on('line',(input: string) => {
98+
rl.on('line', (input: string) => {
9999
var message = input.trim();
100100
this.onMessage(message);
101101
});
102102

103-
rl.on('close',() => {
103+
rl.on('close', () => {
104104
this.exit();
105105
});
106106
}
@@ -155,6 +155,38 @@ namespace ts.server {
155155

156156
var logger = createLoggerFromEnv();
157157

158+
let pending: string[] = [];
159+
function queueMessage(s: string) {
160+
pending.push(s);
161+
if (pending.length === 1) {
162+
drain();
163+
}
164+
}
165+
166+
function drain() {
167+
Debug.assert(pending.length > 0);
168+
writeBuffer(new Buffer(pending[0], "utf8"), 0);
169+
}
170+
171+
function writeBuffer(buffer: Buffer, offset: number) {
172+
const toWrite = buffer.length - offset;
173+
fs.write(1, buffer, offset, toWrite, undefined, (err, written, buffer) => {
174+
if (toWrite > written) {
175+
writeBuffer(buffer, offset + written);
176+
}
177+
else {
178+
Debug.assert(pending.length > 0);
179+
pending.shift();
180+
if (pending.length > 0) {
181+
drain();
182+
}
183+
}
184+
});
185+
}
186+
187+
// Override sys.write because fs.writeSync is not reliable on Node 4
188+
ts.sys.write = (s: string) => queueMessage(s);
189+
158190
var ioSession = new IOSession(ts.sys, logger);
159191
process.on('uncaughtException', function(err: Error) {
160192
ioSession.logError(err, "unknown");

0 commit comments

Comments
 (0)