Canais de dados

O padrão WebRTC também abrange uma API para o envio de dados arbitrários por uma RTCPeerConnection: Para isso, chame createDataChannel() em uma Objeto RTCPeerConnection, que retorna um objeto RTCDataChannel.

const peerConnection = new RTCPeerConnection(configuration);
const dataChannel = peerConnection.createDataChannel();

O peer remoto pode receber canais de dados detectando datachannel no objeto RTCPeerConnection. O evento recebido é do tipo RTCDataChannelEvent e contém uma propriedade channel que representa o RTCDataChannel conectado entre os apps semelhantes.

const peerConnection = new RTCPeerConnection(configuration);
peerConnection.addEventListener('datachannel', event => {
    const dataChannel = event.channel;
});

Abrir e fechar eventos

Antes que um canal possa ser usado para enviar dados, o cliente precisa esperar até que sejam abertos. Isso é feito detectando o evento open. Da mesma forma, há um evento close para quando um dos lados fecha o canal.

const messageBox = document.querySelector('#messageBox');
const sendButton = document.querySelector('#sendButton');
const peerConnection = new RTCPeerConnection(configuration);
const dataChannel = peerConnection.createDataChannel();

// Enable textarea and button when opened
dataChannel.addEventListener('open', event => {
    messageBox.disabled = false;
    messageBox.focus();
    sendButton.disabled = false;
});

// Disable input when closed
dataChannel.addEventListener('close', event => {
    messageBox.disabled = false;
    sendButton.disabled = false;
});

Mensagens

Para enviar uma mensagem em um RTCDataChannel, chame a função send(). com os dados que queremos enviar. O parâmetro data dessa função pode ser uma string, um Blob, um ArrayBuffer ou um ArrayBufferView.

const messageBox = document.querySelector('#messageBox');
const sendButton = document.querySelector('#sendButton');

// Send a simple text message when we click the button
sendButton.addEventListener('click', event => {
    const message = messageBox.textContent;
    dataChannel.send(message);
})

O ponto remoto receberá as mensagens enviadas em um RTCDataChannel ouvindo em o evento message.

const incomingMessages = document.querySelector('#incomingMessages');

const peerConnection = new RTCPeerConnection(configuration);
const dataChannel = peerConnection.createDataChannel();

// Append new messages to the box of incoming messages
dataChannel.addEventListener('message', event => {
    const message = event.data;
    incomingMessages.textContent += message + '\n';
});