diff --git a/apps/desktop-shell/scripts/check-config.mjs b/apps/desktop-shell/scripts/check-config.mjs index d9d175787..ca003807a 100644 --- a/apps/desktop-shell/scripts/check-config.mjs +++ b/apps/desktop-shell/scripts/check-config.mjs @@ -1793,16 +1793,19 @@ for (const snippet of [ if ( !desktopHostBridgeDispatchSource.includes( - 'resolve_desktop_host_bridge_network_status().await', + 'resolve_desktop_host_bridge_network_status(&request).await', ) || desktopHostBridgeDispatchSource.includes('resolve_desktop_network_status') || - desktopHostBridgeDispatchSource.includes('spawn_blocking(resolve_desktop_network_status)') + desktopHostBridgeDispatchSource.includes('spawn_blocking(resolve_desktop_network_status)') || + desktopHostBridgeDispatchSource.includes('Err(error) => failed(request.id, "host_error"') ) { throw new Error('desktop shell network HostBridge method must delegate to network module'); } for (const snippet of [ 'resolve_desktop_host_bridge_network_status', + 'resolve_desktop_host_bridge_network_status_payload', 'spawn_blocking(resolve_desktop_network_status)', + 'failed(request.id.clone(), "host_error", error)', ]) { if (!desktopHostBridgeNetworkSource.includes(snippet)) { throw new Error(`desktop shell network module is missing ${snippet}`); diff --git a/apps/desktop-shell/src-tauri/src/host_bridge/dispatch.rs b/apps/desktop-shell/src-tauri/src/host_bridge/dispatch.rs index f465f9c8c..fd28ca9ec 100644 --- a/apps/desktop-shell/src-tauri/src/host_bridge/dispatch.rs +++ b/apps/desktop-shell/src-tauri/src/host_bridge/dispatch.rs @@ -67,10 +67,7 @@ pub(super) async fn execute_host_bridge_request( Ok(()) => ok(request.id, json!(true)), Err(response) => response, }, - "network.status" => match resolve_desktop_host_bridge_network_status().await { - Ok(status) => ok(request.id, status), - Err(error) => failed(request.id, "host_error", error.to_string()), - }, + "network.status" => resolve_desktop_host_bridge_network_status(&request).await, "notification.showLocal" => match show_desktop_local_notification(&app, &request) { Ok(()) => ok(request.id, json!(true)), Err(response) => response, diff --git a/apps/desktop-shell/src-tauri/src/host_bridge/network.rs b/apps/desktop-shell/src-tauri/src/host_bridge/network.rs index b39335632..196bdd2df 100644 --- a/apps/desktop-shell/src-tauri/src/host_bridge/network.rs +++ b/apps/desktop-shell/src-tauri/src/host_bridge/network.rs @@ -1,8 +1,18 @@ +use crate::host_bridge::protocol::{failed, ok, HostBridgeRequest, HostBridgeResponse}; use crate::shell::webview::resolve_desktop_network_status; use serde_json::Value; -pub(crate) async fn resolve_desktop_host_bridge_network_status() -> Result { +async fn resolve_desktop_host_bridge_network_status_payload() -> Result { tauri::async_runtime::spawn_blocking(resolve_desktop_network_status) .await .map_err(|error| error.to_string()) } + +pub(crate) async fn resolve_desktop_host_bridge_network_status( + request: &HostBridgeRequest, +) -> HostBridgeResponse { + match resolve_desktop_host_bridge_network_status_payload().await { + Ok(status) => ok(request.id.clone(), status), + Err(error) => failed(request.id.clone(), "host_error", error), + } +} diff --git a/docs/project-memory/shared-memory/decision-log.md b/docs/project-memory/shared-memory/decision-log.md index 77ce26f4c..d1645629b 100644 --- a/docs/project-memory/shared-memory/decision-log.md +++ b/docs/project-memory/shared-memory/decision-log.md @@ -2801,6 +2801,6 @@ ## 2026-06-19 原生壳网络查询桥接边界 - 背景:`network.status` 已由 Expo shell network 和 Tauri shell network 承接真实系统 / 主站可达性查询,但两端 HostBridge `dispatch` 仍直接调用底层 network helper 或异步阻塞包装,继续补壳能力时容易让分发层重新承接宿主细节。 -- 决策:Expo 移动壳新增 `apps/mobile-shell/src/host-bridge/network.ts`,统一承接 `network.status` HostBridge 查询并复用 `src/shell/network.ts`;Tauri 桌面壳新增 `apps/desktop-shell/src-tauri/src/host_bridge/network.rs`,统一承接 `network.status` HostBridge 查询并复用 `shell::network::resolve_desktop_network_status`。两端 `dispatch` 只保留 method 委托和响应包装,配置检查会拒绝分发层直接导入 shell network 或直接执行 `resolve_desktop_network_status`。 +- 决策:Expo 移动壳新增 `apps/mobile-shell/src/host-bridge/network.ts`,统一承接 `network.status` HostBridge 查询并复用 `src/shell/network.ts`;Tauri 桌面壳新增 `apps/desktop-shell/src-tauri/src/host_bridge/network.rs`,统一承接 `network.status` HostBridge 查询、成功响应和 `host_error` 失败映射,并复用 `shell::network::resolve_desktop_network_status`。两端 `dispatch` 只保留 method 委托,配置检查会拒绝分发层直接导入 shell network、直接执行 `resolve_desktop_network_status` 或重新映射桌面网络错误。 - 影响范围:`apps/mobile-shell/src/host-bridge/network.ts`、`apps/mobile-shell/src/host-bridge/dispatch.ts`、`apps/mobile-shell/scripts/check-config.mjs`、`apps/desktop-shell/src-tauri/src/host_bridge/network.rs`、`apps/desktop-shell/src-tauri/src/host_bridge/dispatch.rs`、`apps/desktop-shell/scripts/check-config.mjs`、`scripts/check-native-shells.mjs`、宿主壳能力统一协议文档、Expo / Tauri HostBridge 方案文档。 - 验证方式:`npm run mobile-shell:typecheck`、`npm run mobile-shell:test -- src/host-bridge/bridge.test.ts`、`npm run desktop-shell:typecheck`、`cargo test --manifest-path apps/desktop-shell/src-tauri/Cargo.toml`、`npm run check:native-shells`、`npm run check:encoding`、`git diff --check`。