@@ -11,7 +11,7 @@ namespace ts.server {
11
11
input : process . stdin ,
12
12
output : process . stdout ,
13
13
terminal : false ,
14
- } ) ;
14
+ } ) ;
15
15
16
16
class Logger implements ts . server . Logger {
17
17
fd = - 1 ;
@@ -58,7 +58,7 @@ namespace ts.server {
58
58
isVerbose ( ) {
59
59
return this . loggingEnabled ( ) && ( this . level == "verbose" ) ;
60
60
}
61
-
61
+
62
62
63
63
msg ( s : string , type = "Err" ) {
64
64
if ( this . fd < 0 ) {
@@ -89,18 +89,18 @@ namespace ts.server {
89
89
}
90
90
91
91
exit ( ) {
92
- this . projectService . log ( "Exiting..." , "Info" ) ;
92
+ this . projectService . log ( "Exiting..." , "Info" ) ;
93
93
this . projectService . closeLog ( ) ;
94
94
process . exit ( 0 ) ;
95
95
}
96
96
97
97
listen ( ) {
98
- rl . on ( 'line' , ( input : string ) => {
98
+ rl . on ( 'line' , ( input : string ) => {
99
99
var message = input . trim ( ) ;
100
100
this . onMessage ( message ) ;
101
101
} ) ;
102
102
103
- rl . on ( 'close' , ( ) => {
103
+ rl . on ( 'close' , ( ) => {
104
104
this . exit ( ) ;
105
105
} ) ;
106
106
}
@@ -155,6 +155,38 @@ namespace ts.server {
155
155
156
156
var logger = createLoggerFromEnv ( ) ;
157
157
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
+
158
190
var ioSession = new IOSession ( ts . sys , logger ) ;
159
191
process . on ( 'uncaughtException' , function ( err : Error ) {
160
192
ioSession . logError ( err , "unknown" ) ;
0 commit comments