Signatur
Beschreibung
Die schreibgeschützte Eigenschaft sctpCauseCode des Interfaces RTCError gibt den numerischen SCTP-Ursachencode zurück. Er erklärt, warum die SCTP-Verhandlung bzw. die SCTP-Assoziation fehlgeschlagen ist. WebRTC-Datenkanäle (RTCDataChannel) laufen über SCTP (über DTLS). Scheitert dort etwas auf Protokollebene, bekommt der Fehler diesen Code aus dem SCTP-Standard.
Einen Wert hat die Eigenschaft nur, wenn RTCError.errorDetail den Wert "sctp-failure" hat. Bei allen anderen Fehlerarten, etwa "dtls-failure" oder "data-channel-failure", ist sie null. Die Codes stammen aus RFC 4960, Abschnitt 3.3.10 und späteren Erweiterungen. Beispiele sind 1 (ungültige Stream-ID), 12 (vom Nutzer ausgelöster Abbruch, „User Initiated Abort“) und 13 (Protokollverletzung).
Meistens liest man die Eigenschaft im error-Event eines RTCDataChannel aus. Das Event ist ein RTCErrorEvent, und seine Eigenschaft error enthält das RTCError-Objekt. Nützlich ist der Code für Diagnose, Logging und Telemetrie, zum Beispiel um einen regulären Abbruch durch die Gegenstelle von einem echten Protokollproblem zu unterscheiden.
Rückgabewert
errorDetail === "sctp-failure" gilt, sonst null.Beispiele
SCTP-Fehler im error-Event eines Datenkanals auswerten
const pc = new RTCPeerConnection();
const channel = pc.createDataChannel("chat");
channel.addEventListener("error", (event) => {
const err = event.error; // RTCError
if (err.errorDetail === "sctp-failure") {
console.warn(`SCTP-Fehler, Ursachencode: ${err.sctpCauseCode}`);
} else {
console.warn(`Anderer Fehler: ${err.errorDetail}`);
}
});
Ursachencode in lesbaren Text umwandeln
const SCTP_CAUSES = {
1: "Ungültige Stream-ID",
2: "Fehlender Pflichtparameter",
3: "Veraltetes Cookie",
4: "Keine Ressourcen mehr",
5: "Adresse nicht auflösbar",
6: "Unbekannter Chunk-Typ",
7: "Ungültiger Pflichtparameter",
8: "Unbekannte Parameter",
9: "Keine Nutzdaten",
10: "Cookie beim Herunterfahren empfangen",
11: "Neustart der Assoziation mit neuen Adressen",
12: "Vom Nutzer ausgelöster Abbruch",
13: "Protokollverletzung"
};
const describeSctpError = (err) =>
err.sctpCauseCode == null
? "Kein SCTP-Fehler"
: SCTP_CAUSES[err.sctpCauseCode] ?? `Unbekannter Code ${err.sctpCauseCode}`;
channel.onerror = (event) => {
console.log(describeSctpError(event.error));
};
RTCError zum Testen selbst erzeugen
if ("RTCError" in window) {
const err = new RTCError(
{ errorDetail: "sctp-failure", sctpCauseCode: 13 },
"Simulierte Protokollverletzung"
);
console.log(err.name, err.errorDetail, err.sctpCauseCode);
const other = new RTCError({ errorDetail: "dtls-failure" });
console.log(other.sctpCauseCode);
} else {
console.log("RTCError wird nicht unterstützt");
}
// Wichtig · Fallstricke
- Nur bei
"sctp-failure"gesetzt: Bei allen anderen Werten vonerrorDetailist die Eigenschaftnull. Prüfe sie deshalb mit== nullbzw.??. Eine Prüfung wieif (err.sctpCauseCode)reicht nicht, weil sienullund0gleich behandelt. - Browser-Kompatibilität:
RTCErrorundRTCErrorEventgibt es in Chromium-Browsern (Chrome, Edge, Opera) und in neueren Safari-Versionen. Firefox unterstützt sie derzeit nicht. Dort ist daserror-Event von Datenkanälen ein allgemeinesEventohneerror-Eigenschaft. Mache vorher eine Feature-Erkennung mit"RTCError" in windowoderevent.error?.sctpCauseCode. - Der Code
12(User Initiated Abort) steht oft für ein normales Schließen oder Neuladen auf der Gegenstelle. Er muss also kein echter Fehler sein. Werte ihn in der Telemetrie deshalb getrennt aus. - Die Eigenschaft ist schreibgeschützt. Zu Testzwecken kannst du den Wert nur über das Optionsobjekt des Konstruktors
new RTCError()setzen.