Skip to content

Commit

Permalink
Extract resolved config in struct (#2220)
Browse files Browse the repository at this point in the history
* Extract resolved config in struct

* Function instead of iterator
  • Loading branch information
neacsu authored Feb 19, 2025
1 parent d2706cf commit afa7e44
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 29 deletions.
19 changes: 19 additions & 0 deletions nym-vpn-core/crates/nym-gateway-directory/src/gateway_client.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// Copyright 2023-2024 - Nym Technologies SA <[email protected]>
// SPDX-License-Identifier: GPL-3.0-only

use std::net::SocketAddr;
use std::{fmt, net::IpAddr};

use nym_sdk::UserAgent;
Expand Down Expand Up @@ -87,6 +88,24 @@ impl Config {
}
}

pub struct ResolvedConfig {
pub nyxd_socket_addrs: Vec<SocketAddr>,
pub api_socket_addrs: Vec<SocketAddr>,
pub nym_vpn_api_socket_addres: Option<Vec<SocketAddr>>,
}

impl ResolvedConfig {
pub fn all_socket_addrs(&self) -> Vec<SocketAddr> {
let mut socket_addrs = vec![];
socket_addrs.extend(self.nyxd_socket_addrs.iter());
socket_addrs.extend(self.api_socket_addrs.iter());
if let Some(vpn_api_socket_addrs) = &self.nym_vpn_api_socket_addres {
socket_addrs.extend(vpn_api_socket_addrs.iter());
}
socket_addrs
}
}

pub struct GatewayClient {
api_client: NymApiClient,
nym_vpn_api_client: Option<nym_vpn_api_client::VpnApiClient>,
Expand Down
59 changes: 31 additions & 28 deletions nym-vpn-core/crates/nym-gateway-directory/src/helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use std::net::{IpAddr, SocketAddr};
use nym_http_api_client::HickoryDnsResolver;
use tracing::debug;

use crate::{error::Result, Config, Error};
use crate::{error::Result, gateway_client::ResolvedConfig, Config, Error};

async fn try_resolve_hostname(hostname: &str) -> Result<Vec<IpAddr>> {
debug!("Trying to resolve hostname: {hostname}");
Expand All @@ -28,34 +28,37 @@ async fn try_resolve_hostname(hostname: &str) -> Result<Vec<IpAddr>> {
Ok(ips)
}

pub async fn allowed_ips(config: &Config) -> Result<Vec<SocketAddr>> {
let mut socket_addrs = vec![];
let mut urls = vec![];

urls.push(config.nyxd_url());
urls.push(config.api_url());
if let Some(vpn_api_url) = config.nym_vpn_api_url() {
urls.push(vpn_api_url);
}

for unresolved_url in urls {
let port = unresolved_url
.port_or_known_default()
.ok_or(Error::UrlError {
url: unresolved_url.clone(),
reason: "missing port".to_string(),
})?;
let hostname = unresolved_url.host_str().ok_or(Error::UrlError {
async fn url_to_socket_addr(unresolved_url: &url::Url) -> Result<Vec<SocketAddr>> {
let port = unresolved_url
.port_or_known_default()
.ok_or(Error::UrlError {
url: unresolved_url.clone(),
reason: "missing hostname".to_string(),
reason: "missing port".to_string(),
})?;
socket_addrs.extend(
try_resolve_hostname(hostname)
.await?
.into_iter()
.map(|ip| SocketAddr::new(ip, port)),
);
}
let hostname = unresolved_url.host_str().ok_or(Error::UrlError {
url: unresolved_url.clone(),
reason: "missing hostname".to_string(),
})?;

Ok(try_resolve_hostname(hostname)
.await?
.into_iter()
.map(|ip| SocketAddr::new(ip, port))
.collect())
}

pub async fn resolve_config(config: &Config) -> Result<ResolvedConfig> {
let nyxd_socket_addrs = url_to_socket_addr(config.nyxd_url()).await?;
let api_socket_addrs = url_to_socket_addr(config.api_url()).await?;
let nym_vpn_api_socket_addres = if let Some(vpn_api_url) = config.nym_vpn_api_url() {
Some(url_to_socket_addr(vpn_api_url).await?)
} else {
None
};

Ok(socket_addrs)
Ok(ResolvedConfig {
nyxd_socket_addrs,
api_socket_addrs,
nym_vpn_api_socket_addres,
})
}
2 changes: 1 addition & 1 deletion nym-vpn-core/crates/nym-gateway-directory/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,5 @@ pub use crate::{
},
error::Error,
gateway_client::{Config, GatewayClient},
helpers::allowed_ips,
helpers::resolve_config,
};

0 comments on commit afa7e44

Please sign in to comment.