Start · Sprachen · JavaScript · Referenz · WebSocketStream.closed

WebSocketStream.closed

Eigenschaft

Schreibgeschütztes Promise, das mit <code>{ closeCode, reason }</code> erfüllt wird, sobald die Verbindung des <code>WebSocketStream</code> geschlossen ist.

seit JavaScript Nicht standardisiert, experimentell: Chrome/Edge 1 Kategorie: webapi

Signatur

WebSocketStream.closed

Beschreibung

Die schreibgeschützte Eigenschaft closed eines WebSocketStream-Objekts enthält ein Promise. Es wird erfüllt, sobald die WebSocket-Verbindung sauber geschlossen wurde, und liefert dann ein Objekt mit zwei Eigenschaften:

  • closeCode: der numerische Schließcode, den der Server oder Client gesendet hat, z. B. 1000 für ein normales Schließen.
  • reason: ein String mit dem Grund, den der schließende Endpunkt mitgeschickt hat. Er kann leer sein.

Anders als beim klassischen WebSocket brauchst du keinen close-Event-Listener. Mit await wss.closed reagierst du direkt auf das Verbindungsende, zum Beispiel um Aufräumarbeiten zu erledigen, die Oberfläche zu aktualisieren oder eine neue Verbindung aufzubauen.

Wird die Verbindung nicht sauber geschlossen, etwa durch einen Netzwerkfehler, einen fehlgeschlagenen Handshake oder einen Abbruch über das signal, dann wird das Promise abgelehnt. Du solltest deshalb immer eine Fehlerbehandlung mit try…catch oder .catch() einbauen.

Rückgabewert

Typ
Promise<{ closeCode: number, reason: string }>
Beschreibung
Ein Promise, das beim sauberen Schließen mit { closeCode, reason } erfüllt wird. Bei einem Verbindungsfehler oder Abbruch wird es abgelehnt.

Beispiele

Auf das Schließen der Verbindung warten

const wss = new WebSocketStream('wss://echo.websocket.org/');

const { readable, writable } = await wss.opened;
console.log('Verbindung offen');

try {
  const { closeCode, reason } = await wss.closed;
  console.log(`Geschlossen: Code ${closeCode}, Grund: "${reason}"`);
} catch (err) {
  console.error('Verbindung unerwartet beendet:', err);
}
Verbindung offen Geschlossen: Code 1000, Grund: "Fertig"

Selbst schließen und Ergebnis auswerten

const wss = new WebSocketStream('wss://example.com/chat');
const { writable } = await wss.opened;

const writer = writable.getWriter();
await writer.write('Tschüss!');
writer.releaseLock();

// Verbindung mit eigenem Code und Grund schließen
wss.close({ closeCode: 1000, reason: 'Benutzer hat sich abgemeldet' });

const info = await wss.closed;
console.log(info);
{ closeCode: 1000, reason: 'Benutzer hat sich abgemeldet' }

Automatischer Neuaufbau nach Verbindungsverlust

const connect = async (url, attempt = 0) => {
  const wss = new WebSocketStream(url);
  try {
    await wss.opened;
    attempt = 0;
    const { closeCode } = await wss.closed;
    if (closeCode === 1000) return; // normales Ende, kein Neuaufbau
  } catch (err) {
    console.warn('Fehler:', err.message);
  }
  const delay = Math.min(1000 * 2 ** attempt, 30000);
  console.log(`Neuer Versuch in ${delay} ms`);
  setTimeout(() => connect(url, attempt + 1), delay);
};

if ('WebSocketStream' in globalThis) {
  connect('wss://example.com/live');
}
Neuer Versuch in 1000 ms

// Wichtig · Fallstricke

  • Kompatibilität: WebSocketStream ist nicht standardisiert und experimentell. Bisher gibt es die Schnittstelle nur in Chromium-basierten Browsern ab Version 124. Prüfe die Verfügbarkeit mit 'WebSocketStream' in globalThis und greife sonst auf WebSocket zurück.
  • Ablehnung behandeln: Wenn die Verbindung nicht sauber geschlossen wird, etwa durch einen Netzwerkfehler, einen fehlgeschlagenen Handshake oder AbortController.abort(), wird closed abgelehnt. Ohne catch entsteht dann eine unbehandelte Promise-Ablehnung.
  • Scheitert der Verbindungsaufbau, werden sowohl opened als auch closed abgelehnt. Behandle beide Fälle.
  • Das Promise wird erst erfüllt, wenn der Schließ-Handshake abgeschlossen ist, nicht schon beim Aufruf von close().
  • Für closeCode in close() sind nur 1000 oder Werte von 3000 bis 4999 erlaubt. Andere Werte führen zu einem Fehler.