From 9f4bb594e4905646419cf20d609235dc28909b4d Mon Sep 17 00:00:00 2001
From: zhom <2717306+zhom@users.noreply.github.com>
Date: Thu, 16 Apr 2026 13:32:29 +0400
Subject: [PATCH] fix: vpn config discovery
---
.gitignore | 2 +-
next-env.d.ts | 6 ----
src-tauri/Cargo.lock | 45 ++++++++++---------------
src-tauri/Cargo.toml | 2 +-
src-tauri/src/bin/proxy_server.rs | 52 ++++++++++++++++++++++++-----
src-tauri/src/vpn_worker_runner.rs | 12 +++++--
src-tauri/src/vpn_worker_storage.rs | 4 +++
7 files changed, 77 insertions(+), 46 deletions(-)
delete mode 100644 next-env.d.ts
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)?;