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

  1. Pass the EventEmitter or EventTarget itself, never a wrapper
  2. Filter target lists first: keep only values that are instanceof EventTarget or expose setMaxListeners
  3. 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

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


AI-assisted analysis of denoland/deno@9ad36f7a2c (2026-08-20). Data as JSON: /api/errors/82950e5ea86307d1. Report an issue: GitHub.