Connessioni peer

RTCPeerConnection è l'interfaccia centrale dell'API WebRTC. Rappresenta la connessione tra il peer locale e quello remoto e fornisce tutte le funzioni e gli eventi necessari per stabilire la connessione.

Creazione di una connessione peer

Le applicazioni che implementano la funzionalità WebRTC in genere si basano molto sull'interfaccia RTCPeerConnection. Dal lato degli utenti che chiamano (ovvero il peer che avvia una connessione), la procedura di impostazione di una connessione è solitamente la seguente:

  1. Crea una nuova istanza RTCPeerConnection con la configurazione ICE appropriata.
  2. Crea una descrizione SDP locale utilizzando RTCPeerConnection.createOffer().
  3. Imposta la descrizione SDP locale utilizzando RTCPeerConnection.setLocalDescription().
  4. Trasferisci (utilizzando un servizio di segnalazione) la descrizione SDP locale al peer remoto.
  5. Registra un listener per gli eventi icecandidate su RTCPeerConnection.
  6. Per ogni evento icecandidate, trasferiscilo (utilizzando un servizio di segnalazione) al peer remoto.
  7. Attendi una descrizione SDP remota in arrivo dal servizio di segnalazione e impostala utilizzando RTCPeerConnection.setRemoteDescription().
  8. Attendi i candidati ICE remoti in arrivo dal servizio di segnalazione e aggiungili utilizzando RTCPeerConnection.addIceCandidate()

Sul lato del chiamante, la procedura è leggermente diversa.

  1. Crea una nuova istanza RTCPeerConnection con la configurazione ICE appropriata.
  2. Attendi una descrizione SDP remota in arrivo dal servizio di segnalazione e impostala utilizzando RTCPeerConnection.setRemoteDescription().
  3. Crea una risposta per la descrizione SDP remota chiamando RTCPeerConnection.createAnswer().
  4. Trasferisci (utilizzando un servizio di segnalazione) la risposta al peer remoto.
  5. Registra un listener per gli eventi icecandidate su RTCPeerConnection.
  6. Per ogni evento icecandidate, trasferiscilo (utilizzando un servizio di segnalazione) al peer remoto.
  7. Attendi i candidati ICE remoti in arrivo dal servizio di segnalazione e aggiungili utilizzando RTCPeerConnection.addIceCandidate()

Il problema di questa API è che la maggior parte di queste operazioni è asincrona, il che spesso complica l'implementazione effettiva di un'applicazione WebRTC. Molte delle funzioni restituiscono un Promise che deve essere risolto prima che il passaggio successivo del processo possa continuare.

Quando implementa un'applicazione che utilizza questa API, lo sviluppatore deve utilizzare async e await anziché registrare gli ascoltatori (utilizzando Promise.then()), in quanto ciò rende il codice più facile da seguire. Considera l'esempio seguente:

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

Quando scriviamo il codice riportato sopra utilizzando async e await, otteniamo quanto segue:

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