Start · Sprachen · JavaScript · Referenz · RTCSctpTransport.maxChannels

RTCSctpTransport.maxChannels

Eigenschaft

Gibt die höchste Anzahl an <code>RTCDataChannel</code>-Objekten an, die über diesen SCTP-Transport gleichzeitig offen sein können. Solange die Verbindung nicht steht, ist der Wert <code>null</code>.

seit JavaScript Chrome/Edge 76+, Firefox 113+, Safari 15.4+ Kategorie: webapi

Signatur

get RTCSctpTransport.maxChannels

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

Typ
number | null
Beschreibung
Eine ganze Zahl: die höchste Anzahl gleichzeitig offener Datenkanäle. Solange der SCTP-Transport noch nicht den Zustand "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 ...
Zustand: connected Maximal gleichzeitig offene Kanäle: 1024 (browserabhängig)

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`);
Verfügbar: 1024 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');
Kanal file:bericht.pdf geöffnet

// Wichtig · Fallstricke

  • null ist der Normalfall am Anfang: pc.sctp ist null, bis ein Datenkanal ausgehandelt wurde, und maxChannels ist null, bis der Zustand "connected" erreicht ist. Nutze deshalb immer optionale Verkettung (pc.sctp?.maxChannels) oder prüfe vorher auf null.
  • 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() einen OperationError.
  • Kompatibilität: RTCSctpTransport wird 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.prototype und sieh im Zweifel auf MDN bzw. caniuse nach den genauen Versionen. In Node.js gibt es die Eigenschaft nur über zusätzliche WebRTC-Bibliotheken.