Signatur
Beschreibung
Die schreibgeschützte Eigenschaft transportId eines RTCIceCandidatePairStats-Objekts (Statistik-Typ "candidate-pair") ist ein String. Er bezeichnet eindeutig den Transport, also den zugrunde liegenden RTCIceTransport bzw. RTCDtlsTransport, über den dieses Kandidatenpaar geprüft wurde. Der Wert stimmt mit der id eines Eintrags vom Typ "transport" (RTCTransportStats) im selben RTCStatsReport überein.
Nützlich ist die Eigenschaft vor allem, um Statistiken miteinander zu verknüpfen. Zu einem Kandidatenpaar findest du so den Transport-Eintrag, etwa den DTLS-Zustand, die gesendeten und empfangenen Bytes oder das gerade ausgewählte Paar (selectedCandidatePairId). Umgekehrt kannst du alle Kandidatenpaare heraussuchen, die zu einem bestimmten Transport gehören.
Wenn mehrere Medienspuren gebündelt über eine Verbindung laufen (bundlePolicy: "max-bundle"), gibt es meist nur einen Transport. Dann haben alle Kandidatenpaare dieselbe transportId. Ohne Bündelung kann es mehrere Transporte geben, und die Paare verteilen sich auf sie.
Rückgabewert
RTCTransportStats-Eintrags im selben RTCStatsReport. Mit report.get(transportId) kannst du ihn direkt abrufen.Beispiele
transportId aller Kandidatenpaare ausgeben
const pc = new RTCPeerConnection();
// ... Signalisierung und Verbindungsaufbau ...
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'candidate-pair') {
console.log(`Paar ${stats.id} → Transport ${stats.transportId} (Status: ${stats.state})`);
}
});
Vom Kandidatenpaar zum Transport-Eintrag
const getPairTransport = async (pc) => {
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type === 'candidate-pair' && stats.nominated) {
const transport = report.get(stats.transportId);
return {
pairId: stats.id,
dtlsState: transport?.dtlsState,
bytesSent: transport?.bytesSent
};
}
}
return null;
};
console.log(await getPairTransport(pc));
Kandidatenpaare nach Transport gruppieren
const groupPairsByTransport = async (pc) => {
const report = await pc.getStats();
const groups = new Map();
for (const stats of report.values()) {
if (stats.type !== 'candidate-pair') continue;
const list = groups.get(stats.transportId) ?? [];
list.push(stats.id);
groups.set(stats.transportId, list);
}
return groups;
};
const groups = await groupPairsByTransport(pc);
groups.forEach((pairs, transportId) => {
console.log(transportId, '→', pairs.length, 'Paare');
});
// Wichtig · Fallstricke
- Die ID ist ein undurchsichtiger Bezeichner. Ihr Format unterscheidet sich je nach Browser (z. B.
"T01"in Chrome, eine UUID-ähnliche Zeichenkette in Firefox). Werte ihn nicht inhaltlich aus, sondern nutze ihn nur als Schlüssel fürreport.get(). - Die ID ist nur innerhalb derselben
RTCPeerConnectiongültig. Zwischen zweigetStats()-Aufrufen bleibt sie in der Regel gleich, bei einem ICE-Neustart oder einer Neuverhandlung kann sich der Transport aber ändern. - Firefox hat lange keine
"transport"-Einträge geliefert. Dann gibtreport.get(transportId)undefinedzurück, deshalb optionale Verkettung (?.) verwenden. - Ein Paar mit
nominated: trueist nicht automatisch das aktive Paar. Zuverlässiger istRTCTransportStats.selectedCandidatePairId. getStats()ist asynchron und nicht kostenlos. Für die Überwachung in Intervallen von etwa einer Sekunde abfragen, nicht in jedem Frame.