diff --git a/packages/fullstack/src/render.rs b/packages/fullstack/src/render.rs index ea179207f8..42b6395eeb 100644 --- a/packages/fullstack/src/render.rs +++ b/packages/fullstack/src/render.rs @@ -9,6 +9,7 @@ use dioxus_ssr::{ use std::future::Future; use std::sync::Arc; use std::sync::RwLock; +use tokio::task::block_in_place; use tokio::task::JoinHandle; use crate::prelude::*; @@ -64,7 +65,7 @@ impl SsrRendererPool { let prev_context = SERVER_CONTEXT.with(|ctx| ctx.replace(server_context)); // poll the future, which may call server_context() tracing::info!("Rebuilding vdom"); - vdom.rebuild(&mut NoOpMutations); + block_in_place(|| vdom.rebuild(&mut NoOpMutations)); vdom.wait_for_suspense().await; tracing::info!("Suspense resolved"); // after polling the future, we need to restore the context @@ -124,7 +125,7 @@ impl SsrRendererPool { .with(|ctx| ctx.replace(Box::new(server_context))); // poll the future, which may call server_context() tracing::info!("Rebuilding vdom"); - vdom.rebuild(&mut NoOpMutations); + block_in_place(|| vdom.rebuild(&mut NoOpMutations)); vdom.wait_for_suspense().await; tracing::info!("Suspense resolved"); // after polling the future, we need to restore the context diff --git a/packages/fullstack/src/server_context.rs b/packages/fullstack/src/server_context.rs index a2cbfeb55a..7ddc67f3b8 100644 --- a/packages/fullstack/src/server_context.rs +++ b/packages/fullstack/src/server_context.rs @@ -84,14 +84,36 @@ mod server_fn_impl { /// Get the request that triggered: /// - The initial SSR render if called from a ScopeState or ServerFn /// - The server function to be called if called from a server function after the initial render - pub fn request_parts(&self) -> tokio::sync::RwLockReadGuard<'_, http::request::Parts> { + pub async fn request_parts( + &self, + ) -> tokio::sync::RwLockReadGuard<'_, http::request::Parts> { + self.parts.read().await + } + + /// Get the request that triggered: + /// - The initial SSR render if called from a ScopeState or ServerFn + /// - The server function to be called if called from a server function after the initial render + pub fn request_parts_blocking( + &self, + ) -> tokio::sync::RwLockReadGuard<'_, http::request::Parts> { self.parts.blocking_read() } /// Get the request that triggered: /// - The initial SSR render if called from a ScopeState or ServerFn /// - The server function to be called if called from a server function after the initial render - pub fn request_parts_mut(&self) -> tokio::sync::RwLockWriteGuard<'_, http::request::Parts> { + pub async fn request_parts_mut( + &self, + ) -> tokio::sync::RwLockWriteGuard<'_, http::request::Parts> { + self.parts.write().await + } + + /// Get the request that triggered: + /// - The initial SSR render if called from a ScopeState or ServerFn + /// - The server function to be called if called from a server function after the initial render + pub fn request_parts_mut_blocking( + &self, + ) -> tokio::sync::RwLockWriteGuard<'_, http::request::Parts> { self.parts.blocking_write() } @@ -239,6 +261,6 @@ impl< type Rejection = R; async fn from_request(req: &DioxusServerContext) -> Result { - Ok(I::from_request_parts(&mut req.request_parts_mut(), &()).await?) + Ok(I::from_request_parts(&mut *req.request_parts_mut().await, &()).await?) } } diff --git a/packages/router/src/router_cfg.rs b/packages/router/src/router_cfg.rs index 8ec762b141..f4e9177d35 100644 --- a/packages/router/src/router_cfg.rs +++ b/packages/router/src/router_cfg.rs @@ -134,7 +134,7 @@ where return Box::new(AnyHistoryProviderImplWrapper::new( MemoryHistory::::with_initial_path( dioxus_fullstack::prelude::server_context() - .request_parts() + .request_parts_blocking() .uri .to_string() .parse()