From 9f20337e5e7eebf8bca76b380059c96d1df578f9 Mon Sep 17 00:00:00 2001 From: YuKun Liu Date: Sat, 27 Aug 2022 21:56:31 -0700 Subject: [PATCH] feat: `rebuild` supported --- Cargo.toml | 2 +- src/cli/serve/mod.rs | 2 +- src/plugin/mod.rs | 59 ++++++++++++++++++++++++++++++++++++++++++++ src/server/mod.rs | 32 +++++++++++++++++------- 4 files changed, 84 insertions(+), 11 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2690def1b..e88323fd1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -60,7 +60,7 @@ dioxus-rsx-interpreter = { git = "https://github.com/dioxuslabs/dioxus/" } proc-macro2 = { version = "1.0", features = ["span-locations"] } # plugin packages -mlua = { version = "0.8.1", features = ["lua54", "vendored", "async"] } +mlua = { version = "0.8.1", features = ["lua54", "vendored", "async", "send"] } [[bin]] path = "src/main.rs" diff --git a/src/cli/serve/mod.rs b/src/cli/serve/mod.rs index bb24c1e83..44061149e 100644 --- a/src/cli/serve/mod.rs +++ b/src/cli/serve/mod.rs @@ -65,7 +65,7 @@ impl Serve { Serve::regen_dev_page(&crate_config)?; // start the develop server - server::startup(self.serve.port, crate_config.clone()).await?; + server::startup(self.serve.port, crate_config.clone(), plugin_manager).await?; Ok(()) } diff --git a/src/plugin/mod.rs b/src/plugin/mod.rs index 7f0bd99db..c32eee9a3 100644 --- a/src/plugin/mod.rs +++ b/src/plugin/mod.rs @@ -167,6 +167,65 @@ impl PluginManager { Ok(()) } + pub fn on_serve_start(&self, crate_config: &CrateConfig) -> anyhow::Result<()> { + let lua = &self.lua; + + let manager = lua.globals().get::<_, Table>("manager")?; + + let args = lua.create_table()?; + args.set("name", crate_config.dioxus_config.application.name.clone())?; + + for i in 1..(manager.len()? as i32 + 1) { + let info = manager.get::(i)?; + if let Some(func) = info.serve.on_start { + func.call::(args.clone())?; + } + } + + Ok(()) + } + + pub fn on_serve_rebuild(&self, timestamp: i64, files: Vec) -> anyhow::Result<()> { + let lua = &self.lua; + + let manager = lua.globals().get::<_, Table>("manager")?; + + let args = lua.create_table()?; + args.set("timestamp", timestamp)?; + let files: Vec = files + .iter() + .map(|v| v.to_str().unwrap().to_string()) + .collect(); + args.set("changed_files", files)?; + + for i in 1..(manager.len()? as i32 + 1) { + let info = manager.get::(i)?; + if let Some(func) = info.serve.on_rebuild { + func.call::(args.clone())?; + } + } + + Ok(()) + } + + pub fn on_serve_shutdown(&self, crate_config: &CrateConfig) -> anyhow::Result<()> { + let lua = &self.lua; + + let manager = lua.globals().get::<_, Table>("manager")?; + + let args = lua.create_table()?; + args.set("name", crate_config.dioxus_config.application.name.clone())?; + + for i in 1..(manager.len()? as i32 + 1) { + let info = manager.get::(i)?; + if let Some(func) = info.serve.on_shutdown { + func.call::(args.clone())?; + } + } + + Ok(()) + } + fn init_plugin_dir() -> PathBuf { let app_path = app_path(); let plugin_path = app_path.join("plugins"); diff --git a/src/server/mod.rs b/src/server/mod.rs index eed3834a7..a0ee63839 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -16,7 +16,7 @@ use std::{net::UdpSocket, path::PathBuf, process::Command, sync::Arc}; use tower::ServiceBuilder; use tower_http::services::fs::{ServeDir, ServeFileSystemResponseBody}; -use crate::{builder, serve::Serve, BuildResult, CrateConfig, Result}; +use crate::{builder, plugin::PluginManager, serve::Serve, BuildResult, CrateConfig, Result}; use tokio::sync::broadcast; mod hot_reload; @@ -52,20 +52,26 @@ struct WsReloadState { update: broadcast::Sender<()>, } -pub async fn startup(port: u16, config: CrateConfig) -> Result<()> { +pub async fn startup(port: u16, config: CrateConfig, plugin_manager: PluginManager) -> Result<()> { if config.hot_reload { - startup_hot_reload(port, config).await? + startup_hot_reload(port, config, plugin_manager).await? } else { - startup_default(port, config).await? + startup_default(port, config, plugin_manager).await? } Ok(()) } -pub async fn startup_hot_reload(port: u16, config: CrateConfig) -> Result<()> { +pub async fn startup_hot_reload( + port: u16, + config: CrateConfig, + plugin_manager: PluginManager, +) -> Result<()> { let first_build_result = crate::builder::build(&config, false)?; log::info!("🚀 Starting development server..."); + plugin_manager.on_serve_start(&config)?; + let dist_path = config.out_dir.clone(); let (reload_tx, _) = broadcast::channel(100); let last_file_rebuild = Arc::new(Mutex::new(FileMap::new(config.crate_dir.clone()))); @@ -274,11 +280,17 @@ pub async fn startup_hot_reload(port: u16, config: CrateConfig) -> Result<()> { Ok(()) } -pub async fn startup_default(port: u16, config: CrateConfig) -> Result<()> { +pub async fn startup_default( + port: u16, + config: CrateConfig, + plugin_manager: PluginManager, +) -> Result<()> { let first_build_result = crate::builder::build(&config, false)?; log::info!("🚀 Starting development server..."); + plugin_manager.on_serve_start(&config)?; + let dist_path = config.out_dir.clone(); let (reload_tx, _) = broadcast::channel(100); @@ -306,7 +318,7 @@ pub async fn startup_default(port: u16, config: CrateConfig) -> Result<()> { let watcher_config = config.clone(); let mut watcher = notify::recommended_watcher(move |info: notify::Result| { let config = watcher_config.clone(); - if info.is_ok() { + if let Ok(e) = info { if chrono::Local::now().timestamp() > last_update_time { match build_manager.rebuild() { Ok(res) => { @@ -315,11 +327,13 @@ pub async fn startup_default(port: u16, config: CrateConfig) -> Result<()> { port, &config, PrettierOptions { - changed: info.unwrap().paths, + changed: e.paths.clone(), warnings: res.warnings, elapsed_time: res.elapsed_time, }, ); + let _ = plugin_manager + .on_serve_rebuild(chrono::Local::now().timestamp(), e.paths); } Err(e) => log::error!("{}", e), } @@ -599,4 +613,4 @@ async fn ws_handler( reload_watcher.await.unwrap(); }) -} \ No newline at end of file +}