move some shit around
This commit is contained in:
parent
95ae1c09cb
commit
34f09c8a3d
9 changed files with 101 additions and 96 deletions
77
src/app_state.rs
Normal file
77
src/app_state.rs
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
use std::{borrow::Cow, collections::BTreeSet};
|
||||||
|
|
||||||
|
use anyhow::Result;
|
||||||
|
use bytes::Bytes;
|
||||||
|
use tokio::sync::{broadcast, mpsc, Mutex};
|
||||||
|
|
||||||
|
use crate::wire_proto::StreamEvent;
|
||||||
|
|
||||||
|
pub struct RelayServer {
|
||||||
|
pub db: sled::Db,
|
||||||
|
pub db_history: sled::Tree,
|
||||||
|
pub db_users: sled::Tree,
|
||||||
|
pub db_index_cursors: sled::Tree,
|
||||||
|
|
||||||
|
pub plc_resolver: Cow<'static, str>,
|
||||||
|
pub known_good_hosts: Mutex<BTreeSet<String>>,
|
||||||
|
pub active_indexers: Mutex<BTreeSet<String>>,
|
||||||
|
|
||||||
|
pub event_tx: mpsc::Sender<StreamEvent>,
|
||||||
|
pub raw_block_tx: broadcast::Sender<Bytes>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RelayServer {
|
||||||
|
pub fn new(db: sled::Db, event_tx: mpsc::Sender<StreamEvent>) -> Self {
|
||||||
|
let (raw_block_tx, _) = broadcast::channel(128);
|
||||||
|
|
||||||
|
let hosts = db
|
||||||
|
.get("hosts")
|
||||||
|
.expect("Failed to read db entry for hosts")
|
||||||
|
.and_then(|v| serde_ipld_dagcbor::from_slice::<Vec<String>>(&v).ok())
|
||||||
|
.unwrap_or_default();
|
||||||
|
|
||||||
|
Self {
|
||||||
|
event_tx,
|
||||||
|
raw_block_tx,
|
||||||
|
|
||||||
|
plc_resolver: Cow::Borrowed("plc.directory"),
|
||||||
|
known_good_hosts: Mutex::new(hosts.into_iter().collect()),
|
||||||
|
active_indexers: Default::default(),
|
||||||
|
|
||||||
|
db_history: db
|
||||||
|
.open_tree("history")
|
||||||
|
.expect("failed to open history tree"),
|
||||||
|
db_users: db.open_tree("users").expect("failed to open users tree"),
|
||||||
|
db_index_cursors: db
|
||||||
|
.open_tree("index_cursors")
|
||||||
|
.expect("failed to ope index_cursors tree"),
|
||||||
|
db,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn add_good_host(&self, host: String) -> Result<()> {
|
||||||
|
let mut hosts = self.known_good_hosts.lock().await;
|
||||||
|
if hosts.contains(&host) {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
tracing::debug!(%host, "discovered new known-good host");
|
||||||
|
|
||||||
|
hosts.insert(host);
|
||||||
|
let hosts_copy = hosts.iter().collect::<Vec<_>>();
|
||||||
|
let serialized_hosts = serde_ipld_dagcbor::to_vec(&hosts_copy)?;
|
||||||
|
drop(hosts);
|
||||||
|
self.db.insert("hosts", serialized_hosts)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn remove_good_host(&self, host: String) -> Result<()> {
|
||||||
|
tracing::debug!(%host, "dropping known-good host");
|
||||||
|
let mut hosts = self.known_good_hosts.lock().await;
|
||||||
|
hosts.remove(&host);
|
||||||
|
let hosts_copy = hosts.iter().collect::<Vec<_>>();
|
||||||
|
let serialized_hosts = serde_ipld_dagcbor::to_vec(&hosts_copy)?;
|
||||||
|
drop(hosts);
|
||||||
|
self.db.insert("hosts", serialized_hosts)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,3 @@
|
||||||
use crate::{
|
|
||||||
relay_subscription::handle_subscription, request_crawl::handle_request_crawl, RelayServer,
|
|
||||||
};
|
|
||||||
|
|
||||||
use std::{net::SocketAddr, sync::Arc};
|
use std::{net::SocketAddr, sync::Arc};
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
|
@ -14,6 +10,11 @@ use hyper::{
|
||||||
use hyper_util::rt::TokioIo;
|
use hyper_util::rt::TokioIo;
|
||||||
use tokio::net::TcpListener;
|
use tokio::net::TcpListener;
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
relay::{request_crawl::handle_request_crawl, subscribe::handle_subscription},
|
||||||
|
RelayServer,
|
||||||
|
};
|
||||||
|
|
||||||
pub type HttpBody = BoxBody<Bytes, hyper::Error>;
|
pub type HttpBody = BoxBody<Bytes, hyper::Error>;
|
||||||
pub fn body_empty() -> HttpBody {
|
pub fn body_empty() -> HttpBody {
|
||||||
Empty::<Bytes>::new().map_err(|e| match e {}).boxed()
|
Empty::<Bytes>::new().map_err(|e| match e {}).boxed()
|
||||||
|
|
82
src/lib.rs
82
src/lib.rs
|
@ -1,84 +1,8 @@
|
||||||
use std::{borrow::Cow, collections::BTreeSet};
|
mod app_state;
|
||||||
|
pub use app_state::*;
|
||||||
use anyhow::Result;
|
|
||||||
use bytes::Bytes;
|
|
||||||
use tokio::sync::{broadcast, mpsc, Mutex};
|
|
||||||
use wire_proto::StreamEvent;
|
|
||||||
|
|
||||||
pub struct RelayServer {
|
|
||||||
pub db: sled::Db,
|
|
||||||
pub db_history: sled::Tree,
|
|
||||||
pub db_users: sled::Tree,
|
|
||||||
pub db_index_cursors: sled::Tree,
|
|
||||||
|
|
||||||
pub plc_resolver: Cow<'static, str>,
|
|
||||||
pub known_good_hosts: Mutex<BTreeSet<String>>,
|
|
||||||
pub active_indexers: Mutex<BTreeSet<String>>,
|
|
||||||
|
|
||||||
pub event_tx: mpsc::Sender<StreamEvent>,
|
|
||||||
pub raw_block_tx: broadcast::Sender<Bytes>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl RelayServer {
|
|
||||||
pub fn new(db: sled::Db, event_tx: mpsc::Sender<StreamEvent>) -> Self {
|
|
||||||
let (raw_block_tx, _) = broadcast::channel(128);
|
|
||||||
|
|
||||||
let hosts = db
|
|
||||||
.get("hosts")
|
|
||||||
.expect("Failed to read db entry for hosts")
|
|
||||||
.and_then(|v| serde_ipld_dagcbor::from_slice::<Vec<String>>(&v).ok())
|
|
||||||
.unwrap_or_default();
|
|
||||||
|
|
||||||
Self {
|
|
||||||
event_tx,
|
|
||||||
raw_block_tx,
|
|
||||||
|
|
||||||
plc_resolver: Cow::Borrowed("plc.directory"),
|
|
||||||
known_good_hosts: Mutex::new(hosts.into_iter().collect()),
|
|
||||||
active_indexers: Default::default(),
|
|
||||||
|
|
||||||
db_history: db
|
|
||||||
.open_tree("history")
|
|
||||||
.expect("failed to open history tree"),
|
|
||||||
db_users: db.open_tree("users").expect("failed to open users tree"),
|
|
||||||
db_index_cursors: db
|
|
||||||
.open_tree("index_cursors")
|
|
||||||
.expect("failed to ope index_cursors tree"),
|
|
||||||
db,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn add_good_host(&self, host: String) -> Result<()> {
|
|
||||||
let mut hosts = self.known_good_hosts.lock().await;
|
|
||||||
if hosts.contains(&host) {
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
tracing::debug!(%host, "discovered new known-good host");
|
|
||||||
|
|
||||||
hosts.insert(host);
|
|
||||||
let hosts_copy = hosts.iter().collect::<Vec<_>>();
|
|
||||||
let serialized_hosts = serde_ipld_dagcbor::to_vec(&hosts_copy)?;
|
|
||||||
drop(hosts);
|
|
||||||
self.db.insert("hosts", serialized_hosts)?;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn remove_good_host(&self, host: String) -> Result<()> {
|
|
||||||
tracing::debug!(%host, "dropping known-good host");
|
|
||||||
let mut hosts = self.known_good_hosts.lock().await;
|
|
||||||
hosts.remove(&host);
|
|
||||||
let hosts_copy = hosts.iter().collect::<Vec<_>>();
|
|
||||||
let serialized_hosts = serde_ipld_dagcbor::to_vec(&hosts_copy)?;
|
|
||||||
drop(hosts);
|
|
||||||
self.db.insert("hosts", serialized_hosts)?;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub mod http;
|
pub mod http;
|
||||||
pub mod indexer;
|
pub mod relay;
|
||||||
pub mod relay_subscription;
|
|
||||||
pub mod request_crawl;
|
|
||||||
pub mod sequencer;
|
pub mod sequencer;
|
||||||
pub mod tls;
|
pub mod tls;
|
||||||
pub mod user;
|
pub mod user;
|
||||||
|
|
|
@ -6,7 +6,7 @@ use tracing_subscriber::{fmt, prelude::*, EnvFilter};
|
||||||
|
|
||||||
use cerulea_relay::{
|
use cerulea_relay::{
|
||||||
http::{self},
|
http::{self},
|
||||||
indexer::index_servers,
|
relay::index::index_servers,
|
||||||
sequencer::start_sequencer,
|
sequencer::start_sequencer,
|
||||||
RelayServer,
|
RelayServer,
|
||||||
};
|
};
|
||||||
|
|
|
@ -469,16 +469,20 @@ pub async fn index_server(server: Arc<RelayServer>, host: String) -> Result<()>
|
||||||
r
|
r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn start_indexing_server(server: Arc<RelayServer>, host: String) {
|
||||||
|
tokio::task::spawn(async move {
|
||||||
|
if let Err(e) = index_server(server, host.clone()).await {
|
||||||
|
tracing::warn!(%host, "encountered error subscribing to PDS: {e:?}");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
pub fn index_servers(server: Arc<RelayServer>, hosts: &[String]) {
|
pub fn index_servers(server: Arc<RelayServer>, hosts: &[String]) {
|
||||||
// in future we will spider out but right now i just want da stuff from my PDS
|
// in future we will spider out but right now i just want da stuff from my PDS
|
||||||
|
|
||||||
for host in hosts.iter() {
|
for host in hosts.iter() {
|
||||||
let host = host.to_string();
|
let host = host.to_string();
|
||||||
let server = Arc::clone(&server);
|
let server = Arc::clone(&server);
|
||||||
tokio::task::spawn(async move {
|
start_indexing_server(server, host);
|
||||||
if let Err(e) = index_server(server, host.clone()).await {
|
|
||||||
tracing::warn!(%host, "encountered error subscribing to PDS: {e:?}");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
3
src/relay/mod.rs
Normal file
3
src/relay/mod.rs
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
pub mod index;
|
||||||
|
pub mod request_crawl;
|
||||||
|
pub mod subscribe;
|
|
@ -8,7 +8,7 @@ use hyper::{body::Incoming, Request, Response};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
http::{body_full, ServerResponse},
|
http::{body_full, ServerResponse},
|
||||||
indexer::index_server,
|
relay::index::start_indexing_server,
|
||||||
RelayServer,
|
RelayServer,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -31,11 +31,7 @@ pub async fn handle_request_crawl(
|
||||||
};
|
};
|
||||||
|
|
||||||
let hostname = input.data.hostname;
|
let hostname = input.data.hostname;
|
||||||
tokio::task::spawn(async move {
|
start_indexing_server(server, hostname);
|
||||||
if let Err(e) = index_server(server, hostname.clone()).await {
|
|
||||||
tracing::warn!(host = %hostname, "encountered error subscribing to PDS: {e:?}");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Ok(Response::builder()
|
Ok(Response::builder()
|
||||||
.status(200)
|
.status(200)
|
|
@ -129,7 +129,7 @@ pub async fn lookup_user(server: &RelayServer, did: &str) -> Result<User> {
|
||||||
return Ok(cached_user);
|
return Ok(cached_user);
|
||||||
}
|
}
|
||||||
|
|
||||||
return fetch_user(server, did).await;
|
fetch_user(server, did).await
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn store_user(server: &RelayServer, user: &User) -> Result<()> {
|
pub fn store_user(server: &RelayServer, user: &User) -> Result<()> {
|
||||||
|
|
Loading…
Reference in a new issue