Start · Sprachen · JavaScript · Referenz · RTCSctpTransport.state

RTCSctpTransport.state

Eigenschaft

Liefert als schreibgeschützte Zeichenkette den aktuellen Zustand des SCTP-Transports, über den die <code>RTCDataChannel</code>s einer Verbindung laufen.

seit JavaScript Baseline 2023: Chrome 76+, Edge 79+, Firefox 113+, Kategorie: webapi

Signatur

RTCSctpTransport.state

Beschreibung

Die schreibgeschützte Eigenschaft state des Interfaces RTCSctpTransport gibt an, in welchem Zustand sich der SCTP-Transport (Stream Control Transmission Protocol) gerade befindet. Über SCTP laufen in WebRTC alle Datenkanäle (RTCDataChannel). Das zugehörige Objekt erreicht man über RTCPeerConnection.sctp. Die Eigenschaft ist erst dann nicht null, wenn SCTP ausgehandelt wurde.

Mögliche Werte:

  • "connecting": Die SCTP-Assoziation wird gerade aufgebaut. Das ist der Anfangszustand.
  • "connected": Die Aushandlung ist abgeschlossen. Datenkanäle können jetzt geöffnet werden.
  • "closed": Die Assoziation wurde beendet, entweder durch eine SCTP-ABORT- bzw. SHUTDOWN-Nachricht oder weil der zugrunde liegende RTCDtlsTransport geschlossen wurde.

Jeder Zustandswechsel löst auf dem RTCSctpTransport das Ereignis statechange aus. Nutzen Sie die Eigenschaft für Diagnosen, Verbindungsanzeigen oder um zu erkennen, dass die Datenebene einer Verbindung abgebrochen ist, auch wenn die Medienströme noch laufen.

Rückgabewert

Typ
"connecting" | "connected" | "closed"
Beschreibung
Eine Zeichenkette aus der Aufzählung RTCSctpTransportState, die den aktuellen Zustand der SCTP-Assoziation beschreibt.

Beispiele

Aktuellen SCTP-Zustand abfragen

const pc = new RTCPeerConnection();
// Ein Datenkanal sorgt dafür, dass SCTP ausgehandelt wird
const channel = pc.createDataChannel('chat');

const logSctpState = () => {
  // pc.sctp ist null, solange keine Beschreibung mit SCTP gesetzt ist
  if (pc.sctp) {
    console.log('SCTP-Zustand:', pc.sctp.state);
  } else {
    console.log('SCTP noch nicht ausgehandelt');
  }
};

logSctpState();
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
logSctpState();
SCTP noch nicht ausgehandelt SCTP-Zustand: connecting

Zustandswechsel mit statechange überwachen

const watchSctp = (pc) => {
  const sctp = pc.sctp;
  if (!sctp) return;

  sctp.addEventListener('statechange', () => {
    switch (sctp.state) {
      case 'connected':
        console.log(`Datenebene bereit, max. Nachrichtengröße: ${sctp.maxMessageSize} Bytes`);
        break;
      case 'closed':
        console.warn('SCTP-Transport geschlossen – Datenkanäle sind nicht mehr nutzbar');
        break;
      default:
        console.log('SCTP verbindet …');
    }
  });
};

// Aufruf, nachdem setLocalDescription()/setRemoteDescription() erfolgt ist
// watchSctp(pc);
SCTP verbindet … Datenebene bereit, max. Nachrichtengröße: 262144 Bytes

Auf verbundenen Transport warten (Promise)

const waitForSctpConnected = (pc, timeoutMs = 10000) =>
  new Promise((resolve, reject) => {
    const sctp = pc.sctp;
    if (!sctp) return reject(new Error('Kein SCTP-Transport vorhanden'));
    if (sctp.state === 'connected') return resolve(sctp);

    const timer = setTimeout(() => reject(new Error('Zeitüberschreitung')), timeoutMs);
    sctp.onstatechange = () => {
      if (sctp.state === 'connected') {
        clearTimeout(timer);
        resolve(sctp);
      } else if (sctp.state === 'closed') {
        clearTimeout(timer);
        reject(new Error('SCTP-Transport wurde geschlossen'));
      }
    };
  });

// Verwendung:
// const sctp = await waitForSctpConnected(pc);
// console.log(sctp.state); // "connected"
connected

// Wichtig · Fallstricke

  • pc.sctp kann null sein: Solange keine lokale oder entfernte Beschreibung mit einem SCTP-Abschnitt (m=application) gesetzt ist, gibt es kein RTCSctpTransport. Prüfen Sie vor dem Zugriff auf state immer, ob das Objekt existiert, oder nutzen Sie optionales Verketten: pc.sctp?.state.
  • Nur lesbar: Eine Zuweisung an state hat keine Wirkung. Um die Verbindung zu schließen, rufen Sie RTCPeerConnection.close() auf.
  • "closed" ist endgültig: Aus diesem Zustand wird der Transport nicht wieder "connected". Für eine neue Datenverbindung brauchen Sie eine neue Aushandlung bzw. eine neue RTCPeerConnection.
  • Der Zustand hängt vom RTCDtlsTransport (sctp.transport) ab. Die Ursache eines Verbindungsabbruchs findet man oft dort bzw. in iceConnectionState.
  • Kompatibilität: Chromium-Browser und Safari unterstützen die Eigenschaft seit Längerem. Firefox erst ab Version 113. In älteren Browsern ist pc.sctp undefined. Prüfen Sie die Verfügbarkeit mit 'sctp' in RTCPeerConnection.prototype.