Merge pull request #1987 from ealmloff/fix-fullstack-history
Fix fullstack history
This commit is contained in:
3 files changed
+29
-6
No files matched your search
@@ -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
|
||||||
|
|||||||
@@ -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?)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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()
|
||||||
|
|||||||
Reference in new issue
Block a user