Signatur
Beschreibung
RTCSessionDescription steht für eine Sitzungsbeschreibung im WebRTC-Verbindungsaufbau. Sie besteht aus zwei Teilen: dem type ("offer", "answer", "pranswer" oder "rollback") und dem sdp, einem Text im Session Description Protocol. Dieser Text legt unter anderem Codecs, Medienspuren, ICE-Zugangsdaten und DTLS-Fingerabdrücke fest.
Beim Verbindungsaufbau (Offer/Answer-Verfahren) erzeugt die eine Seite mit RTCPeerConnection.createOffer() ein Angebot und setzt es mit setLocalDescription() als lokale Beschreibung. Das Angebot wird dann über einen eigenen Signalisierungskanal (z. B. WebSocket) an die Gegenseite geschickt. Die Gegenseite übernimmt es mit setRemoteDescription() und antwortet mit createAnswer(). Die aktuellen Beschreibungen liest du über localDescription, remoteDescription sowie die Varianten current… und pending… aus.
Wichtige Eigenschaften und Methoden:
type– schreibgeschützter String vom TypRTCSdpType.sdp– schreibgeschützter SDP-String (bei"rollback"leer).toJSON()– liefert ein einfaches Objekt{ type, sdp }, das sich für die Signalisierung serialisieren lässt.
In modernem Code musst du den Konstruktor kaum noch selbst aufrufen. setLocalDescription() und setRemoteDescription() nehmen auch einfache Objekte an, die dem Dictionary RTCSessionDescriptionInit entsprechen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $options Pflicht | RTCSessionDescriptionInit | Parameter des Konstruktors new RTCSessionDescription(options): ein Objekt mit type (Pflicht: "offer", "answer", "pranswer" oder "rollback") und optional sdp (String, Standard: ""). |
Rückgabewert
type und sdp zurück.Beispiele
Instanz erzeugen und Eigenschaften lesen
const desc = new RTCSessionDescription({
type: 'offer',
sdp: 'v=0\r\no=- 0 0 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\n'
});
console.log(desc.type);
console.log(desc.sdp.startsWith('v=0'));
console.log(JSON.stringify(desc.toJSON()).length > 0);
Angebot erstellen und über WebSocket signalisieren
const signaling = new WebSocket('wss://example.com/signal');
const pc = new RTCPeerConnection({ iceServers: [{ urls: 'stun:stun.l.google.com:19302' }] });
pc.addTransceiver('video');
signaling.addEventListener('open', async () => {
// setLocalDescription() ohne Argument erzeugt automatisch Offer bzw. Answer
await pc.setLocalDescription();
const { type, sdp } = pc.localDescription; // RTCSessionDescription
signaling.send(JSON.stringify({ description: { type, sdp } }));
console.log('Gesendet:', type);
});
Entfernte Beschreibung übernehmen und antworten
const pc = new RTCPeerConnection();
const signaling = new WebSocket('wss://example.com/signal');
signaling.addEventListener('message', async ({ data }) => {
const { description } = JSON.parse(data);
if (!description) return;
// Ein einfaches Objekt genügt – der Konstruktor ist nicht nötig
await pc.setRemoteDescription(description);
if (description.type === 'offer') {
await pc.setLocalDescription(); // erzeugt die Answer
signaling.send(JSON.stringify({ description: pc.localDescription.toJSON() }));
console.log('Answer gesendet');
}
});
// Wichtig · Fallstricke
- Der Konstruktor ist überflüssig geworden:
setRemoteDescription(new RTCSessionDescription(obj))findet sich noch in älterem Code. Gib stattdessen direktobjweiter. Der Konstruktor gilt zwar nicht als offiziell veraltet, wird aber nicht mehr benötigt. - Veraltete Callback-API:
createOffer(success, failure)mit Rückruffunktionen ist veraltet. Verwende die Promise-Variante. - SDP-Munging: Wenn du den
sdp-String von Hand änderst, bevor du ihn mitsetLocalDescription()setzt, ist das fehleranfällig und je nach Browser unterschiedlich unterstützt. Codecs wählst du besser mitRTCRtpTransceiver.setCodecPreferences(). - Sicherheit: Das SDP enthält ICE-Kandidaten (und damit möglicherweise lokale oder öffentliche IP-Adressen) sowie DTLS-Fingerabdrücke. Der Signalisierungskanal sollte verschlüsselt sein (
wss://) und authentifiziert werden. Eine gefälschte Beschreibung ermöglicht Man-in-the-Middle-Angriffe. - Serialisierung:
JSON.stringify(desc)funktioniert danktoJSON(). Bei{ ...desc }entsteht dagegen ein leeres Objekt, weiltypeundsdpGetter auf dem Prototyp sind. "rollback"setzt eine laufende Aushandlung zurück, etwa bei „Perfect Negotiation“. Es funktioniert nur mitsetLocalDescription()/setRemoteDescription(), solange ein Angebot noch offen ist.- Kompatibilität: Alle aktuellen Browser unterstützen die Schnittstelle. Sehr alte Versionen brauchten Präfixe (
webkitRTCSessionDescription,mozRTCSessionDescription). In Node.js gibt es sie nur über Zusatzbibliotheken wiewrtc/werift.