Skip to main content

cloakpipe_proxy/
server.rs

1//! HTTP server setup and router configuration.
2
3use crate::{handlers, tree_handlers, state::AppState};
4use axum::{routing::{get, post}, Router};
5use std::sync::Arc;
6use tower_http::cors::CorsLayer;
7use tower_http::trace::TraceLayer;
8
9/// Build the axum router with all routes and middleware.
10pub fn build_router(state: Arc<AppState>) -> Router {
11    Router::new()
12        .route("/health", get(handlers::health))
13        .route("/v1/chat/completions", post(handlers::proxy_chat_completions))
14        .route("/v1/embeddings", post(handlers::proxy_embeddings))
15        // CloakTree endpoints
16        .route("/tree/index", post(tree_handlers::tree_index_text))
17        .route("/tree/index/file", post(tree_handlers::tree_index_file))
18        .route("/tree/list", get(tree_handlers::tree_list))
19        .route("/tree/query", post(tree_handlers::tree_query))
20        .route("/tree/{id}", get(tree_handlers::tree_get).delete(tree_handlers::tree_delete))
21        .route("/tree/{id}/search", post(tree_handlers::tree_search))
22        // Session management endpoints
23        .route("/sessions", get(handlers::sessions_list).delete(handlers::sessions_flush_all))
24        .route("/sessions/{id}", get(handlers::session_inspect).delete(handlers::session_flush))
25        .layer(CorsLayer::permissive())
26        .layer(TraceLayer::new_for_http())
27        .with_state(state)
28}
29
30/// Start the proxy server.
31pub async fn start(state: AppState) -> anyhow::Result<()> {
32    let listen_addr = state.config.proxy.listen.clone();
33    let state = Arc::new(state);
34
35    let app = build_router(state);
36
37    tracing::info!("CloakPipe proxy listening on {}", listen_addr);
38
39    let listener = tokio::net::TcpListener::bind(&listen_addr).await?;
40    axum::serve(listener, app).await?;
41
42    Ok(())
43}