Start · Sprachen · JavaScript · Referenz · RTCPeerConnectionStats.dataChannelsOpened

RTCPeerConnectionStats.dataChannelsOpened

Eigenschaft

Zählt, wie viele eindeutige <code>RTCDataChannel</code>-Objekte einer <code>RTCPeerConnection</code> bisher den Zustand <code>open</code> erreicht haben.

seit JavaScript Baseline: Chrome, Edge, Firefox, Safari (WebRTC-St Kategorie: webapi

Signatur

RTCPeerConnectionStats.dataChannelsOpened

Beschreibung

Die schreibgeschützte Eigenschaft dataChannelsOpened gehört zum Wörterbuch RTCPeerConnectionStats. Dieses Statistikobjekt erscheint im RTCStatsReport, den RTCPeerConnection.getStats() zurückgibt, und hat den type-Wert "peer-connection".

Der Wert gibt an, wie viele verschiedene RTCDataChannel-Objekte während der Lebensdauer der Verbindung mindestens einmal in den Zustand open gewechselt sind. Es ist ein kumulativer Zähler: Er wird nie kleiner, auch wenn Kanäle später geschlossen werden. Jeder Kanal zählt höchstens einmal.

Zusammen mit dataChannelsClosed kannst du die Zahl der gerade offenen Kanäle berechnen (dataChannelsOpened - dataChannelsClosed). Das ist nützlich für Monitoring, Debugging und Telemetrie, zum Beispiel um nicht geschlossene Kanäle zu finden oder um zu prüfen, ob eine Verbindung wie erwartet mit ihren Datenkanälen arbeitet.

Rückgabewert

Typ
number
Beschreibung
Eine nicht negative Ganzzahl (unsigned long) mit der Anzahl der Datenkanäle, die bisher den Zustand open erreicht haben.

Beispiele

Zähler aus dem Statistikbericht lesen

const pc = new RTCPeerConnection();
const channel = pc.createDataChannel('chat');

const logOpenedChannels = async () => {
  const report = await pc.getStats();
  report.forEach((stats) => {
    if (stats.type === 'peer-connection') {
      console.log(`Geöffnete Datenkanäle: ${stats.dataChannelsOpened}`);
    }
  });
};

// Aufrufen, nachdem die Verbindung ausgehandelt wurde
channel.addEventListener('open', logOpenedChannels);
Geöffnete Datenkanäle: 1

Aktuell offene Kanäle berechnen

const getActiveChannelCount = async (pc) => {
  const report = await pc.getStats();
  const stats = [...report.values()].find((s) => s.type === 'peer-connection');
  if (!stats) return 0;
  const opened = stats.dataChannelsOpened ?? 0;
  const closed = stats.dataChannelsClosed ?? 0;
  return opened - closed;
};

// Beispielaufruf mit einer bestehenden Verbindung
const active = await getActiveChannelCount(pc);
console.log(`Offene Kanäle: ${active}`);
Offene Kanäle: 1

Regelmäßiges Monitoring für Telemetrie

const startChannelMonitor = (pc, intervalMs = 5000) => {
  let last = 0;
  const timer = setInterval(async () => {
    const report = await pc.getStats();
    for (const s of report.values()) {
      if (s.type !== 'peer-connection') continue;
      if (s.dataChannelsOpened > last) {
        console.log(`${s.dataChannelsOpened - last} neue(r) Kanal/Kanäle geöffnet`);
        last = s.dataChannelsOpened;
      }
    }
  }, intervalMs);

  // Monitoring beenden, wenn die Verbindung schließt
  pc.addEventListener('connectionstatechange', () => {
    if (pc.connectionState === 'closed') clearInterval(timer);
  });
  return () => clearInterval(timer);
};

const stopMonitor = startChannelMonitor(pc);
1 neue(r) Kanal/Kanäle geöffnet

// Wichtig · Fallstricke

  • Kumulativ: Der Wert nimmt nie ab. Die Zahl der gerade offenen Kanäle bekommst du nur zusammen mit dataChannelsClosed.
  • Nur erreichte open-Zustände: Kanäle, die mit createDataChannel() angelegt wurden, aber nie open erreicht haben (z. B. wegen fehlgeschlagener Aushandlung), werden nicht gezählt.
  • Fehlendes Statistikobjekt: Vor der Aushandlung oder in älteren Browsern kann das "peer-connection"-Objekt fehlen oder die Eigenschaft undefined sein. Nutze deshalb Fallbacks wie ?? 0.
  • Browser-Kompatibilität: Aktuelle Chromium-Browser, Firefox und Safari unterstützen die Eigenschaft. Die veralteten Felder dataChannelsRequested und dataChannelsAccepted wurden aus der Spezifikation entfernt und sollten nicht mehr verwendet werden.
  • Leistung: getStats() ist asynchron und erstellt einen vollständigen Bericht. Frage die Statistik nicht in sehr kurzen Abständen ab, zum Beispiel pro Frame.