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.
Extension Status
permessage-deflateStandard, widely supported
x-webkit-deflate-frameLegacy WebKit DEPRECATED
Multiplexing Never standardized
2. Negotiating Extensions
Header Detail
Client offer Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Server accept Returns subset with chosen params
Multiple offers Comma-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));
Side Control
Browser Auto-on (cannot disable)
Node ws perMessageDeflate: true/options/false
Server Negotiates; can refuse
4. Configuring Compression Parameters
Parameter Range Effect
server_max_window_bits8-15 Larger → better ratio, more memory
client_max_window_bits8-15 Same on client
server_no_context_takeoverflag Reset state per message
level (zlib)1-9 CPU vs ratio
thresholdbytes Skip small frames
5. Checking Active Extensions
Example: Inspect
console. log (ws.extensions);
// e.g. "permessage-deflate; client_max_window_bits=15"
Property Type
ws.extensionsstring (header value)
Empty None negotiated
6. Disabling Extensions
Example: Disable on server
new WebSocketServer ({ port: 8080 , perMessageDeflate: false });
Reason Detail
Memory pressure Each connection: zlib state ~256KB
Latency-sensitive Compression adds CPU latency
Already-compressed payload Binary protobuf/msgpack
7. Understanding Extension Overhead
Cost Detail
CPU zlib deflate per message
Memory zlib state per direction per connection
Latency Small messages may worsen
Throughput Higher for repetitive text
8. Testing Extension Support
Tool Detail
Autobahn TestSuite Full RFC 6455 + 7692 compliance
wscat -HManual header tweak
DevTools Network Inspect extension header
9. Implementing Per-Message Compression
Example: Disable for one send
// Node ws: opt out per send
ws. send (data, { compress: false });
Option Detail
compress: falseSkip compression for this frame
binary: trueForce binary opcode
10. Handling Extension Negotiation
Outcome Action
Server accepts Use; check ws.extensions
Server omits Continue without
Mandatory not granted Server should close 1010