2023-07-10 01:18:19 +00:00
|
|
|
use std::collections::HashMap;
|
|
|
|
use std::sync::{Arc, Mutex};
|
|
|
|
|
|
|
|
use tokio::sync::{broadcast, watch};
|
2023-06-03 23:03:58 +00:00
|
|
|
|
2023-06-02 04:07:42 +00:00
|
|
|
use axum::extract::FromRef;
|
2023-06-03 23:03:58 +00:00
|
|
|
use bytes::Bytes;
|
2023-06-02 04:07:42 +00:00
|
|
|
use sqlx::PgPool;
|
2023-07-10 01:18:19 +00:00
|
|
|
use uuid::Uuid;
|
2023-06-02 04:07:42 +00:00
|
|
|
|
2023-07-10 01:18:19 +00:00
|
|
|
use crate::actors::feed_crawler::FeedCrawlerHandleMessage;
|
2023-06-02 04:07:42 +00:00
|
|
|
use crate::config::Config;
|
|
|
|
|
2023-07-10 01:18:19 +00:00
|
|
|
/// A map of feed IDs to a channel receiver for the active `FeedCrawler` running a crawl for that
|
|
|
|
/// feed.
|
|
|
|
///
|
|
|
|
/// Currently, the only purpose of this is to keep track of active crawls so that axum handlers can
|
|
|
|
/// subscribe to the result of the crawl via the receiver channel which are then sent to end-users
|
|
|
|
/// as a stream of server-sent events.
|
|
|
|
///
|
|
|
|
/// This map should only contain crawls that have just been created but not yet subscribed to.
|
|
|
|
/// Entries are only added when a user adds a feed in the UI and entries are removed by the same
|
|
|
|
/// user once a server-sent event connection is established.
|
|
|
|
pub type Crawls = Arc<Mutex<HashMap<Uuid, broadcast::Receiver<FeedCrawlerHandleMessage>>>>;
|
|
|
|
|
2023-06-02 04:07:42 +00:00
|
|
|
#[derive(Clone)]
|
|
|
|
pub struct AppState {
|
|
|
|
pub pool: PgPool,
|
|
|
|
pub config: Config,
|
2023-07-10 01:18:19 +00:00
|
|
|
pub log_receiver: watch::Receiver<Bytes>,
|
|
|
|
pub crawls: Crawls,
|
2023-06-02 04:07:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl FromRef<AppState> for PgPool {
|
|
|
|
fn from_ref(state: &AppState) -> Self {
|
|
|
|
state.pool.clone()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl FromRef<AppState> for Config {
|
|
|
|
fn from_ref(state: &AppState) -> Self {
|
|
|
|
state.config.clone()
|
|
|
|
}
|
|
|
|
}
|
2023-06-03 23:03:58 +00:00
|
|
|
|
2023-07-10 01:18:19 +00:00
|
|
|
impl FromRef<AppState> for watch::Receiver<Bytes> {
|
2023-06-03 23:03:58 +00:00
|
|
|
fn from_ref(state: &AppState) -> Self {
|
|
|
|
state.log_receiver.clone()
|
|
|
|
}
|
|
|
|
}
|
2023-07-10 01:18:19 +00:00
|
|
|
|
|
|
|
impl FromRef<AppState> for Crawls {
|
|
|
|
fn from_ref(state: &AppState) -> Self {
|
|
|
|
state.crawls.clone()
|
|
|
|
}
|
|
|
|
}
|