diff --git a/.github/workflows/alpha.yml b/.github/workflows/alpha.yml index 73d1fb6a..bb013da9 100644 --- a/.github/workflows/alpha.yml +++ b/.github/workflows/alpha.yml @@ -30,17 +30,6 @@ jobs: - name: Checkout Repository uses: actions/checkout@v4 - - name: Apply Patch - if: matrix.target == 'aarch64-pc-windows-msvc' - run: | - git config --global user.email "clash-verge-rev@github.io" - git config --global user.name "clash-verge-rev" - git am patches/support-windows-aarch64.patch - - - name: Init Submodule - if: matrix.target == 'aarch64-pc-windows-msvc' - run: git submodule update --init --recursive - - name: Install Rust Stable uses: dtolnay/rust-toolchain@stable @@ -57,7 +46,7 @@ jobs: with: node-version: "20" - - uses: pnpm/action-setup@v2 + - uses: pnpm/action-setup@v3 name: Install pnpm with: version: 8 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c5c49999..d049f898 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -27,17 +27,6 @@ jobs: - name: Checkout Repository uses: actions/checkout@v4 - - name: Apply Patch - if: matrix.target == 'aarch64-pc-windows-msvc' - run: | - git config --global user.email "clash-verge-rev@github.io" - git config --global user.name "clash-verge-rev" - git am patches/support-windows-aarch64.patch - - - name: Init Submodule - if: matrix.target == 'aarch64-pc-windows-msvc' - run: git submodule update --init --recursive - - name: Install Rust Stable uses: dtolnay/rust-toolchain@stable @@ -54,7 +43,7 @@ jobs: with: node-version: "20" - - uses: pnpm/action-setup@v2 + - uses: pnpm/action-setup@v3 name: Install pnpm with: version: 8 diff --git a/patches/support-windows-aarch64.patch b/patches/support-windows-aarch64.patch deleted file mode 100644 index 3befdd72..00000000 --- a/patches/support-windows-aarch64.patch +++ /dev/null @@ -1,195 +0,0 @@ -From 871c9a6d1ed014c93da2436a437df03734e9f76c Mon Sep 17 00:00:00 2001 -From: MystiPanda -Date: Sun, 10 Dec 2023 19:47:45 +0800 -Subject: [PATCH] feat: Support windows aarch64 - ---- - .gitmodules | 3 + - src-tauri/Cargo.toml | 2 +- - src-tauri/quick-rs | 1 + - src-tauri/src/enhance/script.rs | 130 +++++++++++++++++++------------- - 4 files changed, 81 insertions(+), 55 deletions(-) - create mode 100644 .gitmodules - create mode 160000 src-tauri/quick-rs - -diff --git a/.gitmodules b/.gitmodules -new file mode 100644 -index 0000000..2eda7e4 ---- /dev/null -+++ b/.gitmodules -@@ -0,0 +1,3 @@ -+[submodule "src-tauri/quick-rs"] -+ path = src-tauri/quick-rs -+ url = https://github.com/clash-verge-rev/quick-rs.git -diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml -index 2f1a3be..d67f6ed 100644 ---- a/src-tauri/Cargo.toml -+++ b/src-tauri/Cargo.toml -@@ -25,7 +25,6 @@ log4rs = "1" - nanoid = "0.4" - chrono = "0.4" - sysinfo = "0.30" --rquickjs = "0.3" # 高版本不支持 Linux aarch64 - serde_json = "1.0" - serde_yaml = "0.9" - once_cell = "1.18" -@@ -33,6 +32,7 @@ port_scanner = "0.1.5" - delay_timer = "0.11.5" - parking_lot = "0.12" - percent-encoding = "2.3.1" -+quick-rs = { path = "quick-rs" } - window-shadows = { version = "0.2" } - tokio = { version = "1", features = ["full"] } - serde = { version = "1.0", features = ["derive"] } -diff --git a/src-tauri/quick-rs b/src-tauri/quick-rs -new file mode 160000 -index 0000000..78277c4 ---- /dev/null -+++ b/src-tauri/quick-rs -@@ -0,0 +1 @@ -+Subproject commit 78277c4509c64f18c0fc5c9f2b84671de7c83343 -diff --git a/src-tauri/src/enhance/script.rs b/src-tauri/src/enhance/script.rs -index 30a922f..d47dc33 100644 ---- a/src-tauri/src/enhance/script.rs -+++ b/src-tauri/src/enhance/script.rs -@@ -3,61 +3,83 @@ use anyhow::Result; - use serde_yaml::Mapping; - - pub fn use_script(script: String, config: Mapping) -> Result<(Mapping, Vec<(String, String)>)> { -- use rquickjs::{function::Func, Context, Runtime}; -- use std::sync::{Arc, Mutex}; -- -- let runtime = Runtime::new().unwrap(); -- let context = Context::full(&runtime).unwrap(); -- let outputs = Arc::new(Mutex::new(vec![])); -- -- let copy_outputs = outputs.clone(); -- let result = context.with(|ctx| -> Result { -- ctx.globals().set( -- "__verge_log__", -- Func::from(move |level: String, data: String| { -- let mut out = copy_outputs.lock().unwrap(); -- out.push((level, data)); -- }), -- )?; -- -- ctx.eval( -- r#"var console = Object.freeze({ -- log(data){__verge_log__("log",JSON.stringify(data))}, -- info(data){__verge_log__("info",JSON.stringify(data))}, -- error(data){__verge_log__("error",JSON.stringify(data))}, -- debug(data){__verge_log__("debug",JSON.stringify(data))}, -- });"#, -- )?; -- -- let config = use_lowercase(config.clone()); -- let config_str = serde_json::to_string(&config)?; -- -- let code = format!( -- r#"try{{ -+ use quick_rs::{context::Context, function::Function, module::Module, runtime::Runtime}; -+ -+ let config = use_lowercase(config.clone()); -+ let config_str = serde_json::to_string(&config)?; -+ -+ let runtime = Runtime::new(); -+ let context = Context::from(&runtime); -+ -+ let code = format!( -+ r#" -+ let output = []; -+ -+ function __verge_log__(type, data) {{ -+ output.push([type, data]); -+ }} -+ -+ var console = Object.freeze({{ -+ log(data) {{ __verge_log__("log", JSON.stringify(data)) }}, -+ info(data) {{ __verge_log__("info", JSON.stringify(data)) }}, -+ error(data) {{ __verge_log__("error", JSON.stringify(data)) }}, -+ debug(data) {{ __verge_log__("debug", JSON.stringify(data)) }}, -+ }}); -+ - {script}; -- JSON.stringify(main({config_str})||'') -- }} catch(err) {{ -- `__error_flag__ ${{err.toString()}}` -- }}"# -- ); -- let result: String = ctx.eval(code.as_str())?; -- if result.starts_with("__error_flag__") { -- anyhow::bail!(result[15..].to_owned()); -- } -- if result == "\"\"" { -- anyhow::bail!("main function should return object"); -- } -- Ok(serde_json::from_str::(result.as_str())?) -- }); -- -- let mut out = outputs.lock().unwrap(); -- match result { -- Ok(config) => Ok((use_lowercase(config), out.to_vec())), -- Err(err) => { -- out.push(("exception".into(), err.to_string())); -- Ok((config, out.to_vec())) -- } -- } -+ -+ export function _main(){{ -+ try{{ -+ let result = JSON.stringify(main({config_str})||""); -+ return JSON.stringify({{result, output}}); -+ }} catch(err) {{ -+ output.push(["exception", err.toString()]); -+ return JSON.stringify({{result: "__error__", output}}); -+ }} -+ }} -+ "# -+ ); -+ let value = context.eval_module(&code, "_main")?; -+ let module = Module::new(value)?; -+ let value = module.get("_main")?; -+ let function = Function::new(value)?; -+ let value = function.call(vec![])?; -+ let result = serde_json::from_str::(&value.to_string()?)?; -+ result -+ .as_object() -+ .map(|obj| { -+ let result = obj.get("result").unwrap().as_str().unwrap(); -+ let output = obj.get("output").unwrap(); -+ -+ let mut out = output -+ .as_array() -+ .unwrap() -+ .iter() -+ .map(|item| { -+ let item = item.as_array().unwrap(); -+ ( -+ item[0].as_str().unwrap().into(), -+ item[1].as_str().unwrap().into(), -+ ) -+ }) -+ .collect::>(); -+ if result.is_empty() { -+ anyhow::bail!("main function should return object"); -+ } -+ if result == "__error__" { -+ return Ok((config, out.to_vec())); -+ } -+ let result = serde_json::from_str::(result); -+ -+ match result { -+ Ok(config) => Ok((use_lowercase(config), out.to_vec())), -+ Err(err) => { -+ out.push(("exception".into(), err.to_string())); -+ Ok((config, out.to_vec())) -+ } -+ } -+ }) -+ .unwrap_or_else(|| anyhow::bail!("Unknown result")) - } - - #[test] --- -2.43.0.windows.1 - diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index dceb7ab0..4c09facd 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -438,6 +438,144 @@ dependencies = [ "tracing", ] +[[package]] +name = "boa_ast" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73498e9b2f0aa7db74977afa4d594657611e90587abf0dd564c0b55b4a130163" +dependencies = [ + "bitflags 2.4.2", + "boa_interner", + "boa_macros", + "indexmap 2.2.2", + "num-bigint", + "rustc-hash", +] + +[[package]] +name = "boa_engine" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16377479d5d6d33896e7acdd1cc698d04a8f72004025bbbddf47558cd29146a6" +dependencies = [ + "bitflags 2.4.2", + "boa_ast", + "boa_gc", + "boa_icu_provider", + "boa_interner", + "boa_macros", + "boa_parser", + "boa_profiler", + "chrono", + "dashmap 5.5.3", + "fast-float", + "icu_normalizer", + "indexmap 2.2.2", + "itertools", + "num-bigint", + "num-integer", + "num-traits", + "num_enum 0.6.1", + "once_cell", + "pollster", + "rand 0.8.5", + "regress", + "rustc-hash", + "ryu-js", + "serde", + "serde_json", + "sptr", + "static_assertions", + "tap", + "thin-vec", + "thiserror", +] + +[[package]] +name = "boa_gc" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c97b44beaef9d4452342d117d94607fdfa8d474280f1ba0fd97853834e3a49b2" +dependencies = [ + "boa_macros", + "boa_profiler", + "thin-vec", +] + +[[package]] +name = "boa_icu_provider" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b30e52e34e451dd0bfc2c654a9a43ed34b0073dbd4ae3394b40313edda8627aa" +dependencies = [ + "icu_collections", + "icu_normalizer", + "icu_properties", + "icu_provider", + "icu_provider_adapters", + "icu_provider_blob", + "once_cell", +] + +[[package]] +name = "boa_interner" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3e5afa991908cfbe79bd3109b824e473a1dc5f74f31fab91bb44c9e245daa77" +dependencies = [ + "boa_gc", + "boa_macros", + "hashbrown 0.14.3", + "indexmap 2.2.2", + "once_cell", + "phf 0.11.2", + "rustc-hash", + "static_assertions", +] + +[[package]] +name = "boa_macros" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "005fa0c5bd20805466dda55eb34cd709bb31a2592bb26927b47714eeed6914d8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", + "synstructure", +] + +[[package]] +name = "boa_parser" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e09afb035377a9044443b598187a7d34cd13164617182a4d7c348522ee3f052" +dependencies = [ + "bitflags 2.4.2", + "boa_ast", + "boa_icu_provider", + "boa_interner", + "boa_macros", + "boa_profiler", + "fast-float", + "icu_locid", + "icu_properties", + "icu_provider", + "icu_provider_macros", + "num-bigint", + "num-traits", + "once_cell", + "regress", + "rustc-hash", + "tinystr", +] + +[[package]] +name = "boa_profiler" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3190f92dfe48224adc92881c620f08ccf37ff62b91a094bb357fe53bd5e84647" + [[package]] name = "brotli" version = "3.4.0" @@ -602,6 +740,7 @@ version = "1.5.8" dependencies = [ "anyhow", "auto-launch", + "boa_engine", "chrono", "ctrlc", "deelevate", @@ -617,7 +756,6 @@ dependencies = [ "percent-encoding", "port_scanner", "reqwest", - "rquickjs", "runas", "serde", "serde_json", @@ -644,6 +782,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "cobs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" + [[package]] name = "cocoa" version = "0.24.1" @@ -802,6 +946,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "critical-section" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216" + [[package]] name = "cron_clock" version = "0.8.0" @@ -949,6 +1099,19 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.3", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "data-encoding" version = "2.5.0" @@ -980,7 +1143,7 @@ dependencies = [ "autocfg", "concat-idents", "cron_clock", - "dashmap", + "dashmap 4.0.2", "event-listener 2.5.3", "futures", "log 0.4.20", @@ -1121,6 +1284,17 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" +[[package]] +name = "displaydoc" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + [[package]] name = "dtoa" version = "1.0.9" @@ -1168,6 +1342,12 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + [[package]] name = "encoding_rs" version = "0.8.33" @@ -1283,6 +1463,12 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "fast-float" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95765f67b4b18863968b4a1bd5bb576f732b29a4a28c7cd84c09fa3e2875f33c" + [[package]] name = "fastrand" version = "1.9.0" @@ -1893,6 +2079,15 @@ dependencies = [ "ahash 0.7.7", ] +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.7", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -2103,6 +2298,122 @@ dependencies = [ "png", ] +[[package]] +name = "icu_collections" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef8302d8dfd6044d3ddb3f807a5ef3d7bbca9a574959c6d6e4dc39aa7012d0d5" +dependencies = [ + "displaydoc", + "serde", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3003f85dccfc0e238ff567693248c59153a46f4e6125ba4020b973cef4d1d335" +dependencies = [ + "displaydoc", + "litemap", + "serde", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "652869735c9fb9f5a64ba180ee16f2c848390469c116deef517ecc53f4343598" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_properties", + "icu_provider", + "serde", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_properties" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce0e1aa26851f16c9e04412a5911c86b7f8768dac8f8d4c5f1c568a7e5d7a434" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_provider", + "serde", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_provider" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dc312a7b6148f7dfe098047ae2494d12d4034f48ade58d4f353000db376e305" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "postcard", + "serde", + "stable_deref_trait", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_adapters" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4ae1e2bd0c41728b77e7c46e9afdec5e2127d1eedacc684724667d50c126bd3" +dependencies = [ + "icu_locid", + "icu_provider", + "serde", + "tinystr", + "yoke", + "zerovec", +] + +[[package]] +name = "icu_provider_blob" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd364c9a01f791a4bc04a74cf2a1d01d9f6926a40fd5ae1c28004e1e70d8338b" +dependencies = [ + "icu_provider", + "postcard", + "serde", + "writeable", + "yoke", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b728b9421e93eff1d9f8681101b78fa745e0748c95c655c83f337044a7e10" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -2261,6 +2572,15 @@ dependencies = [ "once_cell", ] +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.8" @@ -2440,6 +2760,12 @@ version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +[[package]] +name = "litemap" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d642685b028806386b2b6e75685faadd3eb65a85fff7df711ce18446a422da" + [[package]] name = "lock_api" version = "0.4.11" @@ -2725,7 +3051,7 @@ dependencies = [ "bitflags 1.3.2", "jni-sys", "ndk-sys", - "num_enum", + "num_enum 0.5.11", "thiserror", ] @@ -2844,6 +3170,18 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", + "serde", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -2861,6 +3199,15 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.18" @@ -2886,7 +3233,16 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" dependencies = [ - "num_enum_derive", + "num_enum_derive 0.5.11", +] + +[[package]] +name = "num_enum" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +dependencies = [ + "num_enum_derive 0.6.1", ] [[package]] @@ -2901,6 +3257,18 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "num_enum_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.48", +] + [[package]] name = "objc" version = "0.2.7" @@ -2954,6 +3322,10 @@ name = "once_cell" version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +dependencies = [ + "critical-section", + "portable-atomic", +] [[package]] name = "opaque-debug" @@ -3410,12 +3782,35 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "pollster" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22686f4785f02a4fcc856d3b3bb19bf6c8160d103f7a99cc258bddd0251dc7f2" + [[package]] name = "port_scanner" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "325a6d2ac5dee293c3b2612d4993b98aec1dff096b0a2dae70ed7d95784a05da" +[[package]] +name = "portable-atomic" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" + +[[package]] +name = "postcard" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a55c51ee6c0db07e68448e336cf8ea4131a620edefebf9893e759b2d793420f8" +dependencies = [ + "cobs", + "embedded-io", + "serde", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -3709,6 +4104,16 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +[[package]] +name = "regress" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82a9ecfa0cb04d0b04dddb99b8ccf4f66bc8dfd23df694b398570bd8ae3a50fb" +dependencies = [ + "hashbrown 0.13.2", + "memchr", +] + [[package]] name = "reqwest" version = "0.11.24" @@ -3793,33 +4198,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "rquickjs" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db7788c2818f4546daabe9ae2d1ee2f4db61ab1998d4b483494c4193cc38dab" -dependencies = [ - "rquickjs-core", -] - -[[package]] -name = "rquickjs-core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b12cf8646fe0af5bcff2822ccd162990f0679a1f9287c7257f4f4193a9d31ea9" -dependencies = [ - "rquickjs-sys", -] - -[[package]] -name = "rquickjs-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b747058afd4d988d056e4972ec8516a5a86fdfc103c1c1485bfee8966a0743ae" -dependencies = [ - "cc", -] - [[package]] name = "rs-snowflake" version = "0.6.0" @@ -3842,6 +4220,12 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc_version" version = "0.2.3" @@ -3930,6 +4314,12 @@ version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +[[package]] +name = "ryu-js" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6518fc26bced4d53678a22d6e423e9d8716377def84545fe328236e3af070e7f" + [[package]] name = "safemem" version = "0.3.3" @@ -4390,6 +4780,12 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "sptr" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -4477,6 +4873,17 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + [[package]] name = "sysinfo" version = "0.30.5" @@ -4612,6 +5019,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "tar" version = "0.4.40" @@ -4922,6 +5335,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" +[[package]] +name = "thin-vec" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a38c90d48152c236a3ab59271da4f4ae63d678c5d7ad6b7714d7cb9760be5e4b" + [[package]] name = "thiserror" version = "1.0.56" @@ -5013,6 +5432,17 @@ dependencies = [ "time-core", ] +[[package]] +name = "tinystr" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8faa444297615a4e020acb64146b0603c9c395c03a97c17fd9028816d3b4d63e" +dependencies = [ + "displaydoc", + "serde", + "zerovec", +] + [[package]] name = "tinyvec" version = "1.6.0" @@ -5398,12 +5828,24 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + [[package]] name = "utf8-ranges" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcfc827f90e53a02eaef5e535ee14266c1d569214c6aa70133a624d8a3164ba" +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.1" @@ -6221,6 +6663,18 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dad7bb64b8ef9c0aa27b6da38b452b0ee9fd82beaf276a87dd796fb55cbae14e" + [[package]] name = "wry" version = "0.24.7" @@ -6323,6 +6777,30 @@ dependencies = [ "winapi", ] +[[package]] +name = "yoke" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65e71b2e4f287f467794c671e2b8f8a5f3716b3c829079a1c44740148eff07e4" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e6936f0cce458098a201c245a11bef556c6a0181129c7034d10d76d1ec3a2b8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", + "synstructure", +] + [[package]] name = "zbus" version = "3.15.0" @@ -6409,6 +6887,50 @@ dependencies = [ "syn 2.0.48", ] +[[package]] +name = "zerofrom" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "655b0814c5c0b19ade497851070c640773304939a6c0fd5f5fb43da0696d05b7" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6a647510471d372f2e6c2e6b7219e44d8c574d24fdc11c610a61455782f18c3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", + "synstructure", +] + +[[package]] +name = "zerovec" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "591691014119b87047ead4dcf3e6adfbf73cb7c38ab6980d4f18a32138f35d46" +dependencies = [ + "serde", + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a4a1638a1934450809c2266a70362bfc96cd90550c073f5b8a55014d1010157" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + [[package]] name = "zip" version = "0.6.6" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 2990c2c5..a22f2778 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -25,7 +25,6 @@ log4rs = "1" nanoid = "0.4" chrono = "0.4" sysinfo = "0.30" -rquickjs = "0.3" # 高版本不支持 Linux aarch64 serde_json = "1.0" serde_yaml = "0.9" once_cell = "1.18" @@ -40,6 +39,7 @@ reqwest = { version = "0.11", features = ["json", "rustls-tls"] } sysproxy = { git="https://github.com/zzzgydi/sysproxy-rs", branch = "main" } auto-launch = { git="https://github.com/zzzgydi/auto-launch", branch = "main" } tauri = { version = "1.5", features = [ "path-all", "protocol-asset", "dialog-open", "notification-all", "icon-png", "clipboard-all", "global-shortcut-all", "process-all", "shell-all", "system-tray", "updater", "window-all", "devtools"] } +boa_engine = "0.17.3" [target.'cfg(windows)'.dependencies] runas = "=1.0.0" # 高版本会返回错误 Status diff --git a/src-tauri/src/enhance/script.rs b/src-tauri/src/enhance/script.rs index 30a922f6..bb5ee2ea 100644 --- a/src-tauri/src/enhance/script.rs +++ b/src-tauri/src/enhance/script.rs @@ -1,62 +1,75 @@ use super::use_lowercase; -use anyhow::Result; +use anyhow::{Error, Result}; use serde_yaml::Mapping; pub fn use_script(script: String, config: Mapping) -> Result<(Mapping, Vec<(String, String)>)> { - use rquickjs::{function::Func, Context, Runtime}; + use boa_engine::{native_function::NativeFunction, Context, JsValue, Source}; use std::sync::{Arc, Mutex}; + let mut context = Context::default(); - let runtime = Runtime::new().unwrap(); - let context = Context::full(&runtime).unwrap(); let outputs = Arc::new(Mutex::new(vec![])); let copy_outputs = outputs.clone(); - let result = context.with(|ctx| -> Result { - ctx.globals().set( + unsafe { + let _ = context.register_global_builtin_callable( "__verge_log__", - Func::from(move |level: String, data: String| { - let mut out = copy_outputs.lock().unwrap(); - out.push((level, data)); - }), - )?; - - ctx.eval( - r#"var console = Object.freeze({ + 2, + NativeFunction::from_closure( + move |_: &JsValue, args: &[JsValue], context: &mut Context| { + let level = args.get(0).unwrap().to_string(context)?; + let level = level.to_std_string().unwrap(); + let data = args.get(1).unwrap().to_string(context)?; + let data = data.to_std_string().unwrap(); + let mut out = copy_outputs.lock().unwrap(); + out.push((level, data)); + Ok(JsValue::undefined()) + }, + ), + ); + } + let _ = context.eval(Source::from_bytes( + r#"var console = Object.freeze({ log(data){__verge_log__("log",JSON.stringify(data))}, info(data){__verge_log__("info",JSON.stringify(data))}, error(data){__verge_log__("error",JSON.stringify(data))}, debug(data){__verge_log__("debug",JSON.stringify(data))}, });"#, - )?; + )); - let config = use_lowercase(config.clone()); - let config_str = serde_json::to_string(&config)?; + let config = use_lowercase(config.clone()); + let config_str = serde_json::to_string(&config)?; - let code = format!( - r#"try{{ + let code = format!( + r#"try{{ {script}; JSON.stringify(main({config_str})||'') }} catch(err) {{ `__error_flag__ ${{err.toString()}}` }}"# - ); - let result: String = ctx.eval(code.as_str())?; + ); + if let Ok(result) = context.eval(Source::from_bytes(code.as_str())) { + if !result.is_string() { + anyhow::bail!("main function should return object"); + } + let result = result.to_string(&mut context).unwrap(); + let result = result.to_std_string().unwrap(); if result.starts_with("__error_flag__") { anyhow::bail!(result[15..].to_owned()); } if result == "\"\"" { anyhow::bail!("main function should return object"); } - Ok(serde_json::from_str::(result.as_str())?) - }); - - let mut out = outputs.lock().unwrap(); - match result { - Ok(config) => Ok((use_lowercase(config), out.to_vec())), - Err(err) => { - out.push(("exception".into(), err.to_string())); - Ok((config, out.to_vec())) + let res: Result = Ok(serde_json::from_str::(result.as_str())?); + let mut out = outputs.lock().unwrap(); + match res { + Ok(config) => Ok((use_lowercase(config), out.to_vec())), + Err(err) => { + out.push(("exception".into(), err.to_string())); + Ok((config, out.to_vec())) + } } + } else { + anyhow::bail!("main function should return object"); } }