Signatur
Beschreibung
Die Eigenschaft extensions einer WebSocket-Instanz enthält die Erweiterungen, auf die sich Client und Server beim Handshake geeinigt haben. Der Wert entspricht dem Inhalt des HTTP-Antwort-Headers Sec-WebSocket-Extensions, den der Server beim Upgrade zurückschickt.
Die bekannteste Erweiterung ist permessage-deflate (RFC 7692). Sie komprimiert die Nachrichten. Der Browser bietet unterstützte Erweiterungen selbstständig an. Aus JavaScript lässt sich das nicht steuern, die Eigenschaft ist also reine Information.
Solange die Verbindung noch nicht offen ist (readyState === WebSocket.CONNECTING), ist der Wert ein leerer String. Lies ihn deshalb erst im open-Ereignis oder danach aus. Wenn keine Erweiterung ausgehandelt wurde, bleibt der String auch danach leer.
Rückgabewert
"permessage-deflate; client_max_window_bits=15". Ein leerer String bedeutet: Es wurde keine Erweiterung ausgehandelt oder die Verbindung ist noch nicht offen.Beispiele
Erweiterungen nach dem Verbindungsaufbau auslesen
const socket = new WebSocket('wss://echo.websocket.org');
// Vor dem Handshake noch leer
console.log('Vorher:', JSON.stringify(socket.extensions));
socket.addEventListener('open', () => {
console.log('Erweiterungen:', socket.extensions || '(keine)');
});
Prüfen, ob Kompression aktiv ist
const isCompressed = (ws) =>
ws.extensions
.split(',')
.map((ext) => ext.trim().split(';')[0].trim())
.includes('permessage-deflate');
const socket = new WebSocket('wss://example.com/live');
socket.onopen = () => {
if (isCompressed(socket)) {
console.log('Nachrichten werden komprimiert übertragen.');
} else {
console.log('Keine Kompression – große Nachrichten besser bündeln.');
}
};
Erweiterungen mit Parametern in ein Objekt zerlegen
const parseExtensions = (header) =>
header
.split(',')
.filter((part) => part.trim() !== '')
.map((part) => {
const [name, ...params] = part.split(';').map((s) => s.trim());
const options = Object.fromEntries(
params.map((p) => {
const [key, value = true] = p.split('=');
return [key, value];
})
);
return { name, options };
});
console.log(parseExtensions('permessage-deflate; client_max_window_bits=15; server_no_context_takeover'));
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung wie
socket.extensions = '...'wird im nicht-strikten Modus stillschweigend ignoriert und löst im strikten Modus einenTypeErroraus. Welche Erweiterungen angeboten werden, entscheidet allein der Browser. - Zeitpunkt: Vor dem
open-Ereignis ist der Wert immer"". Wenn du ihn direkt nachnew WebSocket()ausliest, kann das zu falschen Schlüssen führen. - Proxys und Load-Balancer können den Header
Sec-WebSocket-Extensionsentfernen. Dann ist keine Kompression aktiv, obwohl der Server sie eigentlich unterstützt. - Sicherheit: Werden geheime Daten zusammen mit Daten komprimiert, die ein Angreifer beeinflussen kann, sind Seitenkanal-Angriffe wie CRIME/BREACH denkbar. Das musst du serverseitig bedenken.
- Kompatibilität: Wird von allen modernen Browsern unterstützt, ebenso vom globalen
WebSocketin Node.js ab Version 22 und vom npm-Paketws.