Signatur
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
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);
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);
});
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);
// 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
requestsSentverwechseln:requestsSentzählt die ICE-Verbindungsprüfungen,consentRequestsSentnur 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.