Signatur
Beschreibung
Die Eigenschaft sctp einer RTCPeerConnection gibt ein RTCSctpTransport-Objekt zurück. Es beschreibt den SCTP-Transport (Stream Control Transmission Protocol), über den WebRTC die Daten aller RTCDataChannel-Instanzen einer Verbindung überträgt. SCTP läuft dabei gekapselt über DTLS, das wiederum über ICE/UDP transportiert wird.
Solange noch kein SCTP ausgehandelt wurde, ist der Wert null. Das ist der Fall, bis eine lokale oder entfernte Beschreibung mit einem m=application-Abschnitt gesetzt wurde, also typischerweise erst nach setLocalDescription() bzw. setRemoteDescription() mit mindestens einem erzeugten Datenkanal.
Über das zurückgegebene Objekt kommt man an nützliche Laufzeitinformationen:
state: Zustand des SCTP-Transports ("connecting","connected","closed")maxMessageSize: größte Nachricht in Bytes, dieRTCDataChannel.send()übertragen kannmaxChannels: Höchstzahl gleichzeitig nutzbarer Datenkanäle (erst im Zustand"connected"gesetzt)transport: das zugrunde liegendeRTCDtlsTransport(und darüber dasRTCIceTransport)
Gebraucht wird die Eigenschaft vor allem, wenn man große Datenmengen in Blöcke zerlegen, Verbindungsprobleme auf Transportebene analysieren oder auf das statechange-Ereignis des SCTP-Transports reagieren möchte.
Rückgabewert
RTCSctpTransport-Objekt der Verbindung oder null, wenn (noch) kein SCTP ausgehandelt wurde.Beispiele
sctp ist vor der Aushandlung null
const pc = new RTCPeerConnection();
console.log(pc.sctp); // noch keine Aushandlung
pc.createDataChannel('chat');
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
console.log(pc.sctp instanceof RTCSctpTransport);
console.log(pc.sctp.state);
Große Daten passend zu maxMessageSize aufteilen
const sendLarge = (pc, channel, buffer) => {
// Fallback 16 KiB, falls sctp noch nicht verfügbar ist
const max = pc.sctp?.maxMessageSize ?? 16 * 1024;
// Sicherheitsabstand und Obergrenze für bessere Interoperabilität
const chunkSize = Math.min(max, 64 * 1024);
for (let offset = 0; offset < buffer.byteLength; offset += chunkSize) {
channel.send(buffer.slice(offset, offset + chunkSize));
}
console.log(`Gesendet in Blöcken zu ${chunkSize} Bytes`);
};
// Nutzung, sobald der Kanal offen ist:
// channel.onopen = () => sendLarge(pc, channel, new ArrayBuffer(1_000_000));
Zustand des SCTP-Transports überwachen
const pc = new RTCPeerConnection({ iceServers: [{ urls: 'stun:stun.l.google.com:19302' }] });
pc.createDataChannel('telemetrie');
await pc.setLocalDescription(await pc.createOffer());
const sctp = pc.sctp;
sctp.addEventListener('statechange', () => {
console.log('SCTP-Zustand:', sctp.state);
if (sctp.state === 'connected') {
console.log('Max. Kanäle:', sctp.maxChannels);
console.log('DTLS-Zustand:', sctp.transport.state);
}
});
// Wichtig · Fallstricke
- Null-Prüfung: Vor
setLocalDescription()/setRemoteDescription()mit Datenkanal istsctpnull. Optional Chaining (pc.sctp?.maxMessageSize) verhindertTypeError. - Datenkanal nötig: Ohne
createDataChannel()vor dem Angebot (oder einen entfernten Datenkanal) wird kein SCTP ausgehandelt; reine Audio-/Video-Verbindungen haben dauerhaftsctp === null. - maxMessageSize: Der Wert hängt von beiden Seiten ab und kann
Infinitysein. Für Interoperabilität zwischen Browsern ist es üblich, Nachrichten auf 16–64 KiB zu begrenzen undbufferedAmountbzw.bufferedamountlowzur Flusskontrolle zu nutzen. - maxChannels ist bis zum Zustand
"connected"null. - Kompatibilität: Firefox unterstützt die Eigenschaft erst seit Version 113, Safari seit 15.4. In älteren Browsern ist
pc.sctpundefined; hier hilft eine Funktionsprüfung mit'sctp' in RTCPeerConnection.prototype.