Proxy vite dev server (#10)

* refactor: pass reqwest from tuono_lib crate and prepared vite_reverse_proxy

* feat: add proxy entry point on vite side

* refactor: internal_handlers_folder

* feat: handle vite websocket tunnel

* feat: handle unexpect WebSocket messages

* feat: split dev/prod ssr handling

* feat: split js/rust bundle reloading

* feat: prevent close error on websocket connection

* feat: remove vite proxy on prod server

* feat: update version to v0.4.0
This commit is contained in:
Valerio Ageno
2024-07-07 11:44:36 +02:00
committed by GitHub
parent 9cd90ba62a
commit 672e4b69d7
22 changed files with 257 additions and 71 deletions
+32 -11
View File
@@ -1,27 +1,48 @@
use crate::mode::{Mode, GLOBAL_MODE};
use lazy_static::lazy_static;
use ssr_rs::Ssr;
use std::cell::RefCell;
use std::fs::read_to_string;
use std::path::PathBuf;
lazy_static! {
static ref BUNDLE_PATH: &'static str = {
if GLOBAL_MODE.get().unwrap() == &Mode::Dev {
return "./.tuono/server/dev-server.js";
}
"./out/server/prod-server.js"
};
}
/// For the server side rendering we need to split the implementation between dev and prod.
/// This completely remove the multi-thread optimization on dev but allow the dev server to
/// update the SSR result without reloading the whole server.
pub struct Js;
impl Js {
pub fn render_to_string(payload: Option<&str>) -> Result<String, &'static str> {
let mode = GLOBAL_MODE.get().expect("Failed to get GLOBAL_MODE");
if *mode == Mode::Dev {
DevJs::render_to_string(payload)
} else {
ProdJs::SSR.with(|ssr| ssr.borrow_mut().render_to_string(payload))
}
}
}
struct ProdJs;
impl ProdJs {
thread_local! {
pub static SSR: RefCell<Ssr<'static, 'static>> = RefCell::new(
Ssr::from(
read_to_string(PathBuf::from(*BUNDLE_PATH)).expect("Server bundle not found"), ""
read_to_string(PathBuf::from("./out/server/prod-server.js")).expect("Server bundle not found"), ""
).unwrap()
)
}
}
struct DevJs;
impl DevJs {
pub fn render_to_string(params: Option<&str>) -> Result<String, &'static str> {
Ssr::from(
read_to_string(PathBuf::from("./.tuono/server/dev-server.js"))
.expect("Server bundle not found"),
"",
)
.unwrap()
.render_to_string(params)
}
}