@@ -10,15 +10,11 @@ var processNextTick = require('process-nextick-args');
10
10
var isArray = require ( 'isarray' ) ;
11
11
/*</replacement>*/
12
12
13
- /*<replacement>*/
14
- var Buffer = require ( 'buffer' ) . Buffer ;
15
- /*</replacement>*/
16
-
17
13
Readable . ReadableState = ReadableState ;
18
14
19
- var EE = require ( 'events' ) ;
20
-
21
15
/*<replacement>*/
16
+ var EE = require ( 'events' ) . EventEmitter ;
17
+
22
18
var EElistenerCount = function ( emitter , type ) {
23
19
return emitter . listeners ( type ) . length ;
24
20
} ;
@@ -36,6 +32,9 @@ var Stream;
36
32
/*</replacement>*/
37
33
38
34
var Buffer = require ( 'buffer' ) . Buffer ;
35
+ /*<replacement>*/
36
+ var bufferShim = require ( 'buffer-shims' ) ;
37
+ /*</replacement>*/
39
38
40
39
/*<replacement>*/
41
40
var util = require ( 'core-util-is' ) ;
@@ -44,7 +43,7 @@ util.inherits = require('inherits');
44
43
45
44
/*<replacement>*/
46
45
var debugUtil = require ( 'util' ) ;
47
- var debug = undefined ;
46
+ var debug = void 0 ;
48
47
if ( debugUtil && debugUtil . debuglog ) {
49
48
debug = debugUtil . debuglog ( 'stream' ) ;
50
49
} else {
@@ -56,6 +55,19 @@ var StringDecoder;
56
55
57
56
util . inherits ( Readable , Stream ) ;
58
57
58
+ var hasPrependListener = typeof EE . prototype . prependListener === 'function' ;
59
+
60
+ function prependListener ( emitter , event , fn ) {
61
+ if ( hasPrependListener ) return emitter . prependListener ( event , fn ) ;
62
+
63
+ // This is a brutally ugly hack to make sure that our error handler
64
+ // is attached before any userland ones. NEVER DO THIS. This is here
65
+ // only because this code needs to continue to work with older versions
66
+ // of Node.js that do not include the prependListener() method. The goal
67
+ // is to eventually remove this hack.
68
+ if ( ! emitter . _events || ! emitter . _events [ event ] ) emitter . on ( event , fn ) ; else if ( isArray ( emitter . _events [ event ] ) ) emitter . _events [ event ] . unshift ( fn ) ; else emitter . _events [ event ] = [ fn , emitter . _events [ event ] ] ;
69
+ }
70
+
59
71
var Duplex ;
60
72
function ReadableState ( options , stream ) {
61
73
Duplex = Duplex || require ( './_stream_duplex' ) ;
@@ -149,7 +161,7 @@ Readable.prototype.push = function (chunk, encoding) {
149
161
if ( ! state . objectMode && typeof chunk === 'string' ) {
150
162
encoding = encoding || state . defaultEncoding ;
151
163
if ( encoding !== state . encoding ) {
152
- chunk = new Buffer ( chunk , encoding ) ;
164
+ chunk = bufferShim . from ( chunk , encoding ) ;
153
165
encoding = '' ;
154
166
}
155
167
}
@@ -179,8 +191,8 @@ function readableAddChunk(stream, state, chunk, encoding, addToFront) {
179
191
var e = new Error ( 'stream.push() after EOF' ) ;
180
192
stream . emit ( 'error' , e ) ;
181
193
} else if ( state . endEmitted && addToFront ) {
182
- var e = new Error ( 'stream.unshift() after end event' ) ;
183
- stream . emit ( 'error' , e ) ;
194
+ var _e = new Error ( 'stream.unshift() after end event' ) ;
195
+ stream . emit ( 'error' , _e ) ;
184
196
} else {
185
197
var skipAdd ;
186
198
if ( state . decoder && ! addToFront && ! encoding ) {
@@ -533,7 +545,8 @@ Readable.prototype.pipe = function (dest, pipeOpts) {
533
545
// If the user unpiped during `dest.write()`, it is possible
534
546
// to get stuck in a permanently paused state if that write
535
547
// also returned false.
536
- if ( state . pipesCount === 1 && state . pipes [ 0 ] === dest && src . listenerCount ( 'data' ) === 1 && ! cleanedUp ) {
548
+ // => Check whether `dest` is still a piping destination.
549
+ if ( ( state . pipesCount === 1 && state . pipes === dest || state . pipesCount > 1 && indexOf ( state . pipes , dest ) !== - 1 ) && ! cleanedUp ) {
537
550
debug ( 'false write response, pause' , src . _readableState . awaitDrain ) ;
538
551
src . _readableState . awaitDrain ++ ;
539
552
}
@@ -549,9 +562,9 @@ Readable.prototype.pipe = function (dest, pipeOpts) {
549
562
dest . removeListener ( 'error' , onerror ) ;
550
563
if ( EElistenerCount ( dest , 'error' ) === 0 ) dest . emit ( 'error' , er ) ;
551
564
}
552
- // This is a brutally ugly hack to make sure that our error handler
553
- // is attached before any userland ones. NEVER DO THIS .
554
- if ( ! dest . _events || ! dest . _events . error ) dest . on ( 'error' , onerror ) ; else if ( isArray ( dest . _events . error ) ) dest . _events . error . unshift ( onerror ) ; else dest . _events . error = [ onerror , dest . _events . error ] ;
565
+
566
+ // Make sure our error handler is attached before userland ones .
567
+ prependListener ( dest , 'error' , onerror ) ;
555
568
556
569
// Both close and finish should trigger unpipe, but only once.
557
570
function onclose ( ) {
@@ -825,16 +838,16 @@ function fromList(n, state) {
825
838
} else {
826
839
// complex case.
827
840
// we have enough to cover it, but it spans past the first buffer.
828
- if ( stringMode ) ret = '' ; else ret = new Buffer ( n ) ;
841
+ if ( stringMode ) ret = '' ; else ret = bufferShim . allocUnsafe ( n ) ;
829
842
830
843
var c = 0 ;
831
844
for ( var i = 0 , l = list . length ; i < l && c < n ; i ++ ) {
832
- var buf = list [ 0 ] ;
833
- var cpy = Math . min ( n - c , buf . length ) ;
845
+ var _buf = list [ 0 ] ;
846
+ var cpy = Math . min ( n - c , _buf . length ) ;
834
847
835
- if ( stringMode ) ret += buf . slice ( 0 , cpy ) ; else buf . copy ( ret , c , 0 , cpy ) ;
848
+ if ( stringMode ) ret += _buf . slice ( 0 , cpy ) ; else _buf . copy ( ret , c , 0 , cpy ) ;
836
849
837
- if ( cpy < buf . length ) list [ 0 ] = buf . slice ( cpy ) ; else list . shift ( ) ;
850
+ if ( cpy < _buf . length ) list [ 0 ] = _buf . slice ( cpy ) ; else list . shift ( ) ;
838
851
839
852
c += cpy ;
840
853
}
@@ -849,7 +862,7 @@ function endReadable(stream) {
849
862
850
863
// If we get here before consuming all the bytes, then that is a
851
864
// bug in node. Should never happen.
852
- if ( state . length > 0 ) throw new Error ( 'endReadable called on non-empty stream' ) ;
865
+ if ( state . length > 0 ) throw new Error ( '" endReadable()" called on non-empty stream' ) ;
853
866
854
867
if ( ! state . endEmitted ) {
855
868
state . ended = true ;
0 commit comments