@@ -26,13 +26,19 @@ const {
2626 ERR_INVALID_THIS ,
2727 }
2828} = require ( 'internal/errors' ) ;
29- const { validateInteger , validateObject } = require ( 'internal/validators' ) ;
29+ const { validateObject } = require ( 'internal/validators' ) ;
3030
3131const { customInspectSymbol } = require ( 'internal/util' ) ;
3232const { inspect } = require ( 'util' ) ;
3333
3434const kIsEventTarget = SymbolFor ( 'nodejs.event_target' ) ;
3535
36+ const EventEmitter = require ( 'events' ) ;
37+ const {
38+ kMaxEventTargetListeners,
39+ kMaxEventTargetListenersWarned,
40+ } = EventEmitter ;
41+
3642const kEvents = Symbol ( 'kEvents' ) ;
3743const kStop = Symbol ( 'kStop' ) ;
3844const kTarget = Symbol ( 'kTarget' ) ;
@@ -43,8 +49,6 @@ const kCreateEvent = Symbol('kCreateEvent');
4349const kNewListener = Symbol ( 'kNewListener' ) ;
4450const kRemoveListener = Symbol ( 'kRemoveListener' ) ;
4551const kIsNodeStyleListener = Symbol ( 'kIsNodeStyleListener' ) ;
46- const kMaxListeners = Symbol ( 'kMaxListeners' ) ;
47- const kMaxListenersWarned = Symbol ( 'kMaxListenersWarned' ) ;
4852const kTrustEvent = Symbol ( 'kTrustEvent' ) ;
4953
5054// Lazy load perf_hooks to avoid the additional overhead on startup
@@ -221,6 +225,8 @@ class Listener {
221225
222226function initEventTarget ( self ) {
223227 self [ kEvents ] = new SafeMap ( ) ;
228+ self [ kMaxEventTargetListeners ] = EventEmitter . defaultMaxListeners ;
229+ self [ kMaxEventTargetListenersWarned ] = false ;
224230}
225231
226232class EventTarget {
@@ -233,7 +239,24 @@ class EventTarget {
233239 initEventTarget ( this ) ;
234240 }
235241
236- [ kNewListener ] ( size , type , listener , once , capture , passive ) { }
242+ [ kNewListener ] ( size , type , listener , once , capture , passive ) {
243+ if ( this [ kMaxEventTargetListeners ] > 0 &&
244+ size > this [ kMaxEventTargetListeners ] &&
245+ ! this [ kMaxEventTargetListenersWarned ] ) {
246+ this [ kMaxEventTargetListenersWarned ] = true ;
247+ // No error code for this since it is a Warning
248+ // eslint-disable-next-line no-restricted-syntax
249+ const w = new Error ( 'Possible EventTarget memory leak detected. ' +
250+ `${ size } ${ type } listeners ` +
251+ `added to ${ inspect ( this , { depth : - 1 } ) } . Use ` +
252+ 'events.setMaxListeners() to increase limit' ) ;
253+ w . name = 'MaxListenersExceededWarning' ;
254+ w . target = this ;
255+ w . type = type ;
256+ w . count = size ;
257+ process . emitWarning ( w ) ;
258+ }
259+ }
237260 [ kRemoveListener ] ( size , type , listener , capture ) { }
238261
239262 addEventListener ( type , listener , options = { } ) {
@@ -417,9 +440,6 @@ ObjectDefineProperty(EventTarget.prototype, SymbolToStringTag, {
417440
418441function initNodeEventTarget ( self ) {
419442 initEventTarget ( self ) ;
420- // eslint-disable-next-line no-use-before-define
421- self [ kMaxListeners ] = NodeEventTarget . defaultMaxListeners ;
422- self [ kMaxListenersWarned ] = false ;
423443}
424444
425445class NodeEventTarget extends EventTarget {
@@ -430,33 +450,12 @@ class NodeEventTarget extends EventTarget {
430450 initNodeEventTarget ( this ) ;
431451 }
432452
433- [ kNewListener ] ( size , type , listener , once , capture , passive ) {
434- if ( this [ kMaxListeners ] > 0 &&
435- size > this [ kMaxListeners ] &&
436- ! this [ kMaxListenersWarned ] ) {
437- this [ kMaxListenersWarned ] = true ;
438- // No error code for this since it is a Warning
439- // eslint-disable-next-line no-restricted-syntax
440- const w = new Error ( 'Possible EventTarget memory leak detected. ' +
441- `${ size } ${ type } listeners ` +
442- `added to ${ inspect ( this , { depth : - 1 } ) } . Use ` +
443- 'setMaxListeners() to increase limit' ) ;
444- w . name = 'MaxListenersExceededWarning' ;
445- w . target = this ;
446- w . type = type ;
447- w . count = size ;
448- process . emitWarning ( w ) ;
449- }
450- }
451-
452453 setMaxListeners ( n ) {
453- validateInteger ( n , 'n' , 0 ) ;
454- this [ kMaxListeners ] = n ;
455- return this ;
454+ EventEmitter . setMaxListeners ( n , this ) ;
456455 }
457456
458457 getMaxListeners ( ) {
459- return this [ kMaxListeners ] ;
458+ return this [ kMaxEventTargetListeners ] ;
460459 }
461460
462461 eventNames ( ) {
0 commit comments