ピア接続

RTCPeerConnection は、WebRTC API の中心的なインターフェースです。これは、ローカル ピアとリモート ピア間の接続を表し、接続を確立するために必要なすべての関数とイベントを提供します。

ピア接続を確立する

通常、WebRTC 機能を実装するアプリケーションは、RTCPeerConnection インターフェースに大きく依存します。呼び出し元側(接続を開始するピア)から見ると、接続を確立するプロセスは通常次のとおりです。

  1. 適切な ICE 構成を使用して新しい RTCPeerConnection インスタンスを作成します。
  2. RTCPeerConnection.createOffer() を使用してローカル SDP の説明を作成します。
  3. RTCPeerConnection.setLocalDescription() を使用してローカル SDP の説明を設定します。
  4. ローカル SDP の説明を(シグナリング サービスを使用して)リモートピアに転送します。
  5. RTCPeerConnectionicecandidate イベントのリスナーを登録します。
  6. icecandidate イベントごとに、シグナリング サービスを使用してリモートピアに転送します。
  7. シグナリング サービスから受信したリモート SDP の説明を待機し、RTCPeerConnection.setRemoteDescription() を使用して設定します。
  8. シグナリング サービスからリモート ICE 候補が届くのを待機し、RTCPeerConnection.addIceCandidate() を使用して追加します。

呼び出し元側のプロセスは若干異なります。

  1. 適切な ICE 構成を使用して新しい RTCPeerConnection インスタンスを作成します。
  2. シグナリング サービスから受信したリモート SDP の説明を待機し、RTCPeerConnection.setRemoteDescription() を使用して設定します。
  3. RTCPeerConnection.createAnswer() を呼び出して、リモート SDP の説明に対する回答を作成します。
  4. シグナリング サービスを使用して、リモートピアに回答を転送します。
  5. RTCPeerConnectionicecandidate イベントのリスナーを登録します。
  6. icecandidate イベントごとに、(シグナリング サービスを使用して)リモートピアに転送します。
  7. シグナリング サービスからリモート ICE 候補が届くのを待機し、RTCPeerConnection.addIceCandidate() を使用して追加します。

この API の課題は、これらのオペレーションのほとんどが非同期であるため、WebRTC アプリケーションの実装が複雑になることです。多くの関数は Promise を返します。この値は、プロセスの次のステップに進む前に解決する必要があります。

この API を使用してアプリケーションを実装する場合は、リスナーを登録する(Promise.then() を使用する)のではなく、asyncawait を使用することをおすすめします。コードがわかりやすくなります。次の例について考えてみましょう。

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

asyncawait を使用して上記のコードを記述すると、次のように表示されます。

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