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:
- Tạo một thực thể
RTCPeerConnection
mới có cấu hình ICE thích hợp. - Tạo nội dung mô tả SDP cục bộ bằng
RTCPeerConnection.createOffer()
. - Đặt nội dung mô tả SDP cục bộ bằng
RTCPeerConnection.setLocalDescription()
. - 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.
- Đăng ký trình nghe cho các sự kiện
icecandidate
trê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 máy tính 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
RTCPeerConnection.setRemoteDescription()
. - 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.
- Tạo một thực thể
RTCPeerConnection
mới có 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
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 (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.
- Đăng ký trình nghe cho các sự kiện
icecandidate
trê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 máy tính từ xa. - 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 async
và await
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 async
và await
, 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
});
}