feat: add clash-verge-types crate and integrate IRuntime struct

This commit is contained in:
Tunglies
2025-11-22 15:33:24 +08:00
parent d110e462aa
commit c82cefe80e
9 changed files with 62 additions and 59 deletions

10
Cargo.lock generated
View File

@@ -1118,6 +1118,7 @@ dependencies = [
"clash-verge-draft", "clash-verge-draft",
"clash-verge-logging", "clash-verge-logging",
"clash-verge-signal", "clash-verge-signal",
"clash-verge-types",
"clash_verge_logger", "clash_verge_logger",
"clash_verge_service_ipc", "clash_verge_service_ipc",
"compact_str", "compact_str",
@@ -1206,6 +1207,15 @@ dependencies = [
"windows-sys 0.61.2", "windows-sys 0.61.2",
] ]
[[package]]
name = "clash-verge-types"
version = "0.1.0"
dependencies = [
"serde",
"serde_yaml_ng",
"smartstring",
]
[[package]] [[package]]
name = "clash_verge_logger" name = "clash_verge_logger"
version = "0.2.1" version = "0.2.1"

View File

@@ -5,6 +5,7 @@ members = [
"crates/clash-verge-logging", "crates/clash-verge-logging",
"crates/clash-verge-signal", "crates/clash-verge-signal",
"crates/tauri-plugin-clash-verge-sysinfo", "crates/tauri-plugin-clash-verge-sysinfo",
"crates/clash-verge-types",
] ]
resolver = "2" resolver = "2"
@@ -45,12 +46,11 @@ strip = false
clash-verge-draft = { path = "crates/clash-verge-draft" } clash-verge-draft = { path = "crates/clash-verge-draft" }
clash-verge-logging = { path = "crates/clash-verge-logging" } clash-verge-logging = { path = "crates/clash-verge-logging" }
clash-verge-signal = { path = "crates/clash-verge-signal" } clash-verge-signal = { path = "crates/clash-verge-signal" }
clash-verge-types = { path = "crates/clash-verge-types" }
tauri-plugin-clash-verge-sysinfo = { path = "crates/tauri-plugin-clash-verge-sysinfo" } tauri-plugin-clash-verge-sysinfo = { path = "crates/tauri-plugin-clash-verge-sysinfo" }
tauri = { version = "2.9.3" } tauri = { version = "2.9.3" }
parking_lot = { version = "0.12.5", features = [ parking_lot = { version = "0.12.5", features = ["hardware-lock-elision"] }
"hardware-lock-elision",
"send_guard",
] }
anyhow = "1.0.100" anyhow = "1.0.100"
criterion = { version = "0.7.0", features = ["async_tokio"] } criterion = { version = "0.7.0", features = ["async_tokio"] }
tokio = { version = "1.48.0", features = [ tokio = { version = "1.48.0", features = [
@@ -59,10 +59,16 @@ tokio = { version = "1.48.0", features = [
"time", "time",
"sync", "sync",
] } ] }
compact_str = { version = "0.9.0", features = ["serde"] }
flexi_logger = "0.31.7" flexi_logger = "0.31.7"
log = "0.4.28" log = "0.4.28"
smartstring = { version = "1.0.1" }
compact_str = { version = "0.9.0", features = ["serde"] }
serde = { version = "1.0.228" }
serde_json = { version = "1.0.145" }
serde_yaml_ng = { version = "0.10.0" }
# *** For Windows platform only *** # *** For Windows platform only ***
deelevate = "0.2.0" deelevate = "0.2.0"
# ********************************* # *********************************

View File

@@ -0,0 +1,13 @@
[package]
name = "clash-verge-types"
version = "0.1.0"
edition.workspace = true
rust-version.workspace = true
[dependencies]
serde = { workspace = true }
serde_yaml_ng = { workspace = true }
smartstring = { workspace = true }
[lints]
workspace = true

View File

@@ -0,0 +1 @@
pub mod runtime;

View File

@@ -1,15 +1,15 @@
use crate::enhance::field::use_keys;
use serde::{Deserialize, Serialize};
use serde_yaml_ng::{Mapping, Value}; use serde_yaml_ng::{Mapping, Value};
use smartstring::alias::String; use smartstring::alias::String;
use std::collections::HashMap; use std::collections::HashMap;
#[derive(Default, Debug, Clone, Deserialize, Serialize)] #[derive(Default, Clone)]
pub struct IRuntime { pub struct IRuntime {
pub config: Option<Mapping>, pub config: Option<Mapping>,
// 记录在订阅中包括merge和script生成的出现过的keys // 记录在订阅中包括merge和script生成的出现过的keys
// 这些keys不一定都生效 // 这些keys不一定都生效
// TODO 或许我们可以用 hashset 来存储以提升查询效率
pub exists_keys: Vec<String>, pub exists_keys: Vec<String>,
// TODO 或许可以用 FixMap 来存储以提升效率
pub chain_logs: HashMap<String, Vec<(String, String)>>, pub chain_logs: HashMap<String, Vec<(String, String)>>,
} }
@@ -49,49 +49,7 @@ impl IRuntime {
} }
} }
//跟新链式代理配置文件 // 传入none 为删除
/// {
/// "proxies":[
/// {
/// name : 入口节点,
/// type: xxx
/// server: xxx
/// port: xxx
/// ports: xxx
/// password: xxx
/// skip-cert-verify: xxx,
/// },
/// {
/// name : hop_node_1_xxxx,
/// type: xxx
/// server: xxx
/// port: xxx
/// ports: xxx
/// password: xxx
/// skip-cert-verify: xxx,
/// dialer-proxy : "入口节点"
/// },
/// {
/// name : 出口节点,
/// type: xxx
/// server: xxx
/// port: xxx
/// ports: xxx
/// password: xxx
/// skip-cert-verify: xxx,
/// dialer-proxy : "hop_node_1_xxxx"
/// }
/// ],
/// "proxy-groups" : [
/// {
/// name : "proxy_chain",
/// type: "select",
/// proxies ["出口节点"]
/// }
/// ]
/// }
///
/// 传入none 为删除
pub fn update_proxy_chain_config(&mut self, proxy_chain_config: Option<Value>) { pub fn update_proxy_chain_config(&mut self, proxy_chain_config: Option<Value>) {
if let Some(config) = self.config.as_mut() { if let Some(config) = self.config.as_mut() {
if let Some(Value::Sequence(proxies)) = config.get_mut("proxies") { if let Some(Value::Sequence(proxies)) = config.get_mut("proxies") {
@@ -121,3 +79,16 @@ impl IRuntime {
} }
} }
} }
// TODO 完整迁移 enhance 行为后移除
fn use_keys(config: &Mapping) -> Vec<String> {
config
.iter()
.filter_map(|(key, _)| key.as_str())
.map(|s: &str| {
let mut s: String = s.into();
s.make_ascii_lowercase();
s
})
.collect()
}

View File

@@ -33,6 +33,7 @@ tauri-build = { version = "2.5.2", features = [] }
clash-verge-draft = { workspace = true } clash-verge-draft = { workspace = true }
clash-verge-logging = { workspace = true } clash-verge-logging = { workspace = true }
clash-verge-signal = { workspace = true } clash-verge-signal = { workspace = true }
clash-verge-types = { workspace = true }
tauri-plugin-clash-verge-sysinfo = { workspace = true } tauri-plugin-clash-verge-sysinfo = { workspace = true }
tauri = { workspace = true, features = [ tauri = { workspace = true, features = [
"protocol-asset", "protocol-asset",
@@ -47,19 +48,20 @@ tokio = { workspace = true }
compact_str = { workspace = true } compact_str = { workspace = true }
flexi_logger = { workspace = true } flexi_logger = { workspace = true }
log = { workspace = true } log = { workspace = true }
serde = { workspace = true, features = ["derive"] }
serde_json = { workspace = true }
serde_yaml_ng = { workspace = true }
smartstring = { workspace = true, features = ["serde"] }
warp = { version = "0.4.2", features = ["server"] } warp = { version = "0.4.2", features = ["server"] }
open = "5.3.3" open = "5.3.3"
dunce = "1.0.5" dunce = "1.0.5"
nanoid = "0.4" nanoid = "0.4"
chrono = "0.4.42" chrono = "0.4.42"
boa_engine = "0.21.0" boa_engine = "0.21.0"
serde_json = "1.0.145"
serde_yaml_ng = "0.10.0"
once_cell = { version = "1.21.3", features = ["parking_lot"] } once_cell = { version = "1.21.3", features = ["parking_lot"] }
port_scanner = "0.1.5" port_scanner = "0.1.5"
delay_timer = "0.11.6" delay_timer = "0.11.6"
percent-encoding = "2.3.2" percent-encoding = "2.3.2"
serde = { version = "1.0.228", features = ["derive"] }
reqwest = { version = "0.12.24", features = ["json", "cookies"] } reqwest = { version = "0.12.24", features = ["json", "cookies"] }
regex = "1.12.2" regex = "1.12.2"
sysproxy = { git = "https://github.com/clash-verge-rev/sysproxy-rs", features = [ sysproxy = { git = "https://github.com/clash-verge-rev/sysproxy-rs", features = [
@@ -91,7 +93,6 @@ tauri-plugin-devtools = { version = "2.0.1" }
tauri-plugin-mihomo = { git = "https://github.com/clash-verge-rev/tauri-plugin-mihomo" } tauri-plugin-mihomo = { git = "https://github.com/clash-verge-rev/tauri-plugin-mihomo" }
clash_verge_logger = { git = "https://github.com/clash-verge-rev/clash-verge-logger" } clash_verge_logger = { git = "https://github.com/clash-verge-rev/clash-verge-logger" }
async-trait = "0.1.89" async-trait = "0.1.89"
smartstring = { version = "1.0.1", features = ["serde"] }
clash_verge_service_ipc = { version = "2.0.21", features = [ clash_verge_service_ipc = { version = "2.0.21", features = [
"client", "client",
], git = "https://github.com/clash-verge-rev/clash-verge-service-ipc" } ], git = "https://github.com/clash-verge-rev/clash-verge-service-ipc" }

View File

@@ -1,4 +1,4 @@
use super::{IClashTemp, IProfiles, IRuntime, IVerge}; use super::{IClashTemp, IProfiles, IVerge};
use crate::{ use crate::{
cmd, cmd,
config::{PrfItem, profiles_append_item_safe}, config::{PrfItem, profiles_append_item_safe},
@@ -11,6 +11,7 @@ use anyhow::{Result, anyhow};
use backoff::{Error as BackoffError, ExponentialBackoff}; use backoff::{Error as BackoffError, ExponentialBackoff};
use clash_verge_draft::Draft; use clash_verge_draft::Draft;
use clash_verge_logging::{Type, logging, logging_error}; use clash_verge_logging::{Type, logging, logging_error};
use clash_verge_types::runtime::IRuntime;
use smartstring::alias::String; use smartstring::alias::String;
use std::path::PathBuf; use std::path::PathBuf;
use tokio::sync::OnceCell; use tokio::sync::OnceCell;

View File

@@ -4,10 +4,9 @@ mod config;
mod encrypt; mod encrypt;
mod prfitem; mod prfitem;
pub mod profiles; pub mod profiles;
mod runtime;
mod verge; mod verge;
pub use self::{clash::*, config::*, encrypt::*, prfitem::*, profiles::*, runtime::*, verge::*}; pub use self::{clash::*, config::*, encrypt::*, prfitem::*, profiles::*, verge::*};
pub const DEFAULT_PAC: &str = r#"function FindProxyForURL(url, host) { pub const DEFAULT_PAC: &str = r#"function FindProxyForURL(url, host) {
return "PROXY 127.0.0.1:%mixed-port%; SOCKS5 127.0.0.1:%mixed-port%; DIRECT;"; return "PROXY 127.0.0.1:%mixed-port%; SOCKS5 127.0.0.1:%mixed-port%; DIRECT;";

View File

@@ -1,12 +1,13 @@
use super::CoreManager; use super::CoreManager;
use crate::{ use crate::{
config::{Config, ConfigType, IRuntime}, config::{Config, ConfigType},
constants::timing, constants::timing,
core::{handle, validate::CoreConfigValidator}, core::{handle, validate::CoreConfigValidator},
utils::{dirs, help}, utils::{dirs, help},
}; };
use anyhow::{Result, anyhow}; use anyhow::{Result, anyhow};
use clash_verge_logging::{Type, logging}; use clash_verge_logging::{Type, logging};
use clash_verge_types::runtime::IRuntime;
use smartstring::alias::String; use smartstring::alias::String;
use std::{path::PathBuf, time::Instant}; use std::{path::PathBuf, time::Instant};
use tauri_plugin_mihomo::Error as MihomoError; use tauri_plugin_mihomo::Error as MihomoError;