Signatur
Beschreibung
Die Methode [Symbol.iterator]() setzt das Iterable-Protokoll für RTCStatsReport um. Ein RTCStatsReport ist ein schreibgeschütztes, Map-ähnliches Objekt: Die Schlüssel sind die eindeutigen IDs der Statistik-Objekte (z. B. "RTCInboundRTPVideoStream_1234"), die Werte sind Statistik-Wörterbücher wie RTCInboundRtpStreamStats oder RTCCandidatePairStats.
Die Methode ist identisch mit RTCStatsReport.prototype.entries() und liefert einen Iterator, der für jeden Eintrag ein Array [id, stats] erzeugt – in der Einfügereihenfolge. Man ruft sie meist nicht direkt auf, sondern indirekt über for...of, die Spread-Syntax [...report], Destrukturierung oder Array.from() bzw. new Map(report).
Typischer Einsatz: Nach await pc.getStats() alle Einträge durchlaufen und nach stats.type filtern, etwa um Bitraten, Paketverluste, Jitter oder den aktiven ICE-Kandidatenpaar-Status für ein Monitoring-Dashboard auszuwerten.
Rückgabewert
[id, stats] liefert. Entspricht dem Rückgabewert von entries().Beispiele
Alle Statistiken mit for...of durchlaufen
const pc = new RTCPeerConnection();
pc.createDataChannel('test');
await pc.setLocalDescription(await pc.createOffer());
const report = await pc.getStats();
// for...of nutzt intern report[Symbol.iterator]()
for (const [id, stats] of report) {
console.log(`${stats.type.padEnd(20)} ${id}`);
}
Eingehende Video-Streams per Spread-Syntax filtern
const getInboundVideo = async (pc) => {
const report = await pc.getStats();
return [...report]
.map(([, stats]) => stats)
.filter((s) => s.type === 'inbound-rtp' && s.kind === 'video')
.map(({ id, packetsLost, jitter, framesPerSecond }) => ({
id, packetsLost, jitter, framesPerSecond,
}));
};
// console.table(await getInboundVideo(pc));
Iterator direkt aufrufen und Bitrate berechnen
let previous = new Map();
const logBitrate = async (pc) => {
const report = await pc.getStats();
const it = report[Symbol.iterator]();
for (let step = it.next(); !step.done; step = it.next()) {
const [id, s] = step.value;
if (s.type !== 'outbound-rtp') continue;
const old = previous.get(id);
if (old) {
const kbit = ((s.bytesSent - old.bytesSent) * 8) / (s.timestamp - old.timestamp);
console.log(`${s.kind}: ${kbit.toFixed(1)} kbit/s`);
}
}
// Snapshot als echte Map sichern
previous = new Map(report);
};
// setInterval(() => logBitrate(pc), 1000);
// Wichtig · Fallstricke
- Momentaufnahme: Ein
RTCStatsReportändert sich nach dem Erzeugen nicht. Für aktuelle Werte mussgetStats()erneut aufgerufen werden; Raten (Bitrate, Paketverlust pro Sekunde) ergeben sich nur aus der Differenz zweier Berichte. - Nur lesbar: Anders als bei
Mapgibt es keinset(),delete()oderclear(). Mitnew Map(report)erhält man eine veränderbare Kopie. - IDs nicht fest einplanen: Format und Inhalt der Schlüssel sind browserspezifisch. Immer über
stats.type(und ggf.kind) filtern, nie über festgelegte ID-Strings. - Verfügbare Felder schwanken: Welche Statistik-Typen und Eigenschaften vorkommen, hängt vom Browser und vom Verbindungszustand ab (z. B. fehlt
inbound-rtp, bevor Medien fließen). Aufundefinedprüfen. - Kompatibilität: Die Iteration wird von allen aktuellen Browsern unterstützt. Sehr alte Chrome-Versionen hatten eine veraltete, auf Callbacks basierende
getStats()-Variante ohne Map-artigen Bericht.