@@ -641,8 +641,16 @@ function howMuchToRead(n, state) {
641641 return ( state [ kState ] & kEnded ) !== 0 ? state . length : 0 ;
642642}
643643
644+ Readable . prototype . readv = function readv ( ) {
645+ return _read . call ( this , true ) ;
646+ } ;
647+
648+ Readable . prototype . read = function read ( ) {
649+ return _read . call ( this , false ) ;
650+ }
651+
644652// You can override either this method, or the async _read(n) below.
645- Readable . prototype . read = function ( n ) {
653+ function _read ( n , returnArr ) {
646654 debug ( 'read' , n ) ;
647655 // Same as parseInt(undefined, 10), however V8 7.3 performance regressed
648656 // in this scenario, so we are doing it manually.
@@ -748,7 +756,7 @@ Readable.prototype.read = function(n) {
748756
749757 let ret ;
750758 if ( n > 0 )
751- ret = fromList ( n , state ) ;
759+ ret = fromList ( n , state , returnArr ) ;
752760 else
753761 ret = null ;
754762
@@ -777,7 +785,13 @@ Readable.prototype.read = function(n) {
777785
778786 if ( ret !== null && ( state [ kState ] & ( kErrorEmitted | kCloseEmitted ) ) === 0 ) {
779787 state [ kState ] |= kDataEmitted ;
780- this . emit ( 'data' , ret ) ;
788+ if ( returnArr ) {
789+ for ( let i = 0 ; i < ret . length ; ++ i ) {
790+ this . emit ( 'data' , ret [ i ] ) ;
791+ }
792+ } else {
793+ this . emit ( 'data' , ret ) ;
794+ }
781795 }
782796
783797 return ret ;
@@ -1582,7 +1596,7 @@ Readable._fromList = fromList;
15821596// Length is the combined lengths of all the buffers in the list.
15831597// This function is designed to be inlinable, so please take care when making
15841598// changes to the function body.
1585- function fromList ( n , state ) {
1599+ function fromList ( n , state , returnArr ) {
15861600 // nothing buffered.
15871601 if ( state . length === 0 )
15881602 return null ;
@@ -1594,8 +1608,13 @@ function fromList(n, state) {
15941608 const len = buf . length ;
15951609
15961610 if ( ( state [ kState ] & kObjectMode ) !== 0 ) {
1597- ret = buf [ idx ] ;
1598- buf [ idx ++ ] = null ;
1611+ if ( returnArr ) {
1612+ ret = buf . slice ( 0 , idx ) ;
1613+ } else {
1614+ ret = buf [ idx ] ;
1615+ buf [ idx ++ ] = null ;
1616+ ret = returnArr ? [ ret ] : ret ;
1617+ }
15991618 } else if ( ! n || n >= state . length ) {
16001619 // Read it all, truncate the list.
16011620 if ( ( state [ kState ] & kDecoder ) !== 0 ) {
@@ -1604,11 +1623,16 @@ function fromList(n, state) {
16041623 ret += buf [ idx ] ;
16051624 buf [ idx ++ ] = null ;
16061625 }
1626+ ret = returnArr ? [ ret ] : ret ;
16071627 } else if ( len - idx === 0 ) {
16081628 ret = Buffer . alloc ( 0 ) ;
1629+ ret = returnArr ? [ ret ] : ret ;
16091630 } else if ( len - idx === 1 ) {
16101631 ret = buf [ idx ] ;
16111632 buf [ idx ++ ] = null ;
1633+ ret = returnArr ? [ ret ] : ret ;
1634+ } else if ( returnArr ) {
1635+ ret = buf . slice ( 0 , idx ) ;
16121636 } else {
16131637 ret = Buffer . allocUnsafe ( state . length ) ;
16141638
@@ -1623,10 +1647,12 @@ function fromList(n, state) {
16231647 // `slice` is the same for buffers and strings.
16241648 ret = buf [ idx ] . slice ( 0 , n ) ;
16251649 buf [ idx ] = buf [ idx ] . slice ( n ) ;
1650+ ret = returnArr ? [ ret ] : ret ;
16261651 } else if ( n === buf [ idx ] . length ) {
16271652 // First chunk is a perfect match.
16281653 ret = buf [ idx ] ;
16291654 buf [ idx ++ ] = null ;
1655+ ret = returnArr ? [ ret ] : ret ;
16301656 } else if ( ( state [ kState ] & kDecoder ) !== 0 ) {
16311657 ret = '' ;
16321658 while ( idx < len ) {
@@ -1646,6 +1672,27 @@ function fromList(n, state) {
16461672 break ;
16471673 }
16481674 }
1675+ ret = returnArr ? [ ret ] : ret ;
1676+ } else if ( returnArr ) {
1677+ ret = [ ] ;
1678+ const retLen = n ;
1679+ while ( idx < len ) {
1680+ const data = buf [ idx ] ;
1681+ if ( n > data . length ) {
1682+ ret . push ( data ) ;
1683+ n -= data . length ;
1684+ buf [ idx ++ ] = null ;
1685+ } else {
1686+ if ( n === data . length ) {
1687+ ret . push ( data ) ;
1688+ buf [ idx ++ ] = null ;
1689+ } else {
1690+ ret . push ( new FastBuffer ( data . buffer , data . byteOffset , n ) ) ;
1691+ buf [ idx ] = new FastBuffer ( data . buffer , data . byteOffset + n , data . length - n ) ;
1692+ }
1693+ break ;
1694+ }
1695+ }
16491696 } else {
16501697 ret = Buffer . allocUnsafe ( n ) ;
16511698
0 commit comments