Start · Sprachen · JavaScript · Referenz · RTCDataChannel.readyState

RTCDataChannel.readyState

Eigenschaft

Schreibgeschützter String, der den aktuellen Zustand der Datenverbindung eines <code>RTCDataChannel</code> angibt: <code>"connecting"</code>, <code>"open"</code>, <code>"closing"</code> oder <code>"closed"</code>.

seit JavaScript Baseline: alle modernen Browser (seit 2020) Kategorie: webapi

Signatur

RTCDataChannel.readyState

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 bei createDataChannel(), 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 Ereignis open ausgelöst.
  • "closing": Der Kanal wird gerade geschlossen, z. B. nach close(). Bereits eingereihte Nachrichten werden noch zu Ende übertragen, neue kann man nicht mehr senden. Danach folgt das Ereignis closing.
  • "closed": Der Kanal ist geschlossen oder konnte gar nicht erst aufgebaut werden. Danach folgt das Ereignis close.

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

Typ
"connecting" | "open" | "closing" | "closed"
Beschreibung
Ein String (Aufzählungstyp 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
Senden nicht möglich, Zustand: connecting

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' }));
Zustand: open (sobald die Verbindung mit dem Gegenüber steht)

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();
⏳ Verbinde …

// Wichtig · Fallstricke

  • Fehler bei send(): Wird send() in einem anderen Zustand als "open" aufgerufen, wirft der Browser einen InvalidStateError (DOMException). Deshalb vor dem Senden immer readyState prüfen oder auf das Ereignis open warten.
  • 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 neue RTCPeerConnection.
  • Nicht mit Zahlen vergleichen: Anders als bei WebSocket.readyState ist der Wert ein String und keine Zahl. Vergleiche wie === 1 sind hier immer falsch.
  • Kanäle auf der Gegenseite: Kanäle, die man über das Ereignis datachannel erhä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ätzlich bufferedAmount und bufferedamountlow beachten.
  • Browser-Unterstützung: Wird in allen aktuellen Browsern unterstützt (Chrome, Edge, Firefox, Safari). Das Ereignis closing kam erst später dazu und fehlt in älteren Browserversionen.