@@ -146,37 +146,43 @@ async function* fromReadable(val) {
146
146
yield * createReadableStreamAsyncIterator ( val ) ;
147
147
}
148
148
149
+ function pumpStdio ( iterable , writable , finish ) {
150
+ let iterator ;
151
+ if ( iterable [ SymbolAsyncIterator ] )
152
+ iterator = iterable [ SymbolAsyncIterator ] ( ) ;
153
+ else if ( iterable [ SymbolIterator ] )
154
+ iterator = iterable [ SymbolIterator ] ( ) ;
155
+
156
+ async function _next ( err ) {
157
+ if ( err ) {
158
+ return finish ( err ) ;
159
+ }
160
+ try {
161
+ const { value, done } = await iterator . next ( ) ;
162
+ if ( done ) {
163
+ return finish ( ) ;
164
+ }
165
+ writable . write ( value , _next ) ;
166
+ } catch ( err ) {
167
+ finish ( err ) ;
168
+ }
169
+ }
170
+ _next ( ) ;
171
+ }
172
+
149
173
async function pump ( iterable , writable , finish ) {
150
174
if ( ! EE ) {
151
175
EE = require ( 'events' ) ;
152
176
}
153
177
let error ;
154
178
try {
155
- if ( ! isStdio ( writable ) ) {
156
- for await ( const chunk of iterable ) {
157
- if ( ! writable . write ( chunk ) ) {
158
- if ( writable . destroyed ) return ;
159
- await EE . once ( writable , 'drain' ) ;
160
- }
161
- }
162
- writable . end ( ) ;
163
- } else {
164
- const errorPromise = new Promise ( ( resolve , reject ) => {
165
- writable . on ( 'error' , reject ) ;
166
- } ) ;
167
- // Don't propagate to unhandledRejection
168
- errorPromise . catch ( ( ) => { } ) ;
169
- for await ( const chunk of iterable ) {
170
- await Promise . race ( [
171
- errorPromise ,
172
- new Promise ( ( resolve , reject ) => {
173
- writable . write ( chunk , null , ( err ) => {
174
- err ? reject ( err ) : resolve ( ) ;
175
- } ) ;
176
- } )
177
- ] ) ;
179
+ for await ( const chunk of iterable ) {
180
+ if ( ! writable . write ( chunk ) ) {
181
+ if ( writable . destroyed ) return ;
182
+ await EE . once ( writable , 'drain' ) ;
178
183
}
179
184
}
185
+ writable . end ( ) ;
180
186
} catch ( err ) {
181
187
error = err ;
182
188
} finally {
@@ -292,7 +298,11 @@ function pipeline(...streams) {
292
298
ret = makeAsyncIterable ( ret ) ;
293
299
294
300
finishCount ++ ;
295
- pump ( ret , stream , finish ) ;
301
+ if ( isStdio ( stream ) ) {
302
+ pumpStdio ( ret , stream , finish ) ;
303
+ } else {
304
+ pump ( ret , stream , finish ) ;
305
+ }
296
306
}
297
307
ret = stream ;
298
308
} else {
0 commit comments