Start · Sprachen · JavaScript · Referenz · RTCPeerConnection.remoteDescription

RTCPeerConnection.remoteDescription

Eigenschaft

Schreibgeschützte Eigenschaft, die die <code>RTCSessionDescription</code> der Gegenseite liefert (SDP mit Medien- und Verbindungsinfos) oder <code>null</code>, wenn noch keine gesetzt ist.

seit JavaScript Baseline: alle modernen Browser (seit ca. 2017) Kategorie: webapi

Signatur

get RTCPeerConnection.remoteDescription

Beschreibung

Die Eigenschaft remoteDescription einer RTCPeerConnection gibt die Sitzungsbeschreibung der entfernten Gegenstelle zurück. Das ist ein RTCSessionDescription-Objekt mit dem Typ (offer, answer, pranswer oder rollback) und dem eigentlichen SDP-Text, der unter anderem Codecs, Medienspuren, ICE-Anmeldedaten und DTLS-Fingerabdrücke beschreibt.

Gesetzt wird der Wert ausschließlich über setRemoteDescription(), typischerweise wenn über den Signalisierungskanal (z. B. WebSocket) ein Offer oder Answer der Gegenseite eintrifft. Ist noch keine Beschreibung gesetzt, liefert die Eigenschaft null.

Während einer laufenden Neuverhandlung gilt: remoteDescription gibt pendingRemoteDescription zurück, wenn es eine ausstehende Beschreibung gibt, ansonsten currentRemoteDescription. Wer genau wissen muss, ob die Beschreibung schon ausgehandelt ist, sollte deshalb direkt diese beiden Eigenschaften abfragen.

In der Praxis dient remoteDescription vor allem als Prüfung, ob schon ICE-Kandidaten per addIceCandidate() hinzugefügt werden dürfen (das geht erst nach gesetzter Remote-Beschreibung), sowie zur Fehlersuche und Analyse des ausgehandelten SDP.

Rückgabewert

Typ
RTCSessionDescription | null
Beschreibung
Die aktuelle bzw. ausstehende Remote-Sitzungsbeschreibung mit den Eigenschaften type und sdp, oder null, wenn noch keine gesetzt wurde.

Beispiele

Remote-Beschreibung setzen und auslesen

const pc = new RTCPeerConnection();

// Offer der Gegenseite kam über den Signalisierungskanal
const handleOffer = async (offer) => {
  console.log(pc.remoteDescription); // null
  await pc.setRemoteDescription(offer);
  console.log(pc.remoteDescription.type);

  const answer = await pc.createAnswer();
  await pc.setLocalDescription(answer);
  return pc.localDescription;
};
null offer

ICE-Kandidaten puffern, bis remoteDescription gesetzt ist

const pc = new RTCPeerConnection();
const pendingCandidates = [];

const onRemoteCandidate = async (candidate) => {
  if (pc.remoteDescription) {
    await pc.addIceCandidate(candidate);
  } else {
    // addIceCandidate() würde sonst mit InvalidStateError fehlschlagen
    pendingCandidates.push(candidate);
  }
};

const onRemoteDescription = async (desc) => {
  await pc.setRemoteDescription(desc);
  for (const c of pendingCandidates.splice(0)) {
    await pc.addIceCandidate(c);
  }
};

Ausgehandelte Codecs aus dem Remote-SDP ermitteln

const logRemoteCodecs = (pc) => {
  const desc = pc.remoteDescription;
  if (!desc) {
    console.log('Noch keine Remote-Beschreibung');
    return;
  }
  const codecs = desc.sdp
    .split('\r\n')
    .filter((line) => line.startsWith('a=rtpmap:'))
    .map((line) => line.split(' ')[1]);
  console.log(codecs);
};
["opus/48000/2", "VP8/90000", "H264/90000", ...]

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung an pc.remoteDescription hat keine Wirkung (im Strict Mode gibt es einen TypeError). Setzen geht nur über setRemoteDescription().
  • Ausstehend oder aktuell: Während einer Neuverhandlung kann der Wert eine noch nicht bestätigte Beschreibung sein. Für den tatsächlich ausgehandelten Stand currentRemoteDescription verwenden.
  • Kein Snapshot: Nach jedem erfolgreichen setRemoteDescription() kann sich das zurückgegebene Objekt ändern. Den Wert also nicht dauerhaft zwischenspeichern.
  • Nach close(): Der zuletzt gesetzte Wert bleibt lesbar, lässt sich aber nicht mehr ändern.
  • SDP-Munging: Den SDP-Text von Hand zu bearbeiten ist fehleranfällig und läuft je nach Browser unterschiedlich. Besser Standard-APIs wie RTCRtpTransceiver.setCodecPreferences() verwenden.
  • Sicherheit: Das SDP enthält IP-Adressen (ICE-Kandidaten) und ICE-Anmeldedaten. Nicht unbedacht protokollieren oder an Dritte senden.
  • Kompatibilität: In Chrome, Firefox, Safari und Edge verfügbar. Sehr alte Implementierungen lieferten den Wert erst nach vollständigem Verbindungsaufbau oder mit Präfix (webkitRTCPeerConnection).