@@ -191,7 +191,7 @@ pub struct RTCPeerConnection {
191
191
stats_id : String ,
192
192
idp_login_url : Option < String > ,
193
193
194
- configuration : RTCConfiguration ,
194
+ configuration : Mutex < RTCConfiguration > ,
195
195
196
196
interceptor_rtcp_writer : Arc < dyn RTCPWriter + Send + Sync > ,
197
197
@@ -256,7 +256,7 @@ impl RTCPeerConnection {
256
256
interceptor,
257
257
interceptor_rtcp_writer,
258
258
internal,
259
- configuration,
259
+ configuration : Mutex :: new ( configuration ) ,
260
260
idp_login_url : None ,
261
261
} )
262
262
}
@@ -647,80 +647,78 @@ impl RTCPeerConnection {
647
647
}
648
648
}
649
649
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 < ( ) > {
653
652
// https://www.w3.org/TR/webrtc/#dom-rtcpeerconnection-setconfiguration (step #2)
653
+ let mut config_lock = self . configuration . lock ( ) . await ;
654
+
654
655
if self . internal . is_closed . load ( Ordering :: SeqCst ) {
655
- return Err(Error::ErrConnectionClosed.into() );
656
+ return Err ( Error :: ErrConnectionClosed ) ;
656
657
}
657
658
658
659
// https://www.w3.org/TR/webrtc/#set-the-configuration (step #3)
659
660
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 ) ;
662
663
}
663
- self.configuration .peer_identity = configuration.peer_identity;
664
+ config_lock . peer_identity = configuration. peer_identity ;
664
665
}
665
666
666
667
// https://www.w3.org/TR/webrtc/#set-the-configuration (step #4)
667
668
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 ) ;
670
671
}
671
672
672
- self.configuration .certificates = configuration.certificates;
673
+ config_lock . certificates = configuration. certificates ;
673
674
}
674
675
675
676
// 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 ) ;
681
680
}
681
+ config_lock. bundle_policy = configuration. bundle_policy ;
682
682
683
683
// 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 ) ;
689
686
}
687
+ config_lock. rtcp_mux_policy = configuration. rtcp_mux_policy ;
690
688
691
689
// https://www.w3.org/TR/webrtc/#set-the-configuration (step #7)
692
690
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
694
692
&& self . local_description ( ) . await . is_some ( )
695
693
{
696
- return Err(Error::ErrModifyingICECandidatePoolSize.into() );
694
+ return Err ( Error :: ErrModifyingICECandidatePoolSize ) ;
697
695
}
698
- self.configuration .ice_candidate_pool_size = configuration.ice_candidate_pool_size;
696
+ config_lock . ice_candidate_pool_size = configuration. ice_candidate_pool_size ;
699
697
}
700
698
701
699
// 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 ;
705
702
706
703
// https://www.w3.org/TR/webrtc/#set-the-configuration (step #11)
707
704
if !configuration. ice_servers . is_empty ( ) {
708
705
// https://www.w3.org/TR/webrtc/#set-the-configuration (step #11.3)
709
706
for server in & configuration. ice_servers {
710
707
server. validate ( ) ?;
711
708
}
712
- self.configuration .ice_servers = configuration.ice_servers
709
+ config_lock . ice_servers = configuration. ice_servers
713
710
}
714
711
Ok ( ( ) )
715
- }*/
712
+ }
716
713
717
714
/// get_configuration returns a Configuration object representing the current
718
715
/// configuration of this PeerConnection object. The returned object is a
719
716
/// copy and direct mutation on it will not take affect until set_configuration
720
717
/// has been called with Configuration passed as its only argument.
721
718
/// <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 ( )
724
722
}
725
723
726
724
pub fn get_stats_id ( & self ) -> & str {
0 commit comments