brainos_httpadapter/
server.rs1use std::collections::HashMap;
4use std::{net::SocketAddr, sync::Arc};
5
6use axum::{routing::delete, Router};
7use channel::transport::inbound::WebhookInboundTransport;
8use tokio::sync::Mutex;
9
10use crate::handlers::*;
11use crate::metrics::Metrics;
12use crate::state::{AppState, CACHE_CAPACITY};
13
14pub fn create_router(
20 processor: Arc<signal::SignalProcessor>,
21 webhook_handlers: HashMap<String, Arc<WebhookInboundTransport>>,
22 api_keys: Vec<brain_core::ApiKeyConfig>,
23 cors_enabled: bool,
24) -> Router {
25 let state = Arc::new(AppState {
26 processor,
27 webhook_handlers,
28 cache: Mutex::new(lru::LruCache::new(
29 std::num::NonZeroUsize::new(CACHE_CAPACITY).unwrap(),
30 )),
31 api_keys,
32 metrics: Arc::new(Metrics::default()),
33 });
34
35 let v1_routes = Router::new()
38 .route("/v1/signals", post(post_signal_handler))
39 .route("/v1/signals/:id", get(get_signal_handler))
40 .route("/v1/memory/search", post(search_memory_handler))
41 .route("/v1/memory/facts", get(get_facts_handler))
42 .route("/v1/memory/namespaces", get(get_namespaces_handler))
43 .route("/v1/memory/export", get(export_memory_handler))
44 .route("/v1/memory/import", post(import_memory_handler))
45 .route("/v1/schedules", get(list_schedules_handler))
46 .route("/v1/schedules/:id", delete(cancel_schedule_handler))
47 .route("/v1/events", get(sse_events_handler))
48 .route("/v1/webhooks/:id", post(post_webhook_handler))
49 .layer(axum::extract::DefaultBodyLimit::max(1_048_576))
50 .layer(tower::limit::ConcurrencyLimitLayer::new(100));
51
52 let router = Router::new()
53 .route("/", get(root_handler))
54 .route("/health", get(health_handler))
55 .route("/metrics", get(metrics_handler))
56 .route("/ui", get(ui_handler))
57 .route("/openapi.json", get(openapi_handler))
58 .route("/api", get(swagger_ui_handler))
59 .merge(v1_routes)
60 .with_state(state);
61
62 if cors_enabled {
63 router.layer(brain_core::cors::localhost_cors())
64 } else {
65 router
66 }
67}
68
69use axum::routing::{get, post};
70
71pub async fn serve(
75 processor: Arc<signal::SignalProcessor>,
76 webhook_handlers: HashMap<String, Arc<WebhookInboundTransport>>,
77 host: &str,
78 port: u16,
79) -> anyhow::Result<()> {
80 let cors_enabled = processor.config().adapters.http.cors;
81 let api_keys = processor.config().access.api_keys.clone();
82 let router = create_router(processor, webhook_handlers, api_keys, cors_enabled);
83 let addr: SocketAddr = format!("{host}:{port}").parse()?;
84 tracing::info!("Synapse HTTP online at http://{addr}");
85 let listener = tokio::net::TcpListener::bind(addr).await?;
86 axum::serve(listener, router).await?;
87 Ok(())
88}