@@ -25,13 +25,19 @@ const {
2525 ERR_INVALID_THIS ,
2626 }
2727} = require ( 'internal/errors' ) ;
28- const { validateInteger , validateObject } = require ( 'internal/validators' ) ;
28+ const { validateObject } = require ( 'internal/validators' ) ;
2929
3030const { customInspectSymbol } = require ( 'internal/util' ) ;
3131const { inspect } = require ( 'util' ) ;
3232
3333const kIsEventTarget = SymbolFor ( 'nodejs.event_target' ) ;
3434
35+ const EventEmitter = require ( 'events' ) ;
36+ const {
37+ kMaxEventTargetListeners,
38+ kMaxEventTargetListenersWarned,
39+ } = EventEmitter ;
40+
3541const kEvents = Symbol ( 'kEvents' ) ;
3642const kStop = Symbol ( 'kStop' ) ;
3743const kTarget = Symbol ( 'kTarget' ) ;
@@ -42,8 +48,6 @@ const kCreateEvent = Symbol('kCreateEvent');
4248const kNewListener = Symbol ( 'kNewListener' ) ;
4349const kRemoveListener = Symbol ( 'kRemoveListener' ) ;
4450const kIsNodeStyleListener = Symbol ( 'kIsNodeStyleListener' ) ;
45- const kMaxListeners = Symbol ( 'kMaxListeners' ) ;
46- const kMaxListenersWarned = Symbol ( 'kMaxListenersWarned' ) ;
4751const kTrustEvent = Symbol ( 'kTrustEvent' ) ;
4852
4953// Lazy load perf_hooks to avoid the additional overhead on startup
@@ -220,6 +224,8 @@ class Listener {
220224
221225function initEventTarget ( self ) {
222226 self [ kEvents ] = new SafeMap ( ) ;
227+ self [ kMaxEventTargetListeners ] = EventEmitter . defaultMaxListeners ;
228+ self [ kMaxEventTargetListenersWarned ] = false ;
223229}
224230
225231class EventTarget {
@@ -232,7 +238,24 @@ class EventTarget {
232238 initEventTarget ( this ) ;
233239 }
234240
235- [ kNewListener ] ( size , type , listener , once , capture , passive ) { }
241+ [ kNewListener ] ( size , type , listener , once , capture , passive ) {
242+ if ( this [ kMaxEventTargetListeners ] > 0 &&
243+ size > this [ kMaxEventTargetListeners ] &&
244+ ! this [ kMaxEventTargetListenersWarned ] ) {
245+ this [ kMaxEventTargetListenersWarned ] = true ;
246+ // No error code for this since it is a Warning
247+ // eslint-disable-next-line no-restricted-syntax
248+ const w = new Error ( 'Possible EventTarget memory leak detected. ' +
249+ `${ size } ${ type } listeners ` +
250+ `added to ${ inspect ( this , { depth : - 1 } ) } . Use ` +
251+ 'events.setMaxListeners() to increase limit' ) ;
252+ w . name = 'MaxListenersExceededWarning' ;
253+ w . target = this ;
254+ w . type = type ;
255+ w . count = size ;
256+ process . emitWarning ( w ) ;
257+ }
258+ }
236259 [ kRemoveListener ] ( size , type , listener , capture ) { }
237260
238261 addEventListener ( type , listener , options = { } ) {
@@ -416,9 +439,6 @@ Object.defineProperty(EventTarget.prototype, SymbolToStringTag, {
416439
417440function initNodeEventTarget ( self ) {
418441 initEventTarget ( self ) ;
419- // eslint-disable-next-line no-use-before-define
420- self [ kMaxListeners ] = NodeEventTarget . defaultMaxListeners ;
421- self [ kMaxListenersWarned ] = false ;
422442}
423443
424444class NodeEventTarget extends EventTarget {
@@ -429,33 +449,12 @@ class NodeEventTarget extends EventTarget {
429449 initNodeEventTarget ( this ) ;
430450 }
431451
432- [ kNewListener ] ( size , type , listener , once , capture , passive ) {
433- if ( this [ kMaxListeners ] > 0 &&
434- size > this [ kMaxListeners ] &&
435- ! this [ kMaxListenersWarned ] ) {
436- this [ kMaxListenersWarned ] = true ;
437- // No error code for this since it is a Warning
438- // eslint-disable-next-line no-restricted-syntax
439- const w = new Error ( 'Possible EventTarget memory leak detected. ' +
440- `${ size } ${ type } listeners ` +
441- `added to ${ inspect ( this , { depth : - 1 } ) } . Use ` +
442- 'setMaxListeners() to increase limit' ) ;
443- w . name = 'MaxListenersExceededWarning' ;
444- w . target = this ;
445- w . type = type ;
446- w . count = size ;
447- process . emitWarning ( w ) ;
448- }
449- }
450-
451452 setMaxListeners ( n ) {
452- validateInteger ( n , 'n' , 0 ) ;
453- this [ kMaxListeners ] = n ;
454- return this ;
453+ EventEmitter . setMaxListeners ( n , this ) ;
455454 }
456455
457456 getMaxListeners ( ) {
458- return this [ kMaxListeners ] ;
457+ return this [ kMaxEventTargetListeners ] ;
459458 }
460459
461460 eventNames ( ) {
0 commit comments