Connessioni peer

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

Stabilire una connessione peer

Le applicazioni che implementano la funzionalità WebRTC si basano in genere sull'interfaccia RTCPeerConnection. Dal lato dei chiamanti (ovvero il peer che avvia una connessione), il processo per stabilire una connessione è di solito il seguente:

  1. Crea una nuova istanza RTCPeerConnection con la configurazione ICE appropriata.
  2. Crea una descrizione dell'SDP locale utilizzando RTCPeerConnection.createOffer().
  3. Imposta la descrizione dell'SDP locale utilizzando RTCPeerConnection.setLocalDescription().
  4. Trasferisci (utilizzando un servizio di segnalazione) la descrizione dell'SDP locale al peer remoto.
  5. Registra un listener per eventi icecandidate su RTCPeerConnection.
  6. Per ogni evento icecandidate, trasferiscilo (utilizzando un servizio di segnalazione) al peer remoto.
  7. Attendi la descrizione dell'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()

La procedura per i destinatari è diversa.

  1. Crea una nuova istanza RTCPeerConnection con la configurazione ICE appropriata.
  2. Attendi la descrizione dell'SDP remota in arrivo dal servizio di segnalazione e impostala utilizzando RTCPeerConnection.setRemoteDescription().
  3. Crea una risposta per la descrizione dell'SDP remota chiamando RTCPeerConnection.createAnswer().
  4. Trasferisci (tramite un servizio di segnalazione) la risposta al peer remoto.
  5. Registra un listener per 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()

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

Durante l'implementazione di un'applicazione con questa API, è consigliabile che gli sviluppatori utilizzino async e await invece di registrare gli ascoltatori (utilizzando Promise.then()), in modo che sia più semplice seguire il codice. Esamina il seguente esempio:

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

Quando scrivi 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
    });
}