ピア接続

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 を返します。この 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
    });
}