@@ -63,7 +63,6 @@ function compression (options) {
6363 var stream
6464
6565 var _end = res . end
66- var _removeListener = res . removeListener
6766 var _write = res . write
6867
6968 // proxy drain events from stream
@@ -80,6 +79,23 @@ function compression (options) {
8079 }
8180 } )
8281
82+ var _removeListener = interceptRemoveListener ( res , function ( type , listener ) {
83+ if ( ! listeners || type !== 'drain' ) {
84+ // skip intercept
85+ return false
86+ } else if ( stream ) {
87+ // remove listener from stream
88+ stream . removeListener ( type , listener )
89+ } else {
90+ // remove buffered listener
91+ for ( var i = listeners . length - 1 ; i >= 0 ; i -- ) {
92+ if ( listeners [ i ] [ 0 ] === type && listeners [ i ] [ 1 ] === listener ) {
93+ listeners . splice ( i , 1 )
94+ }
95+ }
96+ }
97+ } )
98+
8399 // flush
84100 res . flush = function flush ( ) {
85101 if ( stream ) {
@@ -130,31 +146,6 @@ function compression (options) {
130146 : stream . end ( )
131147 }
132148
133- res . removeListener = function removeListener ( type , listener ) {
134- if ( ! listeners || type !== 'drain' ) {
135- return _removeListener . call ( this , type , listener )
136- }
137-
138- if ( stream ) {
139- return stream . removeListener ( type , listener )
140- }
141-
142- // remove buffered listener
143- for ( var i = listeners . length - 1 ; i >= 0 ; i -- ) {
144- if ( listeners [ i ] [ 0 ] === type && listeners [ i ] [ 1 ] === listener ) {
145- listeners . splice ( i , 1 )
146- }
147- }
148-
149- return this
150- }
151-
152- /* istanbul ignore next */
153- if ( res . off ) {
154- // emitter.off was added in Node.js v10+; don't add it to earlier versions
155- res . off = res . removeListener
156- }
157-
158149 function nocompress ( msg ) {
159150 debug ( 'no compression: %s' , msg )
160151 addListeners ( res , _addListener , listeners )
@@ -310,6 +301,46 @@ function interceptAddListener (ee, fn) {
310301 }
311302}
312303
304+ /**
305+ * Intercept add listener on event emitter.
306+ * @private
307+ */
308+
309+ function interceptRemoveListener ( ee , fn ) {
310+ var _removeListener = ee . removeListener
311+ var _off = ee . off
312+
313+ if ( _removeListener ) {
314+ Object . defineProperty ( ee , 'removeListener' , {
315+ configurable : true ,
316+ value : removeListener ,
317+ writable : true
318+ } )
319+ }
320+
321+ if ( _off ) {
322+ Object . defineProperty ( ee , 'off' , {
323+ configurable : true ,
324+ value : off ,
325+ writable : true
326+ } )
327+ }
328+
329+ return _removeListener || _off || noop
330+
331+ function removeListener ( type , listener ) {
332+ return fn . call ( this , type , listener ) === false
333+ ? _removeListener . call ( this , type , listener )
334+ : this
335+ }
336+
337+ function off ( type , listener ) {
338+ return fn . call ( this , type , listener ) === false
339+ ? _off . call ( this , type , listener )
340+ : this
341+ }
342+ }
343+
313344/**
314345 * Reusable no-op function.
315346 * @private
0 commit comments