Start · Sprachen · JavaScript · Referenz · RTCError.sdpLineNumber

RTCError.sdpLineNumber

Eigenschaft

Schreibgeschützte Eigenschaft von <code>RTCError</code>, die die Zeilennummer in der SDP-Beschreibung angibt, in der ein Syntaxfehler gefunden wurde, sonst <code>null</code>.

seit JavaScript Chromium 74+, Safari 15.4+; nicht Baseline Kategorie: webapi

Signatur

RTCError.sdpLineNumber

Beschreibung

Die schreibgeschützte Eigenschaft sdpLineNumber der Schnittstelle RTCError gibt an, in welcher Zeile einer SDP-Nachricht (Session Description Protocol) der WebRTC-Parser einen Syntaxfehler gefunden hat. Die Zählung beginnt bei 1.

Einen Wert hat die Eigenschaft nur, wenn errorDetail den Wert "sdp-syntax-error" hat. Bei allen anderen Fehlerarten (z. B. "dtls-failure", "data-channel-failure") ist sie null.

Gebraucht wird sie vor allem beim Debuggen von Signalisierung, wenn eine Anwendung SDP selbst verändert („SDP munging“, etwa um Codecs umzusortieren oder die Bitrate zu begrenzen) und die Beschreibung danach mit setLocalDescription() oder setRemoteDescription() abgelehnt wird. Über die Zeilennummer lässt sich die fehlerhafte Zeile gezielt aus dem SDP-Text heraussuchen und protokollieren.

Rückgabewert

Typ
number | null
Beschreibung
Eine vorzeichenlose Ganzzahl (long) mit der Zeilennummer des Syntaxfehlers, beginnend bei 1. null, wenn errorDetail nicht "sdp-syntax-error" ist.

Beispiele

RTCError erzeugen und sdpLineNumber lesen

// Ein RTCError lässt sich z. B. für Tests direkt konstruieren
const err = new RTCError(
  { errorDetail: 'sdp-syntax-error', sdpLineNumber: 7 },
  'Ungültige a=rtpmap-Zeile'
);

console.log(err.name);          // Name des Fehlers
console.log(err.errorDetail);
console.log(err.sdpLineNumber);

// Andere Fehlerart: sdpLineNumber bleibt null
const dtlsErr = new RTCError({ errorDetail: 'dtls-failure' });
console.log(dtlsErr.sdpLineNumber);
OperationError sdp-syntax-error 7 null

Fehlerhafte Zeile nach SDP-Munging anzeigen

const pc = new RTCPeerConnection();

const applyRemoteSdp = async (sdpText) => {
  try {
    await pc.setRemoteDescription({ type: 'offer', sdp: sdpText });
  } catch (err) {
    if (err instanceof RTCError && err.errorDetail === 'sdp-syntax-error') {
      const lines = sdpText.split(/\r?\n/);
      const nr = err.sdpLineNumber;           // 1-basiert
      console.error(`SDP-Syntaxfehler in Zeile ${nr}: ${lines[nr - 1]}`);
    } else {
      // Viele Browser werfen hier stattdessen eine DOMException
      console.error('Beschreibung abgelehnt:', err.name, err.message);
    }
  }
};

applyRemoteSdp('v=0\r\no=- 0 0 IN IP4 127.0.0.1\r\nkaputt\r\n');
SDP-Syntaxfehler in Zeile 3: kaputt (oder, je nach Browser: Beschreibung abgelehnt: OperationError ...)

Hilfsfunktion für Fehler-Logging

const describeRtcError = (err) => {
  if (!(err instanceof RTCError)) return `${err.name}: ${err.message}`;
  const parts = [`${err.errorDetail}: ${err.message}`];
  if (err.sdpLineNumber !== null) parts.push(`SDP-Zeile ${err.sdpLineNumber}`);
  return parts.join(' | ');
};

console.log(describeRtcError(
  new RTCError({ errorDetail: 'sdp-syntax-error', sdpLineNumber: 12 }, 'Unbekanntes Attribut')
));
sdp-syntax-error: Unbekanntes Attribut | SDP-Zeile 12

// Wichtig · Fallstricke

  • Nur bei SDP-Syntaxfehlern belegt: Vor dem Zugriff immer errorDetail === "sdp-syntax-error" prüfen, sonst bekommt man null.
  • 1-basiert: Für den Zugriff auf ein per split() erzeugtes Array muss man sdpLineNumber - 1 verwenden. SDP-Zeilen enden mit \r\n, deshalb beim Aufteilen /\r?\n/ nutzen.
  • Browser-Verhalten: Laut Spezifikation sollen SDP-Parserfehler als RTCError gemeldet werden. In der Praxis lehnen viele Browser setRemoteDescription()/setLocalDescription() aber mit einer einfachen DOMException (OperationError/InvalidAccessError) ohne Zeilennummer ab. Deshalb eine Ausweichlösung einbauen und mit instanceof RTCError prüfen.
  • Kompatibilität: RTCError gibt es in Chromium-Browsern und in Safari. Die Unterstützung in Firefox ist lückenhaft, also vorher per Feature-Erkennung prüfen (typeof RTCError !== "undefined").
  • Die Eigenschaft ist schreibgeschützt. Werte lassen sich nur über das Init-Objekt des Konstruktors setzen.