@@ -109,7 +109,7 @@ async function* fromReadable(val) {
109
109
yield * Readable . prototype [ SymbolAsyncIterator ] . call ( val ) ;
110
110
}
111
111
112
- async function pump ( iterable , writable , finish ) {
112
+ async function pump ( iterable , writable , finish , opts ) {
113
113
let error ;
114
114
let onresolve = null ;
115
115
@@ -153,7 +153,9 @@ async function pump(iterable, writable, finish) {
153
153
}
154
154
}
155
155
156
- writable . end ( ) ;
156
+ if ( opts ?. end !== false ) {
157
+ writable . end ( ) ;
158
+ }
157
159
158
160
await wait ( ) ;
159
161
@@ -227,17 +229,22 @@ function pipelineImpl(streams, callback, opts) {
227
229
const stream = streams [ i ] ;
228
230
const reading = i < streams . length - 1 ;
229
231
const writing = i > 0 ;
232
+ const end = reading || opts ?. end !== false ;
230
233
231
234
if ( isNodeStream ( stream ) ) {
232
- finishCount ++ ;
233
- destroys . push ( destroyer ( stream , reading , writing , ( err ) => {
234
- if ( ! err && ! reading && isReadableFinished ( stream , false ) ) {
235
- stream . read ( 0 ) ;
236
- destroyer ( stream , true , writing , finish ) ;
237
- } else {
238
- finish ( err ) ;
239
- }
240
- } ) ) ;
235
+ if ( end ) {
236
+ finishCount ++ ;
237
+ destroys . push ( destroyer ( stream , reading , writing , ( err ) => {
238
+ if ( ! err && ! reading && isReadableFinished ( stream , false ) ) {
239
+ stream . read ( 0 ) ;
240
+ destroyer ( stream , true , writing , finish ) ;
241
+ } else {
242
+ finish ( err ) ;
243
+ }
244
+ } ) ) ;
245
+ } else {
246
+ stream . on ( 'error' , finish ) ;
247
+ }
241
248
}
242
249
243
250
if ( i === 0 ) {
@@ -282,14 +289,17 @@ function pipelineImpl(streams, callback, opts) {
282
289
then . call ( ret ,
283
290
( val ) => {
284
291
value = val ;
285
- pt . end ( val ) ;
292
+ pt . write ( val ) ;
293
+ if ( end ) {
294
+ pt . end ( ) ;
295
+ }
286
296
} , ( err ) => {
287
297
pt . destroy ( err ) ;
288
298
} ,
289
299
) ;
290
300
} else if ( isIterable ( ret , true ) ) {
291
301
finishCount ++ ;
292
- pump ( ret , pt , finish ) ;
302
+ pump ( ret , pt , finish , { end } ) ;
293
303
} else {
294
304
throw new ERR_INVALID_RETURN_VALUE (
295
305
'AsyncIterable or Promise' , 'destination' , ret ) ;
@@ -302,7 +312,7 @@ function pipelineImpl(streams, callback, opts) {
302
312
}
303
313
} else if ( isNodeStream ( stream ) ) {
304
314
if ( isReadableNodeStream ( ret ) ) {
305
- ret . pipe ( stream ) ;
315
+ ret . pipe ( stream , { end } ) ;
306
316
307
317
// Compat. Before node v10.12.0 stdio used to throw an error so
308
318
// pipe() did/does not end() stdio destinations.
@@ -314,7 +324,7 @@ function pipelineImpl(streams, callback, opts) {
314
324
ret = makeAsyncIterable ( ret ) ;
315
325
316
326
finishCount ++ ;
317
- pump ( ret , stream , finish ) ;
327
+ pump ( ret , stream , finish , { end } ) ;
318
328
}
319
329
ret = stream ;
320
330
} else {
0 commit comments