88const { Buffer } = require ( 'buffer' ) ;
99
1010const {
11- ERR_INVALID_ARG_TYPE ,
12- ERR_STREAM_NULL_VALUES ,
13- } = require ( 'internal/errors' ) . codes ;
11+ aggregateTwoErrors,
12+ codes : {
13+ ERR_INVALID_ARG_TYPE ,
14+ ERR_STREAM_NULL_VALUES ,
15+ } ,
16+ } = require ( 'internal/errors' ) ;
1417
1518function from ( Readable , iterable , opts ) {
1619 let iterator ;
@@ -43,6 +46,7 @@ function from(Readable, iterable, opts) {
4346 // TODO(ronag): What options should be allowed?
4447 ...opts ,
4548 } ) ;
49+ const originalDestroy = readable . _destroy ;
4650
4751 // Flag to protect against _read
4852 // being called before last iteration completion.
@@ -64,11 +68,18 @@ function from(Readable, iterable, opts) {
6468 } ;
6569
6670 readable . _destroy = function ( error , cb ) {
67- PromisePrototypeThen (
68- close ( error ) ,
69- ( ) => process . nextTick ( cb , error ) , // nextTick is here in case cb throws
70- ( e ) => process . nextTick ( cb , e || error ) ,
71- ) ;
71+ originalDestroy . call ( this , error , ( destroyError ) => {
72+ const combinedError = destroyError || error ;
73+ PromisePrototypeThen (
74+ close ( combinedError ) ,
75+ // nextTick is here in case cb throws
76+ ( ) => process . nextTick ( cb , combinedError ) ,
77+ ( closeError ) => process . nextTick (
78+ cb ,
79+ aggregateTwoErrors ( combinedError , closeError ) ,
80+ ) ,
81+ ) ;
82+ } ) ;
7283 } ;
7384
7485 async function close ( error ) {
0 commit comments