Signatur
Beschreibung
Die schreibgeschützte Eigenschaft code des CloseEvent-Interfaces enthält den Statuscode, mit dem eine WebSocket-Verbindung beendet wurde. Das Event erhältst du im Handler für das close-Event eines WebSocket-Objekts, entweder über socket.addEventListener("close", handler) oder über socket.onclose.
Die Codes sind in RFC 6455, Abschnitt 7.4 definiert und im IANA-Register gelistet. Wichtige Werte:
1000– normales Schließen, die Verbindung hat ihren Zweck erfüllt.1001– Gegenstelle geht weg (Server fährt herunter, Seite wird verlassen).1002– Protokollfehler.1003– nicht unterstützter Datentyp.1005– kein Statuscode übermittelt (reserviert, wird nie aktiv gesendet).1006– abnormales Schließen ohne Close-Frame, z. B. Netzabbruch oder fehlgeschlagener Handshake (reserviert).1007– ungültige Nutzdaten (z. B. kein gültiges UTF-8).1008– Richtlinienverstoß.1009– Nachricht zu groß.1011– interner Serverfehler.1015– TLS-Handshake fehlgeschlagen (reserviert).3000–3999– für Bibliotheken und Frameworks (bei IANA registriert);4000–4999– frei für anwendungsspezifische Codes.
Typischerweise wertest du code aus, um zu entscheiden, ob du automatisch neu verbindest (z. B. bei 1006 oder 1011), ob du dem Nutzer eine Fehlermeldung anzeigst oder ob das Schließen gewollt war (1000). Zusammen mit CloseEvent.reason und CloseEvent.wasClean ergibt sich ein vollständiges Bild des Verbindungsendes.
Rückgabewert
1000 für normales Schließen. Bei manuell erzeugten Events ohne Angabe: 0.Beispiele
Schließcode mit addEventListener auswerten
const socket = new WebSocket("wss://echo.websocket.org");
socket.addEventListener("open", () => {
// Verbindung sauber mit eigenem Code und Grund beenden
socket.close(1000, "Arbeit erledigt");
});
socket.addEventListener("close", (event) => {
console.log(`Code: ${event.code}, Grund: ${event.reason}, sauber: ${event.wasClean}`);
});
Automatischer Reconnect mit onclose und Backoff
const RETRY_CODES = new Set([1001, 1006, 1011, 1012, 1013]);
let attempt = 0;
const connect = () => {
const socket = new WebSocket("wss://example.com/live");
socket.onopen = () => {
attempt = 0;
};
socket.onclose = ({ code, reason }) => {
if (RETRY_CODES.has(code)) {
const delay = Math.min(30000, 1000 * 2 ** attempt++);
console.warn(`Verbindung verloren (${code}), neuer Versuch in ${delay} ms`);
setTimeout(connect, delay);
} else if (code !== 1000) {
console.error(`Endgültig geschlossen: ${code} ${reason}`);
}
};
};
connect();
Anwendungsspezifische Codes (4000–4999) auswerten
const messages = {
4001: "Sitzung abgelaufen – bitte erneut anmelden.",
4003: "Keine Berechtigung für diesen Kanal.",
};
const socket = new WebSocket("wss://example.com/chat");
socket.addEventListener("close", (event) => {
const text = messages[event.code] ?? `Verbindung beendet (Code ${event.code}).`;
console.log(text);
});
CloseEvent manuell erzeugen (z. B. für Tests)
const event = new CloseEvent("close", {
code: 4001,
reason: "Token abgelaufen",
wasClean: true,
});
console.log(event.code); // 4001
console.log(new CloseEvent("close").code); // 0 (Standardwert)
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung an
event.codehat keine Wirkung (im Strict Mode wirft sie einenTypeError). Den Code legst du beim Schließen überWebSocket.close(code, reason)oder beim Konstruieren übernew CloseEvent("close", { code })fest. - Erlaubte Codes bei
close(): Im Browser darfst du nur1000oder3000–4999übergeben. Andere Werte führen zu einerInvalidAccessError-DOMException. Einreasonlänger als 123 Byte (UTF-8) wirft einenSyntaxError. - 1006 ist nicht aussagekräftig: Aus Sicherheitsgründen verrät der Browser bei fehlgeschlagenem Verbindungsaufbau (DNS-, TLS-, CORS-/Origin-Fehler, abgelehnter Handshake) keine Details – du erhältst nur
1006mit leeremreason. Details findest du ausschließlich in der Entwicklerkonsole bzw. in Server-Logs. 1005,1006und1015werden niemals über das Netz gesendet, sondern nur lokal gemeldet.- Verlasse dich nicht ausschließlich auf
code, um sauberes Schließen zu erkennen – prüfe zusätzlichwasClean. - Kompatibilität: In allen modernen Browsern sowie in Node.js (ab v22 mit globalem
WebSocket) verfügbar.