use std::collections::HashMap;
use std::sync::OnceLock;
use async_trait::async_trait;
use platform_core::{preload, AppError, ComposableFunction, EventEnvelope};
use redis_connection::{resolve_duration, RedisConfig, RedisHealthProbe, BASE_PREFIX};
pub const HEALTH_ROUTE: &str = "redis.health";
const TIMEOUT_KEY: &str = "redis.health.timeout";
const GRACE_KEY: &str = "redis.health.startup.grace";
const DEFAULT_TIMEOUT: &str = "5s";
const DEFAULT_GRACE: &str = "30s";
#[preload(route = "redis.health", instances = 5)]
#[optional_service("redis.cache.enabled")]
pub struct CacheRedisHealthCheck;
impl CacheRedisHealthCheck {
fn probe() -> &'static RedisHealthProbe {
static PROBE: OnceLock<RedisHealthProbe> = OnceLock::new();
PROBE.get_or_init(|| {
RedisHealthProbe::new(
|| RedisConfig::from_prefix(BASE_PREFIX),
resolve_duration(TIMEOUT_KEY, TIMEOUT_KEY, DEFAULT_TIMEOUT),
resolve_duration(GRACE_KEY, GRACE_KEY, DEFAULT_GRACE),
)
})
}
}
#[async_trait]
impl ComposableFunction for CacheRedisHealthCheck {
async fn handle_event(
&self,
headers: HashMap<String, String>,
input: EventEnvelope,
instance: usize,
) -> Result<EventEnvelope, AppError> {
Self::probe().handle_event(headers, input, instance).await
}
}