Spaces:
Running
Running
| /* solverforge-fsr — unified optimizer with SolverForge | |
| Run with: solverforge server | |
| Then open the printed local URL (default port 7860) */ | |
| use solverforge_fsr::api; | |
| use std::net::SocketAddr; | |
| use std::sync::Arc; | |
| use tower_http::cors::{Any, CorsLayer}; | |
| use tower_http::services::ServeDir; | |
| async fn main() { | |
| solverforge::console::init(); | |
| let state = Arc::new(api::AppState::new()); | |
| let cors = CorsLayer::new() | |
| .allow_origin(Any) | |
| .allow_methods(Any) | |
| .allow_headers(Any); | |
| let app = api::router(state) | |
| .merge(solverforge_ui::routes()) | |
| .fallback_service(ServeDir::new("static")) | |
| .layer(cors); | |
| let port = std::env::var("PORT") | |
| .ok() | |
| .and_then(|value| value.parse::<u16>().ok()) | |
| .unwrap_or(7860); | |
| let addr = SocketAddr::from(([0, 0, 0, 0], port)); | |
| println!("▸ solverforge-fsr listening on http://{}", addr); | |
| println!("▸ Open http://localhost:{} in your browser\n", port); | |
| let listener = tokio::net::TcpListener::bind(addr).await.unwrap(); | |
| axum::serve(listener, app) | |
| .with_graceful_shutdown(shutdown_signal()) | |
| .await | |
| .unwrap(); | |
| } | |
| async fn shutdown_signal() { | |
| let ctrl_c = async { | |
| tokio::signal::ctrl_c() | |
| .await | |
| .expect("failed to install Ctrl-C handler"); | |
| }; | |
| let terminate = async { | |
| tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate()) | |
| .expect("failed to install SIGTERM handler") | |
| .recv() | |
| .await; | |
| }; | |
| let terminate = std::future::pending::<()>(); | |
| tokio::select! { | |
| _ = ctrl_c => {}, | |
| _ = terminate => {}, | |
| } | |
| println!("▸ solverforge-fsr shutting down"); | |
| } | |