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}