{"record":{"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":181,"sourceCode":"        (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          (typeof params.client_max_window_bits === 'number'\n            ? opts.clientMaxWindowBits > params.client_max_window_bits\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":163,"sourceCodeEnd":199,"githubUrl":"https://github.com/websockets/ws/blob/c791e707eab3c13dd9a261d2479c3cc4a49a6fed/lib/permessage-deflate.js#L163-L199","documentation":"Thrown by `PerMessageDeflate.acceptAsServer()` when none of the client's extension offers satisfy the server's configured constraints. The server walks each offer and rejects it if (a) the server disabled `server_no_context_takeover` but the offer requests it, (b) the offer's `server_max_window_bits` is smaller than what the server requires, or (c) the server pinned `client_max_window_bits` to a number and the offer can't meet it. If every offer is rejected, negotiation fails with this Error.","triggerScenarios":"Server created with `new WebSocketServer({ perMessageDeflate: { serverNoContextTakeover: false, clientMaxWindowBits: 15 } })` connecting to a client whose offer has `server_no_context_takeover` set or a smaller `client_max_window_bits`; or any combination where the configured constraints are stricter than every offer received.","commonSituations":"An over-strict server `perMessageDeflate` config that no real client can satisfy; a custom client that sends only incompatible offers; version skew where a peer advertises window bits the server forbids.","solutions":["Loosen the server's `perMessageDeflate` options (drop `clientMaxWindowBits` lower bound, allow `serverNoContextTakeover`).","If compression is not required, disable it entirely with `perMessageDeflate: false` on the server.","Catch the error during the handshake (`verifyClient`/`'connection'` setup) and fall back to a no-compression connection or reject the client."],"exampleFix":"// before\nconst pmd = new PerMessageDeflate({\n  isServer: true,\n  clientMaxWindowBits: 15,\n  serverNoContextTakeover: false\n});\npmd.accept([{ server_no_context_takeover: true }]); // throws\n\n// after — align constraints with the offers you expect\nconst pmd = new PerMessageDeflate({ isServer: true });\npmd.accept([{ client_max_window_bits: true }]);","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"const perMessageDeflate = new PerMessageDeflate({ isServer: true });\ntry {\n  perMessageDeflate.accept(parsedOffers);\n} catch (err) {\n  // No offer is compatible with the server's compression policy.\n  // Fall back to a connection without compression, or reject the client.\n  negotiateWithoutCompression(socket);\n}","preventionTips":["Keep the server's `perMessageDeflate` options within what common clients offer (don't pin a high `clientMaxWindowBits` lower bound or forbid context takeover unilaterally).","Expose compression as optional: catch this error and fall back to a no-compression handshake.","Document the server's compression policy so clients can be configured to match."],"tags":["websocket","compression","permessage-deflate","negotiation","handshake","rfc7692"],"backgroundTag":null,"analyzedSha":"c791e707eab3c13dd9a261d2479c3cc4a49a6fed","analyzedAt":"2026-08-06T19:07:51.047Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}