Working with WebSocket Extensions

1. Understanding WebSocket Extensions

Extensions modify framing behavior (compression, multiplexing) via Sec-WebSocket-Extensions. permessage-deflate (RFC 7692) is the only widely deployed extension.

ExtensionStatus
permessage-deflateStandard, widely supported
x-webkit-deflate-frameLegacy WebKit DEPRECATED
MultiplexingNever standardized

2. Negotiating Extensions

HeaderDetail
Client offerSec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Server acceptReturns subset with chosen params
Multiple offersComma-separated; server picks one

3. Enabling Compression

Example: Browser-default

// Browsers auto-offer permessage-deflate; you cannot configure it client-side.
const ws = new WebSocket("wss://x/");
ws.addEventListener("open", () => console.log(ws.extensions));
SideControl
BrowserAuto-on (cannot disable)
Node wsperMessageDeflate: true/options/false
ServerNegotiates; can refuse

4. Configuring Compression Parameters

ParameterRangeEffect
server_max_window_bits8-15Larger → better ratio, more memory
client_max_window_bits8-15Same on client
server_no_context_takeoverflagReset state per message
level (zlib)1-9CPU vs ratio
thresholdbytesSkip small frames

5. Checking Active Extensions

Example: Inspect

console.log(ws.extensions);
// e.g. "permessage-deflate; client_max_window_bits=15"
PropertyType
ws.extensionsstring (header value)
EmptyNone negotiated

6. Disabling Extensions

Example: Disable on server

new WebSocketServer({ port: 8080, perMessageDeflate: false });
ReasonDetail
Memory pressureEach connection: zlib state ~256KB
Latency-sensitiveCompression adds CPU latency
Already-compressed payloadBinary protobuf/msgpack

7. Understanding Extension Overhead

CostDetail
CPUzlib deflate per message
Memoryzlib state per direction per connection
LatencySmall messages may worsen
ThroughputHigher for repetitive text

8. Testing Extension Support

ToolDetail
Autobahn TestSuiteFull RFC 6455 + 7692 compliance
wscat -HManual header tweak
DevTools NetworkInspect extension header

9. Implementing Per-Message Compression

Example: Disable for one send

// Node ws: opt out per send
ws.send(data, { compress: false });
OptionDetail
compress: falseSkip compression for this frame
binary: trueForce binary opcode

10. Handling Extension Negotiation

OutcomeAction
Server acceptsUse; check ws.extensions
Server omitsContinue without
Mandatory not grantedServer should close 1010