Skip to content

Commit 110da67

Browse files
committed
WIP generic add listener interceptor
1 parent 778f27d commit 110da67

File tree

1 file changed

+65
-22
lines changed

1 file changed

+65
-22
lines changed

index.js

Lines changed: 65 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)