{"id":"439c93bee3957e46","repo":"websockets/ws","slug":"none-of-the-extension-offers-can-be-accepted","errorCode":null,"errorMessage":"None of the extension offers can be accepted","messagePattern":"None of the extension offers can be accepted","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"lib/permessage-deflate.js","lineNumber":179,"sourceCode":"    const accepted = offers.find((params) => {\n      if (\n        (opts.serverNoContextTakeover === false &&\n          params.server_no_context_takeover) ||\n        (params.server_max_window_bits &&\n          (opts.serverMaxWindowBits === false ||\n            (typeof opts.serverMaxWindowBits === 'number' &&\n              opts.serverMaxWindowBits > params.server_max_window_bits))) ||\n        (typeof opts.clientMaxWindowBits === 'number' &&\n          !params.client_max_window_bits)\n      ) {\n        return false;\n      }\n\n      return true;\n    });\n\n    if (!accepted) {\n      throw new Error('None of the extension offers can be accepted');\n    }\n\n    if (opts.serverNoContextTakeover) {\n      accepted.server_no_context_takeover = true;\n    }\n    if (opts.clientNoContextTakeover) {\n      accepted.client_no_context_takeover = true;\n    }\n    if (typeof opts.serverMaxWindowBits === 'number') {\n      accepted.server_max_window_bits = opts.serverMaxWindowBits;\n    }\n    if (typeof opts.clientMaxWindowBits === 'number') {\n      accepted.client_max_window_bits = opts.clientMaxWindowBits;\n    } else if (\n      accepted.client_max_window_bits === true ||\n      opts.clientMaxWindowBits === false\n    ) {\n      delete accepted.client_max_window_bits;","sourceCodeStart":161,"sourceCodeEnd":197,"githubUrl":"https://github.com/websockets/ws/blob/ae1de54330cef77e487548890fabfeb9aae1d83d/lib/permessage-deflate.js#L161-L197","documentation":"Thrown by PerMessageDeflate.acceptAsServer() (permessage-deflate.js:178-179) when none of the client's offered permessage-deflate configurations satisfy the server's configured constraints. The server iterates each offered config and rejects it if it conflicts with serverNoContextTakeover=false, serverMaxWindowBits limits, or clientMaxWindowBits requirements. If every offer fails these checks, the negotiation aborts.","triggerScenarios":"A WebSocketServer with perMessageDeflate configured (e.g. serverNoContextTakeover, serverMaxWindowBits, or clientMaxWindowBits as a number) receives a client offer that violates every constraint. For example, the server requires client_max_window_bits but the client omits it, or the server sets serverMaxWindowBits to a number and the client offers a larger value in every configuration.","commonSituations":"A server operator tightens compression settings (e.g. sets clientMaxWindowBits to a specific number) that are incompatible with a client's defaults. A custom client sends offers that don't match the server's policy. Mismatched perMessageDeflate option expectations between client and server.","solutions":["Relax the server's perMessageDeflate constraints — e.g. remove clientMaxWindowBits as a number, or set serverNoContextTakeover to undefined instead of requiring it.","Adjust the client's offer to include parameters the server requires (client_max_window_bits, server_no_context_takeover, etc.).","Set perMessageDeflate: false on the server to disable compression entirely if compatibility cannot be achieved.","Log the server options and the received client offers side-by-side to identify the conflicting parameter."],"exampleFix":"// before — server requires a client_max_window_bits the client never offers\nnew WebSocketServer({ port: 8080, perMessageDeflate: { clientMaxWindowBits: 12 } });\n\n// after — let the server accept offers without forcing client window bits\nnew WebSocketServer({ port: 8080, perMessageDeflate: {} });","handlingStrategy":"try-catch","validationCode":"// Pre-check: verify at least one client offer is compatible before calling accept()\nfunction canAccept(serverOpts, offers) {\n  return offers.some((params) => {\n    if (serverOpts.serverNoContextTakeover === false && params.server_no_context_takeover) return false;\n    if (params.server_max_window_bits &&\n        (serverOpts.serverMaxWindowBits === false ||\n         (typeof serverOpts.serverMaxWindowBits === 'number' &&\n          serverOpts.serverMaxWindowBits > params.server_max_window_bits))) return false;\n    if (typeof serverOpts.clientMaxWindowBits === 'number' && !params.client_max_window_bits) return false;\n    return true;\n  });\n}\n\nconst pmd = new PerMessageDeflate({ ...serverOpts, isServer: true });\nif (canAccept(serverOpts, clientOffers)) {\n  pmd.accept(clientOffers);\n}","typeGuard":null,"tryCatchPattern":"try {\n  perMessageDeflate.accept(offers);\n} catch (err) {\n  if (err.message === 'None of the extension offers can be accepted') {\n    // Proceed without compression — connection stays open, just uncompressed\n    console.warn('Compression negotiation failed; continuing without permessage-deflate.');\n  } else {\n    throw err;\n  }\n}","preventionTips":["Avoid setting overly strict serverMaxWindowBits or clientMaxWindowBits constraints that clients are unlikely to satisfy.","Test your server's perMessageDeflate configuration against common client defaults (browsers, ws clients).","Consider setting perMessageDeflate: false if compression compatibility is problematic for your deployment.","Log the received offers and your server options to diagnose which constraint is rejecting all offers."],"tags":["websocket","permessage-deflate","compression","handshake","negotiation"],"analyzedSha":"ae1de54330cef77e487548890fabfeb9aae1d83d","analyzedAt":"2026-08-03T19:11:18.437Z","schemaVersion":2}