Signatur
Beschreibung
Die Eigenschaft requestsSent eines RTCIceCandidatePairStats-Objekts gibt an, wie viele STUN-Konnektivitätsprüfungen (Binding Requests) der lokale ICE-Agent bisher über das beschriebene Kandidatenpaar gesendet hat. Man erhält das Objekt über RTCPeerConnection.getStats() als Eintrag mit type === "candidate-pair".
ICE sendet solche Anfragen zunächst während der Verbindungsaufbau-Phase, um zu prüfen, ob ein Paar funktioniert, und danach regelmäßig als Consent Freshness-Prüfungen, um die Verbindung am Leben zu halten. Der Zähler wächst also auch bei einer bestehenden Verbindung weiter.
Typische Einsatzzwecke sind Diagnose und Monitoring: Stellt man requestsSent den Werten responsesReceived und requestsReceived gegenüber, erkennt man, ob Prüfungen verloren gehen (z. B. durch Firewalls oder NAT-Probleme). Wiederholte Übertragungen derselben Anfrage (Retransmissions) werden laut Spezifikation nicht mitgezählt, sondern separat in requestsSent-unabhängigen Feldern wie retransmissionsSent erfasst (sofern unterstützt).
Rückgabewert
unsigned long long) mit der Anzahl gesendeter STUN-Konnektivitätsprüfungsanfragen. Kann undefined sein, wenn der Browser das Feld nicht liefert.Beispiele
requestsSent für alle Kandidatenpaare ausgeben
const logRequests = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'candidate-pair') {
console.log(`${stats.id}: ${stats.requestsSent ?? 0} Anfragen gesendet, Zustand: ${stats.state}`);
}
});
};
// Aufruf, z. B. nach Verbindungsaufbau
// await logRequests(peerConnection);
Antwortquote des aktiven Paares berechnen
const getCheckSuccessRate = async (pc) => {
const report = await pc.getStats();
let pair;
report.forEach((s) => {
// aktives Paar über den Transport ermitteln
if (s.type === 'transport' && s.selectedCandidatePairId) {
pair = report.get(s.selectedCandidatePairId);
}
});
if (!pair || !pair.requestsSent) return null;
const rate = pair.responsesReceived / pair.requestsSent;
return Math.round(rate * 100);
};
const rate = await getCheckSuccessRate(peerConnection);
console.log(rate === null ? 'Keine Daten' : `Antwortquote: ${rate} %`);
Verlorene Konnektivitätsprüfungen periodisch überwachen
const monitorIceChecks = (pc, intervalMs = 5000) => {
let last = new Map();
const timer = setInterval(async () => {
const report = await pc.getStats();
report.forEach((s) => {
if (s.type !== 'candidate-pair' || !s.nominated) return;
const prev = last.get(s.id) ?? { sent: 0, recv: 0 };
const sentDelta = (s.requestsSent ?? 0) - prev.sent;
const recvDelta = (s.responsesReceived ?? 0) - prev.recv;
if (sentDelta > 0 && recvDelta === 0) {
console.warn(`Paar ${s.id}: ${sentDelta} Prüfungen ohne Antwort`);
}
last.set(s.id, { sent: s.requestsSent ?? 0, recv: s.responsesReceived ?? 0 });
});
}, intervalMs);
return () => clearInterval(timer);
};
const stop = monitorIceChecks(peerConnection);
// später: stop();
// Wichtig · Fallstricke
- Kumulativer Zähler: Der Wert zählt seit Beginn der Verbindung hoch. Für Raten oder Verlustquoten immer Differenzen zwischen zwei
getStats()-Aufrufen bilden. - Retransmissions nicht enthalten: Wiederholte Sendungen derselben Anfrage fließen nicht ein; daher kann
responsesReceivedtrotz Paketverlust nahe anrequestsSentliegen. - Consent-Prüfungen: Auch nach erfolgreichem Aufbau steigt der Wert durch periodische Keepalive-Prüfungen (etwa alle paar Sekunden) weiter an.
- Kompatibilität: In aktuellen Chromium-, Firefox- und Safari-Versionen verfügbar, ältere Versionen liefern das Feld teils nicht – mit
?? 0absichern. Die Ermittlung des aktiven Paares überselectedCandidatePairIdist ebenfalls nicht in allen Browsern gleich; Alternativnominatedundstate === "succeeded"prüfen. - Die Eigenschaft ist schreibgeschützt; das Stats-Objekt ist eine Momentaufnahme und aktualisiert sich nicht selbst.