use rust_mcp_sdk::schema::schema_utils::CallToolError;
use tokio::sync::OnceCell;
use nab::{AcceleratedClient, SessionStore};
static CLIENT: OnceCell<AcceleratedClient> = OnceCell::const_new();
pub async fn get_client() -> &'static AcceleratedClient {
CLIENT
.get_or_init(|| async { AcceleratedClient::new().expect("Failed to create HTTP client") })
.await
}
static SESSION_STORE: OnceCell<SessionStore> = OnceCell::const_new();
pub(crate) async fn get_session_store() -> &'static SessionStore {
SESSION_STORE
.get_or_init(|| async { SessionStore::new() })
.await
}
pub(crate) async fn resolve_session_client(
name: &str,
seed_cookies: Option<&str>,
seed_url: &str,
) -> Result<reqwest::Client, CallToolError> {
let store = get_session_store().await;
let seed = seed_cookies.filter(|s| !s.is_empty());
let entry = store
.get_or_create(name, seed, Some(seed_url))
.await
.map_err(|e| CallToolError::from_message(e.to_string()))?;
Ok(entry.client)
}
pub(crate) async fn build_transient_client(
seed_cookies: Option<&str>,
seed_url: &str,
) -> Result<reqwest::Client, CallToolError> {
let store = SessionStore::new();
let seed = seed_cookies.filter(|s| !s.is_empty());
let entry = store
.get_or_create("transient", seed, Some(seed_url))
.await
.map_err(|e| CallToolError::from_message(e.to_string()))?;
Ok(entry.client)
}