@@ -63,10 +63,23 @@ function compression (options) {
6363 var stream
6464
6565 var _end = res . end
66- var _on = res . on
6766 var _removeListener = res . removeListener
6867 var _write = res . write
6968
69+ // proxy drain events from stream
70+ var _addListener = interceptAddListener ( res , function ( type , listener ) {
71+ if ( ! listeners || type !== 'drain' ) {
72+ // skip intercept
73+ return false
74+ } else if ( stream ) {
75+ // add listener to stream instead
76+ stream . on ( type , listener )
77+ } else {
78+ // buffer listeners for future stream
79+ listeners . push ( [ type , listener ] )
80+ }
81+ } )
82+
7083 // flush
7184 res . flush = function flush ( ) {
7285 if ( stream ) {
@@ -117,23 +130,6 @@ function compression (options) {
117130 : stream . end ( )
118131 }
119132
120- res . on = function on ( type , listener ) {
121- if ( ! listeners || type !== 'drain' ) {
122- return _on . call ( this , type , listener )
123- }
124-
125- if ( stream ) {
126- return stream . on ( type , listener )
127- }
128-
129- // buffer listeners for future stream
130- listeners . push ( [ type , listener ] )
131-
132- return this
133- }
134-
135- res . addListener = res . on
136-
137133 res . removeListener = function removeListener ( type , listener ) {
138134 if ( ! listeners || type !== 'drain' ) {
139135 return _removeListener . call ( this , type , listener )
@@ -161,7 +157,7 @@ function compression (options) {
161157
162158 function nocompress ( msg ) {
163159 debug ( 'no compression: %s' , msg )
164- addListeners ( res , _on , listeners )
160+ addListeners ( res , _addListener , listeners )
165161 listeners = null
166162 }
167163
@@ -240,7 +236,7 @@ function compression (options) {
240236 _end . call ( res )
241237 } )
242238
243- _on . call ( res , 'drain' , function onResponseDrain ( ) {
239+ _addListener . call ( res , 'drain' , function onResponseDrain ( ) {
244240 stream . resume ( )
245241 } )
246242 } )
@@ -254,9 +250,9 @@ function compression (options) {
254250 * @private
255251 */
256252
257- function addListeners ( stream , on , listeners ) {
253+ function addListeners ( stream , addListener , listeners ) {
258254 for ( var i = 0 ; i < listeners . length ; i ++ ) {
259- on . apply ( stream , listeners [ i ] )
255+ addListener . apply ( stream , listeners [ i ] )
260256 }
261257}
262258
@@ -274,6 +270,53 @@ function chunkLength (chunk, encoding) {
274270 : chunk . length
275271}
276272
273+ /**
274+ * Intercept add listener on event emitter.
275+ * @private
276+ */
277+
278+ function interceptAddListener ( ee , fn ) {
279+ var _addListener = ee . addListener
280+ var _on = ee . on
281+
282+ if ( _addListener ) {
283+ Object . defineProperty ( ee , 'addListener' , {
284+ configurable : true ,
285+ value : addListener ,
286+ writable : true
287+ } )
288+ }
289+
290+ if ( _on ) {
291+ Object . defineProperty ( ee , 'on' , {
292+ configurable : true ,
293+ value : on ,
294+ writable : true
295+ } )
296+ }
297+
298+ return _addListener || _on || noop
299+
300+ function addListener ( type , listener ) {
301+ return fn . call ( this , type , listener ) === false
302+ ? _addListener . call ( this , type , listener )
303+ : this
304+ }
305+
306+ function on ( type , listener ) {
307+ return fn . call ( this , type , listener ) === false
308+ ? _on . call ( this , type , listener )
309+ : this
310+ }
311+ }
312+
313+ /**
314+ * Reusable no-op function.
315+ * @private
316+ */
317+
318+ function noop ( ) { }
319+
277320/**
278321 * Default filter function.
279322 * @private
0 commit comments