{"record":{"id":"71ff54254ab0cc76","repo":"denoland/deno","slug":"err-invalid-arg-type-71ff54","errorCode":"ERR_INVALID_ARG_TYPE","errorMessage":"The \"signal\" argument must be an instance of AbortSignal. Received undefined","messagePattern":"The \"signal\" argument must be an instance of AbortSignal\\. Received undefined","errorType":"exception","errorClass":"NodeTypeError","httpStatus":null,"severity":"error","filePath":"ext/node/polyfills/internal/events/abort_listener.mjs","lineNumber":19,"sourceCode":"// Copyright 2018-2026 the Deno authors. MIT license.\n// Copyright Joyent, Inc. and Node.js contributors. All rights reserved. MIT license.\n(function () {\nconst { core, primordials } = __bootstrap;\nconst { queueMicrotask, SymbolDispose } = primordials;\nconst { validateAbortSignal, validateFunction } = core.loadExtScript(\n  \"ext:deno_node/internal/validators.mjs\",\n);\nconst { codes } = core.loadExtScript(\"ext:deno_node/internal/errors.ts\");\nconst { ERR_INVALID_ARG_TYPE } = codes;\n\n/**\n * @param {AbortSignal} signal\n * @param {EventListener} listener\n * @returns {Disposable}\n */\nfunction addAbortListener(signal, listener) {\n  if (signal === undefined) {\n    throw new ERR_INVALID_ARG_TYPE(\"signal\", \"AbortSignal\", signal);\n  }\n  validateAbortSignal(signal, \"signal\");\n  validateFunction(listener, \"listener\");\n\n  let removeEventListener;\n  if (signal.aborted) {\n    queueMicrotask(() => listener({ target: signal }));\n  } else {\n    signal.addEventListener(\"abort\", listener, {\n      __proto__: null,\n      once: true,\n    });\n    removeEventListener = () => {\n      signal.removeEventListener(\"abort\", listener);\n    };\n  }\n  return {\n    __proto__: null,","sourceCodeStart":1,"sourceCodeEnd":37,"githubUrl":"https://github.com/denoland/deno/blob/9ad36f7a2cce60488e6ec52283efb32efddaf93a/ext/node/polyfills/internal/events/abort_listener.mjs#L1-L37","documentation":"events.addAbortListener(signal, listener) attaches a one-shot 'abort' listener to an AbortSignal and returns a Disposable. The polyfill rejects an undefined signal up front with ERR_INVALID_ARG_TYPE (message says 'must be an instance of AbortSignal. Received undefined') before validateAbortSignal and validateFunction run. Any other non-AbortSignal value fails the subsequent validateAbortSignal check instead.","triggerScenarios":"events.addAbortListener() with no arguments; swapping the argument order: addAbortListener(onAbort, signal); plumbing options.signal that was never set: addAbortListener(options?.signal, fn); destructuring { signal } from an undefined options object.","commonSituations":"AbortController created in one module but forgotten when calling the helper; wrapper APIs that mirror options-object style while addAbortListener is positional; TypeScript without strictNullChecks letting undefined through as an AbortSignal.","solutions":["Create and pass a real signal: const { signal } = new AbortController(); events.addAbortListener(signal, onAbort)","Fix argument order: (signal, listener), not (listener, signal)","Guard optional plumbing: if (signal) events.addAbortListener(signal, listener)","Type parameters as AbortSignal so the compiler rejects undefined call sites"],"exampleFix":"// before\nevents.addAbortListener(onAbort, options.signal); // swapped; signal undefined\n\n// after\nif (options.signal) events.addAbortListener(options.signal, onAbort);","handlingStrategy":"validation","validationCode":"function onAbort(signal, listener) {\n  if (!(signal instanceof AbortSignal)) throw new TypeError('signal must be an AbortSignal');\n  if (typeof listener !== 'function') throw new TypeError('listener must be a function');\n  return events.addAbortListener(signal, listener);\n}","typeGuard":"const isAbortSignal = (v) => v instanceof AbortSignal;","tryCatchPattern":"try { events.addAbortListener(signal, listener); } catch (e) { if (e?.code === 'ERR_INVALID_ARG_TYPE' && /signal/.test(e.message)) throw new TypeError('addAbortListener requires (signal: AbortSignal, listener)'); throw e; }","preventionTips":["Type parameters as (signal: AbortSignal, listener: () => void) so order and undefined fail at compile time","Create the AbortController next to the addAbortListener call to keep the signal non-optional","Guard optional signals: if (signal) addAbortListener(signal, listener)"],"tags":["events","abort-signal","argument-type","node-compat","deno"],"backgroundTag":"abort-signal-validation","analyzedSha":"9ad36f7a2cce60488e6ec52283efb32efddaf93a","analyzedAt":"2026-08-20T13:07:44.778Z","contentChangedAt":"2026-08-20T13:07:44.778Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}