Signatur
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 (sonstnull).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
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);
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);
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));
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung an die Eigenschaft wird ignoriert (im Strict Mode gibt es einen
TypeError). Beschreibungen setzt du nur mitsetLocalDescription(). - Rollback:
setLocalDescription({ type: 'rollback' })verwirft das ausstehende Angebot. Danach istpendingLocalDescriptionwiedernull. Das ist die Grundlage des „Perfect Negotiation“-Musters. - Nicht mit
localDescriptionverwechseln:localDescriptionist fast nienull, sobald einmal etwas gesetzt wurde. Um zu erkennen, ob eine Aushandlung noch läuft, brauchst dupendingLocalDescriptionodersignalingState. - Bei einer Antwort mit
type: "answer"ist die Aushandlung sofort abgeschlossen. Die Beschreibung wandert dann direkt nachcurrentLocalDescription. 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 wiewebrtc-adapter. - Datenschutz: Das SDP kann lokale IP-Adressen in ICE-Kandidaten enthalten. Gib es deshalb nicht ungefiltert in Logs oder an Dritte weiter.