this repo has no description
1use crate::cache::{Cache, DistributedRateLimiter, create_cache};
2use crate::circuit_breaker::CircuitBreakers;
3use crate::config::AuthConfig;
4use crate::rate_limit::RateLimiters;
5use crate::repo::PostgresBlockStore;
6use crate::storage::{BlobStorage, S3BlobStorage};
7use crate::sync::firehose::SequencedEvent;
8use sqlx::PgPool;
9use std::sync::Arc;
10use tokio::sync::broadcast;
11
12#[derive(Clone)]
13pub struct AppState {
14 pub db: PgPool,
15 pub block_store: PostgresBlockStore,
16 pub blob_store: Arc<dyn BlobStorage>,
17 pub firehose_tx: broadcast::Sender<SequencedEvent>,
18 pub rate_limiters: Arc<RateLimiters>,
19 pub circuit_breakers: Arc<CircuitBreakers>,
20 pub cache: Arc<dyn Cache>,
21 pub distributed_rate_limiter: Arc<dyn DistributedRateLimiter>,
22}
23
24impl AppState {
25 pub async fn new(db: PgPool) -> Self {
26 AuthConfig::init();
27
28 let block_store = PostgresBlockStore::new(db.clone());
29 let blob_store = S3BlobStorage::new().await;
30 let (firehose_tx, _) = broadcast::channel(1000);
31 let rate_limiters = Arc::new(RateLimiters::new());
32 let circuit_breakers = Arc::new(CircuitBreakers::new());
33 let (cache, distributed_rate_limiter) = create_cache().await;
34 Self {
35 db,
36 block_store,
37 blob_store: Arc::new(blob_store),
38 firehose_tx,
39 rate_limiters,
40 circuit_breakers,
41 cache,
42 distributed_rate_limiter,
43 }
44 }
45
46 pub fn with_rate_limiters(mut self, rate_limiters: RateLimiters) -> Self {
47 self.rate_limiters = Arc::new(rate_limiters);
48 self
49 }
50
51 pub fn with_circuit_breakers(mut self, circuit_breakers: CircuitBreakers) -> Self {
52 self.circuit_breakers = Arc::new(circuit_breakers);
53 self
54 }
55}