2025-01-23 18:43:17 +01:00
|
|
|
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;
|
2025-01-23 18:43:17 +01:00
|
|
|
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()
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-29 17:31:06 +01:00
|
|
|
let server_address = format!("{}:{}", config.server.host, config.server.port);
|
2025-01-23 18:43:17 +01:00
|
|
|
|
2025-01-28 19:08:18 +01:00
|
|
|
Server {
|
|
|
|
|
router,
|
|
|
|
|
mode,
|
2025-01-29 17:31:06 +01:00
|
|
|
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) {
|
2025-01-29 17:31:06 +01:00
|
|
|
/*
|
|
|
|
|
* 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 {
|
2025-01-29 17:31:06 +01:00
|
|
|
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))
|
|
|
|
|
.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 {
|
2025-01-29 17:31:06 +01:00
|
|
|
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
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|