Skip to content

Commit 858d332

Browse files
committed
WIP generic remove listener interceptor
1 parent 056f146 commit 858d332

File tree

1 file changed

+57
-26
lines changed

1 file changed

+57
-26
lines changed

index.js

+57-26
Original file line numberDiff line numberDiff line change
@@ -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+
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

Comments
 (0)