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