Files
tuono/crates/tuono_lib/src/server.rs
T

96 lines
2.9 KiB
Rust
Raw Normal View History

use crate::config::GLOBAL_CONFIG;
2024-07-02 21:59:30 +02:00
use crate::manifest::load_manifest;
2024-11-16 09:47:59 +01:00
use crate::mode::{Mode, GLOBAL_MODE};
2024-07-02 21:59:30 +02:00
use axum::routing::{get, Router};
2024-08-19 18:25:00 +02:00
use colored::Colorize;
2024-07-02 21:59:30 +02:00
use ssr_rs::Ssr;
use tower_http::services::ServeDir;
use tuono_internal::config::Config;
2024-07-02 21:59:30 +02:00
2024-07-07 12:23:54 +02:00
use crate::{
2024-11-16 10:50:02 +01:00
catch_all::catch_all, logger::LoggerLayer, vite_reverse_proxy::vite_reverse_proxy,
2024-07-07 12:23:54 +02:00
vite_websocket_proxy::vite_websocket_proxy,
};
2024-07-02 21:59:30 +02:00
const DEV_PUBLIC_DIR: &str = "public";
const PROD_PUBLIC_DIR: &str = "out/client";
2025-01-28 19:08:18 +01:00
pub fn tuono_internal_init_v8_platform() {
Ssr::create_platform();
}
#[derive(Debug)]
2024-07-02 21:59:30 +02:00
pub struct Server {
2024-11-17 16:28:56 +01:00
router: Router,
2024-07-02 21:59:30 +02:00
mode: Mode,
2025-01-28 19:08:18 +01:00
pub listener: tokio::net::TcpListener,
pub address: String,
2024-07-02 21:59:30 +02:00
}
impl Server {
2025-01-28 19:08:18 +01:00
pub async fn init(router: Router, mode: Mode) -> Server {
let config = Config::get().expect("[SERVER] Failed to load config");
2024-07-02 21:59:30 +02:00
2025-01-28 19:08:18 +01:00
let _ = GLOBAL_MODE.set(mode);
let _ = GLOBAL_CONFIG.set(config.clone());
2024-07-02 21:59:30 +02:00
if mode == Mode::Prod {
load_manifest()
}
let server_address = format!("{}:{}", config.server.host, config.server.port);
2025-01-28 19:08:18 +01:00
Server {
router,
mode,
address: server_address.clone(),
listener: tokio::net::TcpListener::bind(&server_address)
2025-01-28 19:08:18 +01:00
.await
.expect("[SERVER] Failed to bind to address"),
}
}
2024-07-02 21:59:30 +02:00
2025-01-28 19:08:18 +01:00
pub async fn start(self) {
/*
* Format the server address as a valid URL so that it becomes clickable in the CLI
* @see https://github.com/tuono-labs/tuono/issues/460
*/
let server_base_url = format!("http://{}", self.address);
2024-07-02 21:59:30 +02:00
if self.mode == Mode::Dev {
println!(" Ready at: {}\n", server_base_url.blue().bold());
2024-07-07 11:44:36 +02:00
let router = self
.router
.to_owned()
2024-11-16 09:47:59 +01:00
.layer(LoggerLayer::new())
2024-07-07 11:44:36 +02:00
.route("/vite-server/", get(vite_websocket_proxy))
2025-02-26 19:01:10 +01:00
.route("/vite-server/{*path}", get(vite_reverse_proxy))
2024-11-16 09:47:59 +01:00
.fallback_service(
ServeDir::new(DEV_PUBLIC_DIR)
.fallback(get(catch_all).layer(LoggerLayer::new())),
2024-11-17 16:28:56 +01:00
);
2024-07-07 11:44:36 +02:00
2025-01-28 19:08:18 +01:00
axum::serve(self.listener, router)
2024-07-07 11:44:36 +02:00
.await
.expect("Failed to serve development server");
2024-07-02 21:59:30 +02:00
} else {
println!(
" Production server at: {}\n",
server_base_url.blue().bold()
);
2024-07-07 11:44:36 +02:00
let router = self
.router
.to_owned()
2024-11-16 09:47:59 +01:00
.layer(LoggerLayer::new())
.fallback_service(
ServeDir::new(PROD_PUBLIC_DIR)
.fallback(get(catch_all).layer(LoggerLayer::new())),
2024-11-17 16:28:56 +01:00
);
2024-07-07 11:44:36 +02:00
2025-01-28 19:08:18 +01:00
axum::serve(self.listener, router)
2024-07-07 11:44:36 +02:00
.await
.expect("Failed to serve production server");
2024-07-02 21:59:30 +02:00
}
}
}