Signatur
Beschreibung
Die schreibgeschützte Eigenschaft priority eines RTCIceCandidatePairStats-Objekts gibt an, wie wichtig ein Kandidatenpaar für den ICE-Agenten ist. Ein höherer Wert bedeutet, dass der Agent das Paar früher prüft und bei der Auswahl der Verbindung eher nimmt. Solche Objekte erhältst du über RTCPeerConnection.getStats(). Es sind die Einträge, deren type den Wert "candidate-pair" hat.
Die Priorität wird nach RFC 8445, Abschnitt 6.1.2.3 berechnet. G ist die Priorität des Kandidaten des steuernden Agenten (controlling), D die des gesteuerten Agenten (controlled):2^32 · MIN(G, D) + 2 · MAX(G, D) + (G > D ? 1 : 0).
Das Ergebnis ist eine vorzeichenlose 64-Bit-Zahl.
Nützlich ist die Eigenschaft vor allem beim Debuggen der Verbindung. Du siehst daran, warum ICE ein bestimmtes Paar gewählt hat, zum Beispiel eine direkte Host-Verbindung statt eines TURN-Relays. Die Eigenschaft wurde aus der Spezifikation entfernt. Portabler Code sollte die Priorität deshalb selbst aus localCandidateId und remoteCandidateId berechnen: Die zugehörigen RTCIceCandidateStats haben eine eigene priority.
Rückgabewert
undefined.Beispiele
Prioritäten aller Kandidatenpaare ausgeben
const logPairPriorities = async (pc) => {
const stats = await pc.getStats();
stats.forEach((report) => {
if (report.type === 'candidate-pair') {
console.log(
`Paar ${report.id}: Zustand=${report.state}, priority=${report.priority ?? 'nicht verfügbar'}`
);
}
});
};
// Aufruf, z. B. nach erfolgreichem Verbindungsaufbau
// await logPairPriorities(peerConnection);
Priorität portabel mit BigInt berechnen (RFC 8445)
const pairPriority = (controllingPrio, controlledPrio) => {
const G = BigInt(controllingPrio);
const D = BigInt(controlledPrio);
const min = G < D ? G : D;
const max = G > D ? G : D;
return (1n << 32n) * min + 2n * max + (G > D ? 1n : 0n);
};
const computePriorities = async (pc, isControlling) => {
const stats = await pc.getStats();
for (const report of stats.values()) {
if (report.type !== 'candidate-pair') continue;
const local = stats.get(report.localCandidateId);
const remote = stats.get(report.remoteCandidateId);
if (!local || !remote) continue;
const [g, d] = isControlling
? [local.priority, remote.priority]
: [remote.priority, local.priority];
console.log(report.id, pairPriority(g, d).toString());
}
};
console.log(pairPriority(2122260223, 1686052607).toString());
Priorität des aktiv genutzten Paars ermitteln
const getSelectedPair = async (pc) => {
const stats = await pc.getStats();
for (const report of stats.values()) {
if (report.type === 'transport' && report.selectedCandidatePairId) {
return stats.get(report.selectedCandidatePairId);
}
}
// Fallback: nominiertes Paar im Zustand „succeeded“
return [...stats.values()].find(
(r) => r.type === 'candidate-pair' && r.nominated && r.state === 'succeeded'
);
};
const pair = await getSelectedPair(peerConnection);
console.log('Aktives Paar:', pair?.id, 'Priorität:', pair?.priority);
// Wichtig · Fallstricke
- Veraltet und nicht standardisiert: Die Eigenschaft wurde aus der WebRTC-Statistik-Spezifikation gestrichen. Firefox liefert sie noch, Chromium-Browser und Safari nicht. Rechne immer mit
undefinedund prüfe den Wert, zum Beispiel mit??. - Genauigkeit: Die Priorität nach RFC 8445 kann bis zu 264 groß werden. Das liegt weit über
Number.MAX_SAFE_INTEGER(253 − 1). Deshalb ist der geliefertenumber-Wert möglicherweise gerundet, und zwei Paare mit fast gleicher Priorität lassen sich nicht mehr sicher unterscheiden. Für genaue Berechnungen und Vergleiche verwendeBigInt. - Welcher Kandidat als G und welcher als D zählt, hängt davon ab, ob der eigene Agent steuert (controlling) oder gesteuert wird (controlled). Dieselbe Verbindung hat auf beiden Seiten also dieselbe Paar-Priorität. Die Rollen der lokalen und entfernten Kandidaten sind dabei aber vertauscht.
- Die Statistik ist nur eine Momentaufnahme. Nach einem ICE-Restart oder neu eintreffenden Trickle-Kandidaten musst du
getStats()erneut aufrufen.