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}