Start · Sprachen · JavaScript · Referenz · RTCDataChannelEvent.channel

RTCDataChannelEvent.channel

Eigenschaft

Die schreibgeschützte Eigenschaft <code>channel</code> liefert den <code>RTCDataChannel</code>, den die Gegenstelle geöffnet hat und der das <code>datachannel</code>-Ereignis ausgelöst hat.

seit JavaScript Baseline: alle modernen Browser (Chrome, Firefox, Kategorie: webapi

Signatur

RTCDataChannelEvent.channel

Beschreibung

Die Eigenschaft RTCDataChannelEvent.channel enthält den RTCDataChannel, zu dem ein datachannel-Ereignis auf einer RTCPeerConnection gehört. Das Ereignis wird ausgelöst, wenn die entfernte Gegenstelle mit createDataChannel() einen neuen Datenkanal aushandelt (sogenannte „in-band negotiation“).

Man braucht diese Eigenschaft vor allem auf der empfangenden Seite einer WebRTC-Verbindung: Nur hier erhält man Zugriff auf den Kanal, den die andere Seite angelegt hat. Direkt im Handler sollte man die benötigten Ereignis-Listener (open, message, close, error) registrieren und bei Bedarf binaryType setzen.

Über Eigenschaften wie label, protocol, ordered oder id des gelieferten Kanals kann man mehrere Kanäle voneinander unterscheiden, z. B. einen Chat-Kanal und einen Dateiübertragungs-Kanal.

Rückgabewert

Typ
RTCDataChannel
Beschreibung
Der zum Ereignis gehörende Datenkanal. Die Eigenschaft ist schreibgeschützt; der Wert wird beim Erzeugen des Ereignisses festgelegt.

Beispiele

Eingehenden Datenkanal entgegennehmen

const pc = new RTCPeerConnection();

pc.addEventListener('datachannel', (event) => {
  const channel = event.channel;
  console.log(`Neuer Kanal: ${channel.label}`);

  channel.addEventListener('open', () => channel.send('Hallo zurück!'));
  channel.addEventListener('message', (e) => console.log('Empfangen:', e.data));
  channel.addEventListener('close', () => console.log('Kanal geschlossen'));
});
Neuer Kanal: chat Empfangen: Hallo!

Mehrere Kanäle anhand des Labels unterscheiden (on-Property)

const pc = new RTCPeerConnection();
const handlers = {
  chat: (e) => console.log('Chat:', e.data),
  dateien: (e) => console.log('Chunk erhalten:', e.data.byteLength, 'Bytes')
};

pc.ondatachannel = ({ channel }) => {
  if (channel.label === 'dateien') {
    channel.binaryType = 'arraybuffer';
  }
  channel.onmessage = handlers[channel.label] ?? ((e) => console.warn('Unbekannter Kanal', channel.label));
};
Chat: Hi Chunk erhalten: 16384 Bytes

Vollständige lokale Demo mit zwei Peers

const a = new RTCPeerConnection();
const b = new RTCPeerConnection();

a.onicecandidate = (e) => e.candidate && b.addIceCandidate(e.candidate);
b.onicecandidate = (e) => e.candidate && a.addIceCandidate(e.candidate);

b.ondatachannel = (event) => {
  event.channel.onmessage = (e) => console.log('B empfängt:', e.data);
};

const sendChannel = a.createDataChannel('chat');
sendChannel.onopen = () => sendChannel.send('Hallo!');

const verbinden = async () => {
  await a.setLocalDescription(await a.createOffer());
  await b.setRemoteDescription(a.localDescription);
  await b.setLocalDescription(await b.createAnswer());
  await a.setRemoteDescription(b.localDescription);
};
verbinden();
B empfängt: Hallo!

// Wichtig · Fallstricke

  • Das datachannel-Ereignis wird nur auf der Gegenseite ausgelöst. Wer createDataChannel() selbst aufruft, bekommt kein Ereignis für den eigenen Kanal, sondern verwendet direkt den Rückgabewert.
  • Kanäle, die mit negotiated: true und fester id angelegt wurden, lösen kein datachannel-Ereignis aus. Beide Seiten müssen sie dann selbst mit createDataChannel() erzeugen.
  • Listener sollten direkt im Handler registriert werden. Setzt man sie erst später (etwa nach einem await), gehen frühe message-Ereignisse unter Umständen verloren.
  • Der Kanal kann beim Eintreffen des Ereignisses bereits den Zustand open haben. Deshalb vorher channel.readyState prüfen, statt sich nur auf das open-Ereignis zu verlassen.
  • Der Standardwert von binaryType unterscheidet sich je nach Browser (älteres Chrome: "arraybuffer", Spezifikation: "blob"). Deshalb ausdrücklich setzen.
  • WebRTC funktioniert nur in sicheren Kontexten (HTTPS oder localhost). Die Eigenschaft wird von allen aktuellen Browsern unterstützt.