use std::sync::Arc;
use crate::auth_provider::AuthProvider;
use crate::cache::MetadataChangeCallback;
use crate::circuit_breaker::CircuitBreaker;
use crate::client::{AuthplaneClient, ClientRuntimeConfig};
use crate::dpop_provider::DpopProvider;
use crate::{AuthplaneError, FetchSettings};
#[derive(Clone)]
pub struct AuthplaneClientBuilder {
issuer: String,
fetch_settings: FetchSettings,
jwks_refresh_seconds: u64,
metadata_refresh_seconds: u64,
cache_ttl_buffer_seconds: f64,
default_token_ttl_seconds: f64,
circuit_breaker_threshold: u32,
circuit_breaker_cooldown_seconds: f64,
dpop_provider: Option<Arc<DpopProvider>>,
auth_provider: Option<Arc<dyn AuthProvider>>,
on_metadata_change: Option<MetadataChangeCallback>,
}
impl AuthplaneClientBuilder {
pub const DEFAULT_JWKS_REFRESH_SECONDS: u64 = 300;
pub const DEFAULT_METADATA_REFRESH_SECONDS: u64 = 3600;
pub fn new(issuer: impl Into<String>) -> Self {
Self {
issuer: issuer.into(),
fetch_settings: FetchSettings::default(),
jwks_refresh_seconds: Self::DEFAULT_JWKS_REFRESH_SECONDS,
metadata_refresh_seconds: Self::DEFAULT_METADATA_REFRESH_SECONDS,
cache_ttl_buffer_seconds: crate::cache::TokenCache::DEFAULT_TTL_BUFFER_SECONDS,
default_token_ttl_seconds: crate::cache::TokenCache::DEFAULT_TTL_SECONDS,
circuit_breaker_threshold: CircuitBreaker::DEFAULT_THRESHOLD,
circuit_breaker_cooldown_seconds: CircuitBreaker::DEFAULT_COOLDOWN_SECONDS,
dpop_provider: None,
auth_provider: None,
on_metadata_change: None,
}
}
pub fn with_fetch_settings(mut self, fetch_settings: FetchSettings) -> Self {
self.fetch_settings = fetch_settings;
self
}
pub fn with_jwks_refresh_seconds(mut self, seconds: u64) -> Self {
self.jwks_refresh_seconds = seconds.max(1);
self
}
pub fn with_metadata_refresh_seconds(mut self, seconds: u64) -> Self {
self.metadata_refresh_seconds = seconds.max(1);
self
}
pub fn with_token_cache_ttl_buffer_seconds(mut self, buffer_seconds: f64) -> Self {
self.cache_ttl_buffer_seconds = buffer_seconds.max(0.0);
self
}
pub fn with_default_token_ttl_seconds(mut self, seconds: f64) -> Self {
self.default_token_ttl_seconds = seconds.max(0.0);
self
}
pub fn with_circuit_breaker_threshold(mut self, threshold: u32) -> Self {
self.circuit_breaker_threshold = threshold.max(1);
self
}
pub fn with_circuit_breaker_cooldown_seconds(mut self, cooldown_seconds: f64) -> Self {
self.circuit_breaker_cooldown_seconds = cooldown_seconds.max(0.0);
self
}
pub fn with_auth(mut self, provider: Arc<dyn AuthProvider>) -> Self {
self.auth_provider = Some(provider);
self
}
pub fn with_dpop_provider(mut self, provider: Arc<DpopProvider>) -> Self {
self.dpop_provider = Some(provider);
self
}
pub fn with_metadata_change_callback(mut self, callback: MetadataChangeCallback) -> Self {
self.on_metadata_change = Some(callback);
self
}
pub async fn build(self) -> Result<AuthplaneClient, AuthplaneError> {
let runtime = ClientRuntimeConfig {
jwks_refresh_seconds: self.jwks_refresh_seconds,
metadata_refresh_seconds: self.metadata_refresh_seconds,
cache_ttl_buffer_seconds: self.cache_ttl_buffer_seconds,
default_token_ttl_seconds: self.default_token_ttl_seconds,
circuit_breaker_threshold: self.circuit_breaker_threshold,
circuit_breaker_cooldown_seconds: self.circuit_breaker_cooldown_seconds,
dpop_provider: self.dpop_provider,
auth_provider: self.auth_provider,
on_metadata_change: self.on_metadata_change,
};
AuthplaneClient::build(self.issuer, self.fetch_settings, runtime).await
}
}