use crate::config::Config;
use crate::traits::{
CircuitBreakerWrapper, CorrelationEngine, DynCircuitBreaker, DynRetryStrategy, EnhancedScanner,
EventBufferTrait, HealthCheckTrait, RateLimiter, RecoveryStrategyTrait, ResilienceFactory,
RetryStrategyWrapper, SecurityComponentFactory, SecurityEventProcessor, SecurityScannerTrait,
};
use anyhow::Result;
use std::sync::Arc;
use std::time::Duration;
pub fn create_enhanced_event_buffer(
buffer_size_mb: usize,
max_endpoints: u32,
) -> Result<impl EventBufferTrait> {
#[allow(dead_code)]
struct EnhancedEventBuffer {
buffer_size_mb: usize,
max_endpoints: u32,
}
impl EventBufferTrait for EnhancedEventBuffer {
fn enqueue_event(
&self,
_endpoint_id: u32,
_data: &[u8],
_priority: crate::traits::Priority,
) -> Result<u64> {
Ok(0) }
fn get_endpoint_stats(&self, _endpoint_id: u32) -> Result<crate::traits::EndpointStats> {
Ok(crate::traits::EndpointStats {
success_count: 0,
failure_count: 0,
circuit_state: crate::traits::CircuitState::Closed,
available_tokens: 100,
})
}
}
Ok(EnhancedEventBuffer {
buffer_size_mb,
max_endpoints,
})
}
pub struct EnhancedComponentFactory;
impl SecurityComponentFactory for EnhancedComponentFactory {
fn create_event_processor(
&self,
_config: &Config,
storage: Arc<dyn crate::storage::StorageProvider>,
) -> Result<Arc<dyn SecurityEventProcessor>> {
Ok(Arc::new(crate::standard_impl::StandardEventProcessor::new(
storage,
)))
}
fn create_scanner(&self, _config: &Config) -> Result<Arc<dyn EnhancedScanner>> {
Ok(Arc::new(crate::standard_impl::StandardScanner::new()))
}
fn create_correlation_engine(
&self,
_config: &Config,
_storage: Arc<dyn crate::storage::StorageProvider>,
) -> Result<Arc<dyn CorrelationEngine>> {
Ok(Arc::new(
crate::standard_impl::StandardCorrelationEngine::new(),
))
}
fn create_rate_limiter(
&self,
_config: &Config,
storage: Arc<dyn crate::storage::StorageProvider>,
) -> Result<Arc<dyn RateLimiter>> {
tracing::info!(
target: "performance.rate_limit",
mode = "standard",
"Initializing standard rate limiter"
);
Ok(Arc::new(crate::standard_impl::StandardRateLimiter::new(
storage, 1000, 100, )))
}
fn create_security_scanner(&self, config: &Config) -> Result<Arc<dyn SecurityScannerTrait>> {
Ok(crate::scanner::create_security_scanner(&config.scanner))
}
}
impl ResilienceFactory for EnhancedComponentFactory {
fn create_circuit_breaker(&self, config: &Config) -> Result<Arc<dyn DynCircuitBreaker>> {
let circuit_config = crate::resilience::circuit_breaker::CircuitBreakerConfig {
failure_threshold: config.resilience.circuit_breaker.failure_threshold,
failure_window: Duration::from_secs(60), success_threshold: 0.8, recovery_timeout: config.resilience.circuit_breaker.recovery_timeout,
request_timeout: Duration::from_secs(30), half_open_max_requests: config.resilience.circuit_breaker.half_open_max_requests,
};
let inner = crate::resilience::standard::StandardCircuitBreaker::new(circuit_config);
Ok(Arc::new(CircuitBreakerWrapper::new(inner)))
}
fn create_retry_strategy(&self, config: &Config) -> Result<Arc<dyn DynRetryStrategy>> {
let retry_config = crate::resilience::retry::RetryConfig {
max_attempts: config.resilience.retry.max_attempts,
initial_delay: config.resilience.retry.initial_delay,
max_delay: config.resilience.retry.max_delay,
multiplier: 2.0, jitter_factor: config.resilience.retry.jitter_factor,
timeout: Some(Duration::from_secs(60)), };
let inner = crate::resilience::standard::StandardRetryStrategy::new(retry_config);
Ok(Arc::new(RetryStrategyWrapper::new(inner)))
}
fn create_health_checker(&self, _config: &Config) -> Result<Arc<dyn HealthCheckTrait>> {
Ok(Arc::new(
crate::resilience::standard::StandardHealthChecker::new(),
))
}
fn create_recovery_strategy(&self, _config: &Config) -> Result<Arc<dyn RecoveryStrategyTrait>> {
Ok(Arc::new(
crate::resilience::standard::StandardRecoveryStrategy::new(),
))
}
fn create_bulkhead(&self, config: &Config) -> Result<Arc<dyn crate::resilience::DynBulkhead>> {
use crate::resilience::bulkhead::{BulkheadWrapper, StandardBulkhead};
#[cfg(feature = "enhanced")]
{
use crate::resilience::bulkhead::EnhancedBulkhead;
let bulkhead = EnhancedBulkhead::from_config(config);
Ok(Arc::new(BulkheadWrapper::new(bulkhead)))
}
#[cfg(not(feature = "enhanced"))]
{
let bulkhead = StandardBulkhead::from_config(config);
Ok(Arc::new(BulkheadWrapper::new(bulkhead)))
}
}
}