Bläddra i källkod

Merge pull request #1987 from ealmloff/fix-fullstack-history

Fix fullstack history
Jonathan Kelley 1 år sedan
förälder
incheckning
62d79747aa

+ 3 - 2
packages/fullstack/src/render.rs

@@ -9,6 +9,7 @@ use dioxus_ssr::{
 use std::future::Future;
 use std::future::Future;
 use std::sync::Arc;
 use std::sync::Arc;
 use std::sync::RwLock;
 use std::sync::RwLock;
+use tokio::task::block_in_place;
 use tokio::task::JoinHandle;
 use tokio::task::JoinHandle;
 
 
 use crate::prelude::*;
 use crate::prelude::*;
@@ -64,7 +65,7 @@ impl SsrRendererPool {
                     let prev_context = SERVER_CONTEXT.with(|ctx| ctx.replace(server_context));
                     let prev_context = SERVER_CONTEXT.with(|ctx| ctx.replace(server_context));
                     // poll the future, which may call server_context()
                     // poll the future, which may call server_context()
                     tracing::info!("Rebuilding vdom");
                     tracing::info!("Rebuilding vdom");
-                    vdom.rebuild(&mut NoOpMutations);
+                    block_in_place(|| vdom.rebuild(&mut NoOpMutations));
                     vdom.wait_for_suspense().await;
                     vdom.wait_for_suspense().await;
                     tracing::info!("Suspense resolved");
                     tracing::info!("Suspense resolved");
                     // after polling the future, we need to restore the context
                     // after polling the future, we need to restore the context
@@ -124,7 +125,7 @@ impl SsrRendererPool {
                                         .with(|ctx| ctx.replace(Box::new(server_context)));
                                         .with(|ctx| ctx.replace(Box::new(server_context)));
                                     // poll the future, which may call server_context()
                                     // poll the future, which may call server_context()
                                     tracing::info!("Rebuilding vdom");
                                     tracing::info!("Rebuilding vdom");
-                                    vdom.rebuild(&mut NoOpMutations);
+                                    block_in_place(|| vdom.rebuild(&mut NoOpMutations));
                                     vdom.wait_for_suspense().await;
                                     vdom.wait_for_suspense().await;
                                     tracing::info!("Suspense resolved");
                                     tracing::info!("Suspense resolved");
                                     // after polling the future, we need to restore the context
                                     // after polling the future, we need to restore the context

+ 25 - 3
packages/fullstack/src/server_context.rs

@@ -84,14 +84,36 @@ mod server_fn_impl {
         /// Get the request that triggered:
         /// Get the request that triggered:
         /// - The initial SSR render if called from a ScopeState or ServerFn
         /// - 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
         /// - 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()
             self.parts.blocking_read()
         }
         }
 
 
         /// Get the request that triggered:
         /// Get the request that triggered:
         /// - The initial SSR render if called from a ScopeState or ServerFn
         /// - 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
         /// - 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()
             self.parts.blocking_write()
         }
         }
 
 
@@ -239,6 +261,6 @@ impl<
     type Rejection = R;
     type Rejection = R;
 
 
     async fn from_request(req: &DioxusServerContext) -> Result<Self, Self::Rejection> {
     async fn from_request(req: &DioxusServerContext) -> Result<Self, Self::Rejection> {
-        Ok(I::from_request_parts(&mut req.request_parts_mut(), &()).await?)
+        Ok(I::from_request_parts(&mut *req.request_parts_mut().await, &()).await?)
     }
     }
 }
 }

+ 1 - 1
packages/router/src/router_cfg.rs

@@ -134,7 +134,7 @@ where
     return Box::new(AnyHistoryProviderImplWrapper::new(
     return Box::new(AnyHistoryProviderImplWrapper::new(
         MemoryHistory::<R>::with_initial_path(
         MemoryHistory::<R>::with_initial_path(
             dioxus_fullstack::prelude::server_context()
             dioxus_fullstack::prelude::server_context()
-                .request_parts()
+                .request_parts_blocking()
                 .uri
                 .uri
                 .to_string()
                 .to_string()
                 .parse()
                 .parse()