Start · Sprachen · JavaScript · Referenz · RTCStatsReport.has()

RTCStatsReport.has()

Methode

Prüft, ob ein <code>RTCStatsReport</code> ein Statistik-Wörterbuch mit der angegebenen ID enthält, und gibt <code>true</code> oder <code>false</code> zurück.

seit JavaScript Baseline: alle modernen Browser (Chrome 58+, Firef Kategorie: webapi

Signatur

RTCStatsReport.prototype.has(id)

Beschreibung

RTCStatsReport ist ein schreibgeschütztes, Map-ähnliches Objekt. Es ordnet jeder Statistik-ID (einem String) ein Statistik-Objekt zu, zum Beispiel vom Typ inbound-rtp, outbound-rtp, candidate-pair oder transport. Die Methode has() funktioniert wie Map.prototype.has(): Sie sagt Ihnen, ob es im Bericht einen Eintrag mit genau diesem Schlüssel gibt.

Gebraucht wird has() vor allem dann, wenn Sie Statistiken über Verweise verfolgen. Viele Statistik-Objekte enthalten Felder mit den IDs anderer Einträge, etwa transportId, codecId, localCandidateId oder selectedCandidatePairId. Ob der Zieleintrag im aktuellen Bericht wirklich vorhanden ist, prüfen Sie mit has(), bevor Sie ihn mit get() auslesen.

Auch beim Vergleich zweier Berichte, die zu unterschiedlichen Zeitpunkten erstellt wurden, ist has() nützlich. So finden Sie heraus, ob ein Eintrag schon im vorherigen Bericht stand. Das brauchen Sie etwa, um Bitraten aus der Differenz von bytesReceived und timestamp zu berechnen.

Die IDs werden vom Browser vergeben. Sie sind nicht standardisiert und können sich je nach Browser und Sitzung unterscheiden. Deshalb sollten Sie IDs nie fest in den Code schreiben, sondern immer aus einem Bericht oder aus Verweisfeldern übernehmen.

Parameter

Name Typ Default Beschreibung
$id Pflicht string Die ID des gesuchten Statistik-Objekts. Sie entspricht dem Feld id des Eintrags bzw. einem Verweisfeld wie transportId oder codecId.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn der Bericht einen Eintrag mit der angegebenen ID enthält, sonst false.

Beispiele

Codec-Verweis vor dem Zugriff prüfen

// pc ist eine bestehende RTCPeerConnection mit aktiver Verbindung
const logInboundCodecs = async (pc) => {
  const report = await pc.getStats();
  report.forEach((stat) => {
    if (stat.type !== 'inbound-rtp') return;
    if (stat.codecId && report.has(stat.codecId)) {
      const codec = report.get(stat.codecId);
      console.log(`${stat.kind}: ${codec.mimeType}`);
    } else {
      console.log(`${stat.kind}: Codec noch unbekannt`);
    }
  });
};

logInboundCodecs(pc);
audio: audio/opus video: video/VP8

Aktives Kandidatenpaar über den Transport ermitteln

const getSelectedPair = async (pc) => {
  const report = await pc.getStats();
  for (const stat of report.values()) {
    if (stat.type === 'transport' && report.has(stat.selectedCandidatePairId)) {
      return report.get(stat.selectedCandidatePairId);
    }
  }
  return null;
};

const pair = await getSelectedPair(pc);
console.log(pair ? `RTT: ${pair.currentRoundTripTime} s` : 'Kein aktives Paar');
RTT: 0.023 s

Bitrate aus zwei Berichten berechnen

let previous = null;

const sampleBitrate = async (pc) => {
  const report = await pc.getStats();
  report.forEach((stat) => {
    if (stat.type !== 'inbound-rtp' || stat.kind !== 'video') return;
    // Nur rechnen, wenn der Eintrag schon im letzten Bericht stand
    if (previous?.has(stat.id)) {
      const old = previous.get(stat.id);
      const bits = (stat.bytesReceived - old.bytesReceived) * 8;
      const seconds = (stat.timestamp - old.timestamp) / 1000;
      console.log(`Video-Bitrate: ${Math.round(bits / seconds / 1000)} kbit/s`);
    }
  });
  previous = report;
};

setInterval(() => sampleBitrate(pc), 1000);
Video-Bitrate: 1450 kbit/s

Einfacher Test mit einer unbekannten ID

const pc = new RTCPeerConnection();
const report = await pc.getStats();
console.log(report.has('gibt-es-nicht'));
console.log([...report.keys()].every((id) => report.has(id)));
pc.close();
false true

// Wichtig · Fallstricke

  • IDs sind browserspezifisch: Das Format der IDs ist nicht festgelegt. Chrome verwendet zum Beispiel "IT01V1234", Firefox eher UUID-artige Werte. Schreiben Sie IDs nie fest in den Code.
  • Momentaufnahme: Ein RTCStatsReport ändert sich nach seiner Erstellung nicht mehr. Ob has() true liefert, gilt nur für diesen einen Bericht. Wenn Tracks oder Kandidaten hinzukommen oder wegfallen, können neue Berichte andere Einträge enthalten.
  • Verweisfelder können fehlen: Felder wie codecId oder selectedCandidatePairId sind nicht immer gesetzt, etwa bevor die Verbindung steht. has(undefined) gibt dann einfach false zurück und wirft keinen Fehler.
  • Keine Wertprüfung: has() prüft nur, ob der Schlüssel existiert. Ob ein bestimmtes Feld im Statistik-Objekt vorhanden ist, müssen Sie selbst prüfen, denn einzelne Metriken werden nicht von allen Browsern gleich unterstützt.
  • Kompatibilität: Die Map-ähnliche Schnittstelle, also has(), get() und forEach(), wird von allen modernen Browsern unterstützt. Das veraltete Chrome-Format mit Rückruffunktion (getStats(callback)) liefert dagegen kein RTCStatsReport-Objekt mit dieser Methode.