Start · Sprachen · JavaScript · Referenz · RTCIceCandidatePairStats.consentRequestsSent

RTCIceCandidatePairStats.consentRequestsSent

Eigenschaft

Gibt an, wie viele ICE-Einwilligungsanfragen (Consent-Freshness-Checks nach RFC 7675) bisher insgesamt über dieses Kandidatenpaar gesendet wurden.

seit JavaScript Experimentell: Chromium-basierte Browser; nicht in Kategorie: webapi

Signatur

RTCIceCandidatePairStats.consentRequestsSent

Beschreibung

Die schreibgeschützte Eigenschaft consentRequestsSent eines RTCIceCandidatePairStats-Objekts gibt an, wie viele Einwilligungsanfragen (engl. consent requests) bisher über das Kandidatenpaar gesendet wurden. Diese Anfragen sind STUN-Binding-Requests, die der ICE-Agent nach dem Aufbau einer Verbindung regelmäßig verschickt. So prüft er, ob die Gegenstelle weiterhin Daten auf diesem Pfad annehmen will (Consent Freshness, RFC 7675).

Einwilligungsanfragen sind etwas anderes als die ersten Verbindungsprüfungen (connectivity checks), die in requestsSent gezählt werden. Sobald ein Kandidatenpaar ausgewählt ist und Medien fließen, sendet der Browser etwa alle 4–6 Sekunden (zufällig verteilt) eine Einwilligungsanfrage. Kommt etwa 30 Sekunden lang keine Antwort, gilt die Einwilligung als abgelaufen und der Browser hört auf, über dieses Paar zu senden. Die Verbindung wechselt dann meist in den Zustand disconnected oder failed.

Du erreichst den Wert über RTCPeerConnection.getStats(). Dabei filterst du den zurückgegebenen RTCStatsReport nach Einträgen mit type === "candidate-pair". Sinnvoll ist der Zähler vor allem zur Diagnose: Wenn consentRequestsSent stetig steigt, responsesReceived sich aber nicht mehr ändert, deutet das auf einen abgebrochenen Netzpfad hin, etwa durch eine NAT-Zuordnung, die abgelaufen ist, eine Firewall oder einen Netzwechsel.

Rückgabewert

Typ
number | undefined
Beschreibung
Eine nicht-negative Ganzzahl (in der Spezifikation unsigned long long) mit der Gesamtzahl der gesendeten Einwilligungsanfragen. Ist undefined, wenn der Browser die Eigenschaft nicht unterstützt.

Beispiele

Einwilligungsanfragen des aktiven Kandidatenpaars auslesen

// pc ist eine bestehende, verbundene RTCPeerConnection
const logConsentRequests = async (pc) => {
  const report = await pc.getStats();
  report.forEach((stats) => {
    if (stats.type === "candidate-pair" && stats.nominated) {
      console.log(`Paar ${stats.id}: ${stats.consentRequestsSent ?? "nicht unterstützt"} Einwilligungsanfragen`);
    }
  });
};

await logConsentRequests(pc);
Paar CPabc123_def456: 12 Einwilligungsanfragen

Abgebrochenen Netzpfad erkennen (Anfragen ohne Antworten)

let last = null;

const checkConsent = async (pc) => {
  const report = await pc.getStats();
  const pair = [...report.values()].find(
    (s) => s.type === "candidate-pair" && s.nominated && s.state === "succeeded"
  );
  if (!pair || pair.consentRequestsSent === undefined) return;

  if (last) {
    const sentDelta = pair.consentRequestsSent - last.consentRequestsSent;
    const recvDelta = pair.responsesReceived - last.responsesReceived;
    if (sentDelta > 0 && recvDelta === 0) {
      console.warn(`Keine Antwort auf ${sentDelta} Einwilligungsanfrage(n) – Pfad evtl. unterbrochen`);
    }
  }
  last = { consentRequestsSent: pair.consentRequestsSent, responsesReceived: pair.responsesReceived };
};

const timer = setInterval(() => checkConsent(pc), 10_000);
pc.addEventListener("connectionstatechange", () => {
  if (pc.connectionState === "closed") clearInterval(timer);
});
Keine Antwort auf 2 Einwilligungsanfrage(n) – Pfad evtl. unterbrochen

Verbindungsprüfungen und Einwilligungsanfragen gegenüberstellen

const summarizePairs = async (pc) => {
  const report = await pc.getStats();
  const rows = [...report.values()]
    .filter((s) => s.type === "candidate-pair")
    .map(({ id, state, requestsSent, consentRequestsSent, responsesReceived }) => ({
      id, state, requestsSent, consentRequestsSent, responsesReceived
    }));
  console.table(rows);
};

await summarizePairs(pc);
Tabelle mit id, state, requestsSent, consentRequestsSent und responsesReceived je Kandidatenpaar

// Wichtig · Fallstricke

  • Browser-Unterstützung: Die Eigenschaft ist experimentell und wird nicht von allen Browsern bereitgestellt. Chromium-basierte Browser liefern sie, in Firefox und Safari kann sie fehlen. Prüfe den Wert deshalb immer auf undefined, zum Beispiel mit ?? 0, bevor du damit rechnest.
  • Nicht mit requestsSent verwechseln: requestsSent zählt die ICE-Verbindungsprüfungen, consentRequestsSent nur die späteren Consent-Freshness-Anfragen. Wie die Browser die beiden Zähler genau trennen, kann sich je nach Implementierung leicht unterscheiden.
  • Zähler, keine Rate: Der Wert wächst über die gesamte Lebensdauer des Paars immer weiter. Aussagekräftig werden erst die Differenzen zwischen zwei getStats()-Aufrufen.
  • Für Paare, die nicht ausgewählt oder nicht nominiert sind, bleibt der Wert meist bei 0, weil Einwilligungsanfragen nur auf dem aktiven Pfad gesendet werden.
  • Ein häufiger getStats()-Aufruf (z. B. mehrmals pro Sekunde) kostet unnötig Leistung. Weil Einwilligungsanfragen nur etwa alle 5 Sekunden gesendet werden, reichen Abfrageintervalle von 5–10 Sekunden.