Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 5aec513

Browse filesBrowse files
phryneasaduh95
authored andcommitted
lib: disable default memory leak warning for AbortSignal
This change sets the default `kMaxEventTargetListeners` property for `AbortSignal` instances to 0, disabling the check per default, to enable users to write isomorphic library code. If desirable, the max event target listeners check can still be enabled for individual `AbortSignal` instances by calling `setMaxListeners` on them. Refs: #54758 PR-URL: #55816 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
1 parent 041a490 commit 5aec513
Copy full SHA for 5aec513

File tree

Expand file treeCollapse file tree

3 files changed

+29
-11
lines changed
Open diff view settings
Filter options
Expand file treeCollapse file tree

3 files changed

+29
-11
lines changed
Open diff view settings
Collapse file

‎doc/api/events.md‎

Copy file name to clipboardExpand all lines: doc/api/events.md
+4Lines changed: 4 additions & 0 deletions
  • Display the source diff
  • Display the rich diff
Original file line numberDiff line numberDiff line change
@@ -1171,6 +1171,10 @@ that a "possible EventEmitter memory leak" has been detected. For any single
11711171
`EventEmitter`, the `emitter.getMaxListeners()` and `emitter.setMaxListeners()`
11721172
methods can be used to temporarily avoid this warning:
11731173

1174+
`defaultMaxListeners` has no effect on `AbortSignal` instances. While it is
1175+
still possible to use [`emitter.setMaxListeners(n)`][] to set a warning limit
1176+
for individual `AbortSignal` instances, per default `AbortSignal` instances will not warn.
1177+
11741178
```mjs
11751179
import { EventEmitter } from 'node:events';
11761180
const emitter = new EventEmitter();
Collapse file

‎lib/internal/abort_controller.js‎

Copy file name to clipboardExpand all lines: lib/internal/abort_controller.js
+2Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ const {
2828
kResistStopPropagation,
2929
kWeakHandler,
3030
} = require('internal/event_target');
31+
const { kMaxEventTargetListeners } = require('events');
3132
const {
3233
customInspectSymbol,
3334
kEmptyObject,
@@ -164,6 +165,7 @@ class AbortSignal extends EventTarget {
164165
}
165166
super();
166167

168+
this[kMaxEventTargetListeners] = 0;
167169
const {
168170
aborted = false,
169171
reason = undefined,
Collapse file

‎test/parallel/test-eventtarget-memoryleakwarning.js‎

Copy file name to clipboardExpand all lines: test/parallel/test-eventtarget-memoryleakwarning.js
+23-11Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,22 @@ const { setTimeout } = require('timers/promises');
1212
common.expectWarning({
1313
MaxListenersExceededWarning: [
1414
['Possible EventTarget memory leak detected. 3 foo listeners added to ' +
15-
'EventTarget. MaxListeners is 2. Use events.setMaxListeners() ' +
15+
'EventTarget. MaxListeners is 2. Use events.setMaxListeners() ' +
1616
'to increase limit'],
1717
['Possible EventTarget memory leak detected. 3 foo listeners added to ' +
18-
'[MessagePort [EventTarget]]. ' +
19-
'MaxListeners is 2. ' +
20-
'Use events.setMaxListeners() to increase ' +
18+
'[MessagePort [EventTarget]]. ' +
19+
'MaxListeners is 2. ' +
20+
'Use events.setMaxListeners() to increase ' +
2121
'limit'],
2222
['Possible EventTarget memory leak detected. 3 foo listeners added to ' +
23-
'[MessagePort [EventTarget]]. ' +
24-
'MaxListeners is 2. ' +
25-
'Use events.setMaxListeners() to increase ' +
23+
'[MessagePort [EventTarget]]. ' +
24+
'MaxListeners is 2. ' +
25+
'Use events.setMaxListeners() to increase ' +
2626
'limit'],
27-
['Possible EventTarget memory leak detected. 3 foo listeners added to ' +
28-
'[AbortSignal]. ' +
29-
'MaxListeners is 2. ' +
30-
'Use events.setMaxListeners() to increase ' +
27+
['Possible EventTarget memory leak detected. 2 foo listeners added to ' +
28+
'[AbortSignal]. ' +
29+
'MaxListeners is 1. ' +
30+
'Use events.setMaxListeners() to increase ' +
3131
'limit'],
3232
],
3333
});
@@ -65,13 +65,25 @@ common.expectWarning({
6565
mc.port1.addEventListener('foo', () => {});
6666
mc.port1.addEventListener('foo', () => {});
6767
mc.port1.addEventListener('foo', () => {});
68+
}
6869

70+
{
71+
// No warning emitted because AbortController ignores `EventEmitter.defaultMaxListeners`
72+
setMaxListeners(2);
6973
const ac = new AbortController();
7074
ac.signal.addEventListener('foo', () => {});
7175
ac.signal.addEventListener('foo', () => {});
7276
ac.signal.addEventListener('foo', () => {});
7377
}
7478

79+
{
80+
// Will still warn as `setMaxListeners` can still manually set a limit
81+
const ac = new AbortController();
82+
setMaxListeners(1, ac.signal);
83+
ac.signal.addEventListener('foo', () => {});
84+
ac.signal.addEventListener('foo', () => {});
85+
}
86+
7587
{
7688
// It works for EventEmitters also
7789
const ee = new EventEmitter();

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.