aboutsummaryrefslogtreecommitdiffstats
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs46
1 files changed, 19 insertions, 27 deletions
diff --git a/src/main.rs b/src/main.rs
index a10eb73..c3d7458 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -4,7 +4,6 @@
//! main.rs only wires things together: arguments, the starting document, the node
//! (`node`), bootstrap and the HTTP server.
-use std::future::IntoFuture;
use std::sync::Arc;
use std::sync::atomic::{AtomicBool, Ordering};
@@ -94,10 +93,11 @@ async fn main() -> Result<()> {
// the spot, and startup (starting transports, bootstrap) can take minutes.
let stop = watch_for_shutdown().context("Installing signal handlers")?;
// A broken htpasswd will abort startup.
- let auth_state = AuthState::new(args.htpasswd.as_deref().context("htpasswd is required")?)?;
+ let auth_state =
+ AuthState::from_settings(&args)?.context("htpasswd or user-header is required")?;
info!(
- bind_addr = args.bind_addr.to_string(),
+ bind_addr = ?args.bind_addr.iter().map(ToString::to_string).collect::<Vec<_>>(),
transports = ?args.transports,
"Starting replication service"
);
@@ -219,8 +219,10 @@ async fn main() -> Result<()> {
.with_probe_max(args.dormant_probe_max),
neighbours_k: args.neighbours,
alias: args.alias.clone(),
+ dashboard_url: args.dashboard_url.clone(),
electorate_window: args.electorate_window,
clock_skew_warn: args.clock_skew_warn,
+ stream_heartbeat: args.stream_heartbeat,
superseded_writes: args.superseded_writes,
// At most 4MiB (`Settings::check`).
blob_chunk_bytes: args.blob_chunk as u32,
@@ -260,20 +262,16 @@ async fn main() -> Result<()> {
let joined = AtomicBool::new(false);
let app = api::router(state.clone(), auth_state, args.debug_api);
- let listener = tokio::net::TcpListener::bind(args.bind_addr)
- .await
- .with_context(|| format!("Binding local API to {}", args.bind_addr))?;
-
- info!(address = %listener.local_addr()?, "HTTP API listening");
-
- // The node shutting down (`AppState::closing`): the server drains.
+ // The node shutting down (`AppState::closing`): the servers drain.
let closing = state.closing.subscribe();
- let server_builder = axum::serve(listener, app).with_graceful_shutdown(async move {
- stopped(closing).await;
- info!("Shutdown signal received. Draining API connections...")
- });
-
- let server_fut = server_builder.into_future();
+ let server_fut = api::listen::serve(&args.bind_addr, app, move || {
+ let closing = closing.clone();
+ async move {
+ stopped(closing).await;
+ info!("Shutdown signal received. Draining API connections...")
+ }
+ })
+ .await?;
tokio::pin!(server_fut);
// Joins, then runs until stopped; returns only if joining fails.
@@ -336,7 +334,7 @@ async fn main() -> Result<()> {
#[cfg(feature = "libp2p")]
async fn relay_only(args: &config::Settings) -> Result<()> {
let stop = watch_for_shutdown().context("Installing signal handlers")?;
- let auth_state = args.htpasswd.as_deref().map(AuthState::new).transpose()?;
+ let auth_state = AuthState::from_settings(args)?;
let transport: Arc<dyn Transport> = Arc::new(transport::libp2p::Libp2pTransport::start(
transport::libp2p::Libp2pConfig::from_settings(args, true)?,
)?);
@@ -345,19 +343,13 @@ async fn relay_only(args: &config::Settings) -> Result<()> {
let server = match auth_state {
Some(auth_state) => {
let app = api::relay_only_router(Arc::clone(&transport), auth_state);
- let listener = tokio::net::TcpListener::bind(args.bind_addr)
- .await
- .with_context(|| format!("Binding local API to {}", args.bind_addr))?;
- info!(address = %listener.local_addr()?, "HTTP API listening");
let stop = stop.clone();
- Some(tokio::spawn(async move {
- axum::serve(listener, app)
- .with_graceful_shutdown(stopped(stop))
- .await
- }))
+ let served =
+ api::listen::serve(&args.bind_addr, app, move || stopped(stop.clone())).await?;
+ Some(tokio::spawn(served))
}
None => {
- info!("No htpasswd: no HTTP API");
+ info!("No htpasswd or user-header: no HTTP API");
None
}
};