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}