pub mod error;
pub mod handler;
#[allow(clippy::needless_for_each)]
pub mod openapi;
pub mod router;
pub mod usage;
pub use error::ApiError;
pub use openapi::ApiDoc;
pub use router::make_router;
pub use usage::UsageStats;
use arc_swap::ArcSwap;
use byokey_auth::AuthManager;
use byokey_types::RateLimitStore;
use std::sync::Arc;
pub struct AppState {
pub config: Arc<ArcSwap<byokey_config::Config>>,
pub auth: Arc<AuthManager>,
pub http: rquest::Client,
pub usage: Arc<UsageStats>,
pub ratelimits: Arc<RateLimitStore>,
}
impl AppState {
pub fn new(config: Arc<ArcSwap<byokey_config::Config>>, auth: Arc<AuthManager>) -> Arc<Self> {
let snapshot = config.load();
let http = build_http_client(snapshot.proxy_url.as_deref());
Arc::new(Self {
config,
auth,
http,
usage: Arc::new(UsageStats::new()),
ratelimits: Arc::new(RateLimitStore::new()),
})
}
}
fn build_http_client(proxy_url: Option<&str>) -> rquest::Client {
if let Some(url) = proxy_url {
match rquest::Proxy::all(url) {
Ok(proxy) => {
return rquest::Client::builder()
.proxy(proxy)
.build()
.unwrap_or_else(|_| rquest::Client::new());
}
Err(e) => {
tracing::warn!(url = url, error = %e, "invalid proxy_url, using direct connection");
}
}
}
rquest::Client::new()
}