RTCPeerConnection — это центральный интерфейс API WebRTC. Он представляет собой соединение между локальным и удалённым узлами и предоставляет все функции и события, необходимые для установления соединения.
Установление однорангового соединения
Приложения, реализующие функциональность WebRTC, обычно активно используют интерфейс RTCPeerConnection . Со стороны вызывающей стороны (то есть со стороны узла, инициирующего соединение) процесс установления соединения обычно выглядит следующим образом:
- Создайте новый экземпляр
RTCPeerConnectionс соответствующей конфигурацией ICE. - Создайте локальное описание SDP с помощью
RTCPeerConnection.createOffer(). - Установите локальное описание SDP с помощью
RTCPeerConnection.setLocalDescription(). - Передать (используя сигнальную службу) локальное описание SDP удаленному узлу.
- Зарегистрируйте прослушиватель событий
icecandidateнаRTCPeerConnection. - Для каждого события
icecandidateпередайте его (используя сигнальную службу) удаленному узлу. - Дождитесь входящего удаленного описания SDP от службы сигнализации и установите его с помощью
RTCPeerConnection.setRemoteDescription(). - Ожидайте входящие удаленные ICE-кандидаты от службы сигнализации и добавляйте их с помощью
RTCPeerConnection.addIceCandidate()
Со стороны вызываемого абонента процесс немного отличается.
- Создайте новый экземпляр
RTCPeerConnectionс соответствующей конфигурацией ICE. - Дождитесь входящего удаленного описания SDP от службы сигнализации и установите его с помощью
RTCPeerConnection.setRemoteDescription(). - Создайте ответ для удаленного описания SDP, вызвав
RTCPeerConnection.createAnswer(). - Передать (с помощью сигнальной службы) ответ удаленному узлу.
- Зарегистрируйте прослушиватель событий
icecandidateнаRTCPeerConnection. - Для каждого события
icecandidateпередайте его (используя сигнальную службу) удаленному узлу. - Ожидайте входящие удаленные ICE-кандидаты от службы сигнализации и добавляйте их с помощью
RTCPeerConnection.addIceCandidate()
Проблема этого API заключается в том, что большинство операций выполняются асинхронно, что часто усложняет реализацию WebRTC-приложения. Многие функции возвращают Promise , который необходимо разрешить перед продолжением следующего этапа процесса.
При реализации приложения с использованием этого API разработчику рекомендуется использовать async и await вместо регистрации слушателей (с помощью Promise.then() ), так как это упрощает понимание кода. Рассмотрим следующий пример:
function createAndSendOffer(peerConnection, signallingService) {
peerConnection.createOffer()
.then(offer => {
signallingService.send({
type: 'offer',
data: offer
});
});
}
При написании кода выше с использованием async и await мы получаем следующее:
async function createAndSendOffer(peerConnection, signallingService) {
const offer = await peerConnection.createOffer();
signallingService.send({
type: 'offer',
data: offer
});
}