diff --git a/.gitignore b/.gitignore index 4f2a279..d2fde0e 100644 --- a/.gitignore +++ b/.gitignore @@ -58,4 +58,4 @@ nodecar/nodecar-bin .env # next -next-env.d.ts \ No newline at end of file +**/next-env.d.ts diff --git a/next-env.d.ts b/next-env.d.ts deleted file mode 100644 index b87975d..0000000 --- a/next-env.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -/// -/// -import "./dist/dev/types/routes.d.ts"; - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 3327751..9be0b91 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -169,7 +169,7 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -180,7 +180,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -1714,7 +1714,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -2082,7 +2082,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -3085,7 +3085,7 @@ dependencies = [ "tower-layer", "tower-service", "tracing", - "windows-registry 0.6.1", + "windows-registry", ] [[package]] @@ -3100,7 +3100,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.62.2", + "windows-core 0.61.2", ] [[package]] @@ -4548,7 +4548,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.45.0", ] [[package]] @@ -4923,7 +4923,7 @@ checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" [[package]] name = "playwright" version = "0.0.23" -source = "git+https://github.com/sctg-development/playwright-rust?branch=master#77d7a9729bc6c45b899a61eb4fb84adf075315e2" +source = "git+https://github.com/zhom/playwright-rust?branch=master#95a6c94d87c88376502ce2f33d4c61c09fc008a6" dependencies = [ "base64 0.22.1", "chrono", @@ -5848,7 +5848,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -5875,9 +5875,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.11" +version = "0.103.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20a6af516fea4b20eccceaf166e8aa666ac996208e8a644ce3ef5aa783bc7cd4" +checksum = "8279bb85272c9f10811ae6a6c547ff594d6a7f3c6c6b02ee9726d1d0dcfcdd06" dependencies = [ "ring", "rustls-pki-types", @@ -6550,7 +6550,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -7097,7 +7097,7 @@ dependencies = [ "thiserror 2.0.18", "tracing", "url", - "windows-registry 0.5.3", + "windows-registry", "windows-result 0.3.4", ] @@ -7348,7 +7348,7 @@ dependencies = [ "getrandom 0.4.2", "once_cell", "rustix", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -7957,7 +7957,7 @@ checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" dependencies = [ "memoffset", "tempfile", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -8551,7 +8551,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -8731,17 +8731,6 @@ dependencies = [ "windows-strings 0.4.2", ] -[[package]] -name = "windows-registry" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" -dependencies = [ - "windows-link 0.2.1", - "windows-result 0.4.1", - "windows-strings 0.5.1", -] - [[package]] name = "windows-result" version = "0.3.4" @@ -9080,7 +9069,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d6f32a0ff4a9f6f01231eb2059cc85479330739333e0e58cadf03b6af2cca10" dependencies = [ "cfg-if", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index dfd836d..e3e5bf6 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -93,7 +93,7 @@ clap = { version = "4", features = ["derive"] } async-socks5 = "0.6" # Camoufox/Playwright integration -playwright = { git = "https://github.com/sctg-development/playwright-rust", branch = "master" } +playwright = { git = "https://github.com/zhom/playwright-rust", branch = "master" } # Wayfern CDP integration tokio-tungstenite = { version = "0.29", features = ["native-tls"] } diff --git a/src-tauri/src/bin/proxy_server.rs b/src-tauri/src/bin/proxy_server.rs index 2ea3677..bfcb1ea 100644 --- a/src-tauri/src/bin/proxy_server.rs +++ b/src-tauri/src/bin/proxy_server.rs @@ -198,7 +198,12 @@ async fn main() { .required(true) .help("Local SOCKS5 port"), ) - .arg(Arg::new("action").required(true).help("Action (start)")), + .arg(Arg::new("action").required(true).help("Action (start)")) + .arg( + Arg::new("config-path") + .long("config-path") + .help("Direct path to the VPN worker config JSON file"), + ), ) .subcommand( Command::new("mcp-bridge") @@ -391,6 +396,7 @@ async fn main() { let port = *vpn_matches .get_one::("port") .expect("port is required"); + let config_path = vpn_matches.get_one::("config-path"); if action == "start" { set_high_priority(); @@ -398,8 +404,37 @@ async fn main() { log::info!("VPN worker starting, config id: {}", id); log::info!("Process PID: {}", std::process::id()); - // Retry config loading to handle file system race condition - let config = { + let config = if let Some(path) = config_path { + // Load config directly from the provided path + log::info!("Loading VPN worker config from: {}", path); + match std::fs::read_to_string(path) { + Ok(content) => match serde_json::from_str::< + donutbrowser_lib::vpn_worker_storage::VpnWorkerConfig, + >(&content) + { + Ok(config) => { + log::info!( + "Found VPN worker config: id={}, vpn_type={}, vpn_id={}", + config.id, + config.vpn_type, + config.vpn_id + ); + config + } + Err(e) => { + log::error!("Failed to parse VPN worker config from {}: {}", path, e); + process::exit(1); + } + }, + Err(e) => { + log::error!("Failed to read VPN worker config from {}: {}", path, e); + process::exit(1); + } + } + } else { + // Fallback: discover config by ID with retries + let storage_dir = donutbrowser_lib::proxy_storage::get_storage_dir(); + log::info!("Looking for VPN worker config in: {:?}", storage_dir); let mut attempts = 0; loop { if let Some(config) = donutbrowser_lib::vpn_worker_storage::get_vpn_worker_config(id) { @@ -412,20 +447,21 @@ async fn main() { break config; } attempts += 1; - if attempts >= 10 { + if attempts >= 50 { log::error!( - "VPN worker configuration {} not found after {} attempts", + "VPN worker configuration {} not found after {} attempts in {:?}", id, - attempts + attempts, + storage_dir ); process::exit(1); } log::info!( - "VPN worker config {} not found yet, retrying ({}/10)...", + "VPN worker config {} not found yet, retrying ({}/50)...", id, attempts ); - std::thread::sleep(std::time::Duration::from_millis(50)); + std::thread::sleep(std::time::Duration::from_millis(100)); } }; diff --git a/src-tauri/src/vpn_worker_runner.rs b/src-tauri/src/vpn_worker_runner.rs index 4d628fd..c8d662d 100644 --- a/src-tauri/src/vpn_worker_runner.rs +++ b/src-tauri/src/vpn_worker_runner.rs @@ -2,7 +2,8 @@ use crate::proxy_runner::find_sidecar_executable; use crate::proxy_storage::is_process_running; use crate::vpn_worker_storage::{ delete_vpn_worker_config, find_vpn_worker_by_vpn_id, generate_vpn_worker_id, - get_vpn_worker_config, list_vpn_worker_configs, save_vpn_worker_config, VpnWorkerConfig, + get_vpn_worker_config, list_vpn_worker_configs, save_vpn_worker_config, vpn_worker_config_path, + VpnWorkerConfig, }; use std::process::Stdio; @@ -175,6 +176,8 @@ pub async fn start_vpn_worker(vpn_id: &str) -> Result Result Result Result std::path::PathBuf { + get_storage_dir().join(format!("vpn_worker_{}.json", id)) +} + pub fn save_vpn_worker_config(config: &VpnWorkerConfig) -> Result<(), Box> { let storage_dir = get_storage_dir(); fs::create_dir_all(&storage_dir)?;