Initial implementation: relay server + common protocol + client stub

This commit is contained in:
Helios 2026-03-02 18:03:46 +01:00
commit 7285a33cff
No known key found for this signature in database
GPG key ID: C8259547CD8309B5
17 changed files with 926 additions and 0 deletions

62
crates/server/src/main.rs Normal file
View file

@ -0,0 +1,62 @@
mod session;
mod ws_handler;
mod api;
mod auth;
use std::sync::Arc;
use axum::{
Router,
routing::{get, post},
middleware,
};
use tokio::net::TcpListener;
use tracing::info;
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
use session::SessionStore;
use auth::require_api_key;
#[derive(Clone)]
pub struct AppState {
pub sessions: Arc<SessionStore>,
pub api_key: String,
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
tracing_subscriber::registry()
.with(tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| "helios_server=debug,tower_http=info".into()))
.with(tracing_subscriber::fmt::layer())
.init();
let api_key = std::env::var("HELIOS_API_KEY")
.unwrap_or_else(|_| "dev-secret".to_string());
let bind_addr = std::env::var("HELIOS_BIND")
.unwrap_or_else(|_| "0.0.0.0:3000".to_string());
let state = AppState {
sessions: Arc::new(SessionStore::new()),
api_key,
};
let protected = Router::new()
.route("/sessions", get(api::list_sessions))
.route("/sessions/:id/screenshot", post(api::request_screenshot))
.route("/sessions/:id/exec", post(api::request_exec))
.route("/sessions/:id/click", post(api::request_click))
.route("/sessions/:id/type", post(api::request_type))
.route("/sessions/:id/label", post(api::set_label))
.layer(middleware::from_fn_with_state(state.clone(), require_api_key));
let app = Router::new()
.route("/ws", get(ws_handler::ws_upgrade))
.merge(protected)
.with_state(state);
info!("helios-server listening on {bind_addr}");
let listener = TcpListener::bind(&bind_addr).await?;
axum::serve(listener, app).await?;
Ok(())
}