Signatur
Beschreibung
Das error-Ereignis wird an einem RTCDataChannel ausgelöst, wenn im Datenkanal ein Fehler auftritt. Das kann zum Beispiel passieren, wenn die zugrunde liegende SCTP-Verbindung abbricht, eine Nachricht nicht übertragen werden kann oder die Gegenseite den Kanal fehlerhaft schließt. Das Ereignis ist nicht abbrechbar und steigt nicht im DOM auf.
Den Handler registriert man entweder mit addEventListener("error", handler) oder über die Eigenschaft onerror. Das Ereignisobjekt ist ein RTCErrorEvent. Dessen Eigenschaft error enthält ein RTCError-Objekt (abgeleitet von DOMException) mit genaueren Angaben:
errorDetail: Art des Fehlers, bei Datenkanälen meist"data-channel-failure"oder"sctp-failure".sctpCauseCode: SCTP-Ursachencode nach RFC 4960, wennerrorDetailden Wert"sctp-failure"hat. Sonst ist ernull.receivedAlert/sentAlert: DTLS-Alert-Codes bei"dtls-failure".message: eine lesbare Fehlermeldung.
In der Praxis nutzt man das Ereignis, um Fehler zu protokollieren, die Oberfläche zu informieren (z. B. „Verbindung unterbrochen“) und die Verbindung neu aufzubauen. Nach einem Fehler wird der Kanal meist geschlossen. Deshalb sollte man zusätzlich auf das close-Ereignis reagieren.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Der Ereignisname "error", wenn man addEventListener verwendet. |
|
| $handler Pflicht | (event: RTCErrorEvent) => void | Callback, der das RTCErrorEvent erhält. Die Fehlerdetails stehen in event.error. |
|
| $options | boolean | AddEventListenerOptions | false | Optionale Listener-Optionen wie once oder signal (für das Abmelden per AbortController). |
Rückgabewert
addEventListener gibt nichts zurück. Der Handler erhält ein RTCErrorEvent, dessen Eigenschaft error ein RTCError enthält.Beispiele
Fehler mit addEventListener auswerten
const pc = new RTCPeerConnection();
const channel = pc.createDataChannel("chat");
channel.addEventListener("error", (event) => {
const err = event.error; // RTCError
console.error("Datenkanal-Fehler:", err?.message);
console.log("Detail:", err?.errorDetail);
if (err?.errorDetail === "sctp-failure") {
console.log("SCTP-Ursachencode:", err.sctpCauseCode);
}
});
onerror-Eigenschaft mit UI-Hinweis
const pc = new RTCPeerConnection();
const channel = pc.createDataChannel("dateien", { ordered: true });
const status = document.querySelector("#status");
channel.onerror = (event) => {
const detail = event.error?.errorDetail ?? "unbekannt";
status.textContent = `Übertragung fehlgeschlagen (${detail})`;
};
channel.onclose = () => {
status.textContent += " – Kanal geschlossen.";
};
Listener per AbortController wieder entfernen
const pc = new RTCPeerConnection();
const channel = pc.createDataChannel("telemetrie");
const controller = new AbortController();
const onError = (event) => {
console.warn("Fehler im Kanal", channel.label, event.error?.message);
};
channel.addEventListener("error", onError, { signal: controller.signal });
// Später, z. B. beim Verlassen der Ansicht:
const cleanup = () => {
controller.abort(); // entfernt den Listener
// Alternativ: channel.removeEventListener("error", onError);
channel.close();
pc.close();
};
cleanup();
console.log("Aufgeräumt, Zustand:", channel.readyState);
Automatischer Neuaufbau nach Fehler
const createChannel = (pc, label, attempt = 1) => {
const channel = pc.createDataChannel(label);
channel.addEventListener("error", (event) => {
console.error(`Versuch ${attempt}:`, event.error?.errorDetail);
});
channel.addEventListener("close", () => {
if (attempt < 3 && pc.connectionState === "connected") {
setTimeout(() => createChannel(pc, label, attempt + 1), 1000 * attempt);
}
}, { once: true });
return channel;
};
const pc = new RTCPeerConnection();
const channel = createChannel(pc, "sync");
// Wichtig · Fallstricke
- Browser-Kompatibilität: Das
error-Ereignis wird von allen modernen Browsern unterstützt.RTCErrorEventundRTCErrormit Feldern wieerrorDetailundsctpCauseCodegibt es aber nicht in allen Browsern bzw. älteren Versionen (vor allem ältere Firefox-Versionen). Greifen Sie deshalb defensiv zu, z. B. mitevent.error?.errorDetail. - Fehler bei
send(): Ruft mansend()auf einem Kanal auf, der noch nicht offen ist (readyState !== "open"), löst das keinerror-Ereignis aus. Stattdessen wird synchron eineInvalidStateError-DOMExceptiongeworfen. Diese muss man mittry/catchabfangen. - Kanal ist danach meist unbrauchbar: Nach einem
errorfolgt in der Regelclose. Legen Sie die Logik für den Neuaufbau deshalb in denclose-Handler und nicht in denerror-Handler, sonst wird der Kanal womöglich doppelt aufgebaut. - Nur ein Handler über
onerror: Weronerrorerneut zuweist, überschreibt den vorherigen Handler. Für mehrere unabhängige Handler verwenden SieaddEventListener. - Nicht mit Verbindungsfehlern verwechseln: Probleme mit ICE oder der gesamten Peer-Verbindung melden
RTCPeerConnection-Ereignisse wieconnectionstatechangeodericecandidateerror, nicht dieses Ereignis.