Połączenia równorzędne

RTCPeerConnection to główny interfejs API WebRTC. Odzwierciedla połączenie między lokalnym a zdalnym peerem oraz zapewnia wszystkie funkcje i zdarzenia niezbędne do nawiązania połączenia.

Nawiązuję połączenie równorzędne

Aplikacje implementujące funkcje WebRTC zwykle bazują na interfejsie RTCPeerConnection. Po stronie dzwoniącego (tzn. przez peera, który nawiązuje połączenie) proces nawiązywania połączenia jest zwykle taki:

  1. Utwórz nową instancję RTCPeerConnection z odpowiednią konfiguracją ICE.
  2. Utwórz opis lokalnego pliku SDP za pomocą funkcji RTCPeerConnection.createOffer().
  3. Ustaw opis lokalnego SDP za pomocą RTCPeerConnection.setLocalDescription().
  4. Przenieś (z użyciem usługi sygnalizacyjnej) lokalny opis SDP do zdalnego peera.
  5. Zarejestruj detektor zdarzeń icecandidate w RTCPeerConnection.
  6. Dla każdego zdarzenia icecandidate przenieś je (za pomocą usługi sygnalizacyjnej) do zdalnego peera.
  7. Poczekaj, aż opis usługi SDP poczty przychodzącej pojawi się w usłudze sygnalizacji i skonfiguruj ją za pomocą RTCPeerConnection.setRemoteDescription().
  8. Poczekaj, aż kandydujący do usługi zdalnej ICE (z usługi sygnalizacyjnej) doda je za pomocą RTCPeerConnection.addIceCandidate().

Ten proces wygląda nieco inaczej po stronie rozmówcy.

  1. Utwórz nową instancję RTCPeerConnection z odpowiednią konfiguracją ICE.
  2. Poczekaj, aż opis usługi SDP poczty przychodzącej pojawi się w usłudze sygnalizacji i skonfiguruj ją za pomocą RTCPeerConnection.setRemoteDescription().
  3. Utwórz odpowiedź na opis zdalnego zarządzania SDP, wywołując RTCPeerConnection.createAnswer().
  4. Przenieś odpowiedź (korzystając z usługi sygnalizacyjnej) do zdalnego peera.
  5. Zarejestruj detektor zdarzeń icecandidate w RTCPeerConnection.
  6. Dla każdego zdarzenia icecandidate przenieś je (za pomocą usługi sygnalizacyjnej) do zdalnego peera.
  7. Poczekaj, aż kandydujący do usługi zdalnej ICE (z usługi sygnalizacyjnej) doda je za pomocą RTCPeerConnection.addIceCandidate().

Problem z interfejsem API polega na tym, że większość z nich jest asynchroniczna, co często utrudnia rzeczywistą implementację aplikacji WebRTC. Wiele funkcji zwraca błąd Promise, który musi rozwiązać, zanim będzie można przejść do następnego kroku procesu.

Zaleca się, aby przy implementacji aplikacji przy użyciu tego interfejsu API deweloper korzystał z metod async i await, zamiast rejestrować detektory (korzystając z metody Promise.then()), co ułatwia śledzenie kodu. Przyjrzyj się temu przykładowi:

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

Podczas pisania powyższego kodu przy użyciu async i await otrzymujemy:

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