Signatur
Beschreibung
Die schreibgeschützte Eigenschaft id eines RTCTransportStats-Wörterbuchs enthält einen String, der den zugrunde liegenden Transport (in der Praxis den RTCDtlsTransport samt ICE-Transport) innerhalb eines RTCStatsReport eindeutig kennzeichnet. Sie dient zugleich als Schlüssel des Eintrags in der Map-artigen Struktur des Berichts.
Die ID ist vor allem für Verknüpfungen nützlich: Andere Statistikobjekte verweisen über Felder wie transportId (z. B. in RTCInboundRtpStreamStats, RTCOutboundRtpStreamStats, RTCIceCandidatePairStats) auf genau diesen Wert. Umgekehrt führt selectedCandidatePairId bzw. localCertificateId vom Transport zu weiteren Einträgen.
Da dasselbe Objekt bei wiederholten Aufrufen von RTCPeerConnection.getStats() dieselbe id behält, lassen sich Werte zweier Berichte sicher einander zuordnen – etwa um aus bytesSent-Differenzen und timestamp eine Übertragungsrate zu berechnen.
Der Aufbau des Strings ist nicht standardisiert und browserabhängig (z. B. "T01" in Chrome oder eine UUID-artige Zeichenkette in Firefox). Man sollte ihn deshalb nur als undurchsichtigen Bezeichner behandeln.
Rückgabewert
RTCStatsReport.Beispiele
Transport-IDs aus einem Statistikbericht auslesen
const pc = new RTCPeerConnection();
pc.createDataChannel('chat');
await pc.setLocalDescription(await pc.createOffer());
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'transport') {
console.log('Transport-ID:', stats.id, '| DTLS-Status:', stats.dtlsState);
}
});
RTP-Stream seinem Transport zuordnen
const logTransportForStreams = async (pc) => {
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type === 'outbound-rtp') {
// transportId verweist auf RTCTransportStats.id
const transport = report.get(stats.transportId);
console.log(`${stats.kind}-Stream nutzt Transport ${transport?.id}`);
console.log('Gewähltes Kandidatenpaar:', transport?.selectedCandidatePairId);
}
}
};
await logTransportForStreams(pc);
Senderate über zwei Berichte per id berechnen
const getTransports = async (pc) => {
const map = new Map();
(await pc.getStats()).forEach((s) => {
if (s.type === 'transport') map.set(s.id, s);
});
return map;
};
const before = await getTransports(pc);
await new Promise((r) => setTimeout(r, 1000));
const after = await getTransports(pc);
for (const [id, now] of after) {
const prev = before.get(id);
if (!prev) continue;
const seconds = (now.timestamp - prev.timestamp) / 1000;
const kbps = ((now.bytesSent - prev.bytesSent) * 8) / seconds / 1000;
console.log(`Transport ${id}: ${kbps.toFixed(1)} kbit/s`);
}
// Wichtig · Fallstricke
- Das Format der
idist nicht spezifiziert und unterscheidet sich zwischen Browsern – niemals parsen oder Annahmen über Präfixe wie"T"treffen. - Die ID ist nur innerhalb derselben
RTCPeerConnectioneindeutig und stabil. Nach einem ICE-Neustart oder bei neuem Transport kann eine neue ID auftauchen; alte IDs verschwinden aus dem Bericht. - Mit
bundlePolicy: "max-bundle"(Standard in modernen Browsern) gibt es meist nur einen Transport-Eintrag; ohne Bundling können mehrere Transporte mit eigenen IDs existieren. - Einträge vom Typ
"transport"erscheinen erst, wenn ein Transport angelegt wurde (nachsetLocalDescription()). Firefox liefertetransport-Statistiken lange nicht bzw. nur eingeschränkt – vorher auf Existenz prüfen. - Die ID kann Fingerprinting-relevante Rückschlüsse nicht zulassen, sollte aber wie alle Statistikdaten nicht ungefiltert an Dritte übermittelt werden.