RTCPeerConnection là giao diện trung tâm trong API WebRTC. Lớp này đại diện cho mối kết nối giữa các thiết bị ngang hàng cục bộ và từ xa, đồng thời cung cấp tất cả các hàm và sự kiện cần thiết để thiết lập mối 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. Về phía người gọi (tức là bên ngang khởi tạo một kết nối), quy trình thiết lập kết nối thường như sau:
- Tạo một thực thể
RTCPeerConnectionmới với cấu hình ICE thích hợp. - Tạo nội dung mô tả SDP cục bộ bằng cách sử dụng
RTCPeerConnection.createOffer(). - Đặt nội dung mô tả SDP cục bộ bằng
RTCPeerConnection.setLocalDescription(). - Chuyển (bằng dịch vụ báo hiệu) nội dung mô tả SDP cục bộ đến thiết bị ngang hàng từ xa.
- Đăng ký một trình nghe cho các sự kiện
icecandidatetrênRTCPeerConnection. - Đố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 thiết bị ngang hàng từ xa. - 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 cách sử dụng
RTCPeerConnection.setRemoteDescription(). - Chờ các ICE candidate từ xa đến từ dịch vụ báo hiệu và thêm các candidate đó bằng cách sử dụng
RTCPeerConnection.addIceCandidate()
Về phía người nhận cuộc gọi, quy trình này có chút khác biệt.
- Tạo một thực thể
RTCPeerConnectionmới với cấu hình ICE thích hợp. - 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 cách sử dụng
RTCPeerConnection.setRemoteDescription(). - Tạo câu trả lời cho nội dung mô tả SDP từ xa bằng cách gọi
RTCPeerConnection.createAnswer(). - Chuyển câu trả lời (bằng dịch vụ báo hiệu) đến thiết bị ngang hàng từ xa.
- Đăng ký một trình nghe cho các sự kiện
icecandidatetrênRTCPeerConnection. - Đố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 thiết bị ngang hàng từ xa. - Chờ các ICE candidate từ xa đến từ dịch vụ báo hiệu và thêm các candidate đó bằng cách sử dụ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ế một ứng dụng WebRTC trở nên phức tạp.
Nhiều hàm trả về một Promise phải được phân giải trước khi bước tiếp theo trong quy 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 async và await thay vì đăng ký trình nghe (bằng Promise.then()), vì điều này giúp mã của bạn dễ theo dõi hơn. Hãy xem xét 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 cách sử dụng async và await, chúng ta sẽ nhận được như sau:
async function createAndSendOffer(peerConnection, signallingService) {
const offer = await peerConnection.createOffer();
signallingService.send({
type: 'offer',
data: offer
});
}