Kết nối ngang hàng

RTCPeerConnection là giao diện trung tâm trong API WebRTC. Thông số này đại diện cho sự kết nối giữa ứng dụng ngang hàng cục bộ và ứng dụng ngang hàng, từ đó chia sẻ tất cả hàm 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ẽ dựa nhiều vào giao diện RTCPeerConnection. Từ phía người gọi (tức là các ứng dụng ngang hàng sẽ bắt đầu kết nối), quy trình thiết lập kết nối thường như sau:

  1. Tạo một thực thể RTCPeerConnection mới có cấu hình ICE phù hợp.
  2. Tạo một nội dung mô tả SDP cục bộ bằng RTCPeerConnection.createOffer().
  3. Đặt nội dung mô tả SDP cục bộ bằng RTCPeerConnection.setLocalDescription().
  4. Chuyển (sử dụng dịch vụ tín hiệu) nội dung mô tả SDP địa phương sang ứng dụng ngang hàng từ xa.
  5. Đăng ký trình xử lý 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 đó (bằng dịch vụ tín hiệu) sang ứng dụng ngang hàng từ xa.
  7. Chờ mô tả SDP từ xa đến từ dịch vụ tín hiệu và đặt mô tả bằng RTCPeerConnection.setRemoteDescription() bằng cách sử dụng.
  8. Chờ các ứng viên ICE từ xa sử dụng dịch vụ tín hiệu và thêm các ứng viên đó từ RTCPeerConnection.addIceCandidate()

Đối với bên gọi, quy trình hơi khác.

  1. Tạo một thực thể RTCPeerConnection mới có cấu hình ICE phù hợp.
  2. Chờ mô tả SDP từ xa đến từ dịch vụ tín hiệu và đặt mô tả bằng RTCPeerConnection.setRemoteDescription() bằng cách sử dụng.
  3. Tạo câu trả lời cho phần mô tả SDP từ xa bằng cách gọi RTCPeerConnection.createAnswer().
  4. Chuyển (sử dụng dịch vụ tín hiệu) câu trả lời cho ứng dụng ngang hàng từ xa.
  5. Đăng ký trình xử lý 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 đó (bằng dịch vụ tín hiệu) sang ứng dụng ngang hàng từ xa.
  7. Chờ các ứng viên ICE từ xa sử dụng dịch vụ tín hiệu và thêm các ứng viên đó từ RTCPeerConnection.addIceCandidate()

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

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

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 tôi nhận được các thông tin sau:

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