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