@@ -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,52 @@ namespace ts.server {
155
155
156
156
var logger = createLoggerFromEnv ( ) ;
157
157
158
+ var messagesToWrite : string [ ] = [ ] ;
159
+ function addMessage ( message : string ) {
160
+ messagesToWrite . push ( message ) ;
161
+ // If the current message list has more than 1 messages, that means
162
+ // the current writing is not ended yet, so don't start new writeNext
163
+ // as it may interfere with ongoing writing sessions.
164
+ if ( messagesToWrite . length === 1 ) {
165
+ startWrite ( ) ;
166
+ }
167
+ }
168
+
169
+ function startWrite ( ) {
170
+ if ( messagesToWrite . length === 0 ) {
171
+ return ;
172
+ }
173
+
174
+ let messageToWrite = messagesToWrite [ 0 ] ;
175
+ let buffer = new Buffer ( messageToWrite , "utf8" ) ;
176
+ write ( buffer ) ;
177
+ }
178
+
179
+ function writeNext ( ) {
180
+ if ( messagesToWrite . length > 0 ) {
181
+ messagesToWrite = copyListRemovingItem ( messagesToWrite [ 0 ] , messagesToWrite ) ;
182
+ }
183
+ startWrite ( ) ;
184
+ }
185
+
186
+ function write ( buffer : any , offset = 0 ) {
187
+ let toWrite = buffer . length - offset ;
188
+ fs . write ( 1 , buffer , offset , toWrite , /*position*/ undefined , function ( err : any , written : number , buffer : any ) {
189
+ offset += written ;
190
+ if ( toWrite > written ) {
191
+ // there are some content left that still need to be written
192
+ write ( buffer , offset ) ;
193
+ }
194
+ else {
195
+ // ready to write the next string
196
+ writeNext ( ) ;
197
+ }
198
+ } )
199
+ }
200
+
201
+ // Override sys.write because fs.writeSync is not reliable on Node 4
202
+ ts . sys . write = ( s : string ) => addMessage ( s ) ;
203
+
158
204
var ioSession = new IOSession ( ts . sys , logger ) ;
159
205
process . on ( 'uncaughtException' , function ( err : Error ) {
160
206
ioSession . logError ( err , "unknown" ) ;
0 commit comments