Skip to main content

cas_lib/http/
mod.rs

1use std::sync::{Arc, Mutex};
2use url::Url;
3
4#[cfg(not(target_arch = "wasm32"))]
5use reqwest::{Client, cookie::Jar};
6
7pub mod types;
8use crate::http::types::{BenchmarkRequest};
9
10static API_KEY: Mutex<String> = Mutex::new(String::new());
11static BASE_URL: Mutex<String> = Mutex::new(String::new());
12
13static TOKEN: Mutex<String> = Mutex::new(String::new());
14static REFRESH_TOKEN: Mutex<String> = Mutex::new(String::new());
15
16#[cfg(not(target_arch = "wasm32"))]
17static BENCHMARK_SENDER_CLIENT: Mutex<Option<Client>> = Mutex::new(None);
18
19#[cfg(not(target_arch = "wasm32"))]
20fn create_benchmark_sender_client(token: String, refresh_token: String) -> Client {
21    let cookie_store = Arc::new(Jar::default());
22    let base_url = Url::parse(BASE_URL.lock().unwrap().as_str()).unwrap();
23    cookie_store.add_cookie_str(&format!("Token={}; Path=/", token), &base_url);
24    cookie_store.add_cookie_str(&format!("RefreshToken={}; Path=/", refresh_token), &base_url);
25    Client::builder()
26        .cookie_provider(cookie_store)
27        .build()
28        .unwrap()
29}
30
31#[cfg(not(target_arch = "wasm32"))]
32fn determine_api_route() -> String {
33    let base_url = BASE_URL.lock().unwrap();
34    if base_url.contains("cryptographicapiservices.com") {
35        "api/userapi".to_string()
36    } else {
37        "api".to_string()
38    }
39}
40
41#[cfg(not(target_arch = "wasm32"))]
42pub async fn set_api_key_in_cache(api_key: String) {
43    let mut key = API_KEY.lock().unwrap();
44    *key = api_key.clone();
45    set_tokens_in_cache(api_key).await;
46}
47
48#[cfg(not(target_arch = "wasm32"))]
49pub fn set_base_url_in_cache(base_url: String) {
50    let mut url = BASE_URL.lock().unwrap();
51    *url = base_url
52}
53
54#[cfg(not(target_arch = "wasm32"))]
55pub async fn set_tokens_in_cache(api_key: String) {
56    let client = Client::new();
57    let base_url = BASE_URL.lock().unwrap().clone();
58    let url = format!("{}/{}/APIKey/GetToken", base_url, determine_api_route());
59    let response_task = client
60        .get(url)
61        .header("Authorization", api_key)
62        .send()
63        .await;
64    let response = response_task.unwrap().json::<types::AuthResponse>().await;
65    match response {
66        Ok(auth_response) => {
67            {
68                let mut token = TOKEN.lock().unwrap();
69                *token = auth_response.token.clone();
70            }
71            {
72                let mut refresh = REFRESH_TOKEN.lock().unwrap();
73                *refresh = auth_response.refresh_token.clone();
74            }
75            {
76                let mut bench_client = BENCHMARK_SENDER_CLIENT.lock().unwrap();
77                *bench_client = Some(create_benchmark_sender_client(
78                    auth_response.token,
79                    auth_response.refresh_token,
80                ));
81            }
82        }
83
84        Err(_) => {
85            *TOKEN.lock().unwrap() = String::new();
86            *REFRESH_TOKEN.lock().unwrap() = String::new();
87        }
88    }
89}
90
91#[cfg(not(target_arch = "wasm32"))]
92pub async fn send_benchmark(time_in_milliseconds: i64, class_name: String, method_name: String) {
93    let payload = BenchmarkRequest {
94        class_name,
95        method_name,
96        time_in_milliseconds,
97    };
98    let base_url = BASE_URL.lock().unwrap().clone();
99    let client = BENCHMARK_SENDER_CLIENT.lock().unwrap().as_ref().unwrap().clone();
100    
101    let _response = client
102        .post(format!("{}/{}/Benchmark", base_url, determine_api_route()))
103        .json(&payload)
104        .send()
105        .await;
106}