events,lib: don't require EE#listenerCount()
Now parts of our public and public-ish APIs fall back to old-style listenerCount() if the emitter does not have a listenerCount function. Fixes: https://github.com/nodejs/node/issues/2655 Refs: 8f58fb92fff904a6ca58fd0df9ee5a1816e5b84e PR-URL: https://github.com/nodejs/node/pull/2661 Reviewed-By: Sakthipriyan Vairamani <thechargingvolcano@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
parent
6ed0603fb1
commit
46b7d15167
@ -374,7 +374,7 @@ function connectionListener(socket) {
|
|||||||
parser = null;
|
parser = null;
|
||||||
|
|
||||||
var eventName = req.method === 'CONNECT' ? 'connect' : 'upgrade';
|
var eventName = req.method === 'CONNECT' ? 'connect' : 'upgrade';
|
||||||
if (self.listenerCount(eventName) > 0) {
|
if (EventEmitter.listenerCount(self, eventName) > 0) {
|
||||||
debug('SERVER have listener for %s', eventName);
|
debug('SERVER have listener for %s', eventName);
|
||||||
var bodyHead = d.slice(bytesParsed, d.length);
|
var bodyHead = d.slice(bytesParsed, d.length);
|
||||||
|
|
||||||
@ -497,7 +497,7 @@ function connectionListener(socket) {
|
|||||||
(req.httpVersionMajor == 1 && req.httpVersionMinor == 1) &&
|
(req.httpVersionMajor == 1 && req.httpVersionMinor == 1) &&
|
||||||
continueExpression.test(req.headers['expect'])) {
|
continueExpression.test(req.headers['expect'])) {
|
||||||
res._expect_continue = true;
|
res._expect_continue = true;
|
||||||
if (self.listenerCount('checkContinue') > 0) {
|
if (EventEmitter.listenerCount(self, 'checkContinue') > 0) {
|
||||||
self.emit('checkContinue', req, res);
|
self.emit('checkContinue', req, res);
|
||||||
} else {
|
} else {
|
||||||
res.writeContinue();
|
res.writeContinue();
|
||||||
|
@ -537,7 +537,7 @@ Readable.prototype.pipe = function(dest, pipeOpts) {
|
|||||||
debug('onerror', er);
|
debug('onerror', er);
|
||||||
unpipe();
|
unpipe();
|
||||||
dest.removeListener('error', onerror);
|
dest.removeListener('error', onerror);
|
||||||
if (dest.listenerCount('error') === 0)
|
if (EE.listenerCount(dest, 'error') === 0)
|
||||||
dest.emit('error', er);
|
dest.emit('error', er);
|
||||||
}
|
}
|
||||||
// This is a brutally ugly hack to make sure that our error handler
|
// This is a brutally ugly hack to make sure that our error handler
|
||||||
@ -586,7 +586,7 @@ function pipeOnDrain(src) {
|
|||||||
debug('pipeOnDrain', state.awaitDrain);
|
debug('pipeOnDrain', state.awaitDrain);
|
||||||
if (state.awaitDrain)
|
if (state.awaitDrain)
|
||||||
state.awaitDrain--;
|
state.awaitDrain--;
|
||||||
if (state.awaitDrain === 0 && src.listenerCount('data')) {
|
if (state.awaitDrain === 0 && EE.listenerCount(src, 'data')) {
|
||||||
state.flowing = true;
|
state.flowing = true;
|
||||||
flow(src);
|
flow(src);
|
||||||
}
|
}
|
||||||
|
@ -395,10 +395,15 @@ EventEmitter.prototype.listeners = function listeners(type) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
EventEmitter.listenerCount = function(emitter, type) {
|
EventEmitter.listenerCount = function(emitter, type) {
|
||||||
|
if (typeof emitter.listenerCount === 'function') {
|
||||||
return emitter.listenerCount(type);
|
return emitter.listenerCount(type);
|
||||||
|
} else {
|
||||||
|
return listenerCount.call(emitter, type);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
EventEmitter.prototype.listenerCount = function listenerCount(type) {
|
EventEmitter.prototype.listenerCount = listenerCount;
|
||||||
|
function listenerCount(type) {
|
||||||
const events = this._events;
|
const events = this._events;
|
||||||
|
|
||||||
if (events) {
|
if (events) {
|
||||||
|
@ -70,7 +70,7 @@ Stream.prototype.pipe = function(dest, options) {
|
|||||||
// don't leave dangling pipes when there are errors.
|
// don't leave dangling pipes when there are errors.
|
||||||
function onerror(er) {
|
function onerror(er) {
|
||||||
cleanup();
|
cleanup();
|
||||||
if (this.listenerCount('error') === 0) {
|
if (EE.listenerCount(this, 'error') === 0) {
|
||||||
throw er; // Unhandled stream error in pipe.
|
throw er; // Unhandled stream error in pipe.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
19
test/parallel/test-stream-pipe-without-listenerCount.js
Normal file
19
test/parallel/test-stream-pipe-without-listenerCount.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
'use strict';
|
||||||
|
const common = require('../common');
|
||||||
|
const stream = require('stream');
|
||||||
|
|
||||||
|
const r = new stream.Stream();
|
||||||
|
r.listenerCount = undefined;
|
||||||
|
|
||||||
|
const w = new stream.Stream();
|
||||||
|
w.listenerCount = undefined;
|
||||||
|
|
||||||
|
w.on('pipe', function() {
|
||||||
|
r.emit('error', new Error('Readable Error'));
|
||||||
|
w.emit('error', new Error('Writable Error'));
|
||||||
|
});
|
||||||
|
r.on('error', common.mustCall(noop));
|
||||||
|
w.on('error', common.mustCall(noop));
|
||||||
|
r.pipe(w);
|
||||||
|
|
||||||
|
function noop() {};
|
Loading…
x
Reference in New Issue
Block a user