Start · Sprachen · JavaScript · Referenz · RTCPeerConnection.pendingLocalDescription

RTCPeerConnection.pendingLocalDescription

Eigenschaft

Liefert die lokale Sitzungsbeschreibung (<code>RTCSessionDescription</code>), die gesetzt, aber noch nicht durch eine Antwort der Gegenstelle bestätigt wurde, oder <code>null</code>.

seit JavaScript Baseline: alle modernen Browser (seit 2020) Kategorie: webapi

Signatur

RTCPeerConnection.pendingLocalDescription

Beschreibung

Die schreibgeschützte Eigenschaft pendingLocalDescription gibt die lokale SDP-Beschreibung zurück, die per setLocalDescription() angewendet wurde, aber noch nicht wirksam ist. Die Verbindung wartet dann noch auf die passende Antwort der Gegenstelle oder die Aushandlung (Negotiation) läuft noch. Ein typischer Fall: Du hast ein Angebot (offer) erzeugt und lokal gesetzt, die Antwort (answer) der Gegenstelle ist aber noch nicht eingetroffen.

WebRTC speichert die lokale Beschreibung auf drei Wegen:

  • currentLocalDescription: die zuletzt erfolgreich ausgehandelte, aktive Beschreibung.
  • pendingLocalDescription: die neue Beschreibung, deren Aushandlung noch läuft (sonst null).
  • localDescription: gibt die ausstehende Beschreibung zurück, falls es eine gibt, sonst die aktuelle.

Die Eigenschaft ist nützlich, um bei einer Neuaushandlung (Renegotiation, zum Beispiel beim Hinzufügen einer Videospur) zu prüfen, ob gerade ein Angebot unbeantwortet ist. Das hilft auch beim Erkennen von „Glare“, also Situationen, in denen beide Seiten gleichzeitig ein Angebot senden, und beim Debugging des Signalisierungsablaufs. Die zurückgegebene Beschreibung enthält auch ICE-Kandidaten, die seit ihrer Erzeugung gesammelt wurden.

Rückgabewert

Typ
RTCSessionDescription | null
Beschreibung
Die ausstehende lokale Sitzungsbeschreibung mit type (z. B. "offer") und sdp. Ist keine Änderung ausstehend, ist der Wert null.

Beispiele

Ausstehendes Angebot nach setLocalDescription prüfen

const pc = new RTCPeerConnection();
pc.addTransceiver('audio');

const offer = await pc.createOffer();
await pc.setLocalDescription(offer);

console.log(pc.signalingState);
console.log(pc.pendingLocalDescription?.type);
console.log(pc.currentLocalDescription);
have-local-offer offer null

Nach Eingang der Antwort ist nichts mehr ausstehend

const caller = new RTCPeerConnection();
const callee = new RTCPeerConnection();
caller.addTransceiver('video');

await caller.setLocalDescription(); // implizites Angebot
await callee.setRemoteDescription(caller.localDescription);
await callee.setLocalDescription(); // implizite Antwort
await caller.setRemoteDescription(callee.localDescription);

console.log(caller.pendingLocalDescription);
console.log(caller.currentLocalDescription.type);
null offer

Hilfsfunktion zur Diagnose des Aushandlungsstatus

const describeNegotiation = (pc) => {
  const pending = pc.pendingLocalDescription;
  if (pending) {
    return `Warte auf Antwort für lokales ${pending.type} (${pending.sdp.length} Zeichen SDP)`;
  }
  return pc.currentLocalDescription
    ? 'Lokale Beschreibung ausgehandelt und aktiv'
    : 'Noch keine lokale Beschreibung gesetzt';
};

const pc = new RTCPeerConnection();
console.log(describeNegotiation(pc));
pc.addTransceiver('audio');
await pc.setLocalDescription();
console.log(describeNegotiation(pc));
Noch keine lokale Beschreibung gesetzt Warte auf Antwort für lokales offer (… Zeichen SDP)

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung an die Eigenschaft wird ignoriert (im Strict Mode gibt es einen TypeError). Beschreibungen setzt du nur mit setLocalDescription().
  • Rollback: setLocalDescription({ type: 'rollback' }) verwirft das ausstehende Angebot. Danach ist pendingLocalDescription wieder null. Das ist die Grundlage des „Perfect Negotiation“-Musters.
  • Nicht mit localDescription verwechseln: localDescription ist fast nie null, sobald einmal etwas gesetzt wurde. Um zu erkennen, ob eine Aushandlung noch läuft, brauchst du pendingLocalDescription oder signalingState.
  • Bei einer Antwort mit type: "answer" ist die Aushandlung sofort abgeschlossen. Die Beschreibung wandert dann direkt nach currentLocalDescription. Nur eine vorläufige Antwort ("pranswer") bleibt ausstehend.
  • Kompatibilität: Wird in Chrome, Edge, Firefox und Safari (ab 11) unterstützt. Ältere Browser kennen nur localDescription. Wenn du alte Browser unterstützen musst, hilft ein Polyfill wie webrtc-adapter.
  • Datenschutz: Das SDP kann lokale IP-Adressen in ICE-Kandidaten enthalten. Gib es deshalb nicht ungefiltert in Logs oder an Dritte weiter.