Signatur
Beschreibung
Die Eigenschaft id gibt die numerische Kennung eines RTCDataChannel zurück. Die Kennung entspricht der SCTP-Stream-ID, über die der Kanal intern übertragen wird. Sie ist innerhalb der zugehörigen RTCPeerConnection eindeutig und liegt zwischen 0 und 65534. Der Wert 65535 ist reserviert.
Wie die Kennung zustande kommt, hängt davon ab, wie der Kanal angelegt wurde:
- Automatische Aushandlung (Standard,
negotiated: false): Der Browser vergibt die ID selbst. Das geschieht meist erst, wenn der SCTP-Transport steht, weil die ID von der DTLS-Rolle abhängt. Der DTLS-Client nutzt gerade IDs, der DTLS-Server ungerade. Bis dahin kannidden Wertnullhaben. - Manuelle Aushandlung (
negotiated: true): Sie legen die ID beim Aufruf voncreateDataChannel()über die Optionidselbst fest. Beide Seiten müssen einen Kanal mit derselben ID anlegen. Eindatachannel-Ereignis wird dabei nicht ausgelöst.
In der Praxis dient id dazu, mehrere Kanäle einer Verbindung auseinanderzuhalten, zum Beispiel in einer Map, für Logs oder in der Statistik von getStats(). Die Eigenschaft ist schreibgeschützt. Eine ID lässt sich nur beim Anlegen des Kanals festlegen.
Rückgabewert
0 und 65534 (unsigned short). null, solange der Browser bei automatischer Aushandlung noch keine ID vergeben hat.Beispiele
ID eines automatisch ausgehandelten Kanals auslesen
const pc = new RTCPeerConnection();
const channel = pc.createDataChannel('chat');
// Vor dem Verbindungsaufbau ist oft noch keine ID vergeben
console.log('ID direkt nach dem Anlegen:', channel.id);
channel.addEventListener('open', () => {
// Spätestens jetzt ist die ID fest vergeben
console.log(`Kanal "${channel.label}" geöffnet, ID: ${channel.id}`);
});
Manuell ausgehandelter Kanal mit fester ID
// Auf BEIDEN Peers identisch ausführen – kein datachannel-Ereignis nötig
const pc = new RTCPeerConnection();
const control = pc.createDataChannel('control', {
negotiated: true,
id: 42
});
console.log(control.id); // sofort verfügbar
console.log(control.negotiated);
Mehrere Kanäle über ihre ID verwalten
const pc = new RTCPeerConnection();
const channels = new Map();
pc.addEventListener('datachannel', ({ channel }) => {
channels.set(channel.id, channel);
console.log(`Neuer Kanal ${channel.id} (${channel.label})`);
channel.addEventListener('message', (event) => {
console.log(`[Kanal ${channel.id}]`, event.data);
});
channel.addEventListener('close', () => {
channels.delete(channel.id);
console.log(`Kanal ${channel.id} entfernt, offen: ${channels.size}`);
});
});
// Wichtig · Fallstricke
nullprüfen: Bei automatisch ausgehandelten Kanälen istidvor dem Aufbau des SCTP-Transports häufignull. Verwenden Sie die ID als Schlüssel deshalb erst nach demopen-Ereignis oder imdatachannel-Ereignis.- Kollisionen bei
negotiated: true: Ist die ID in der Verbindung schon vergeben, löstcreateDataChannel()eineOperationError-Ausnahme aus. Liegt sie außerhalb des gültigen Bereichs, also über65534oder über dem Grenzwert ausRTCSctpTransport.maxChannels, gibt es einenTypeError. Mischen Sie manuelle IDs nicht wahllos mit automatisch vergebenen. Halten Sie sich am besten an die Gerade/Ungerade-Regel oder verwenden Sie ausschließlich manuelle IDs. - Nicht mit
labelverwechseln:labelist ein frei wählbarer und nicht eindeutiger Name. Eindeutig ist nurid. - Wiederverwendung: Nach dem Schließen eines Kanals kann seine ID später für einen neuen Kanal wiederverwendet werden.
- Kompatibilität: Wird von allen modernen Browsern unterstützt. Ältere Versionen gaben vor der ID-Vergabe teilweise
65535stattnullzurück.