Start · Sprachen · JavaScript · Referenz · WebSocket.extensions

WebSocket.extensions

Eigenschaft

Schreibgeschützte Eigenschaft, die als String die vom Server beim Verbindungsaufbau ausgewählten WebSocket-Erweiterungen liefert (z. B. <code>permessage-deflate</code>).

seit JavaScript Baseline: alle modernen Browser Kategorie: webapi

Signatur

WebSocket.extensions

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

Typ
string
Beschreibung
Die ausgehandelten Erweiterungen samt Parametern, z. B. "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)');
});
Vorher: "" Erweiterungen: permessage-deflate; client_max_window_bits=15

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.');
  }
};
Nachrichten werden komprimiert übertragen.

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'));
[ { name: 'permessage-deflate', options: { client_max_window_bits: '15', server_no_context_takeover: true } } ]

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung wie socket.extensions = '...' wird im nicht-strikten Modus stillschweigend ignoriert und löst im strikten Modus einen TypeError aus. Welche Erweiterungen angeboten werden, entscheidet allein der Browser.
  • Zeitpunkt: Vor dem open-Ereignis ist der Wert immer "". Wenn du ihn direkt nach new WebSocket() ausliest, kann das zu falschen Schlüssen führen.
  • Proxys und Load-Balancer können den Header Sec-WebSocket-Extensions entfernen. 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 WebSocket in Node.js ab Version 22 und vom npm-Paket ws.