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