Signatur
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 liegendeRTCDtlsTransportgeschlossen 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
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();
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);
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"
// Wichtig · Fallstricke
pc.sctpkannnullsein: Solange keine lokale oder entfernte Beschreibung mit einem SCTP-Abschnitt (m=application) gesetzt ist, gibt es keinRTCSctpTransport. Prüfen Sie vor dem Zugriff aufstateimmer, ob das Objekt existiert, oder nutzen Sie optionales Verketten:pc.sctp?.state.- Nur lesbar: Eine Zuweisung an
statehat keine Wirkung. Um die Verbindung zu schließen, rufen SieRTCPeerConnection.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 neueRTCPeerConnection.- Der Zustand hängt vom
RTCDtlsTransport(sctp.transport) ab. Die Ursache eines Verbindungsabbruchs findet man oft dort bzw. iniceConnectionState. - Kompatibilität: Chromium-Browser und Safari unterstützen die Eigenschaft seit Längerem. Firefox erst ab Version 113. In älteren Browsern ist
pc.sctpundefined. Prüfen Sie die Verfügbarkeit mit'sctp' in RTCPeerConnection.prototype.