1use crate::builder::CacheBuilder;
3use actix::dev::ToEnvelope;
4use actix::prelude::*;
5use hitbox::dev::{Delete, Get, Lock, Set};
6#[cfg(feature = "metrics")]
7use hitbox::metrics::{
8 CACHE_HIT_COUNTER, CACHE_MISS_COUNTER, CACHE_STALE_COUNTER, CACHE_UPSTREAM_HANDLING_HISTOGRAM,
9};
10use hitbox::settings::CacheSettings;
11use hitbox::CacheError;
12use hitbox_backend::Backend;
13use hitbox_redis::RedisBackend;
14use tracing::{debug, info};
15
16pub struct CacheActor<B>
35where
36 B: Backend,
37{
38 pub(crate) settings: CacheSettings,
39 pub(crate) backend: Addr<B>,
40}
41
42impl<B> CacheActor<B>
43where
44 B: Actor + Backend,
45 <B as Actor>::Context:
46 ToEnvelope<B, Get> + ToEnvelope<B, Set> + ToEnvelope<B, Lock> + ToEnvelope<B, Delete>,
47{
48 #[allow(clippy::new_ret_no_self)]
50 pub async fn new() -> Result<CacheActor<RedisBackend>, CacheError> {
51 let backend = RedisBackend::new()
52 .await
53 .map_err(|err| CacheError::BackendError(err.into()))?
54 .start();
55 Ok(CacheBuilder::default().finish(backend))
56 }
57
58 pub fn builder() -> CacheBuilder<B> {
60 CacheBuilder::default()
61 }
62}
63
64impl<B> Actor for CacheActor<B>
65where
66 B: Backend,
67{
68 type Context = Context<Self>;
69
70 fn started(&mut self, _: &mut Self::Context) {
71 info!("Cache actor started");
72 debug!("Cache enabled: {:?}", self.settings);
73 }
74}