{"id":"8a449514d3c08f6b","repo":"websockets/ws","slug":"unknown-parameter-key","errorCode":null,"errorMessage":"Unknown parameter \"${key}\"","messagePattern":"Unknown parameter \"(.+?)\"","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"lib/permessage-deflate.js","lineNumber":287,"sourceCode":"        } else if (key === 'server_max_window_bits') {\n          const num = +value;\n          if (!Number.isInteger(num) || num < 8 || num > 15) {\n            throw new TypeError(\n              `Invalid value for parameter \"${key}\": ${value}`\n            );\n          }\n          value = num;\n        } else if (\n          key === 'client_no_context_takeover' ||\n          key === 'server_no_context_takeover'\n        ) {\n          if (value !== true) {\n            throw new TypeError(\n              `Invalid value for parameter \"${key}\": ${value}`\n            );\n          }\n        } else {\n          throw new Error(`Unknown parameter \"${key}\"`);\n        }\n\n        params[key] = value;\n      });\n    });\n\n    return configurations;\n  }\n\n  /**\n   * Decompress data. Concurrency limited.\n   *\n   * @param {Buffer} data Compressed data\n   * @param {Boolean} fin Specifies whether or not this is the last fragment\n   * @param {Function} callback Callback\n   * @public\n   */\n  decompress(data, fin, callback) {","sourceCodeStart":269,"sourceCodeEnd":305,"githubUrl":"https://github.com/websockets/ws/blob/ae1de54330cef77e487548890fabfeb9aae1d83d/lib/permessage-deflate.js#L269-L305","documentation":"Thrown by normalizeParams() (permessage-deflate.js:286-287) when a parameter key is not one of the four recognized permessage-deflate parameters: client_max_window_bits, server_max_window_bits, client_no_context_takeover, or server_no_context_takeover. Any other key in the configuration is rejected as unknown, preventing unrecognized or typo'd parameters from being silently accepted.","triggerScenarios":"normalizeParams() is called with a configuration containing a parameter name outside the four allowed, e.g. from a header like 'permessage-deflate; max_window_bits=10', '...; context_takeover', '...; compress=true', or '...; custom_param=x'. A typo such as 'sever_max_window_bits' would also hit this.","commonSituations":"A peer advertises a non-standard or misspelled parameter. A developer adds a custom parameter name that is not part of RFC 7692. A proxy injects an unknown parameter. A typo in a hand-crafted header.","solutions":["Check the parameter name in the error message: if it is a typo of a known parameter, correct the spelling.","Remove any non-standard parameters that are not part of the permessage-deflate specification (client_max_window_bits, server_max_window_bits, client_no_context_takeover, server_no_context_takeover).","Fix the peer or middleware that introduces the unknown parameter.","If a custom extension with extra parameters is needed, use a separate extension implementation rather than permessage-deflate."],"exampleFix":"// before — misspelled parameter name\nconst header = 'permessage-deflate; sever_max_window_bits=10';\n\n// after\nconst header = 'permessage-deflate; server_max_window_bits=10';","handlingStrategy":"validation","validationCode":"const KNOWN_PARAMS = new Set([\n  'client_max_window_bits',\n  'server_max_window_bits',\n  'client_no_context_takeover',\n  'server_no_context_takeover'\n]);\n\nfunction hasOnlyKnownParams(config) {\n  return Object.keys(config).every((key) => KNOWN_PARAMS.has(key));\n}","typeGuard":"function isKnownPerMessageDeflateParam(key) {\n  return [\n    'client_max_window_bits',\n    'server_max_window_bits',\n    'client_no_context_takeover',\n    'server_no_context_takeover'\n  ].includes(key);\n}","tryCatchPattern":"try {\n  perMessageDeflate.normalizeParams(configurations);\n} catch (err) {\n  if (err.message.startsWith('Unknown parameter')) {\n    console.warn('Unrecognized permessage-deflate parameter:', err.message);\n  } else {\n    throw err;\n  }\n}","preventionTips":["Restrict parameter keys to the four RFC 7692 defined names.","Double-check spelling — 'sever' vs 'server', 'windowbits' vs 'window_bits'.","Do not add custom parameters to permessage-deflate configurations.","Validate configuration keys against a known-set before calling normalizeParams."],"tags":["websocket","permessage-deflate","compression","handshake","negotiation","validation"],"analyzedSha":"ae1de54330cef77e487548890fabfeb9aae1d83d","analyzedAt":"2026-08-03T19:11:18.437Z","schemaVersion":2}