Skip to main content

rtc_ice/candidate/
candidate_relay.rs

1use super::*;
2use crate::network_type::determine_network_type;
3use crate::rand::generate_cand_id;
4use shared::error::*;
5
6/// The config required to create a new `CandidateRelay`.
7#[derive(Default)]
8pub struct CandidateRelayConfig {
9    /// The fields shared by every candidate type.
10    pub base_config: CandidateConfig,
11
12    /// The base address this candidate was derived from, reported as `raddr`.
13    pub rel_addr: String,
14    /// The base port, reported as `rport`.
15    pub rel_port: u16,
16
17    /// The server this candidate was gathered from.
18    pub url: Option<String>,
19}
20
21impl CandidateRelayConfig {
22    /// Creates a new relay candidate.
23    pub fn new_candidate_relay(self) -> Result<Candidate> {
24        let mut candidate_id = self.base_config.candidate_id;
25        if candidate_id.is_empty() {
26            candidate_id = generate_cand_id();
27        }
28
29        let ip: IpAddr = match self.base_config.address.parse() {
30            Ok(ip) => ip,
31            Err(_) => return Err(Error::ErrAddressParseFailed),
32        };
33        let network_type = determine_network_type(&self.base_config.network, &ip)?;
34
35        Ok(Candidate {
36            id: candidate_id,
37            network_type,
38            candidate_type: CandidateType::Relay,
39            address: self.base_config.address,
40            port: self.base_config.port,
41            resolved_addr: SocketAddr::new(ip, self.base_config.port),
42            component: self.base_config.component,
43            foundation_override: self.base_config.foundation,
44            priority_override: self.base_config.priority,
45            related_address: Some(CandidateRelatedAddress {
46                address: self.rel_addr,
47                port: self.rel_port,
48            }),
49            url: self.url,
50            ..Candidate::default()
51        })
52    }
53}