From 6ec82c27a6ee910edbe448cffb065065f013c6ba Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Sat, 4 Apr 2026 08:01:04 -0300 Subject: [PATCH] fix: Replace futures::executor::block_on with thread::spawn in SET USER - Fixes panic: Cannot start a runtime from within a runtime - set_user.rs was using futures::executor::block_on directly in Rhai callback - Now uses std::thread::spawn + new_current_thread().block_on() pattern - This is called during bootstrap and was causing startup crash --- src/basic/keywords/set_user.rs | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/basic/keywords/set_user.rs b/src/basic/keywords/set_user.rs index 806cb99c..2b899157 100644 --- a/src/basic/keywords/set_user.rs +++ b/src/basic/keywords/set_user.rs @@ -17,16 +17,28 @@ pub fn set_user_keyword(state: Arc, user: UserSession, engine: &mut En Ok(user_id) => { let state_for_spawn = Arc::clone(&state_clone); let user_clone_spawn = user_clone.clone(); - let mut session_manager = - futures::executor::block_on(state_for_spawn.session_manager.lock()); - - if let Err(e) = session_manager.update_user_id(user_clone_spawn.id, user_id) { - error!("Failed to update user ID in session: {e}"); - } else { + let (tx, rx) = std::sync::mpsc::channel(); + std::thread::spawn(move || { + let rt = tokio::runtime::Builder::new_current_thread() + .enable_all() + .build(); + let result = if let Ok(rt) = rt { + rt.block_on(async { + let mut session_manager = state_for_spawn.session_manager.lock().await; + session_manager.update_user_id(user_clone_spawn.id, user_id) + }) + } else { + Err("Failed to create runtime".into()) + }; + let _ = tx.send(result); + }); + if let Ok(Ok(())) = rx.recv() { trace!( "Updated session {} to user ID: {user_id}", user_clone_spawn.id ); + } else { + error!("Failed to update user ID in session"); } } Err(e) => {