Start · Sprachen · JavaScript · Referenz · RTCPeerConnectionStats.dataChannelsClosed

RTCPeerConnectionStats.dataChannelsClosed

Eigenschaft

Zählt, wie viele verschiedene <code>RTCDataChannel</code>-Objekte einer Verbindung den Zustand <code>"open"</code> bisher wieder verlassen haben.

seit JavaScript WebRTC Statistics API – Chrome/Edge, Firefox, Safa Kategorie: webapi

Signatur

RTCPeerConnectionStats.dataChannelsClosed

Beschreibung

Die schreibgeschützte Eigenschaft dataChannelsClosed gehört zum Statistik-Wörterbuch RTCPeerConnectionStats. Dieses Objekt erscheint im Bericht von RTCPeerConnection.getStats() als Eintrag mit type === "peer-connection". Der Wert gibt an, wie viele verschiedene Datenkanäle während ihrer Lebensdauer den Zustand "open" verlassen haben. Das passiert, wenn eine der beiden Seiten den Kanal schließt oder wenn der darunterliegende Transport (SCTP/DTLS) beendet wird.

Kanäle, die direkt von "connecting" nach "closing" oder "closed" wechseln, ohne jemals offen gewesen zu sein, werden nicht mitgezählt. Der Zähler steigt nur, er wird also nie kleiner.

Am nützlichsten ist die Eigenschaft zusammen mit dataChannelsOpened: Die Differenz dataChannelsOpened - dataChannelsClosed ergibt die Zahl der aktuell geöffneten Datenkanäle. Damit lassen sich Lecks finden (Kanäle, die nie geschlossen werden), die Kanalnutzung in Dashboards überwachen oder Verbindungsabbrüche erkennen.

Rückgabewert

Typ
number
Beschreibung
Eine nicht negative ganze Zahl: wie viele verschiedene RTCDataChannel-Objekte den Zustand "open" bisher verlassen haben. Fehlt die Unterstützung im Browser, ist die Eigenschaft undefined.

Beispiele

Wert aus dem Statistikbericht auslesen

const pc = new RTCPeerConnection();

const getClosedChannels = async (connection) => {
  const report = await connection.getStats();
  for (const stats of report.values()) {
    if (stats.type === "peer-connection") {
      return stats.dataChannelsClosed ?? 0;
    }
  }
  return 0;
};

console.log("Geschlossene Kanäle:", await getClosedChannels(pc));
Geschlossene Kanäle: 0

Aktuell geöffnete Datenkanäle berechnen

const countOpenChannels = async (pc) => {
  const report = await pc.getStats();
  const stats = [...report.values()].find((s) => s.type === "peer-connection");
  if (!stats) return null;

  const { dataChannelsOpened = 0, dataChannelsClosed = 0 } = stats;
  return dataChannelsOpened - dataChannelsClosed;
};

// Beispiel: nach 3 geöffneten und 1 geschlossenen Kanal
console.log(`Offene Kanäle: ${await countOpenChannels(pc)}`);
Offene Kanäle: 2

Kanal-Schließungen laufend überwachen

const monitorDataChannels = (pc, intervalMs = 2000) => {
  let lastClosed = 0;

  const timer = setInterval(async () => {
    if (pc.connectionState === "closed") {
      clearInterval(timer);
      return;
    }
    const report = await pc.getStats();
    report.forEach((s) => {
      if (s.type !== "peer-connection") return;
      const closed = s.dataChannelsClosed ?? 0;
      if (closed > lastClosed) {
        console.warn(`${closed - lastClosed} Datenkanal/-kanäle geschlossen (gesamt: ${closed})`);
        lastClosed = closed;
      }
    });
  }, intervalMs);

  return () => clearInterval(timer);
};

const stopMonitoring = monitorDataChannels(pc);
1 Datenkanal/-kanäle geschlossen (gesamt: 1)

// Wichtig · Fallstricke

  • Nur offen gewesene Kanäle zählen: Scheitert ein Kanal schon beim Aufbau und wechselt von "connecting" direkt nach "closed", steigt der Zähler nicht. Fehlgeschlagene Verbindungsversuche erkennt man daher nicht über diese Eigenschaft, sondern über das Ereignis error bzw. close des Kanals.
  • Verschiedene Kanäle: Jedes RTCDataChannel-Objekt wird höchstens einmal gezählt. Ein neu erzeugter Kanal mit demselben label zählt aber als eigener Kanal.
  • Zeitverzögerung: getStats() ist asynchron. Direkt nach channel.close() kann der Zähler noch den alten Wert zeigen, solange der Kanal im Zustand "closing" ist. Erst nach dem Ereignis close abfragen oder regelmäßig neu abfragen.
  • Kompatibilität: Chromium-Browser unterstützen die Eigenschaft. In Firefox und Safari kam sie erst in neueren Versionen dazu. Mit ?? 0 absichern und das Fehlen nicht als „0 Kanäle“ auswerten, wenn es auf genaue Werte ankommt.
  • Die Statistik gilt für die ganze RTCPeerConnection. Werte für einzelne Kanäle liefern Einträge mit type === "data-channel" (RTCDataChannelStats).