Kết nối ngang hàng

RTCPeerConnection là giao diện trung tâm trong API WebRTC. Nó thể hiện kết nối giữa ứng dụng ngang hàng cục bộ và từ xa, đồng thời cung cấp tất cả chức năng và sự kiện cần thiết để thiết lập kết nối.

Thiết lập kết nối ngang hàng

Các ứng dụng triển khai chức năng WebRTC thường sẽ chủ yếu dựa vào Giao diện RTCPeerConnection. Từ phía người gọi (tức là ứng dụng ngang hàng bắt đầu kết nối), quá trình thiết lập kết nối thường là sau:

  1. Tạo một thực thể RTCPeerConnection mới bằng ICE thích hợp .
  2. Tạo nội dung mô tả SDP cục bộ bằng RTCPeerConnection.createOffer().
  3. Đặt nội dung mô tả về SDP cục bộ bằng RTCPeerConnection.setLocalDescription().
  4. Truyền (sử dụng dịch vụ tín hiệu) mô tả SDP cục bộ sang điều khiển từ xa ứng dụng ngang hàng.
  5. Đăng ký trình nghe cho các sự kiện icecandidate trên RTCPeerConnection.
  6. Đối với mỗi sự kiện icecandidate, hãy chuyển sự kiện đó (sử dụng một dịch vụ tín hiệu) đến ứng dụng ngang hàng từ xa.
  7. Chờ thông tin mô tả SDP từ xa đến từ dịch vụ tín hiệu và hãy đặt giá trị này bằng RTCPeerConnection.setRemoteDescription().
  8. Chờ các ứng viên ICE từ xa đến từ dịch vụ báo hiệu rồi thêm họ sử dụng RTCPeerConnection.addIceCandidate()

Về phía người được gọi, quy trình này hơi khác.

  1. Tạo một thực thể RTCPeerConnection mới bằng ICE thích hợp .
  2. Chờ thông tin mô tả SDP từ xa đến từ dịch vụ tín hiệu, rồi hãy đặt giá trị này bằng RTCPeerConnection.setRemoteDescription().
  3. Tạo câu trả lời cho nội dung mô tả SDP từ xa bằng cách gọi RTCPeerConnection.createAnswer().
  4. Chuyển câu trả lời đến ứng dụng ngang hàng từ xa (bằng một dịch vụ tín hiệu).
  5. Đăng ký trình nghe cho các sự kiện icecandidate trên RTCPeerConnection.
  6. Đối với mỗi sự kiện icecandidate, hãy chuyển sự kiện đó (sử dụng một dịch vụ tín hiệu) đến ứng dụng ngang hàng từ xa.
  7. Chờ các ứng viên ICE từ xa đến từ dịch vụ báo hiệu rồi thêm họ sử dụng RTCPeerConnection.addIceCandidate()

Thách thức đối với API này là hầu hết các thao tác này đều không đồng bộ, Điều này thường khiến việc triển khai ứng dụng WebRTC thực tế trở nên phức tạp. Nhiều hàm trả về Promise và phải được giải quyết trước khi bước tiếp theo trong quy trình có thể tiếp tục.

Khi triển khai ứng dụng bằng API này, nhà phát triển sử dụng asyncawait thay vì đăng ký trình nghe (sử dụng Promise.then()), vì điều này giúp mã của bạn dễ theo dõi hơn. Cân nhắc ví dụ sau:

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

Khi viết mã ở trên bằng asyncawait, chúng ta sẽ có được như sau:

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