{"record":{"id":"a152b86a880447f1","repo":"denoland/deno","slug":"err-invalid-arg-type-a152b8","errorCode":"ERR_INVALID_ARG_TYPE","errorMessage":"The \"${name}\" argument must be an instance of AbortSignal. Received ${signal}","messagePattern":"The \"(.+?)\" argument must be an instance of AbortSignal\\. Received (.+?)","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"ext/node/polyfills/internal/streams/add-abort-signal.js","lineNumber":39,"sourceCode":"    ERR_INVALID_ARG_TYPE,\n  },\n} = imported1;\n\nconst {\n  SymbolDispose,\n} = primordials;\n\nlet addAbortListener;\n\n// This method is inlined here for readable-stream\n// It also does not allow for signal to not exist on the stream\n// https://github.com/nodejs/node/pull/36061#discussion_r533718029\nconst validateAbortSignal = (signal, name) => {\n  if (\n    typeof signal !== \"object\" ||\n    !(\"aborted\" in signal)\n  ) {\n    throw new ERR_INVALID_ARG_TYPE(name, \"AbortSignal\", signal);\n  }\n};\n\nconst addAbortSignal = function addAbortSignal(signal, stream) {\n  validateAbortSignal(signal, \"signal\");\n  if (!isNodeStream(stream) && !isWebStream(stream)) {\n    throw new ERR_INVALID_ARG_TYPE(\"stream\", [\n      \"ReadableStream\",\n      \"WritableStream\",\n      \"Stream\",\n    ], stream);\n  }\n  return addAbortSignalNoValidate(signal, stream);\n};\n\nconst addAbortSignalNoValidate = function (signal, stream) {\n  if (typeof signal !== \"object\" || !(\"aborted\" in signal)) {\n    return stream;","sourceCodeStart":21,"sourceCodeEnd":57,"githubUrl":"https://github.com/denoland/deno/blob/9ad36f7a2cce60488e6ec52283efb32efddaf93a/ext/node/polyfills/internal/streams/add-abort-signal.js#L21-L57","documentation":"stream.addAbortSignal(signal, stream) validates its first argument before wiring abort behavior. The polyfill's validator accepts any object that has an 'aborted' property (a deliberate duck-type check shared with readable-stream), and throws ERR_INVALID_ARG_TYPE for anything else: undefined, null, primitives, or plain objects. The thrown name in the message is the literal argument name 'signal'.","triggerScenarios":"stream.addAbortSignal(undefined, readable) - typically forwarding an optional opts.signal that was never supplied; addAbortSignal(abortController, stream) - passing the controller instead of controller.signal; addAbortSignal('SIGTERM', stream) or any primitive; passing a custom EventEmitter that lacks an 'aborted' property.","commonSituations":"Optional abort support where the signal parameter defaults to undefined; refactoring code that previously used its own listener wiring; passing a DOM AbortController object rather than its .signal; test harnesses calling addAbortSignal with mock objects that forget the aborted flag.","solutions":["Default the signal: addAbortSignal(opts.signal ?? new AbortController().signal, stream), or skip the call when no signal exists","Pass controller.signal, never the AbortController instance","Guard before calling: if (signal && typeof signal === 'object' && 'aborted' in signal) addAbortSignal(signal, stream)"],"exampleFix":"// before\nfunction handler(readable, opts = {}) {\n  addAbortSignal(opts.signal, readable); // throws when opts.signal is undefined\n}\n\n// after\nfunction handler(readable, opts = {}) {\n  if (opts.signal) addAbortSignal(opts.signal, readable);\n}","handlingStrategy":"type-guard","validationCode":"if (opts.signal) addAbortSignal(opts.signal, stream);","typeGuard":"function isAbortSignalLike(s) {\n  return typeof s === 'object' && s !== null && 'aborted' in s;\n}","tryCatchPattern":null,"preventionTips":["Forward AbortController#signal (.signal), never the controller","Make signal parameters optional and skip the call when absent","In tests, use real AbortController instances, not bare objects"],"tags":["streams","abort-signal","node-compat","argument-validation"],"backgroundTag":"invalid-argument-type","analyzedSha":"9ad36f7a2cce60488e6ec52283efb32efddaf93a","analyzedAt":"2026-08-20T13:07:44.778Z","schemaVersion":2},"datasetVersion":"2026-08-31T09:17:48.483Z"}