-
Notifications
You must be signed in to change notification settings - Fork 389
/
Copy pathapi_address_updater.rs
55 lines (48 loc) · 2.03 KB
/
api_address_updater.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//! A small updater that keeps the API IP address cache up to date by fetching changes from the
//! Mullvad API.
use mullvad_api::{rest::MullvadRestHandle, AddressCache, ApiProxy};
use std::time::Duration;
const API_IP_CHECK_INITIAL: Duration = Duration::from_secs(15 * 60);
const API_IP_CHECK_INTERVAL: Duration = Duration::from_secs(24 * 60 * 60);
const API_IP_CHECK_ERROR_INTERVAL: Duration = Duration::from_secs(15 * 60);
pub async fn run_api_address_fetcher(address_cache: AddressCache, handle: MullvadRestHandle) {
#[cfg(feature = "api-override")]
if mullvad_api::API.disable_address_cache {
return;
}
let availability = handle.availability.clone();
let api_proxy = ApiProxy::new(handle);
let mut next_delay = API_IP_CHECK_INITIAL;
loop {
talpid_time::sleep(next_delay).await;
if let Err(error) = availability.wait_background().await {
log::error!("Failed while waiting for API: {}", error);
continue;
}
match api_proxy.clone().get_api_addrs().await {
Ok(new_addrs) => {
if let Some(addr) = new_addrs.first() {
log::debug!(
"Fetched new API address {:?}. Fetching again in {} hours",
addr,
API_IP_CHECK_INTERVAL.as_secs() / (60 * 60)
);
if let Err(err) = address_cache.set_address(*addr).await {
log::error!("Failed to save newly updated API address: {}", err);
}
} else {
log::error!("API returned no API addresses");
}
next_delay = API_IP_CHECK_INTERVAL;
}
Err(err) => {
log::error!(
"Failed to fetch new API addresses: {}. Retrying in {} seconds",
err,
API_IP_CHECK_ERROR_INTERVAL.as_secs()
);
next_delay = API_IP_CHECK_ERROR_INTERVAL;
}
}
}
}