mirror of
https://github.com/farion1231/cc-switch.git
synced 2026-04-18 17:33:08 +08:00
fix(proxy): wait for server shutdown before exiting app
The previous cleanup logic only sent a shutdown signal but didn't wait for the proxy server to actually stop. This caused a race condition where the app would exit before cleanup completed, leaving Live configs in an inconsistent state. Changes: - Add `server_handle` field to ProxyServer to track the spawned task - Modify `stop()` to wait for server task completion (5s timeout) - Add 100ms delay before process exit to ensure I/O flush - Export ProxyService and fix test files that were missing proxy_service field
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use cc_switch_lib::{import_provider_from_deeplink, parse_deeplink_url, AppState, Database};
|
||||
use cc_switch_lib::{import_provider_from_deeplink, parse_deeplink_url, AppState, Database, ProxyService};
|
||||
|
||||
#[path = "support.rs"]
|
||||
mod support;
|
||||
@@ -16,8 +16,8 @@ fn deeplink_import_claude_provider_persists_to_db() {
|
||||
let request = parse_deeplink_url(url).expect("parse deeplink url");
|
||||
|
||||
let db = Arc::new(Database::memory().expect("create memory db"));
|
||||
|
||||
let state = AppState { db: db.clone() };
|
||||
let proxy_service = ProxyService::new(db.clone());
|
||||
let state = AppState { db: db.clone(), proxy_service };
|
||||
|
||||
let provider_id = import_provider_from_deeplink(&state, request.clone())
|
||||
.expect("import provider from deeplink");
|
||||
@@ -53,8 +53,8 @@ fn deeplink_import_codex_provider_builds_auth_and_config() {
|
||||
let request = parse_deeplink_url(url).expect("parse deeplink url");
|
||||
|
||||
let db = Arc::new(Database::memory().expect("create memory db"));
|
||||
|
||||
let state = AppState { db: db.clone() };
|
||||
let proxy_service = ProxyService::new(db.clone());
|
||||
let state = AppState { db: db.clone(), proxy_service };
|
||||
|
||||
let provider_id = import_provider_from_deeplink(&state, request.clone())
|
||||
.expect("import provider from deeplink");
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::sync::{Arc, Mutex, OnceLock};
|
||||
|
||||
use cc_switch_lib::{update_settings, AppSettings, AppState, Database, MultiAppConfig};
|
||||
use cc_switch_lib::{update_settings, AppSettings, AppState, Database, MultiAppConfig, ProxyService};
|
||||
|
||||
/// 为测试设置隔离的 HOME 目录,避免污染真实用户数据。
|
||||
pub fn ensure_test_home() -> &'static Path {
|
||||
@@ -48,15 +48,17 @@ pub fn test_mutex() -> &'static Mutex<()> {
|
||||
|
||||
/// 创建测试用的 AppState,包含一个空的数据库
|
||||
pub fn create_test_state() -> Result<AppState, Box<dyn std::error::Error>> {
|
||||
let db = Database::init()?;
|
||||
Ok(AppState { db: Arc::new(db) })
|
||||
let db = Arc::new(Database::init()?);
|
||||
let proxy_service = ProxyService::new(db.clone());
|
||||
Ok(AppState { db, proxy_service })
|
||||
}
|
||||
|
||||
/// 创建测试用的 AppState,并从 MultiAppConfig 迁移数据
|
||||
pub fn create_test_state_with_config(
|
||||
config: &MultiAppConfig,
|
||||
) -> Result<AppState, Box<dyn std::error::Error>> {
|
||||
let db = Database::init()?;
|
||||
let db = Arc::new(Database::init()?);
|
||||
db.migrate_from_json(config)?;
|
||||
Ok(AppState { db: Arc::new(db) })
|
||||
let proxy_service = ProxyService::new(db.clone());
|
||||
Ok(AppState { db, proxy_service })
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user