From 042b67b61b901fb75a648c1726e91eac4392771a Mon Sep 17 00:00:00 2001 From: = Date: Wed, 11 Jan 2023 16:43:41 -0600 Subject: [PATCH] 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(|| {