From 76319005b851288ea096ab006fd73f0a71b9f2b8 Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Sat, 11 Oct 2025 21:03:54 -0700 Subject: [PATCH] use `queue_events` instead of `process_events` to fix ssr issue (#4772) * use `queue_events` instead of `process_events` to fix ssr issue * remove suspense wait from liveview --- packages/core/src/virtual_dom.rs | 2 ++ packages/fullstack-server/src/ssr.rs | 4 ---- packages/liveview/src/pool.rs | 8 +------- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/packages/core/src/virtual_dom.rs b/packages/core/src/virtual_dom.rs index a642e133b..bc1fced02 100644 --- a/packages/core/src/virtual_dom.rs +++ b/packages/core/src/virtual_dom.rs @@ -640,6 +640,8 @@ impl VirtualDom { #[instrument(skip(self), level = "trace", name = "VirtualDom::wait_for_suspense")] pub async fn wait_for_suspense(&mut self) { loop { + self.queue_events(); + if !self.suspended_tasks_remaining() && !self.has_dirty_scopes() { break; } diff --git a/packages/fullstack-server/src/ssr.rs b/packages/fullstack-server/src/ssr.rs index 39f290ee3..2f4cef42a 100644 --- a/packages/fullstack-server/src/ssr.rs +++ b/packages/fullstack-server/src/ssr.rs @@ -208,10 +208,6 @@ impl SsrRendererPool { // rebuild the virtual dom virtual_dom.rebuild_in_place(); - // Process any pending events that might have been triggered during the rebuild - // This ensures things like error boundaries get a chance to run. - virtual_dom.process_events(); - // If streaming is disabled, wait for the virtual dom to finish all suspense work // before rendering anything if streaming_mode == StreamingMode::Disabled { diff --git a/packages/liveview/src/pool.rs b/packages/liveview/src/pool.rs index afedced14..46dc57b9c 100644 --- a/packages/liveview/src/pool.rs +++ b/packages/liveview/src/pool.rs @@ -11,7 +11,7 @@ use dioxus_html::{EventData, HtmlEvent, PlatformEventData}; use dioxus_interpreter_js::MutationState; use futures_util::{pin_mut, SinkExt, StreamExt}; use serde::Serialize; -use std::{any::Any, rc::Rc, time::Duration}; +use std::{any::Any, rc::Rc}; use tokio_util::task::LocalPoolHandle; #[derive(Clone)] @@ -238,12 +238,6 @@ pub async fn run(mut vdom: VirtualDom, ws: impl LiveViewSocket) -> Result<(), Li } } - // wait for suspense to resolve in a 10ms window - tokio::select! { - _ = tokio::time::sleep(Duration::from_millis(10)) => {} - _ = vdom.wait_for_suspense() => {} - } - // render the vdom vdom.render_immediate(&mut mutations);