Połączenia równorzędne

RTCPeerConnection to główny interfejs interfejsu WebRTC API. it reprezentuje połączenie między lokalnym i zdalnym połączeniem peera i zapewnia obsługę funkcji i zdarzeń niezbędnych do nawiązania połączenia.

Nawiązywanie połączenia z inną aplikacją

Aplikacje implementujące funkcje WebRTC w dużym stopniu polegają na Interfejs RTCPeerConnection. Po stronie rozmówcy (czyli zainicjowanie połączenia), proces nawiązywania połączenia jest zwykle :

  1. Utwórz nową instancję RTCPeerConnection za pomocą odpowiedniej platformy ICE konfiguracji.
  2. Utwórz lokalny opis SDP za pomocą właściwości RTCPeerConnection.createOffer().
  3. Ustaw opis lokalnego SDP za pomocą RTCPeerConnection.setLocalDescription()
  4. Przenieś lokalny opis SDP (przy użyciu usługi sygnalizacyjnej) na pilota w porównaniu z innymi wydawcami.
  5. Zarejestruj detektor zdarzeń icecandidate w: RTCPeerConnection.
  6. W przypadku każdego zdarzenia icecandidate przenieś je (za pomocą usługi sygnalizacyjnej) do zdalnym peerem.
  7. Poczekaj na przychodzący zdalny opis SDP z usługi sygnalizacji ustaw go za pomocą funkcji RTCPeerConnection.setRemoteDescription().
  8. Poczekaj na przychodzących zdalnych kandydatów ICE z usługi sygnalizacji i dodaj za pomocą RTCPeerConnection.addIceCandidate()

Jeśli chodzi o odbiorcę, ten proces jest nieco inny.

  1. Utwórz nową instancję RTCPeerConnection za pomocą odpowiedniej platformy ICE konfiguracji.
  2. Poczekaj na przychodzący zdalny opis SDP z usługi sygnalizacji ustaw go za pomocą funkcji RTCPeerConnection.setRemoteDescription().
  3. Utwórz odpowiedź na opis zdalnego SDP, wywołując RTCPeerConnection.createAnswer()
  4. Przekaż odpowiedź (korzystając z usługi sygnalizacji) do zdalnego peera.
  5. Zarejestruj detektor zdarzeń icecandidate w: RTCPeerConnection.
  6. W przypadku każdego zdarzenia icecandidate przenieś je (za pomocą usługi sygnalizacyjnej) do zdalnym peerem.
  7. Poczekaj na przychodzących zdalnych kandydatów ICE z usługi sygnalizacji i dodaj za pomocą RTCPeerConnection.addIceCandidate()

Problem z tym interfejsem API polega na tym, że większość tych operacji jest asynchronicznych, co często komplikuje faktyczną implementację aplikacji WebRTC. Wiele funkcji zwraca wartość Promise, którą należy rozwiązać, zanim funkcja może kontynuować proces.

Zaleca się, aby przy implementowaniu aplikacji za pomocą tego interfejsu API deweloper używa interfejsów async i await, zamiast rejestrować detektorów (za pomocą Promise.then()), co ułatwia śledzenie kodu. Rozważ następujący przykład:

function createAndSendOffer(peerConnection, signallingService) {
    peerConnection.createOffer()
                  .then(offer => {
                      signallingService.send({
                          type: 'offer',
                          data: offer
                      });
                  });
}

Po wpisaniu powyższego kodu za pomocą funkcji async i await otrzymujemy:

async function createAndSendOffer(peerConnection, signallingService) {
    const offer = await peerConnection.createOffer();
    signallingService.send({
        type: 'offer',
        data: offer
    });
}