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:
- Tạo một thực thể
RTCPeerConnection
mới bằng 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ả về SDP cục bộ bằng
RTCPeerConnection.setLocalDescription()
. - 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.
- Đă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 đó (sử dụng một dịch vụ tín hiệu) đến ứng dụng ngang hàng từ xa. - 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()
. - 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.
- Tạo một thực thể
RTCPeerConnection
mới bằng ICE thích hợp . - 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()
. - 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 đến ứng dụng ngang hàng từ xa (bằng một dịch vụ tín hiệu).
- Đă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 đó (sử dụng một dịch vụ tín hiệu) đến ứng dụng ngang hàng từ xa. - 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 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. 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 async
và await
, chúng ta sẽ có được như sau:
async function createAndSendOffer(peerConnection, signallingService) {
const offer = await peerConnection.createOffer();
signallingService.send({
type: 'offer',
data: offer
});
}