Signatur
Beschreibung
Die Eigenschaft readyState gibt an, in welchem Zustand sich der zugrunde liegende Transport eines RTCDataChannel befindet. Nur im Zustand "open" kann man mit send() Daten verschicken. In jedem anderen Zustand wirft send() einen InvalidStateError.
Mögliche Werte:
"connecting": Der Kanal wird gerade aufgebaut. Das ist der Anfangszustand beicreateDataChannel(), solange die Verbindung noch nicht steht."open": Die Verbindung steht, Daten können in beide Richtungen fließen. Beim Wechsel in diesen Zustand wird das Ereignisopenausgelöst."closing": Der Kanal wird gerade geschlossen, z. B. nachclose(). Bereits eingereihte Nachrichten werden noch zu Ende übertragen, neue kann man nicht mehr senden. Danach folgt das Ereignisclosing."closed": Der Kanal ist geschlossen oder konnte gar nicht erst aufgebaut werden. Danach folgt das Ereignisclose.
In der Praxis prüft man readyState vor dem Senden, um Fehler zu vermeiden, oder man nutzt ihn für Statusanzeigen und eigene Warteschlangen. Auf Zustandswechsel reagiert man am besten ereignisbasiert mit open, closing und close, statt den Wert regelmäßig abzufragen.
Rückgabewert
RTCDataChannelState), der den aktuellen Zustand des Datenkanals beschreibt.Beispiele
Nur senden, wenn der Kanal offen ist
const pc = new RTCPeerConnection();
const channel = pc.createDataChannel('chat');
const sendMessage = (text) => {
if (channel.readyState === 'open') {
channel.send(text);
} else {
console.warn(`Senden nicht möglich, Zustand: ${channel.readyState}`);
}
};
sendMessage('Hallo!'); // Die Verbindung steht noch nicht
Nachrichten zwischenspeichern, bis der Kanal offen ist
const pc = new RTCPeerConnection();
const channel = pc.createDataChannel('updates');
const queue = [];
const send = (data) => {
if (channel.readyState === 'open') {
channel.send(data);
} else if (channel.readyState === 'connecting') {
queue.push(data); // für später aufheben
} else {
throw new Error('Kanal ist geschlossen');
}
};
channel.addEventListener('open', () => {
console.log('Zustand:', channel.readyState);
while (queue.length) channel.send(queue.shift());
});
send(JSON.stringify({ type: 'ping' }));
Statusanzeige über Ereignisse aktualisieren
const pc = new RTCPeerConnection();
const channel = pc.createDataChannel('status');
const labels = {
connecting: '⏳ Verbinde …',
open: '🟢 Verbunden',
closing: '🟠 Wird getrennt …',
closed: '🔴 Getrennt'
};
const render = () => console.log(labels[channel.readyState]);
render();
for (const type of ['open', 'closing', 'close']) {
channel.addEventListener(type, render);
}
// Später z. B. per Knopfdruck:
// channel.close();
// Wichtig · Fallstricke
- Fehler bei
send(): Wirdsend()in einem anderen Zustand als"open"aufgerufen, wirft der Browser einenInvalidStateError(DOMException). Deshalb vor dem Senden immerreadyStateprüfen oder auf das Ereignisopenwarten. - Keine Rückkehr aus
"closed": Ein geschlossener Kanal lässt sich nicht wieder öffnen. Für einen neuen Versuch braucht man einen neuen Kanal (createDataChannel()), eventuell sogar eine neueRTCPeerConnection. - Nicht mit Zahlen vergleichen: Anders als bei
WebSocket.readyStateist der Wert ein String und keine Zahl. Vergleiche wie=== 1sind hier immer falsch. - Kanäle auf der Gegenseite: Kanäle, die man über das Ereignis
datachannelerhält, sind meist schon"open". Trotzdem sollte man den Zustand prüfen. - Pufferfüllstand:
"open"sagt nichts darüber, wie viele Daten noch warten. Bei großen Datenmengen zusätzlichbufferedAmountundbufferedamountlowbeachten. - Browser-Unterstützung: Wird in allen aktuellen Browsern unterstützt (Chrome, Edge, Firefox, Safari). Das Ereignis
closingkam erst später dazu und fehlt in älteren Browserversionen.