jacquardSnapshot

← snapshot

1603 bytes
//! The jac-serve binary: an in-memory jacquard host on one port.
//!
//! ```text
//! cargo run -p jac-serve                 # empty state, port 8787
//! cargo run -p jac-serve -- --seed-demo  # start with the walkthrough seeded
//! JAC_SERVE_PORT=9000 cargo run -p jac-serve
//! ```

use std::sync::Arc;

use jac_serve::state::AppState;
use jac_telemetry::{S10Config, Telemetry};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let telemetry = Telemetry::start(S10Config::from_env(), "jac-serve");
    if telemetry.enabled() {
        println!("telemetry: reporting to s10");
    } else {
        println!("telemetry: disabled (set S10_INGEST_URL and S10_INGEST_KEY to enable)");
    }
    let state = Arc::new(AppState::with_telemetry(telemetry));

    if std::env::args().any(|a| a == "--seed-demo") {
        jac_serve::demo::seed(&state).map_err(|e| anyhow::anyhow!("demo seed failed: {e}"))?;
        println!("seeded the demo arc: meridian-systems + halcyon-works");
    }

    let port = std::env::var("JAC_SERVE_PORT")
        .or_else(|_| std::env::var("PORT"))
        .ok()
        .and_then(|p| p.parse::<u16>().ok())
        .unwrap_or(8787);

    let app = jac_serve::app(state);
    let listener = tokio::net::TcpListener::bind(("0.0.0.0", port)).await?;
    println!("jac-serve listening on http://localhost:{port}");
    println!("honest scope: identities are declared, not authenticated; nothing persists");

    axum::serve(listener, app)
        .with_graceful_shutdown(async {
            let _ = tokio::signal::ctrl_c().await;
        })
        .await?;
    Ok(())
}