Signatur
Beschreibung
Die Eigenschaft currentDirection eines RTCRtpTransceiver gibt an, in welche Richtung Medien über diesen Transceiver tatsächlich fließen dürfen. Der Wert entsteht aus der zuletzt abgeschlossenen Offer/Answer-Aushandlung, also erst nachdem sowohl lokale als auch entfernte Beschreibung (setLocalDescription() / setRemoteDescription()) angewendet wurden.
Wichtig ist der Unterschied zu direction: direction ist die gewünschte Richtung, die du selbst setzt und die in das nächste Offer bzw. Answer einfließt. currentDirection ist dagegen das Ergebnis der Aushandlung, bei dem auch die Gegenseite mitentscheidet. Setzt du z. B. direction = "sendrecv", die Gegenseite antwortet aber mit recvonly, ergibt sich lokal currentDirection === "sendonly".
Mögliche Werte sind "sendrecv", "sendonly", "recvonly", "inactive" und "stopped" (nach stop()). Solange noch keine Aushandlung für den Transceiver abgeschlossen wurde, ist der Wert null. Nutze die Eigenschaft, um UI-Zustände korrekt darzustellen (z. B. „Gegenseite empfängt kein Video“) oder um nach einer Neuaushandlung zu prüfen, ob eine Richtungsänderung wirklich übernommen wurde.
Rückgabewert
null, wenn der Transceiver noch nie in einer abgeschlossenen Offer/Answer-Runde vorkam.Beispiele
direction vs. currentDirection vor und nach der Aushandlung
const pc1 = new RTCPeerConnection();
const pc2 = new RTCPeerConnection();
const transceiver = pc1.addTransceiver('video', { direction: 'sendrecv' });
console.log('vorher:', transceiver.direction, transceiver.currentDirection);
// Offer/Answer lokal zwischen zwei Verbindungen durchspielen
const offer = await pc1.createOffer();
await pc1.setLocalDescription(offer);
await pc2.setRemoteDescription(offer);
// Gegenseite will nur empfangen
pc2.getTransceivers()[0].direction = 'recvonly';
const answer = await pc2.createAnswer();
await pc2.setLocalDescription(answer);
await pc1.setRemoteDescription(answer);
console.log('nachher:', transceiver.direction, transceiver.currentDirection);
Video pausieren und Übernahme prüfen
// pc ist eine bestehende RTCPeerConnection mit ausgehandeltem Video
const pauseVideo = async (pc) => {
const videoTx = pc.getTransceivers()
.find((t) => t.receiver.track.kind === 'video');
if (!videoTx) return;
videoTx.direction = 'recvonly'; // Wunsch: nicht mehr senden
// Neuaushandlung wird über negotiationneeded angestoßen;
// danach das Ergebnis prüfen:
pc.addEventListener('signalingstatechange', () => {
if (pc.signalingState === 'stable') {
console.log('Ausgehandelt:', videoTx.currentDirection);
}
}, { once: true });
};
Status-Übersicht aller Transceiver
const logTransceivers = (pc) => {
for (const t of pc.getTransceivers()) {
console.log(`${t.mid ?? '(kein mid)'} | ${t.receiver.track.kind} | gewünscht: ${t.direction} | aktuell: ${t.currentDirection ?? 'noch nicht ausgehandelt'}`);
}
};
logTransceivers(pc);
// Wichtig · Fallstricke
- Schreibgeschützt: Zuweisungen an
currentDirectionwerden ignoriert (im Strict ModeTypeError). Zum Ändern immerdirectionsetzen und neu aushandeln. - Kein sofortiger Effekt: Eine Änderung von
directionspiegelt sich erst nach abgeschlossener Offer/Answer-Runde incurrentDirectionwider – nicht direkt nach der Zuweisung. null-Fall beachten: Neu peraddTransceiver()erzeugte Transceiver haben bis zur ersten vollständigen Aushandlungnull. Bei einer Rücknahme (Rollback) kann der Wert ebenfalls wiedernullwerden.- Perspektive: Der Wert gilt aus Sicht der lokalen Seite; die Gegenseite sieht die gespiegelte Richtung (
sendonly↔recvonly). - Kompatibilität: In allen aktuellen Browsern verfügbar. Der Wert
"stopped"wird in älteren Versionen (vor Unified-Plan-/Spezifikationsanpassungen, z. B. Chrome < 88) teils nicht geliefert; dort stattdessentransceiver.stoppedprüfen (inzwischen veraltet).