Kết nối ngang hàng

RTCPeerConnection là giao diện trung tâm trong API WebRTC. Lớp này đại diện cho kết nối giữa máy tính cục bộ và máy tính từ xa, đồng thời cung cấp tất cả cá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ẽ phụ thuộc nhiều vào giao diện RTCPeerConnection. Từ phía phương thức gọi (tức là máy ngang hàng khởi tạo kết nối), quy trình thiết lập kết nối thường diễn ra như sau:

  1. Tạo một thực thể RTCPeerConnection mới có cấu hình 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ả SDP cục bộ bằng RTCPeerConnection.setLocalDescription().
  4. Chuyển (bằng cách sử dụng dịch vụ báo hiệu) nội dung mô tả SDP cục bộ đến máy ngang hàng từ xa.
  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 đó (bằng cách sử dụng dịch vụ báo hiệu) đến máy tính từ xa.
  7. Chờ thông tin mô tả SDP từ xa đến từ dịch vụ báo hiệu và đặt thông tin đó bằng RTCPeerConnection.setRemoteDescription().
  8. Chờ các đề xuất ICE từ xa sắp tới từ dịch vụ báo hiệu và thêm các đề xuất đó bằng RTCPeerConnection.addIceCandidate()

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

  1. Tạo một thực thể RTCPeerConnection mới có cấu hình ICE thích hợp.
  2. Chờ thông tin mô tả SDP từ xa đến từ dịch vụ báo hiệu và đặt thông tin đó 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 (bằng cách sử dụng dịch vụ báo hiệu) câu trả lời đến máy tính từ xa.
  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 đó (bằng cách sử dụng dịch vụ báo hiệu) đến máy tính từ xa.
  7. Chờ các đề xuất ICE từ xa sắp tới từ dịch vụ báo hiệu và thêm các đề xuất đó bằng RTCPeerConnection.addIceCandidate()

Thách thức 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 thực tế của ứng dụng WebRTC trở nên phức tạp. Nhiều hàm trả về một Promise cần được phân giải trước khi có thể tiếp tục bước tiếp theo trong quy trình.

Khi triển khai ứ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 (sử dụng Promise.then()), vì điều này giúp mã của bạn dễ theo dõi hơn. Hãy xem 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ẽ nhận được kết quả sau:

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