use mvdb::Mvdb;
use geeny_api::ConnectApi;
use geeny_api::models::AuthLoginResponse;
use std::thread;
use interface;
#[derive(Debug, Serialize, Deserialize, Clone, Hash, Default)]
pub struct ServiceCredentials {
pub username: String,
pub token: Option<String>,
}
pub fn auth_manager(config: interface::HubSDKConfig, auth: &Mvdb<ServiceCredentials>) {
let server = config.connect_api;
loop {
let creds = auth.access(|auth| auth.clone()).unwrap();
let new_tkn = match creds.token {
None => None,
Some(ref tkn) => check_and_refresh(&server, tkn),
};
let backoff_ms: u32 = match new_tkn {
Some(_) => (24 * 60 * 60 * 1000), None => (5 * 60 * 1000), };
if new_tkn != creds.token {
auth.access_mut(|auth| auth.token = new_tkn).unwrap();
}
info!("auth manager sleeping for {} seconds...", backoff_ms);
#[allow(deprecated)]
thread::sleep_ms(backoff_ms);
}
}
pub fn check_and_refresh(server: &ConnectApi, auth: &str) -> Option<String> {
info!("Refreshing current token");
match server.refresh_token(&AuthLoginResponse { token: auth.into() }) {
Ok(tkn) => Some(tkn.token),
Err(e) => {
error!("Token refresh failed: {:?}", e);
None
}
}
}