Skip to content

Commit ae93e81

Browse files
author
yngrtc
committed
enable set_configuration and get_configuration
1 parent c0e30bc commit ae93e81

File tree

3 files changed

+124
-33
lines changed

3 files changed

+124
-33
lines changed

webrtc/src/ice_transport/ice_server.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::ice_transport::ice_credential_type::RTCIceCredentialType;
55

66
/// ICEServer describes a single STUN and TURN server that can be used by
77
/// the ICEAgent to establish a connection with a peer.
8-
#[derive(Default, Debug, Clone, Serialize, Deserialize, Hash)]
8+
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize, Hash)]
99
pub struct RTCIceServer {
1010
pub urls: Vec<String>,
1111
pub username: String,

webrtc/src/peer_connection/mod.rs

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ pub struct RTCPeerConnection {
191191
stats_id: String,
192192
idp_login_url: Option<String>,
193193

194-
configuration: RTCConfiguration,
194+
configuration: Mutex<RTCConfiguration>,
195195

196196
interceptor_rtcp_writer: Arc<dyn RTCPWriter + Send + Sync>,
197197

@@ -256,7 +256,7 @@ impl RTCPeerConnection {
256256
interceptor,
257257
interceptor_rtcp_writer,
258258
internal,
259-
configuration,
259+
configuration: Mutex::new(configuration),
260260
idp_login_url: None,
261261
})
262262
}
@@ -647,80 +647,78 @@ impl RTCPeerConnection {
647647
}
648648
}
649649

650-
/*TODO: // set_configuration updates the configuration of this PeerConnection object.
651-
pub async fn set_configuration(&mut self, configuration: Configuration) -> Result<()> {
652-
//nolint:gocognit
650+
// set_configuration updates the configuration of this PeerConnection object.
651+
pub async fn set_configuration(&self, configuration: RTCConfiguration) -> Result<()> {
653652
// https://www.w3.org/TR/webrtc/#dom-rtcpeerconnection-setconfiguration (step #2)
653+
let mut config_lock = self.configuration.lock().await;
654+
654655
if self.internal.is_closed.load(Ordering::SeqCst) {
655-
return Err(Error::ErrConnectionClosed.into());
656+
return Err(Error::ErrConnectionClosed);
656657
}
657658

658659
// https://www.w3.org/TR/webrtc/#set-the-configuration (step #3)
659660
if !configuration.peer_identity.is_empty() {
660-
if configuration.peer_identity != self.configuration.peer_identity {
661-
return Err(Error::ErrModifyingPeerIdentity.into());
661+
if configuration.peer_identity != config_lock.peer_identity {
662+
return Err(Error::ErrModifyingPeerIdentity);
662663
}
663-
self.configuration.peer_identity = configuration.peer_identity;
664+
config_lock.peer_identity = configuration.peer_identity;
664665
}
665666

666667
// https://www.w3.org/TR/webrtc/#set-the-configuration (step #4)
667668
if !configuration.certificates.is_empty() {
668-
if configuration.certificates.len() != self.configuration.certificates.len() {
669-
return Err(Error::ErrModifyingCertificates.into());
669+
if configuration.certificates.len() != config_lock.certificates.len() {
670+
return Err(Error::ErrModifyingCertificates);
670671
}
671672

672-
self.configuration.certificates = configuration.certificates;
673+
config_lock.certificates = configuration.certificates;
673674
}
674675

675676
// https://www.w3.org/TR/webrtc/#set-the-configuration (step #5)
676-
if configuration.bundle_policy != BundlePolicy::Unspecified {
677-
if configuration.bundle_policy != self.configuration.bundle_policy {
678-
return Err(Error::ErrModifyingBundlePolicy.into());
679-
}
680-
self.configuration.bundle_policy = configuration.bundle_policy;
677+
678+
if configuration.bundle_policy != config_lock.bundle_policy {
679+
return Err(Error::ErrModifyingBundlePolicy);
681680
}
681+
config_lock.bundle_policy = configuration.bundle_policy;
682682

683683
// https://www.w3.org/TR/webrtc/#set-the-configuration (step #6)
684-
if configuration.rtcp_mux_policy != RTCPMuxPolicy::Unspecified {
685-
if configuration.rtcp_mux_policy != self.configuration.rtcp_mux_policy {
686-
return Err(Error::ErrModifyingRTCPMuxPolicy.into());
687-
}
688-
self.configuration.rtcp_mux_policy = configuration.rtcp_mux_policy;
684+
if configuration.rtcp_mux_policy != config_lock.rtcp_mux_policy {
685+
return Err(Error::ErrModifyingRTCPMuxPolicy);
689686
}
687+
config_lock.rtcp_mux_policy = configuration.rtcp_mux_policy;
690688

691689
// https://www.w3.org/TR/webrtc/#set-the-configuration (step #7)
692690
if configuration.ice_candidate_pool_size != 0 {
693-
if self.configuration.ice_candidate_pool_size != configuration.ice_candidate_pool_size
691+
if config_lock.ice_candidate_pool_size != configuration.ice_candidate_pool_size
694692
&& self.local_description().await.is_some()
695693
{
696-
return Err(Error::ErrModifyingICECandidatePoolSize.into());
694+
return Err(Error::ErrModifyingICECandidatePoolSize);
697695
}
698-
self.configuration.ice_candidate_pool_size = configuration.ice_candidate_pool_size;
696+
config_lock.ice_candidate_pool_size = configuration.ice_candidate_pool_size;
699697
}
700698

701699
// https://www.w3.org/TR/webrtc/#set-the-configuration (step #8)
702-
if configuration.ice_transport_policy != ICETransportPolicy::Unspecified {
703-
self.configuration.ice_transport_policy = configuration.ice_transport_policy
704-
}
700+
701+
config_lock.ice_transport_policy = configuration.ice_transport_policy;
705702

706703
// https://www.w3.org/TR/webrtc/#set-the-configuration (step #11)
707704
if !configuration.ice_servers.is_empty() {
708705
// https://www.w3.org/TR/webrtc/#set-the-configuration (step #11.3)
709706
for server in &configuration.ice_servers {
710707
server.validate()?;
711708
}
712-
self.configuration.ice_servers = configuration.ice_servers
709+
config_lock.ice_servers = configuration.ice_servers
713710
}
714711
Ok(())
715-
}*/
712+
}
716713

717714
/// get_configuration returns a Configuration object representing the current
718715
/// configuration of this PeerConnection object. The returned object is a
719716
/// copy and direct mutation on it will not take affect until set_configuration
720717
/// has been called with Configuration passed as its only argument.
721718
/// <https://www.w3.org/TR/webrtc/#dom-rtcpeerconnection-getconfiguration>
722-
pub fn get_configuration(&self) -> &RTCConfiguration {
723-
&self.configuration
719+
pub async fn get_configuration(&self) -> RTCConfiguration {
720+
let configuration = self.configuration.lock().await;
721+
configuration.clone()
724722
}
725723

726724
pub fn get_stats_id(&self) -> &str {

webrtc/src/peer_connection/peer_connection_test.rs

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use crate::api::interceptor_registry::register_default_interceptors;
1414
use crate::api::media_engine::{MediaEngine, MIME_TYPE_VP8};
1515
use crate::api::APIBuilder;
1616
use crate::ice_transport::ice_candidate_pair::RTCIceCandidatePair;
17+
use crate::ice_transport::ice_credential_type::RTCIceCredentialType;
1718
use crate::ice_transport::ice_server::RTCIceServer;
1819
use crate::peer_connection::configuration::RTCConfiguration;
1920
use crate::rtp_transceiver::rtp_codec::RTCRtpCodecCapability;
@@ -388,6 +389,98 @@ async fn test_peer_connection_close_is_send() -> Result<()> {
388389
tokio::join!(handle).0.unwrap()
389390
}
390391

392+
#[tokio::test]
393+
async fn test_set_get_configuration() {
394+
// initialize MediaEngine and InterceptorRegistry
395+
let media_engine = MediaEngine::default();
396+
let registry = Registry::default();
397+
398+
// create API instance
399+
let api = APIBuilder::new()
400+
.with_media_engine(media_engine)
401+
.with_interceptor_registry(registry)
402+
.build();
403+
404+
// create configuration
405+
let initial_config = RTCConfiguration {
406+
ice_servers: vec![RTCIceServer {
407+
urls: vec!["stun:stun.l.google.com:19302".to_string()],
408+
username: "".to_string(),
409+
credential: "".to_string(),
410+
credential_type: RTCIceCredentialType::Unspecified,
411+
}],
412+
..Default::default()
413+
};
414+
415+
// create RTCPeerConnection instance
416+
let peer = Arc::new(
417+
api.new_peer_connection(initial_config.clone())
418+
.await
419+
.expect("Failed to create RTCPeerConnection"),
420+
);
421+
422+
// get configuration and println
423+
let config_before = peer.get_configuration().await;
424+
println!("Initial ICE Servers: {:?}", config_before.ice_servers);
425+
println!(
426+
"Initial ICE Transport Policy: {:?}",
427+
config_before.ice_transport_policy
428+
);
429+
println!("Initial Bundle Policy: {:?}", config_before.bundle_policy);
430+
println!(
431+
"Initial RTCP Mux Policy: {:?}",
432+
config_before.rtcp_mux_policy
433+
);
434+
println!("Initial Peer Identity: {:?}", config_before.peer_identity);
435+
println!("Initial Certificates: {:?}", config_before.certificates);
436+
println!(
437+
"Initial ICE Candidate Pool Size: {:?}",
438+
config_before.ice_candidate_pool_size
439+
);
440+
println!("");
441+
442+
// create new configuration
443+
let new_config = RTCConfiguration {
444+
ice_servers: vec![RTCIceServer {
445+
urls: vec![
446+
"turn:turn.22333.fun".to_string(),
447+
"turn:cn.22333.fun".to_string(),
448+
],
449+
username: "live777".to_string(),
450+
credential: "live777".to_string(),
451+
credential_type: RTCIceCredentialType::Password,
452+
}],
453+
..Default::default()
454+
};
455+
456+
// set new configuration
457+
peer.set_configuration(new_config.clone())
458+
.await
459+
.expect("Failed to set configuration");
460+
461+
// get new configuration and println
462+
let updated_config = peer.get_configuration().await;
463+
println!("Updated ICE Servers: {:?}", updated_config.ice_servers);
464+
println!(
465+
"Updated ICE Transport Policy: {:?}",
466+
updated_config.ice_transport_policy
467+
);
468+
println!("Updated Bundle Policy: {:?}", updated_config.bundle_policy);
469+
println!(
470+
"Updated RTCP Mux Policy: {:?}",
471+
updated_config.rtcp_mux_policy
472+
);
473+
println!("Updated Peer Identity: {:?}", updated_config.peer_identity);
474+
println!("Updated Certificates: {:?}", updated_config.certificates);
475+
println!(
476+
"Updated ICE Candidate Pool Size: {:?}",
477+
updated_config.ice_candidate_pool_size
478+
);
479+
480+
// verify
481+
assert_eq!(updated_config.ice_servers, new_config.ice_servers);
482+
}
483+
391484
async fn peer() -> Result<()> {
392485
let mut m = MediaEngine::default();
393486
m.register_default_codecs()?;

0 commit comments

Comments
 (0)