Skip to main content

acp_http_adapter/
lib.rs

1use std::net::SocketAddr;
2use std::sync::Arc;
3use std::time::Duration;
4
5use app::build_router;
6use process::AdapterRuntime;
7use registry::LaunchSpec;
8
9pub mod app;
10pub mod process;
11pub mod registry;
12
13#[derive(Debug, Clone)]
14pub struct ServerConfig {
15    pub host: String,
16    pub port: u16,
17    pub registry_json: String,
18    pub registry_agent_id: Option<String>,
19    pub rpc_timeout: Duration,
20}
21
22pub async fn run_server(
23    config: ServerConfig,
24) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
25    let launch =
26        LaunchSpec::from_registry_blob(&config.registry_json, config.registry_agent_id.as_deref())?;
27    let runtime = Arc::new(AdapterRuntime::start(launch, config.rpc_timeout).await?);
28    run_server_with_runtime(config.host, config.port, runtime).await
29}
30
31pub async fn run_server_with_runtime(
32    host: String,
33    port: u16,
34    runtime: Arc<AdapterRuntime>,
35) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
36    let app = build_router(runtime.clone());
37    let addr: SocketAddr = format!("{host}:{port}").parse()?;
38    let listener = tokio::net::TcpListener::bind(addr).await?;
39    tracing::info!(addr = %addr, "acp-http-adapter listening");
40
41    axum::serve(listener, app)
42        .with_graceful_shutdown(shutdown_signal(runtime))
43        .await?;
44    Ok(())
45}
46
47async fn shutdown_signal(runtime: Arc<AdapterRuntime>) {
48    let _ = tokio::signal::ctrl_c().await;
49    runtime.shutdown().await;
50}