Signatur
Beschreibung
Die schreibgeschützte Eigenschaft maxChannels des Interfaces RTCSctpTransport gibt an, wie viele RTCDataChannel-Objekte höchstens gleichzeitig über diese WebRTC-Verbindung offen sein können. Jeder Datenkanal belegt einen eigenen SCTP-Stream. Die beiden Gegenstellen handeln die Zahl der verfügbaren Streams beim Aufbau der SCTP-Verbindung aus. maxChannels ist daher das Minimum aus den eingehenden und ausgehenden Streams, die beide Seiten unterstützen.
Du erreichst das Objekt über RTCPeerConnection.sctp. Diese Eigenschaft ist erst dann nicht mehr null, wenn in der Sitzungsbeschreibung (SDP) ein Datenkanal ausgehandelt wurde. Auch maxChannels selbst bleibt null, bis der Transport den Zustand "connected" erreicht. Frag den Wert deshalb am besten im statechange-Ereignis des RTCSctpTransport ab oder im open-Ereignis des ersten Datenkanals.
Praktisch ist die Eigenschaft vor allem für Anwendungen, die viele Kanäle öffnen. Beispiele sind ein eigener Kanal pro Dateiübertragung, pro Spielobjekt oder pro Teilnehmer. Mit maxChannels kannst du vorher prüfen, ob noch ein Kanal frei ist, statt in einen Fehler zu laufen. Wenn keine Stream-IDs mehr frei sind, wirft createDataChannel() einen OperationError.
Rückgabewert
"connected" erreicht hat, ist der Wert null.Beispiele
maxChannels nach dem Verbindungsaufbau auslesen
const pc = new RTCPeerConnection();
// Ohne Datenkanal wird kein SCTP-Transport ausgehandelt
const channel = pc.createDataChannel('chat');
channel.addEventListener('open', () => {
const { sctp } = pc;
console.log('Zustand:', sctp.state);
console.log('Maximal gleichzeitig offene Kanäle:', sctp.maxChannels);
});
// ... Offer/Answer-Austausch über den Signalisierungskanal ...
Auf den Zustand des SCTP-Transports warten
const waitForMaxChannels = (pc) => new Promise((resolve) => {
const check = () => {
const sctp = pc.sctp;
if (sctp?.state === 'connected' && sctp.maxChannels !== null) {
resolve(sctp.maxChannels);
return true;
}
return false;
};
if (check()) return;
// pc.sctp existiert erst nach setLocal-/setRemoteDescription
pc.addEventListener('signalingstatechange', () => {
pc.sctp?.addEventListener('statechange', check, { once: false });
});
pc.addEventListener('connectionstatechange', check);
});
const pc = new RTCPeerConnection();
pc.createDataChannel('control');
// ... Signalisierung ...
const max = await waitForMaxChannels(pc);
console.log(`Verfügbar: ${max} Kanäle`);
Vor dem Öffnen weiterer Kanäle das Limit prüfen
const openChannels = new Set();
const openTransferChannel = (pc, fileName) => {
const limit = pc.sctp?.maxChannels ?? 0;
if (openChannels.size >= limit) {
console.warn(`Limit von ${limit} Kanälen erreicht – ${fileName} wartet.`);
return null;
}
const ch = pc.createDataChannel(`file:${fileName}`);
openChannels.add(ch);
ch.addEventListener('close', () => openChannels.delete(ch));
return ch;
};
// Aufruf, nachdem die Verbindung steht
const ch = openTransferChannel(pc, 'bericht.pdf');
console.log(ch ? `Kanal ${ch.label} geöffnet` : 'In Warteschlange');
// Wichtig · Fallstricke
nullist der Normalfall am Anfang:pc.sctpistnull, bis ein Datenkanal ausgehandelt wurde, undmaxChannelsistnull, bis der Zustand"connected"erreicht ist. Nutze deshalb immer optionale Verkettung (pc.sctp?.maxChannels) oder prüfe vorher aufnull.- Browserabhängiger Wert: Die tatsächliche Zahl hängt von der SCTP-Umsetzung beider Seiten ab. Chromium verwendet z. B. deutlich weniger als die theoretisch möglichen 65535 Streams. Leg dich im Code nicht auf eine feste Zahl fest.
- Grenze für gleichzeitig offene Kanäle, nicht für die Gesamtzahl: Geschlossene Kanäle geben ihre Stream-ID wieder frei. Wird das Limit überschritten, wirft
createDataChannel()einenOperationError. - Kompatibilität:
RTCSctpTransportwird von Chromium-Browsern seit Version 76 unterstützt. In Firefox und Safari kam die Unterstützung erst später. Prüfe die Verfügbarkeit mit'sctp' in RTCPeerConnection.prototypeund sieh im Zweifel auf MDN bzw. caniuse nach den genauen Versionen. In Node.js gibt es die Eigenschaft nur über zusätzliche WebRTC-Bibliotheken.