Start · Sprachen · JavaScript · Referenz · RTCStatsReport.[Symbol.iterator]()

RTCStatsReport.[Symbol.iterator]()

Methode

Gibt einen Iterator über die <code>[id, stats]</code>-Paare eines <code>RTCStatsReport</code> zurück, damit <code>for...of</code>, Spread-Syntax und <code>Array.from()</code> funktionieren.

seit JavaScript Baseline: alle modernen Browser (Chrome, Firefox, Kategorie: webapi

Signatur

RTCStatsReport.prototype[Symbol.iterator]()

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

Typ
Iterator<[string, object]>
Beschreibung
Ein neuer Map-Iterator, der für jeden Statistik-Eintrag ein Array [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}`);
}
peer-connection P data-channel D1 codec ... (genaue IDs sind browserabhängig)

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));
[{ id: 'IT01V123', packetsLost: 0, jitter: 0.004, framesPerSecond: 30 }]

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);
video: 1480.3 kbit/s audio: 32.1 kbit/s

// Wichtig · Fallstricke

  • Momentaufnahme: Ein RTCStatsReport ändert sich nach dem Erzeugen nicht. Für aktuelle Werte muss getStats() erneut aufgerufen werden; Raten (Bitrate, Paketverlust pro Sekunde) ergeben sich nur aus der Differenz zweier Berichte.
  • Nur lesbar: Anders als bei Map gibt es kein set(), delete() oder clear(). Mit new 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). Auf undefined prü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.