@@ -26,19 +26,21 @@ class FakeStream extends PassThrough {
26
26
}
27
27
}
28
28
29
+ export const realStderrWrite = process . stderr . write . bind ( process . stderr )
30
+ export const realStdoutWrite = process . stdout . write . bind ( process . stdout ) ;
29
31
// console.log, console.error maintain references to write(), so it must be replaced with a permenant hook
30
- let stderrWrite = process . stderr . write ;
31
- let stdoutWrite = process . stdout . write ;
32
+ let stderrWrite = realStderrWrite ;
33
+ let stdoutWrite = realStdoutWrite ;
32
34
33
- Object . defineProperty ( process , 'stdout ' , {
35
+ Object . defineProperty ( process , 'stderr ' , {
34
36
configurable : true ,
35
37
enumerable : true ,
36
- get : ( stdin => ( ) => stdin ) ( new FakeStream ) ,
38
+ get : ( stderr => ( ) => stderr ) ( new FakeStream ) ,
37
39
} ) ;
38
- Object . defineProperty ( process , 'stderr ' , {
40
+ Object . defineProperty ( process , 'stdout ' , {
39
41
configurable : true ,
40
42
enumerable : true ,
41
- get : ( stdin => ( ) => stdin ) ( new FakeStream ) ,
43
+ get : ( stdout => ( ) => stdout ) ( new FakeStream ) ,
42
44
} ) ;
43
45
44
46
process . stderr . write = function ( ) {
@@ -130,6 +132,14 @@ export class Command {
130
132
this . removeListener ( 'resume' , stdinResume ) ;
131
133
ref . unref ( ) ;
132
134
} ) ;
135
+ process . stdin . on ( 'newListener' , function listener ( this : NodeJS . ReadStream , type ) {
136
+ switch ( type ) {
137
+ case 'data' :
138
+ case 'end' :
139
+ this . removeListener ( 'newListener' , listener ) ;
140
+ stdin . request ( ) ;
141
+ }
142
+ } ) ;
133
143
134
144
// stdout
135
145
const stdout = new CommandStdout ( ) ;
@@ -166,13 +176,12 @@ export class Command {
166
176
class CommandStdin extends Transform {
167
177
constructor ( private readonly writer : Writable , private readonly ref : Ref ) {
168
178
super ( { writableObjectMode :true } ) ;
179
+ }
180
+
181
+ request ( ) {
169
182
// NodeJS will not flush this buffer
170
183
// a workaround is to send a newline (!) but that clutters the output
171
184
// this.writer.write(new Chunk(ChunkType.Stderr, Buffer.from('\n')));
172
- this . _request ( ) ;
173
- }
174
-
175
- private _request ( ) {
176
185
try {
177
186
this . writer . write ( new Chunk ( ChunkType . StdinStart ) ) ;
178
187
} catch ( e ) {
@@ -183,7 +192,7 @@ class CommandStdin extends Transform {
183
192
switch ( chunk . type ) {
184
193
case ChunkType . Stdin :
185
194
callback ( null , chunk . data ) ;
186
- this . _request ( ) ;
195
+ this . request ( ) ;
187
196
break ;
188
197
case ChunkType . StdinEnd :
189
198
callback ( ) ;
0 commit comments