From 042b67b61b901fb75a648c1726e91eac4392771a Mon Sep 17 00:00:00 2001 From: = Date: Wed, 11 Jan 2023 16:43:41 -0600 Subject: [PATCH 1/2] factor out a hot reloading connect function --- packages/desktop/Cargo.toml | 1 + packages/desktop/src/hot_reload.rs | 38 ----------------------------- packages/desktop/src/lib.rs | 13 +++++++--- packages/hot-reload/src/lib.rs | 31 +++++++++++++++++++++-- packages/liveview/Cargo.toml | 1 + packages/liveview/src/hot_reload.rs | 31 ----------------------- packages/liveview/src/lib.rs | 2 -- packages/liveview/src/pool.rs | 4 ++- packages/tui/Cargo.toml | 1 + packages/tui/src/hot_reload.rs | 31 ----------------------- packages/tui/src/lib.rs | 6 ++--- 11 files changed, 47 insertions(+), 112 deletions(-) delete mode 100644 packages/desktop/src/hot_reload.rs delete mode 100644 packages/liveview/src/hot_reload.rs delete mode 100644 packages/tui/src/hot_reload.rs diff --git a/packages/desktop/Cargo.toml b/packages/desktop/Cargo.toml index 16cc622c6..eb2f88fc9 100644 --- a/packages/desktop/Cargo.toml +++ b/packages/desktop/Cargo.toml @@ -15,6 +15,7 @@ keywords = ["dom", "ui", "gui", "react", "wasm"] dioxus-core = { path = "../core", version = "^0.3.0", features = ["serialize"] } dioxus-html = { path = "../html", features = ["serialize"], version = "^0.3.0" } dioxus-interpreter-js = { path = "../interpreter", version = "^0.3.0" } +dioxus-hot-reload = { path = "../hot-reload" } serde = "1.0.136" serde_json = "1.0.79" diff --git a/packages/desktop/src/hot_reload.rs b/packages/desktop/src/hot_reload.rs deleted file mode 100644 index 20907f59d..000000000 --- a/packages/desktop/src/hot_reload.rs +++ /dev/null @@ -1,38 +0,0 @@ -#![allow(dead_code)] - -use dioxus_core::Template; - -use interprocess::local_socket::LocalSocketStream; -use std::io::{BufRead, BufReader}; -use wry::application::{event_loop::EventLoopProxy, window::WindowId}; - -use crate::desktop_context::{EventData, UserWindowEvent}; - -pub(crate) fn init(proxy: EventLoopProxy) { - std::thread::spawn(move || { - let temp_file = std::env::temp_dir().join("@dioxusin"); - if let Ok(socket) = LocalSocketStream::connect(temp_file.as_path()) { - let mut buf_reader = BufReader::new(socket); - loop { - let mut buf = String::new(); - match buf_reader.read_line(&mut buf) { - Ok(_) => { - let template: Template<'static> = - serde_json::from_str(Box::leak(buf.into_boxed_str())).unwrap(); - proxy - .send_event(UserWindowEvent( - EventData::TemplateUpdated(template), - unsafe { WindowId::dummy() }, - )) - .unwrap(); - } - Err(err) => { - if err.kind() != std::io::ErrorKind::WouldBlock { - break; - } - } - } - } - } - }); -} diff --git a/packages/desktop/src/lib.rs b/packages/desktop/src/lib.rs index 7072f1dd0..0ec1f922c 100644 --- a/packages/desktop/src/lib.rs +++ b/packages/desktop/src/lib.rs @@ -12,9 +12,6 @@ mod protocol; mod waker; mod webview; -#[cfg(all(feature = "hot-reload", debug_assertions))] -mod hot_reload; - pub use cfg::Config; pub use desktop_context::{use_window, DesktopContext}; use desktop_context::{EventData, UserWindowEvent, WebviewQueue}; @@ -111,7 +108,15 @@ pub fn launch_with_props(root: Component

, props: P, cfg: Config) // Intialize hot reloading if it is enabled #[cfg(all(feature = "hot-reload", debug_assertions))] - hot_reload::init(proxy.clone()); + { + let proxy = proxy.clone(); + dioxus_hot_reload::connect(move |template| { + let _ = proxy.send_event(UserWindowEvent( + EventData::TemplateUpdated(template), + unsafe { WindowId::dummy() }, + )); + }); + } // We start the tokio runtime *on this thread* // Any future we poll later will use this runtime to spawn tasks and for IO diff --git a/packages/hot-reload/src/lib.rs b/packages/hot-reload/src/lib.rs index 4918b0c03..554263c5f 100644 --- a/packages/hot-reload/src/lib.rs +++ b/packages/hot-reload/src/lib.rs @@ -1,16 +1,18 @@ use std::{ - io::Write, + io::{BufRead, BufReader, Write}, path::PathBuf, str::FromStr, sync::{Arc, Mutex}, }; +use dioxus_core::Template; pub use dioxus_hot_reload_macro::hot_reload; use dioxus_html::HtmlCtx; use dioxus_rsx::hot_reload::{FileMap, UpdateResult}; -use interprocess::local_socket::LocalSocketListener; +use interprocess::local_socket::{LocalSocketListener, LocalSocketStream}; use notify::{RecommendedWatcher, RecursiveMode, Watcher}; +/// Initialize the hot reloading listener on the given path pub fn init(path: &'static str) { if let Ok(crate_dir) = PathBuf::from_str(path) { let temp_file = std::env::temp_dir().join("@dioxusin"); @@ -82,3 +84,28 @@ pub fn init(path: &'static str) { } } } + +/// Connect to the hot reloading listener. The callback provided will be called every time a template change is detected +pub fn connect(mut f: impl FnMut(Template<'static>) + Send + 'static) { + std::thread::spawn(move || { + let temp_file = std::env::temp_dir().join("@dioxusin"); + if let Ok(socket) = LocalSocketStream::connect(temp_file.as_path()) { + let mut buf_reader = BufReader::new(socket); + loop { + let mut buf = String::new(); + match buf_reader.read_line(&mut buf) { + Ok(_) => { + let template: Template<'static> = + serde_json::from_str(Box::leak(buf.into_boxed_str())).unwrap(); + f(template); + } + Err(err) => { + if err.kind() != std::io::ErrorKind::WouldBlock { + break; + } + } + } + } + } + }); +} diff --git a/packages/liveview/Cargo.toml b/packages/liveview/Cargo.toml index 53df88759..08a2b757c 100644 --- a/packages/liveview/Cargo.toml +++ b/packages/liveview/Cargo.toml @@ -16,6 +16,7 @@ license = "MIT/Apache-2.0" dioxus-html = { path = "../html", features = ["serialize"], version = "^0.3.0" } dioxus-core = { path = "../core", features = ["serialize"], version = "^0.3.0" } dioxus-interpreter-js = { path = "../interpreter", version = "0.3.0" } +dioxus-hot-reload = { path = "../hot-reload" } tokio = { version = "1.23.0", features = ["full"] } futures-util = { version = "0.3.25", default-features = false, features = [ diff --git a/packages/liveview/src/hot_reload.rs b/packages/liveview/src/hot_reload.rs deleted file mode 100644 index 8385879e0..000000000 --- a/packages/liveview/src/hot_reload.rs +++ /dev/null @@ -1,31 +0,0 @@ -#![allow(dead_code)] - -use dioxus_core::Template; - -use interprocess::local_socket::LocalSocketStream; -use std::io::{BufRead, BufReader}; -use tokio::sync::mpsc::UnboundedSender; - -pub(crate) fn init(proxy: UnboundedSender>) { - std::thread::spawn(move || { - let temp_file = std::env::temp_dir().join("@dioxusin"); - if let Ok(socket) = LocalSocketStream::connect(temp_file.as_path()) { - let mut buf_reader = BufReader::new(socket); - loop { - let mut buf = String::new(); - match buf_reader.read_line(&mut buf) { - Ok(_) => { - let template: Template<'static> = - serde_json::from_str(Box::leak(buf.into_boxed_str())).unwrap(); - proxy.send(template).unwrap(); - } - Err(err) => { - if err.kind() != std::io::ErrorKind::WouldBlock { - break; - } - } - } - } - } - }); -} diff --git a/packages/liveview/src/lib.rs b/packages/liveview/src/lib.rs index 6c4428c3c..ffddf0272 100644 --- a/packages/liveview/src/lib.rs +++ b/packages/liveview/src/lib.rs @@ -18,8 +18,6 @@ pub mod adapters { pub use adapters::*; -#[cfg(all(feature = "hot-reload", debug_assertions))] -mod hot_reload; pub mod pool; use futures_util::{SinkExt, StreamExt}; pub use pool::*; diff --git a/packages/liveview/src/pool.rs b/packages/liveview/src/pool.rs index 0f7598333..3def78537 100644 --- a/packages/liveview/src/pool.rs +++ b/packages/liveview/src/pool.rs @@ -106,7 +106,9 @@ where #[cfg(all(feature = "hot-reload", debug_assertions))] let mut hot_reload_rx = { let (tx, rx) = tokio::sync::mpsc::unbounded_channel(); - crate::hot_reload::init(tx); + dioxus_hot_reload::connect(move |template| { + let _ = tx.send(template); + }); rx }; diff --git a/packages/tui/Cargo.toml b/packages/tui/Cargo.toml index 1e35f8b3e..d6c96cfd3 100644 --- a/packages/tui/Cargo.toml +++ b/packages/tui/Cargo.toml @@ -18,6 +18,7 @@ dioxus-core = { path = "../core", version = "^0.3.0", features = ["serialize"] } dioxus-html = { path = "../html", version = "^0.3.0" } dioxus-native-core = { path = "../native-core", version = "^0.2.0" } dioxus-native-core-macro = { path = "../native-core-macro", version = "^0.2.0" } +dioxus-hot-reload = { path = "../hot-reload" } tui = "0.17.0" crossterm = "0.23.0" diff --git a/packages/tui/src/hot_reload.rs b/packages/tui/src/hot_reload.rs deleted file mode 100644 index 8385879e0..000000000 --- a/packages/tui/src/hot_reload.rs +++ /dev/null @@ -1,31 +0,0 @@ -#![allow(dead_code)] - -use dioxus_core::Template; - -use interprocess::local_socket::LocalSocketStream; -use std::io::{BufRead, BufReader}; -use tokio::sync::mpsc::UnboundedSender; - -pub(crate) fn init(proxy: UnboundedSender>) { - std::thread::spawn(move || { - let temp_file = std::env::temp_dir().join("@dioxusin"); - if let Ok(socket) = LocalSocketStream::connect(temp_file.as_path()) { - let mut buf_reader = BufReader::new(socket); - loop { - let mut buf = String::new(); - match buf_reader.read_line(&mut buf) { - Ok(_) => { - let template: Template<'static> = - serde_json::from_str(Box::leak(buf.into_boxed_str())).unwrap(); - proxy.send(template).unwrap(); - } - Err(err) => { - if err.kind() != std::io::ErrorKind::WouldBlock { - break; - } - } - } - } - } - }); -} diff --git a/packages/tui/src/lib.rs b/packages/tui/src/lib.rs index 6af02e993..a8cd295d3 100644 --- a/packages/tui/src/lib.rs +++ b/packages/tui/src/lib.rs @@ -28,8 +28,6 @@ use tui::{backend::CrosstermBackend, layout::Rect, Terminal}; mod config; mod focus; mod hooks; -#[cfg(all(feature = "hot-reload", debug_assertions))] -mod hot_reload; mod layout; mod node; pub mod prelude; @@ -150,7 +148,9 @@ fn render_vdom( #[cfg(all(feature = "hot-reload", debug_assertions))] let mut hot_reload_rx = { let (hot_reload_tx, hot_reload_rx) = unbounded_channel::>(); - hot_reload::init(hot_reload_tx); + dioxus_hot_reload::connect(move |template| { + let _ = hot_reload_tx.send(template); + }); hot_reload_rx }; let mut terminal = (!cfg.headless).then(|| { From 9e45cbe4a779507ba2308bb86130ab86ae538f99 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 11 Jan 2023 18:51:09 -0600 Subject: [PATCH 2/2] remove the hot-reload-macro crate --- Cargo.toml | 1 - packages/hot-reload-macro/Cargo.toml | 13 ------------- packages/hot-reload-macro/src/lib.rs | 7 ------- packages/hot-reload/Cargo.toml | 1 - packages/hot-reload/src/lib.rs | 14 ++++++++++++-- 5 files changed, 12 insertions(+), 24 deletions(-) delete mode 100644 packages/hot-reload-macro/Cargo.toml delete mode 100644 packages/hot-reload-macro/src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index ebfe288c5..c00f8f948 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,7 +21,6 @@ members = [ "packages/rsx-rosetta", "packages/signals", "packages/hot-reload", - "packages/hot-reload-macro", "docs/guide", ] diff --git a/packages/hot-reload-macro/Cargo.toml b/packages/hot-reload-macro/Cargo.toml deleted file mode 100644 index 009c6501a..000000000 --- a/packages/hot-reload-macro/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "dioxus-hot-reload-macro" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -syn = { version = "1.0.107", features = ["full"] } -proc-macro2 = { version = "1.0" } - -[lib] -proc-macro = true \ No newline at end of file diff --git a/packages/hot-reload-macro/src/lib.rs b/packages/hot-reload-macro/src/lib.rs deleted file mode 100644 index 211be00cf..000000000 --- a/packages/hot-reload-macro/src/lib.rs +++ /dev/null @@ -1,7 +0,0 @@ -use proc_macro::TokenStream; -use syn::__private::quote::quote; - -#[proc_macro] -pub fn hot_reload(_: TokenStream) -> TokenStream { - quote!(dioxus_hot_reload::init(core::env!("CARGO_MANIFEST_DIR"))).into() -} diff --git a/packages/hot-reload/Cargo.toml b/packages/hot-reload/Cargo.toml index 5c9f34826..d6088a109 100644 --- a/packages/hot-reload/Cargo.toml +++ b/packages/hot-reload/Cargo.toml @@ -6,7 +6,6 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -dioxus-hot-reload-macro = { path = "../hot-reload-macro" } dioxus-rsx = { path = "../rsx" } dioxus-core = { path = "../core", features = ["serialize"] } dioxus-html = { path = "../html", features = ["hot-reload-context"] } diff --git a/packages/hot-reload/src/lib.rs b/packages/hot-reload/src/lib.rs index 554263c5f..14cc8e9c2 100644 --- a/packages/hot-reload/src/lib.rs +++ b/packages/hot-reload/src/lib.rs @@ -6,14 +6,13 @@ use std::{ }; use dioxus_core::Template; -pub use dioxus_hot_reload_macro::hot_reload; use dioxus_html::HtmlCtx; use dioxus_rsx::hot_reload::{FileMap, UpdateResult}; use interprocess::local_socket::{LocalSocketListener, LocalSocketStream}; use notify::{RecommendedWatcher, RecursiveMode, Watcher}; /// Initialize the hot reloading listener on the given path -pub fn init(path: &'static str) { +pub fn init(path: &'static str, listening_paths: &'static [&'static str]) { if let Ok(crate_dir) = PathBuf::from_str(path) { let temp_file = std::env::temp_dir().join("@dioxusin"); let channels = Arc::new(Mutex::new(Vec::new())); @@ -109,3 +108,14 @@ pub fn connect(mut f: impl FnMut(Template<'static>) + Send + 'static) { } }); } + +#[macro_export] +macro_rules! hot_reload { + () => { + dioxus_hot_reload::init(core::env!("CARGO_MANIFEST_DIR"), &[]) + }; + + ($($paths: literal,)*,?) => { + dioxus_hot_reload::init(core::env!("CARGO_MANIFEST_DIR"), &[$($path,)*]) + }; +}