From e1e8725dab9a45fa028f2ad9971bb21c93d4d1d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Fri, 2 Oct 2026 12:12:50 +0800 Subject: [PATCH] =?UTF-8?q?AuthClientInitFailed=E5=B8=A6=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E5=8E=9F=E5=A7=8B=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 错误枚举:authClientInitFailed 从 unit 变体改成带 detail 的载荷变体,导出 AuthClientInitFailed 绑定 - auth_session:build_client 失败时把 reqwest 原始错误放进 detail,不再丢弃 - carrier 用例按带载荷变体 as 取 detail - 前端维持固定文案,不把 detail 贴到界面上 --- .../src-tauri/src/auth_error.rs | 25 ++++++++++++++++--- .../src-tauri/src/auth_session.rs | 14 +++++++---- .../generated/AuthClientInitFailed.ts | 6 +++++ .../src/services/generated/ClientAuthError.ts | 3 ++- .../tests/clientAuthErrorCarrier.test.ts | 3 ++- 5 files changed, 41 insertions(+), 10 deletions(-) create mode 100644 apps/ai-game-creator-shell/src/services/generated/AuthClientInitFailed.ts diff --git a/apps/ai-game-creator-shell/src-tauri/src/auth_error.rs b/apps/ai-game-creator-shell/src-tauri/src/auth_error.rs index 4f1ebbe30..826cc6e93 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/auth_error.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/auth_error.rs @@ -61,8 +61,8 @@ pub(crate) enum ClientAuthError { ClientSessionPersistFailed(ClientSessionPersistFailed), /// 本机运行时会话安装 / 清理失败;`detail` 同上。 RuntimeSessionInstallFailed(RuntimeSessionInstallFailed), - /// 认证网络客户端构建失败。 - AuthClientInitFailed, + /// 认证网络客户端构建失败;`detail` 是原始错误。 + AuthClientInitFailed(AuthClientInitFailed), } // ---- 可枚举的细分原因:类型化字段,不是字符串 ---- @@ -204,6 +204,14 @@ pub(crate) struct RuntimeSessionInstallFailed { pub(crate) detail: String, } +/// 认证网络客户端构建失败的原始错误明细。 +#[derive(Clone, Debug, PartialEq, Eq, Serialize, TS)] +#[serde(rename_all = "camelCase")] +#[ts(export, export_to = concat!(env!("CARGO_MANIFEST_DIR"), "/../src/services/generated/"))] +pub(crate) struct AuthClientInitFailed { + pub(crate) detail: String, +} + impl ClientAuthError { /// 会话路由的 401/403 是「登录态失效」:调用方据此清会话、按未登录处理, /// 既不给用户报错,也不进错误报告池。 @@ -291,7 +299,9 @@ mod tests { "runtimeSessionInstallFailed", ), ( - ClientAuthError::AuthClientInitFailed, + ClientAuthError::AuthClientInitFailed(AuthClientInitFailed { + detail: "x".to_string(), + }), "authClientInitFailed", ), ]; @@ -364,6 +374,15 @@ mod tests { )) .expect("serialize auth error"); assert_eq!(persist["detail"], "磁盘只读"); + + let init = serde_json::to_value(ClientAuthError::AuthClientInitFailed( + AuthClientInitFailed { + detail: "tls handshake failed".to_string(), + }, + )) + .expect("serialize auth error"); + assert_eq!(init["type"], "authClientInitFailed"); + assert_eq!(init["detail"], "tls handshake failed"); } #[test] diff --git a/apps/ai-game-creator-shell/src-tauri/src/auth_session.rs b/apps/ai-game-creator-shell/src-tauri/src/auth_session.rs index 9a711da2b..026fa176f 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/auth_session.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/auth_session.rs @@ -5,10 +5,10 @@ //! origin 变化都会让旧身份的在途请求失败关闭;同一身份的凭据轮换不改变身份代次。 use crate::auth_error::{ - AuthNetworkFailure, AuthNetworkReason, AuthResponseInvalid, AuthResponseInvalidReason, - AuthServiceUnavailable, ClientAuthError, ClientSessionPersistFailed, PasswordLoginRejected, - PhoneCodeLoginRejected, RuntimeSessionInstallFailed, SendCodeRejected, ServerAddressReason, - ServerAddressRejected, UnexpectedRejection, + AuthClientInitFailed, AuthNetworkFailure, AuthNetworkReason, AuthResponseInvalid, + AuthResponseInvalidReason, AuthServiceUnavailable, ClientAuthError, ClientSessionPersistFailed, + PasswordLoginRejected, PhoneCodeLoginRejected, RuntimeSessionInstallFailed, SendCodeRejected, + ServerAddressReason, ServerAddressRejected, UnexpectedRejection, }; use crate::http_client::agc_main_site_client_builder; use crate::platform_session::{current_platform_session, PlatformSessionSnapshot}; @@ -443,7 +443,11 @@ fn build_client() -> Result { .connect_timeout(Duration::from_secs(10)) .timeout(HTTP_TIMEOUT) .build() - .map_err(|_| ClientAuthError::AuthClientInitFailed) + .map_err(|error| { + ClientAuthError::AuthClientInitFailed(AuthClientInitFailed { + detail: error.to_string(), + }) + }) } fn network_error(error: &reqwest::Error) -> ClientAuthError { diff --git a/apps/ai-game-creator-shell/src/services/generated/AuthClientInitFailed.ts b/apps/ai-game-creator-shell/src/services/generated/AuthClientInitFailed.ts new file mode 100644 index 000000000..73188e2d3 --- /dev/null +++ b/apps/ai-game-creator-shell/src/services/generated/AuthClientInitFailed.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * 认证网络客户端构建失败的原始错误明细。 + */ +export type AuthClientInitFailed = { detail: string }; diff --git a/apps/ai-game-creator-shell/src/services/generated/ClientAuthError.ts b/apps/ai-game-creator-shell/src/services/generated/ClientAuthError.ts index 6cb924232..d52f178dc 100644 --- a/apps/ai-game-creator-shell/src/services/generated/ClientAuthError.ts +++ b/apps/ai-game-creator-shell/src/services/generated/ClientAuthError.ts @@ -1,4 +1,5 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { AuthClientInitFailed } from './AuthClientInitFailed'; import type { AuthNetworkFailure } from './AuthNetworkFailure'; import type { AuthResponseInvalid } from './AuthResponseInvalid'; import type { AuthServiceUnavailable } from './AuthServiceUnavailable'; @@ -32,4 +33,4 @@ export type ClientAuthError = | ({ type: 'authResponseInvalid' } & AuthResponseInvalid) | ({ type: 'clientSessionPersistFailed' } & ClientSessionPersistFailed) | ({ type: 'runtimeSessionInstallFailed' } & RuntimeSessionInstallFailed) - | { type: 'authClientInitFailed' }; + | ({ type: 'authClientInitFailed' } & AuthClientInitFailed); diff --git a/apps/ai-game-creator-shell/tests/clientAuthErrorCarrier.test.ts b/apps/ai-game-creator-shell/tests/clientAuthErrorCarrier.test.ts index c343247a6..4ae2f922b 100644 --- a/apps/ai-game-creator-shell/tests/clientAuthErrorCarrier.test.ts +++ b/apps/ai-game-creator-shell/tests/clientAuthErrorCarrier.test.ts @@ -12,6 +12,7 @@ import { describe, expect, it, vi } from 'vitest'; import { loginClientWithPassword } from '../src/services/clientAuth'; import { ClientAuthErrorWrapper } from '../src/services/clientAuthErrorWrapper'; +import type { AuthClientInitFailed } from '../src/services/generated/AuthClientInitFailed'; import type { AuthNetworkFailure } from '../src/services/generated/AuthNetworkFailure'; import type { AuthResponseInvalid } from '../src/services/generated/AuthResponseInvalid'; import type { AuthServiceUnavailable } from '../src/services/generated/AuthServiceUnavailable'; @@ -119,7 +120,7 @@ function variantMessage(error: ClientAuthError): string { case 'runtimeSessionInstallFailed': return (error as RuntimeSessionInstallFailed).detail; case 'authClientInitFailed': - return '网络客户端构建失败'; + return (error as AuthClientInitFailed).detail; default: { expectNever(error); return '';