Skip to content

Commit 8f58fb9

Browse files
committed
events: deprecate static listenerCount function
As per the discussion in #734, this patch deprecates the usage of `EventEmitter.listenerCount` static function in the docs, and introduces the `listenerCount` function in the prototype of `EventEmitter` itself. PR-URL: #2349 Reviewed-By: Trevor Norris <trev.norris@gmail.com> Reviewed-By: Brian White <mscdex@mscdex.net>
1 parent d98eed5 commit 8f58fb9

13 files changed

+56
-30
lines changed

benchmark/events/ee-listener-count.js benchmark/events/ee-listener-count-on-prototype.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,13 @@ function main(conf) {
77
var n = conf.n | 0;
88

99
var ee = new EventEmitter();
10-
var listenerCount = EventEmitter.listenerCount;
1110

1211
for (var k = 0; k < 10; k += 1)
1312
ee.on('dummy', function() {});
1413

1514
bench.start();
1615
for (var i = 0; i < n; i += 1) {
17-
var r = listenerCount(ee, 'dummy');
16+
var r = ee.listenerCount('dummy');
1817
}
1918
bench.end(n);
2019
}

doc/api/events.markdown

+7
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,17 @@ Execute each of the listeners in order with the supplied arguments.
137137
Returns `true` if event had listeners, `false` otherwise.
138138

139139

140+
### emitter.listenerCount(type)
141+
142+
* `type` {Value} The type of event
143+
144+
Returns the number of listeners listening to the `type` of event.
145+
140146
### Class Method: EventEmitter.listenerCount(emitter, event)
141147

142148
Return the number of listeners for a given event.
143149

150+
_Note: This is deprecated. Use `emitter.listenerCount` instead._
144151

145152
### Event: 'newListener'
146153

lib/_http_client.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ function socketOnData(d) {
322322
var bodyHead = d.slice(bytesParsed, d.length);
323323

324324
var eventName = req.method === 'CONNECT' ? 'connect' : 'upgrade';
325-
if (EventEmitter.listenerCount(req, eventName) > 0) {
325+
if (req.listenerCount(eventName) > 0) {
326326
req.upgradeOrConnect = true;
327327

328328
// detach the socket

lib/_http_server.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ function connectionListener(socket) {
343343
parser = null;
344344

345345
var eventName = req.method === 'CONNECT' ? 'connect' : 'upgrade';
346-
if (EventEmitter.listenerCount(self, eventName) > 0) {
346+
if (self.listenerCount(eventName) > 0) {
347347
debug('SERVER have listener for %s', eventName);
348348
var bodyHead = d.slice(bytesParsed, d.length);
349349

@@ -467,7 +467,7 @@ function connectionListener(socket) {
467467
(req.httpVersionMajor == 1 && req.httpVersionMinor == 1) &&
468468
continueExpression.test(req.headers['expect'])) {
469469
res._expect_continue = true;
470-
if (EventEmitter.listenerCount(self, 'checkContinue') > 0) {
470+
if (self.listenerCount('checkContinue') > 0) {
471471
self.emit('checkContinue', req, res);
472472
} else {
473473
res.writeContinue();

lib/_stream_readable.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -533,7 +533,7 @@ Readable.prototype.pipe = function(dest, pipeOpts) {
533533
debug('onerror', er);
534534
unpipe();
535535
dest.removeListener('error', onerror);
536-
if (EE.listenerCount(dest, 'error') === 0)
536+
if (dest.listenerCount('error') === 0)
537537
dest.emit('error', er);
538538
}
539539
// This is a brutally ugly hack to make sure that our error handler
@@ -582,7 +582,7 @@ function pipeOnDrain(src) {
582582
debug('pipeOnDrain', state.awaitDrain);
583583
if (state.awaitDrain)
584584
state.awaitDrain--;
585-
if (state.awaitDrain === 0 && EE.listenerCount(src, 'data')) {
585+
if (state.awaitDrain === 0 && src.listenerCount('data')) {
586586
state.flowing = true;
587587
flow(src);
588588
}

lib/_tls_wrap.js

+4-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ const crypto = require('crypto');
55
const net = require('net');
66
const tls = require('tls');
77
const util = require('util');
8-
const listenerCount = require('events').listenerCount;
98
const common = require('_tls_common');
109
const StreamWrap = require('_stream_wrap').StreamWrap;
1110
const Buffer = require('buffer').Buffer;
@@ -116,7 +115,7 @@ function requestOCSP(self, hello, ctx, cb) {
116115
if (ctx.context)
117116
ctx = ctx.context;
118117

119-
if (listenerCount(self.server, 'OCSPRequest') === 0) {
118+
if (self.server.listenerCount('OCSPRequest') === 0) {
120119
return cb(null);
121120
} else {
122121
self.server.emit('OCSPRequest',
@@ -396,11 +395,11 @@ TLSSocket.prototype._init = function(socket, wrap) {
396395
ssl.handshakes = 0;
397396

398397
if (this.server) {
399-
if (listenerCount(this.server, 'resumeSession') > 0 ||
400-
listenerCount(this.server, 'newSession') > 0) {
398+
if (this.server.listenerCount('resumeSession') > 0 ||
399+
this.server.listenerCount('newSession') > 0) {
401400
ssl.enableSessionCallbacks();
402401
}
403-
if (listenerCount(this.server, 'OCSPRequest') > 0)
402+
if (this.server.listenerCount('OCSPRequest') > 0)
404403
ssl.enableCertCb();
405404
}
406405
} else {

lib/events.js

+13-9
Original file line numberDiff line numberDiff line change
@@ -395,19 +395,23 @@ EventEmitter.prototype.listeners = function listeners(type) {
395395
};
396396

397397
EventEmitter.listenerCount = function(emitter, type) {
398-
var evlistener;
399-
var ret = 0;
400-
var events = emitter._events;
398+
return emitter.listenerCount(type);
399+
};
400+
401+
EventEmitter.prototype.listenerCount = function listenerCount(type) {
402+
const events = this._events;
401403

402404
if (events) {
403-
evlistener = events[type];
404-
if (typeof evlistener === 'function')
405-
ret = 1;
406-
else if (evlistener)
407-
ret = evlistener.length;
405+
const evlistener = events[type];
406+
407+
if (typeof evlistener === 'function') {
408+
return 1;
409+
} else if (evlistener) {
410+
return evlistener.length;
411+
}
408412
}
409413

410-
return ret;
414+
return 0;
411415
};
412416

413417
// About 1.5x faster than the two-arg version of Array#splice().

lib/fs.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1354,7 +1354,7 @@ fs.unwatchFile = function(filename, listener) {
13541354
stat.removeAllListeners('change');
13551355
}
13561356

1357-
if (EventEmitter.listenerCount(stat, 'change') === 0) {
1357+
if (stat.listenerCount('change') === 0) {
13581358
stat.stop();
13591359
statWatchers.delete(filename);
13601360
}

lib/readline.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -683,7 +683,7 @@ Interface.prototype._ttyWrite = function(s, key) {
683683

684684
switch (key.name) {
685685
case 'c':
686-
if (EventEmitter.listenerCount(this, 'SIGINT') > 0) {
686+
if (this.listenerCount('SIGINT') > 0) {
687687
this.emit('SIGINT');
688688
} else {
689689
// This readline instance is finished
@@ -746,7 +746,7 @@ Interface.prototype._ttyWrite = function(s, key) {
746746

747747
case 'z':
748748
if (process.platform == 'win32') break;
749-
if (EventEmitter.listenerCount(this, 'SIGTSTP') > 0) {
749+
if (this.listenerCount('SIGTSTP') > 0) {
750750
this.emit('SIGTSTP');
751751
} else {
752752
process.once('SIGCONT', (function(self) {
@@ -907,7 +907,7 @@ function emitKeypressEvents(stream) {
907907
stream[ESCAPE_DECODER].next();
908908

909909
function onData(b) {
910-
if (EventEmitter.listenerCount(stream, 'keypress') > 0) {
910+
if (stream.listenerCount('keypress') > 0) {
911911
var r = stream[KEYPRESS_DECODER].write(b);
912912
if (r) {
913913
for (var i = 0; i < r.length; i++) {
@@ -936,7 +936,7 @@ function emitKeypressEvents(stream) {
936936
}
937937
}
938938

939-
if (EventEmitter.listenerCount(stream, 'keypress') > 0) {
939+
if (stream.listenerCount('keypress') > 0) {
940940
stream.on('data', onData);
941941
} else {
942942
stream.on('newListener', onNewListener);

lib/stream.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ Stream.prototype.pipe = function(dest, options) {
7070
// don't leave dangling pipes when there are errors.
7171
function onerror(er) {
7272
cleanup();
73-
if (EE.listenerCount(this, 'error') === 0) {
73+
if (this.listenerCount('error') === 0) {
7474
throw er; // Unhandled stream error in pipe.
7575
}
7676
}

src/node.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -802,8 +802,7 @@
802802
});
803803

804804
process.on('removeListener', function(type, listener) {
805-
if (signalWraps.hasOwnProperty(type) &&
806-
NativeModule.require('events').listenerCount(this, type) === 0) {
805+
if (signalWraps.hasOwnProperty(type) && this.listenerCount(type) === 0) {
807806
signalWraps[type].close();
808807
delete signalWraps[type];
809808
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
const assert = require('assert');
5+
const EventEmitter = require('events');
6+
7+
const emitter = new EventEmitter();
8+
emitter.on('foo', function() {});
9+
emitter.on('foo', function() {});
10+
emitter.on('baz', function() {});
11+
// Allow any type
12+
emitter.on(123, function() {});
13+
14+
assert.strictEqual(EventEmitter.listenerCount(emitter, 'foo'), 2);
15+
assert.strictEqual(emitter.listenerCount('foo'), 2);
16+
assert.strictEqual(emitter.listenerCount('bar'), 0);
17+
assert.strictEqual(emitter.listenerCount('baz'), 1);
18+
assert.strictEqual(emitter.listenerCount(123), 1);

test/parallel/test-event-emitter-subclass.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,4 @@ var ee2 = new MyEE2();
4646

4747
ee1.on('x', function() {});
4848

49-
assert.equal(EventEmitter.listenerCount(ee2, 'x'), 0);
49+
assert.equal(ee2.listenerCount('x'), 0);

0 commit comments

Comments
 (0)