denoland/deno · error · TypeError
ERR_INVALID_ARG_TYPE
ERR_INVALID_ARG_TYPE
Error message
The "eventTargets" argument must be an instance of EventEmitter or EventTarget. Received ${actual} What it means
node:events setMaxListeners(n, ...eventTargets) applies a per-target listener cap. Each target must be an EventTarget (checked via prototype chain in ext/node/polyfills/_events.mjs) or expose a setMaxListeners function (EventEmitter-like); anything else throws ERR_INVALID_ARG_TYPE with 'eventTargets' expecting ['EventEmitter', 'EventTarget'] and the received value rendered in the message.
Source
Thrown at ext/node/polyfills/_events.mjs:220
* @returns {void}
*/
function setMaxListeners(
n = defaultMaxListeners,
...eventTargets
) {
validateNumber(n, "setMaxListeners", 0);
if (eventTargets.length === 0) {
defaultMaxListeners = n;
} else {
for (let i = 0; i < eventTargets.length; i++) {
const target = eventTargets[i];
if (ObjectPrototypeIsPrototypeOf(EventTarget.prototype, target)) {
target[kMaxEventTargetListeners] = n;
target[kMaxEventTargetListenersWarned] = false;
} else if (typeof target.setMaxListeners === "function") {
target.setMaxListeners(n);
} else {
throw new ERR_INVALID_ARG_TYPE(
"eventTargets",
["EventEmitter", "EventTarget"],
target,
);
}
}
}
}
EventEmitter.init = function (opts) {
if (
this._events === undefined ||
this._events === ObjectGetPrototypeOf(this)._events
) {
this._events = ObjectCreate(null);
this._eventsCount = 0;
}
View on GitHub (pinned to 9ad36f7a2c)
Solutions
- Pass the EventEmitter or EventTarget itself, never a wrapper
- Filter target lists first: keep only values that are instanceof EventTarget or expose setMaxListeners
- Call with no extra arguments to set the process-wide default: setMaxListeners(n)
Example fix
// before
import { setMaxListeners } from 'node:events';
setMaxListeners(10, { emitter: server });
// after
setMaxListeners(10, server); // the EventEmitter itself Defensive patterns
Strategy: type-guard
Validate before calling
const isEventEmitterOrTarget = (v) => v instanceof EventTarget || (typeof v?.setMaxListeners === 'function'); const safeTargets = targets.filter(isEventEmitterOrTarget); setMaxListeners(n, ...safeTargets);
Type guard
function isEventEmitterOrTarget(v) {
return v instanceof EventTarget ||
(typeof v === 'object' && v !== null && typeof v.setMaxListeners === 'function');
} Prevention
- Pass the emitter itself, never wrappers or option bags
- Filter dynamically-built target lists before the call
- Prefer setMaxListeners(n) with no targets to set the process-wide default
When it happens
Trigger: `setMaxListeners(10, {})`; passing a wrapper object around an emitter instead of the emitter; passing a string or undefined in the target list; passing an options bag where the emitter was expected.
Common situations: Tuning listener-leak warnings; generic instrumentation written against node:events receiving Deno-native or plain objects; variables shadowed so the wrong value lands in the argument.
Understand the failure class
Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.
Related errors
- ERR_INVALID_ARG_TYPE
- invalid ${name}, must not be infinity or NaN
- ERR_INVALID_HTTP_TOKEN
- ERR_INVALID_HTTP_TOKEN
- ERR_HTTP_INVALID_HEADER_VALUE
AI-assisted analysis of denoland/deno@9ad36f7a2c (2026-08-20).
Data as JSON: /api/errors/82950e5ea86307d1.
Report an issue: GitHub.