Files
Skald-Circle/crates/skald-relay-server/src/main.rs
T
2026-07-10 15:02:09 +01:00

59 lines
2.1 KiB
Rust

//! Skald Remote Control relay server — binary entrypoint (see data/ios-app/relay.md).
//!
//! Thin wrapper: load config → build [`AppState`] → start the GC task → serve
//! the axum router until a shutdown signal arrives. All logic lives in the lib.
use std::net::SocketAddr;
use skald_relay_server::config::Config;
use skald_relay_server::{AppState, router, shutdown_signal, spawn_gc};
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::util::SubscriberInitExt;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// Persist logs to `logs/skald-relay.log` (rolling daily), mirroring the main
// app, and also mirror to stdout for terminal development. Raise verbosity
// with RUST_LOG, e.g. `RUST_LOG=skald_relay_server=debug` (or `=trace` for
// full frame-level tracing). The `_log_guard` must live for the whole
// program so the non-blocking writer flushes.
std::fs::create_dir_all("logs")?;
let file_appender = tracing_appender::rolling::daily("logs", "skald-relay.log");
let (non_blocking, _log_guard) = tracing_appender::non_blocking(file_appender);
let filter = tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| "skald_relay_server=info,info".into());
tracing_subscriber::registry()
.with(filter)
.with(
tracing_subscriber::fmt::layer()
.with_writer(non_blocking)
.with_ansi(false),
)
.with(tracing_subscriber::fmt::layer())
.init();
let cfg = Config::from_env();
let bind = cfg.bind;
let db_path = cfg.db_path.clone();
let state = AppState::build(cfg).await?;
tracing::info!(db = %db_path, "store ready");
spawn_gc(state.clone());
let listener = tokio::net::TcpListener::bind(bind).await?;
tracing::info!(%bind, "relay listening on /v1/ws + /v1/pipe");
axum::serve(
listener,
router(state).into_make_service_with_connect_info::<SocketAddr>(),
)
.with_graceful_shutdown(shutdown_signal())
.await?;
tracing::info!("relay stopped");
Ok(())
}