Parcourir la source

refactor: Try to migrate to boa_engine

#634
MystiPanda il y a 1 an
Parent
commit
aa76a5c436

+ 1 - 12
.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

+ 1 - 12
.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

+ 0 - 195
patches/support-windows-aarch64.patch

@@ -1,195 +0,0 @@
-From 871c9a6d1ed014c93da2436a437df03734e9f76c Mon Sep 17 00:00:00 2001
-From: MystiPanda <mystipanda@proton.me>
-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<Mapping> {
--        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::<Mapping>(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::<serde_json::Value>(&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::<Vec<_>>();
-+            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::<Mapping>(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
-

+ 553 - 31
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"

+ 1 - 1
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

+ 43 - 30
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<Mapping> {
-        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::<Mapping>(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<Mapping, Error> = Ok(serde_json::from_str::<Mapping>(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");
     }
 }