@@ -63,10 +63,23 @@ function compression (options) {
63
63
var stream
64
64
65
65
var _end = res . end
66
- var _on = res . on
67
66
var _removeListener = res . removeListener
68
67
var _write = res . write
69
68
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
+
70
83
// flush
71
84
res . flush = function flush ( ) {
72
85
if ( stream ) {
@@ -117,23 +130,6 @@ function compression (options) {
117
130
: stream . end ( )
118
131
}
119
132
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
-
137
133
res . removeListener = function removeListener ( type , listener ) {
138
134
if ( ! listeners || type !== 'drain' ) {
139
135
return _removeListener . call ( this , type , listener )
@@ -161,7 +157,7 @@ function compression (options) {
161
157
162
158
function nocompress ( msg ) {
163
159
debug ( 'no compression: %s' , msg )
164
- addListeners ( res , _on , listeners )
160
+ addListeners ( res , _addListener , listeners )
165
161
listeners = null
166
162
}
167
163
@@ -240,7 +236,7 @@ function compression (options) {
240
236
_end . call ( res )
241
237
} )
242
238
243
- _on . call ( res , 'drain' , function onResponseDrain ( ) {
239
+ _addListener . call ( res , 'drain' , function onResponseDrain ( ) {
244
240
stream . resume ( )
245
241
} )
246
242
} )
@@ -254,9 +250,9 @@ function compression (options) {
254
250
* @private
255
251
*/
256
252
257
- function addListeners ( stream , on , listeners ) {
253
+ function addListeners ( stream , addListener , listeners ) {
258
254
for ( var i = 0 ; i < listeners . length ; i ++ ) {
259
- on . apply ( stream , listeners [ i ] )
255
+ addListener . apply ( stream , listeners [ i ] )
260
256
}
261
257
}
262
258
@@ -274,6 +270,53 @@ function chunkLength (chunk, encoding) {
274
270
: chunk . length
275
271
}
276
272
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
+
277
320
/**
278
321
* Default filter function.
279
322
* @private
0 commit comments