support-windows-aarch64.patch 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. From 871c9a6d1ed014c93da2436a437df03734e9f76c Mon Sep 17 00:00:00 2001
  2. From: MystiPanda <mystipanda@proton.me>
  3. Date: Sun, 10 Dec 2023 19:47:45 +0800
  4. Subject: [PATCH] feat: Support windows aarch64
  5. ---
  6. .gitmodules | 3 +
  7. src-tauri/Cargo.toml | 2 +-
  8. src-tauri/quick-rs | 1 +
  9. src-tauri/src/enhance/script.rs | 130 +++++++++++++++++++-------------
  10. 4 files changed, 81 insertions(+), 55 deletions(-)
  11. create mode 100644 .gitmodules
  12. create mode 160000 src-tauri/quick-rs
  13. diff --git a/.gitmodules b/.gitmodules
  14. new file mode 100644
  15. index 0000000..2eda7e4
  16. --- /dev/null
  17. +++ b/.gitmodules
  18. @@ -0,0 +1,3 @@
  19. +[submodule "src-tauri/quick-rs"]
  20. + path = src-tauri/quick-rs
  21. + url = https://github.com/clash-verge-rev/quick-rs.git
  22. diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml
  23. index 2f1a3be..d67f6ed 100644
  24. --- a/src-tauri/Cargo.toml
  25. +++ b/src-tauri/Cargo.toml
  26. @@ -25,7 +25,6 @@ log4rs = "1"
  27. nanoid = "0.4"
  28. chrono = "0.4"
  29. sysinfo = "0.30"
  30. -rquickjs = "0.3" # 高版本不支持 Linux aarch64
  31. serde_json = "1.0"
  32. serde_yaml = "0.9"
  33. once_cell = "1.18"
  34. @@ -33,6 +32,7 @@ port_scanner = "0.1.5"
  35. delay_timer = "0.11.5"
  36. parking_lot = "0.12"
  37. percent-encoding = "2.3.1"
  38. +quick-rs = { path = "quick-rs" }
  39. window-shadows = { version = "0.2" }
  40. tokio = { version = "1", features = ["full"] }
  41. serde = { version = "1.0", features = ["derive"] }
  42. diff --git a/src-tauri/quick-rs b/src-tauri/quick-rs
  43. new file mode 160000
  44. index 0000000..78277c4
  45. --- /dev/null
  46. +++ b/src-tauri/quick-rs
  47. @@ -0,0 +1 @@
  48. +Subproject commit 78277c4509c64f18c0fc5c9f2b84671de7c83343
  49. diff --git a/src-tauri/src/enhance/script.rs b/src-tauri/src/enhance/script.rs
  50. index 30a922f..d47dc33 100644
  51. --- a/src-tauri/src/enhance/script.rs
  52. +++ b/src-tauri/src/enhance/script.rs
  53. @@ -3,61 +3,83 @@ use anyhow::Result;
  54. use serde_yaml::Mapping;
  55. pub fn use_script(script: String, config: Mapping) -> Result<(Mapping, Vec<(String, String)>)> {
  56. - use rquickjs::{function::Func, Context, Runtime};
  57. - use std::sync::{Arc, Mutex};
  58. -
  59. - let runtime = Runtime::new().unwrap();
  60. - let context = Context::full(&runtime).unwrap();
  61. - let outputs = Arc::new(Mutex::new(vec![]));
  62. -
  63. - let copy_outputs = outputs.clone();
  64. - let result = context.with(|ctx| -> Result<Mapping> {
  65. - ctx.globals().set(
  66. - "__verge_log__",
  67. - Func::from(move |level: String, data: String| {
  68. - let mut out = copy_outputs.lock().unwrap();
  69. - out.push((level, data));
  70. - }),
  71. - )?;
  72. -
  73. - ctx.eval(
  74. - r#"var console = Object.freeze({
  75. - log(data){__verge_log__("log",JSON.stringify(data))},
  76. - info(data){__verge_log__("info",JSON.stringify(data))},
  77. - error(data){__verge_log__("error",JSON.stringify(data))},
  78. - debug(data){__verge_log__("debug",JSON.stringify(data))},
  79. - });"#,
  80. - )?;
  81. -
  82. - let config = use_lowercase(config.clone());
  83. - let config_str = serde_json::to_string(&config)?;
  84. -
  85. - let code = format!(
  86. - r#"try{{
  87. + use quick_rs::{context::Context, function::Function, module::Module, runtime::Runtime};
  88. +
  89. + let config = use_lowercase(config.clone());
  90. + let config_str = serde_json::to_string(&config)?;
  91. +
  92. + let runtime = Runtime::new();
  93. + let context = Context::from(&runtime);
  94. +
  95. + let code = format!(
  96. + r#"
  97. + let output = [];
  98. +
  99. + function __verge_log__(type, data) {{
  100. + output.push([type, data]);
  101. + }}
  102. +
  103. + var console = Object.freeze({{
  104. + log(data) {{ __verge_log__("log", JSON.stringify(data)) }},
  105. + info(data) {{ __verge_log__("info", JSON.stringify(data)) }},
  106. + error(data) {{ __verge_log__("error", JSON.stringify(data)) }},
  107. + debug(data) {{ __verge_log__("debug", JSON.stringify(data)) }},
  108. + }});
  109. +
  110. {script};
  111. - JSON.stringify(main({config_str})||'')
  112. - }} catch(err) {{
  113. - `__error_flag__ ${{err.toString()}}`
  114. - }}"#
  115. - );
  116. - let result: String = ctx.eval(code.as_str())?;
  117. - if result.starts_with("__error_flag__") {
  118. - anyhow::bail!(result[15..].to_owned());
  119. - }
  120. - if result == "\"\"" {
  121. - anyhow::bail!("main function should return object");
  122. - }
  123. - Ok(serde_json::from_str::<Mapping>(result.as_str())?)
  124. - });
  125. -
  126. - let mut out = outputs.lock().unwrap();
  127. - match result {
  128. - Ok(config) => Ok((use_lowercase(config), out.to_vec())),
  129. - Err(err) => {
  130. - out.push(("exception".into(), err.to_string()));
  131. - Ok((config, out.to_vec()))
  132. - }
  133. - }
  134. +
  135. + export function _main(){{
  136. + try{{
  137. + let result = JSON.stringify(main({config_str})||"");
  138. + return JSON.stringify({{result, output}});
  139. + }} catch(err) {{
  140. + output.push(["exception", err.toString()]);
  141. + return JSON.stringify({{result: "__error__", output}});
  142. + }}
  143. + }}
  144. + "#
  145. + );
  146. + let value = context.eval_module(&code, "_main")?;
  147. + let module = Module::new(value)?;
  148. + let value = module.get("_main")?;
  149. + let function = Function::new(value)?;
  150. + let value = function.call(vec![])?;
  151. + let result = serde_json::from_str::<serde_json::Value>(&value.to_string()?)?;
  152. + result
  153. + .as_object()
  154. + .map(|obj| {
  155. + let result = obj.get("result").unwrap().as_str().unwrap();
  156. + let output = obj.get("output").unwrap();
  157. +
  158. + let mut out = output
  159. + .as_array()
  160. + .unwrap()
  161. + .iter()
  162. + .map(|item| {
  163. + let item = item.as_array().unwrap();
  164. + (
  165. + item[0].as_str().unwrap().into(),
  166. + item[1].as_str().unwrap().into(),
  167. + )
  168. + })
  169. + .collect::<Vec<_>>();
  170. + if result.is_empty() {
  171. + anyhow::bail!("main function should return object");
  172. + }
  173. + if result == "__error__" {
  174. + return Ok((config, out.to_vec()));
  175. + }
  176. + let result = serde_json::from_str::<Mapping>(result);
  177. +
  178. + match result {
  179. + Ok(config) => Ok((use_lowercase(config), out.to_vec())),
  180. + Err(err) => {
  181. + out.push(("exception".into(), err.to_string()));
  182. + Ok((config, out.to_vec()))
  183. + }
  184. + }
  185. + })
  186. + .unwrap_or_else(|| anyhow::bail!("Unknown result"))
  187. }
  188. #[test]
  189. --
  190. 2.43.0.windows.1