Signatur
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
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);
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}`);
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);
// 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 nieopenerreicht 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 Eigenschaftundefinedsein. Nutze deshalb Fallbacks wie?? 0. - Browser-Kompatibilität: Aktuelle Chromium-Browser, Firefox und Safari unterstützen die Eigenschaft. Die veralteten Felder
dataChannelsRequestedunddataChannelsAcceptedwurden 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.