Initial GuruConnect implementation - Phase 1 MVP
- Agent: DXGI/GDI screen capture, mouse/keyboard input, WebSocket transport - Server: Axum relay, session management, REST API - Dashboard: React viewer components with TypeScript - Protocol: Protobuf definitions for all message types 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
82
server/src/main.rs
Normal file
82
server/src/main.rs
Normal file
@@ -0,0 +1,82 @@
|
||||
//! GuruConnect Server - WebSocket Relay Server
|
||||
//!
|
||||
//! Handles connections from both agents and dashboard viewers,
|
||||
//! relaying video frames and input events between them.
|
||||
|
||||
mod config;
|
||||
mod relay;
|
||||
mod session;
|
||||
mod auth;
|
||||
mod api;
|
||||
mod db;
|
||||
|
||||
pub mod proto {
|
||||
include!(concat!(env!("OUT_DIR"), "/guruconnect.rs"));
|
||||
}
|
||||
|
||||
use anyhow::Result;
|
||||
use axum::{
|
||||
Router,
|
||||
routing::get,
|
||||
};
|
||||
use std::net::SocketAddr;
|
||||
use tower_http::cors::{Any, CorsLayer};
|
||||
use tower_http::trace::TraceLayer;
|
||||
use tracing::{info, Level};
|
||||
use tracing_subscriber::FmtSubscriber;
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<()> {
|
||||
// Initialize logging
|
||||
let _subscriber = FmtSubscriber::builder()
|
||||
.with_max_level(Level::INFO)
|
||||
.with_target(true)
|
||||
.init();
|
||||
|
||||
info!("GuruConnect Server v{}", env!("CARGO_PKG_VERSION"));
|
||||
|
||||
// Load configuration
|
||||
let config = config::Config::load()?;
|
||||
info!("Loaded configuration, listening on {}", config.listen_addr);
|
||||
|
||||
// Initialize database connection (optional for MVP)
|
||||
// let db = db::init(&config.database_url).await?;
|
||||
|
||||
// Create session manager
|
||||
let sessions = session::SessionManager::new();
|
||||
|
||||
// Build router
|
||||
let app = Router::new()
|
||||
// Health check
|
||||
.route("/health", get(health))
|
||||
// WebSocket endpoints
|
||||
.route("/ws/agent", get(relay::agent_ws_handler))
|
||||
.route("/ws/viewer", get(relay::viewer_ws_handler))
|
||||
// REST API
|
||||
.route("/api/sessions", get(api::list_sessions))
|
||||
.route("/api/sessions/:id", get(api::get_session))
|
||||
// State
|
||||
.with_state(sessions)
|
||||
// Middleware
|
||||
.layer(TraceLayer::new_for_http())
|
||||
.layer(
|
||||
CorsLayer::new()
|
||||
.allow_origin(Any)
|
||||
.allow_methods(Any)
|
||||
.allow_headers(Any),
|
||||
);
|
||||
|
||||
// Start server
|
||||
let addr: SocketAddr = config.listen_addr.parse()?;
|
||||
let listener = tokio::net::TcpListener::bind(addr).await?;
|
||||
|
||||
info!("Server listening on {}", addr);
|
||||
|
||||
axum::serve(listener, app).await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn health() -> &'static str {
|
||||
"OK"
|
||||
}
|
||||
Reference in New Issue
Block a user