From 8decd9554caadc7712556962898db7366fc04509 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E7=82=8E?= <635735027@qq.com> Date: Tue, 14 Apr 2026 09:15:33 +0800 Subject: [PATCH] fix(service): lift cached_host to outer loop to prevent duplicate helper pages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Qoder][https://qoder.com] --- src/service/mod.rs | 11 +++++++++-- src/service/server.rs | 9 +++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/service/mod.rs b/src/service/mod.rs index 78ebd74..188488d 100644 --- a/src/service/mod.rs +++ b/src/service/mod.rs @@ -7,6 +7,7 @@ use std::sync::Arc; use tungstenite::accept; use crate::agent::AgentRuntimeContext; +use crate::browser::callback_host::LiveBrowserCallbackHost; use crate::pipe::PipeError; use crate::security::MacPolicy; @@ -14,7 +15,7 @@ const DEFAULT_BROWSER_WS_URL: &str = "ws://127.0.0.1:12345"; const DEFAULT_SERVICE_WS_LISTEN_ADDR: &str = "127.0.0.1:42321"; pub use protocol::{ClientMessage, ServiceMessage}; -pub use server::{serve_client, ServiceEventSink, ServiceSession}; +pub use server::{ServiceEventSink, ServiceSession}; pub(crate) mod browser_ws_client { pub(crate) use super::server::{initial_request_url_for_submit_task, ServiceWsClient}; @@ -69,6 +70,11 @@ pub fn run() -> Result<(), PipeError> { browser_ws_url, ); + // Cache the browser callback host across client sessions so the helper + // page tab is opened only once per process lifetime instead of once per + // WebSocket reconnection. + let mut cached_host: Option> = None; + loop { let (stream, _) = listener.accept()?; let websocket = accept(stream) @@ -76,12 +82,13 @@ pub fn run() -> Result<(), PipeError> { let sink = Arc::new(ServiceEventSink::from_websocket(websocket)); match session.try_attach_client() { Ok(()) => { - let result = serve_client( + let result = server::serve_client( &runtime_context, &session, sink.clone(), browser_ws_url, &mac_policy, + &mut cached_host, ); session.detach_client(); match result { diff --git a/src/service/server.rs b/src/service/server.rs index a25de6c..2fddfb2 100644 --- a/src/service/server.rs +++ b/src/service/server.rs @@ -229,17 +229,14 @@ fn send_status_changed(sink: &ServiceEventSink, state: &str) -> Result<(), PipeE }) } -pub fn serve_client( +pub(crate) fn serve_client( context: &AgentRuntimeContext, session: &ServiceSession, sink: Arc, browser_ws_url: &str, mac_policy: &MacPolicy, + cached_host: &mut Option>, ) -> Result<(), PipeError> { - // Cache the browser callback host across tasks so the helper page tab is - // opened only once per client session instead of once per task. - let mut cached_host: Option> = None; - loop { let Some(message) = sink.recv_client_message()? else { return Ok(()); @@ -293,7 +290,7 @@ pub fn serve_client( false, // use_hidden_domain: visible tab for now ) { Ok(host) => { - cached_host = Some(Arc::new(host)); + *cached_host = Some(Arc::new(host)); } Err(err) => { session.finish_task();