mirror of
https://github.com/farion1231/cc-switch.git
synced 2026-07-27 16:26:16 +08:00
4c94e70f97
Add a complete HTTP proxy server implementation built on Axum framework, enabling local API request forwarding with automatic provider failover and load balancing capabilities. Backend Implementation (Rust): - Add proxy server module with 7 core components: * server.rs: Axum HTTP server lifecycle management (start/stop/status) * router.rs: API routing configuration for Claude/OpenAI/Gemini endpoints * handlers.rs: Request/response handling and transformation * forwarder.rs: Upstream forwarding logic with retry mechanism (652 lines) * error.rs: Comprehensive error handling and HTTP status mapping * types.rs: Shared types (ProxyConfig, ProxyStatus, ProxyServerInfo) * health.rs: Provider health check infrastructure Service Layer: - Add ProxyService (services/proxy.rs, 157 lines): * Manage proxy server lifecycle * Handle configuration updates * Track runtime status and metrics Database Layer: - Add proxy configuration DAO (dao/proxy.rs, 242 lines): * Persist proxy settings (listen address, port, timeout) * Store provider priority and availability flags - Update schema with proxy_config table (schema.rs): * Support runtime configuration persistence Tauri Commands: - Add 6 command endpoints (commands/proxy.rs): * start_proxy_server: Launch proxy server * stop_proxy_server: Gracefully shutdown server * get_proxy_status: Query runtime status * get_proxy_config: Retrieve current configuration * update_proxy_config: Modify settings without restart * is_proxy_running: Check server state Frontend Implementation (React + TypeScript): - Add ProxyPanel component (222 lines): * Real-time server status display * Start/stop controls * Provider availability monitoring - Add ProxySettingsDialog component (420 lines): * Configuration editor (address, port, timeout) * Provider priority management * Settings validation - Add React hooks: * useProxyConfig: Manage proxy configuration state * useProxyStatus: Poll and display server status - Add TypeScript types (types/proxy.ts): * Define ProxyConfig, ProxyStatus interfaces Provider Integration: - Extend Provider model with availability field (providers.rs): * Track provider health for failover logic - Update ProviderCard UI to display proxy status - Integrate proxy controls in Settings page Dependencies: - Add Axum 0.7 (async web framework) - Add Tower 0.4 (middleware and service abstractions) - Add Tower-HTTP (CORS layer) - Add Tokio sync primitives (oneshot, RwLock) Technical Details: - Graceful shutdown via oneshot channel - Shared state with Arc<RwLock<T>> for thread-safe config updates - CORS enabled for cross-origin frontend access - Request/response streaming support - Automatic retry with exponential backoff (forwarder) - API key extraction from multiple config formats (Claude/Codex/Gemini) File Statistics: - 41 files changed - 3491 insertions(+), 41 deletions(-) - Core modules: 1393 lines (server + forwarder + handlers) - Frontend UI: 642 lines (ProxyPanel + ProxySettingsDialog) - Database/DAO: 326 lines This implementation provides the foundation for advanced features like: - Multi-provider load balancing - Automatic failover on provider errors - Request logging and analytics - Usage tracking and cost monitoring
82 lines
2.1 KiB
TOML
82 lines
2.1 KiB
TOML
[package]
|
|
name = "cc-switch"
|
|
version = "3.8.1"
|
|
description = "All-in-One Assistant for Claude Code, Codex & Gemini CLI"
|
|
authors = ["Jason Young"]
|
|
license = "MIT"
|
|
repository = "https://github.com/farion1231/cc-switch"
|
|
edition = "2021"
|
|
rust-version = "1.85.0"
|
|
|
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
|
|
[lib]
|
|
name = "cc_switch_lib"
|
|
crate-type = ["staticlib", "cdylib", "rlib"]
|
|
|
|
[features]
|
|
default = []
|
|
test-hooks = []
|
|
|
|
[build-dependencies]
|
|
tauri-build = { version = "2.4.0", features = [] }
|
|
|
|
[dependencies]
|
|
serde_json = "1.0"
|
|
serde = { version = "1.0", features = ["derive"] }
|
|
log = "0.4"
|
|
chrono = { version = "0.4", features = ["serde"] }
|
|
tauri = { version = "2.8.2", features = ["tray-icon", "protocol-asset"] }
|
|
tauri-plugin-log = "2"
|
|
tauri-plugin-opener = "2"
|
|
tauri-plugin-process = "2"
|
|
tauri-plugin-updater = "2"
|
|
tauri-plugin-dialog = "2"
|
|
tauri-plugin-store = "2"
|
|
tauri-plugin-deep-link = "2"
|
|
dirs = "5.0"
|
|
toml = "0.8"
|
|
toml_edit = "0.22"
|
|
reqwest = { version = "0.12", features = ["rustls-tls", "json", "stream"] }
|
|
tokio = { version = "1", features = ["macros", "rt-multi-thread", "time", "sync"] }
|
|
futures = "0.3"
|
|
axum = "0.7"
|
|
tower = "0.4"
|
|
tower-http = { version = "0.5", features = ["cors"] }
|
|
hyper = { version = "1.0", features = ["full"] }
|
|
regex = "1.10"
|
|
rquickjs = { version = "0.8", features = ["array-buffer", "classes"] }
|
|
thiserror = "2.0"
|
|
anyhow = "1.0"
|
|
zip = "2.2"
|
|
serde_yaml = "0.9"
|
|
tempfile = "3"
|
|
url = "2.5"
|
|
auto-launch = "0.5"
|
|
once_cell = "1.21.3"
|
|
base64 = "0.22"
|
|
rusqlite = { version = "0.31", features = ["bundled", "backup"] }
|
|
indexmap = { version = "2", features = ["serde"] }
|
|
|
|
[target.'cfg(any(target_os = "macos", target_os = "windows", target_os = "linux"))'.dependencies]
|
|
tauri-plugin-single-instance = "2"
|
|
|
|
[target.'cfg(target_os = "windows")'.dependencies]
|
|
winreg = "0.52"
|
|
|
|
[target.'cfg(target_os = "macos")'.dependencies]
|
|
objc2 = "0.5"
|
|
objc2-app-kit = { version = "0.2", features = ["NSColor"] }
|
|
|
|
# Optimize release binary size to help reduce AppImage footprint
|
|
[profile.release]
|
|
codegen-units = 1
|
|
lto = "thin"
|
|
opt-level = "s"
|
|
panic = "abort"
|
|
strip = "symbols"
|
|
|
|
[dev-dependencies]
|
|
serial_test = "3"
|
|
tempfile = "3"
|