From 945e1715b849490e715ac7200175f2a8c63ef581 Mon Sep 17 00:00:00 2001 From: Tunglies <77394545+Tunglies@users.noreply.github.com> Date: Wed, 25 Jun 2025 01:32:26 +0800 Subject: [PATCH] Refactor Mihomo API integration and remove crate_mihomo_api - Removed the `mihomo_api` crate and its dependencies from the project. - Introduced `IpcManager` for handling IPC communication with Mihomo. - Implemented IPC methods for managing proxies, connections, and configurations. - Updated `MihomoManager` to utilize `IpcManager` instead of the removed crate. - Added platform-specific IPC socket path handling for macOS, Linux, and Windows. - Cleaned up related tests and configuration files. --- src-tauri/Cargo.lock | 496 ++++++++++-------- src-tauri/Cargo.toml | 16 +- src-tauri/src/ipc/general.rs | 130 +++++ src-tauri/src/ipc/mod.rs | 3 + src-tauri/src/lib.rs | 1 + src-tauri/src/module/mihomo.rs | 17 +- src-tauri/src/utils/dirs.rs | 18 + src-tauri/src_crates/crate_mihomo_api/.env | 2 - .../src_crates/crate_mihomo_api/Cargo.toml | 11 - .../src_crates/crate_mihomo_api/src/lib.rs | 147 ------ .../src_crates/crate_mihomo_api/src/model.rs | 5 - .../crate_mihomo_api/tests/test_mihomo_api.rs | 7 - 12 files changed, 453 insertions(+), 400 deletions(-) create mode 100644 src-tauri/src/ipc/general.rs create mode 100644 src-tauri/src/ipc/mod.rs delete mode 100644 src-tauri/src_crates/crate_mihomo_api/.env delete mode 100644 src-tauri/src_crates/crate_mihomo_api/Cargo.toml delete mode 100644 src-tauri/src_crates/crate_mihomo_api/src/lib.rs delete mode 100644 src-tauri/src_crates/crate_mihomo_api/src/model.rs delete mode 100644 src-tauri/src_crates/crate_mihomo_api/tests/test_mihomo_api.rs diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index b4bce4de..29f7783f 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -2,6 +2,22 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "ab_glyph" +version = "0.2.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0f4f6fbdc5ee39f2ede9f5f3ec79477271a6d6a2baff22310d51736bda6cea" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2187590a23ab1e3df8681afdf0987c48504d80291f002fcdb651f0ef5e25169" + [[package]] name = "addr2line" version = "0.24.2" @@ -205,6 +221,9 @@ dependencies = [ "serde_repr", "tokio", "url", + "wayland-backend", + "wayland-client", + "wayland-protocols", "zbus", ] @@ -233,9 +252,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" dependencies = [ "concurrent-queue", "event-listener-strategy", @@ -356,25 +375,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "async-process" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde3f4e40e6021d7acffc90095cbd6dc54cb593903d1de5832f435eb274b85dc" -dependencies = [ - "async-channel 2.3.1", - "async-io 2.4.1", - "async-lock 3.4.0", - "async-signal", - "async-task", - "blocking", - "cfg-if", - "event-listener 5.3.0", - "futures-lite 2.6.0", - "rustix 1.0.7", - "tracing", -] - [[package]] name = "async-recursion" version = "1.1.1" @@ -505,9 +505,9 @@ dependencies = [ [[package]] name = "avif-serialize" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19135c0c7a60bfee564dbe44ab5ce0557c6bf3884e5291a50be76a15640c4fbd" +checksum = "2ea8ef51aced2b9191c08197f55450d830876d9933f8f48a429b354f1d496b42" dependencies = [ "arrayvec", ] @@ -661,11 +661,11 @@ dependencies = [ [[package]] name = "blocking" -version = "1.6.1" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" dependencies = [ - "async-channel 2.3.1", + "async-channel 2.5.0", "async-task", "futures-io", "futures-lite 2.6.0", @@ -958,7 +958,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02260d489095346e5cafd04dea8e8cb54d1d74fcd759022a9b72986ebe9a1257" dependencies = [ "serde", - "toml", + "toml 0.8.23", ] [[package]] @@ -969,9 +969,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.27" +version = "1.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" +checksum = "5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362" dependencies = [ "jobserver", "libc", @@ -1071,18 +1071,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.40" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f" +checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.40" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e" +checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d" dependencies = [ "anstyle", "clap_lex", @@ -1098,6 +1098,7 @@ checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" name = "clash-verge" version = "2.3.2" dependencies = [ + "ab_glyph", "aes-gcm", "anyhow", "async-trait", @@ -1105,7 +1106,6 @@ dependencies = [ "boa_engine", "chrono", "criterion", - "dashmap 7.0.0-rc2", "deelevate", "delay_timer", "dirs 6.0.0", @@ -1116,11 +1116,11 @@ dependencies = [ "hex", "hmac", "image", + "kode-bridge", "lazy_static", "libc", "log", "log4rs", - "mihomo_api", "nanoid", "network-interface", "once_cell", @@ -1149,13 +1149,13 @@ dependencies = [ "tauri-plugin-dialog", "tauri-plugin-fs", "tauri-plugin-global-shortcut", - "tauri-plugin-notification", "tauri-plugin-process", "tauri-plugin-shell", "tauri-plugin-updater", "tauri-plugin-window-state", "tempfile", "tokio", + "tungstenite 0.27.0", "users", "warp", "winapi", @@ -1578,20 +1578,6 @@ dependencies = [ "parking_lot_core", ] -[[package]] -name = "dashmap" -version = "7.0.0-rc2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a1e35a65fe0538a60167f0ada6e195ad5d477f6ddae273943596d4a1a5730b" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "equivalent", - "hashbrown 0.15.4", - "lock_api", - "parking_lot_core", -] - [[package]] name = "data-encoding" version = "2.9.0" @@ -1816,18 +1802,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" -[[package]] -name = "dispatch2" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a0d569e003ff27784e0e14e4a594048698e0c0f0b66cabcb51511be55a7caa0" -dependencies = [ - "bitflags 2.9.1", - "block2 0.6.1", - "libc", - "objc2 0.6.1", -] - [[package]] name = "dispatch2" version = "0.3.0" @@ -1835,6 +1809,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" dependencies = [ "bitflags 2.9.1", + "block2 0.6.1", + "libc", "objc2 0.6.1", ] @@ -1849,6 +1825,15 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading 0.8.8", +] + [[package]] name = "dlopen2" version = "0.7.0" @@ -1881,6 +1866,12 @@ dependencies = [ "const-random", ] +[[package]] +name = "doctest-file" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" + [[package]] name = "document-features" version = "0.2.11" @@ -1890,6 +1881,12 @@ dependencies = [ "litrs", ] +[[package]] +name = "dotenv" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" + [[package]] name = "downcast-rs" version = "1.2.1" @@ -1940,14 +1937,14 @@ checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "embed-resource" -version = "3.0.4" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0963f530273dc3022ab2bdc3fcd6d488e850256f2284a82b7413cb9481ee85dd" +checksum = "4c6d81016d6c977deefb2ef8d8290da019e27cc26167e102185da528e6c0ab38" dependencies = [ "cc", "memchr", "rustc_version 0.4.1", - "toml", + "toml 0.9.2", "vswhom", "winreg 0.55.0", ] @@ -1994,6 +1991,15 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "env" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc95de49ad098572c02d3fbf368c9a020bfff5ae78483685b77f51d8a7e9486d" +dependencies = [ + "num_threads", +] + [[package]] name = "equator" version = "0.4.2" @@ -2739,9 +2745,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" dependencies = [ "bytes", "fnv", @@ -3002,7 +3008,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.3.26", + "h2 0.3.27", "http 0.2.12", "http-body 0.4.6", "httparse", @@ -3083,9 +3089,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb" +checksum = "7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df" dependencies = [ "base64 0.22.1", "bytes", @@ -3487,6 +3493,21 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "interprocess" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d941b405bd2322993887859a8ee6ac9134945a24ec5ec763a8a962fc64dfec2d" +dependencies = [ + "doctest-file", + "futures-core", + "libc", + "recvmsg", + "tokio", + "widestring", + "windows-sys 0.52.0", +] + [[package]] name = "intrusive-collections" version = "0.9.7" @@ -3701,6 +3722,21 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "kode-bridge" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e04a2994f37fa3c40940dbf302050199607072ff826ff6c126e02c4faf34bd3a" +dependencies = [ + "dotenv", + "env", + "interprocess", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", +] + [[package]] name = "kuchikiki" version = "0.8.8-speedreader" @@ -3745,7 +3781,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" dependencies = [ "gtk-sys", - "libloading", + "libloading 0.7.4", "once_cell", ] @@ -3763,9 +3799,9 @@ checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] name = "libfuzzer-sys" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" +checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404" dependencies = [ "arbitrary", "cc", @@ -3781,6 +3817,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "libloading" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" +dependencies = [ + "cfg-if", + "windows-targets 0.53.2", +] + [[package]] name = "liblzma" version = "0.4.2" @@ -3952,18 +3998,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" -[[package]] -name = "mac-notification-sys" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b95dfb34071d1592b45622bf93e315e3a72d414b6782aca9a015c12bec367ef" -dependencies = [ - "cc", - "objc2 0.6.1", - "objc2-foundation 0.3.1", - "time", -] - [[package]] name = "malloc_buf" version = "0.0.6" @@ -4069,16 +4103,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "mihomo_api" -version = "0.0.0" -dependencies = [ - "reqwest", - "serde", - "serde_json", - "tokio", -] - [[package]] name = "mime" version = "0.3.17" @@ -4325,20 +4349,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" -[[package]] -name = "notify-rust" -version = "4.11.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6442248665a5aa2514e794af3b39661a8e73033b1cc5e59899e1276117ee4400" -dependencies = [ - "futures-lite 2.6.0", - "log", - "mac-notification-sys", - "serde", - "tauri-winrt-notification", - "zbus", -] - [[package]] name = "ntapi" version = "0.4.1" @@ -4540,7 +4550,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" dependencies = [ "bitflags 2.9.1", - "dispatch2 0.3.0", + "dispatch2", "objc2 0.6.1", ] @@ -4551,7 +4561,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" dependencies = [ "bitflags 2.9.1", - "dispatch2 0.3.0", + "dispatch2", "objc2 0.6.1", "objc2-core-foundation", "objc2-io-surface", @@ -4850,6 +4860,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "owned_ttf_parser" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" +dependencies = [ + "ttf-parser", +] + [[package]] name = "pango" version = "0.18.3" @@ -5181,13 +5200,13 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "plist" -version = "1.7.2" +version = "1.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d77244ce2d584cd84f6a15f86195b8c9b2a0dfbfd817c09e0464244091a58ed" +checksum = "3af6b589e163c5a788fab00ce0c0366f6efbb9959c2f9874b224936af7fce7e1" dependencies = [ "base64 0.22.1", "indexmap 2.10.0", - "quick-xml", + "quick-xml 0.38.0", "serde", "time", ] @@ -5497,6 +5516,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "quick-xml" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8927b0664f5c5a98265138b7e3f90aa19a6b21353182469ace36d4ac527b7b1b" +dependencies = [ + "memchr", +] + [[package]] name = "quinn" version = "0.11.8" @@ -5753,6 +5781,12 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "recvmsg" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" + [[package]] name = "redox_syscall" version = "0.5.13" @@ -5850,9 +5884,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "regress" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ef7fa9ed0256d64a688a3747d0fef7a88851c18a5e1d57f115f38ec2e09366" +checksum = "145bb27393fe455dd64d6cbc8d059adfa392590a45eadf079c01b11857e7b010" dependencies = [ "hashbrown 0.15.4", "memchr", @@ -5929,13 +5963,13 @@ dependencies = [ [[package]] name = "rfd" -version = "0.15.3" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80c844748fdc82aae252ee4594a89b6e7ebef1063de7951545564cbc4e57075d" +checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" dependencies = [ "ashpd", "block2 0.6.1", - "dispatch2 0.2.0", + "dispatch2", "glib-sys", "gobject-sys", "gtk-sys", @@ -5954,9 +5988,9 @@ dependencies = [ [[package]] name = "rgb" -version = "0.8.50" +version = "0.8.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" +checksum = "a457e416a0f90d246a4c3288bd7a25b2304ca727f253f95be383dd17af56be8f" [[package]] name = "ring" @@ -6003,13 +6037,12 @@ dependencies = [ [[package]] name = "rust-ini" -version = "0.21.1" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e310ef0e1b6eeb79169a1171daf9abcb87a2e17c03bee2c4bb100b55c75409f" +checksum = "e7295b7ce3bf4806b419dc3420745998b447178b7005e2011947b38fc5aa6791" dependencies = [ "cfg-if", "ordered-multimap", - "trim-in-place", ] [[package]] @@ -6084,9 +6117,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.28" +version = "0.23.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" +checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1" dependencies = [ "once_cell", "ring", @@ -6108,9 +6141,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.3" +version = "0.103.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" dependencies = [ "ring", "rustls-pki-types", @@ -6182,9 +6215,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1375ba8ef45a6f15d83fa8748f1079428295d403d6ea991d09ab100155fbc06d" +checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" dependencies = [ "dyn-clone", "ref-cast", @@ -6395,6 +6428,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -6419,7 +6461,7 @@ dependencies = [ "indexmap 1.9.3", "indexmap 2.10.0", "schemars 0.9.0", - "schemars 1.0.3", + "schemars 1.0.4", "serde", "serde_derive", "serde_json", @@ -6530,9 +6572,9 @@ dependencies = [ [[package]] name = "shared_child" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2778001df1384cf20b6dc5a5a90f48da35539885edaaefd887f8d744e939c0b" +checksum = "1e362d9935bc50f019969e2f9ecd66786612daae13e8f277be7bfb66e8bed3f7" dependencies = [ "libc", "sigchld", @@ -6557,9 +6599,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "sigchld" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1219ef50fc0fdb04fcc243e6aa27f855553434ffafe4fa26554efb78b5b4bf89" +checksum = "47106eded3c154e70176fc83df9737335c94ce22f821c32d17ed1db1f83badb1" dependencies = [ "libc", "os_pipe", @@ -6646,7 +6688,7 @@ dependencies = [ "async-io 1.13.0", "async-lock 2.8.0", "async-net", - "async-process 1.8.1", + "async-process", "blocking", "futures-lite 1.13.0", ] @@ -6907,7 +6949,7 @@ dependencies = [ "cfg-expr", "heck 0.5.0", "pkg-config", - "toml", + "toml 0.8.23", "version-compare", ] @@ -7055,7 +7097,7 @@ dependencies = [ "serde_json", "tauri-utils", "tauri-winres", - "toml", + "toml 0.8.23", "walkdir", ] @@ -7113,7 +7155,7 @@ dependencies = [ "serde", "serde_json", "tauri-utils", - "toml", + "toml 0.8.23", "walkdir", ] @@ -7229,7 +7271,7 @@ dependencies = [ "tauri-plugin", "tauri-utils", "thiserror 2.0.12", - "toml", + "toml 0.8.23", "url", ] @@ -7248,25 +7290,6 @@ dependencies = [ "thiserror 2.0.12", ] -[[package]] -name = "tauri-plugin-notification" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe06ed89cff6d0ec06ff4f544fb961e4718348a33309f56ccb2086e77bc9116" -dependencies = [ - "log", - "notify-rust", - "rand 0.8.5", - "serde", - "serde_json", - "serde_repr", - "tauri", - "tauri-plugin", - "thiserror 2.0.12", - "time", - "url", -] - [[package]] name = "tauri-plugin-process" version = "2.3.0" @@ -7426,7 +7449,7 @@ dependencies = [ "serde_with", "swift-rs", "thiserror 2.0.12", - "toml", + "toml 0.8.23", "url", "urlpattern", "uuid", @@ -7441,19 +7464,7 @@ checksum = "e8d321dbc6f998d825ab3f0d62673e810c861aac2d0de2cc2c395328f1d113b4" dependencies = [ "embed-resource", "indexmap 2.10.0", - "toml", -] - -[[package]] -name = "tauri-winrt-notification" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b1e66e07de489fe43a46678dd0b8df65e0c973909df1b60ba33874e297ba9b9" -dependencies = [ - "quick-xml", - "thiserror 2.0.12", - "windows 0.61.3", - "windows-version", + "toml 0.8.23", ] [[package]] @@ -7780,7 +7791,7 @@ dependencies = [ "futures-util", "log", "tokio", - "tungstenite", + "tungstenite 0.21.0", ] [[package]] @@ -7803,11 +7814,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", "toml_edit 0.22.27", ] +[[package]] +name = "toml" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed0aee96c12fa71097902e0bb061a5e1ebd766a6636bb605ba401c45c1650eac" +dependencies = [ + "indexmap 2.10.0", + "serde", + "serde_spanned 1.0.0", + "toml_datetime 0.7.0", + "toml_parser", + "toml_writer", + "winnow 0.7.12", +] + [[package]] name = "toml_datetime" version = "0.6.11" @@ -7817,6 +7843,15 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_datetime" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" +dependencies = [ + "serde", +] + [[package]] name = "toml_edit" version = "0.19.15" @@ -7824,7 +7859,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap 2.10.0", - "toml_datetime", + "toml_datetime 0.6.11", "winnow 0.5.40", ] @@ -7835,7 +7870,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" dependencies = [ "indexmap 2.10.0", - "toml_datetime", + "toml_datetime 0.6.11", "winnow 0.5.40", ] @@ -7847,10 +7882,19 @@ checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap 2.10.0", "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", "toml_write", - "winnow 0.7.11", + "winnow 0.7.12", +] + +[[package]] +name = "toml_parser" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97200572db069e74c512a14117b296ba0a80a30123fbbb5aa1f4a348f639ca30" +dependencies = [ + "winnow 0.7.12", ] [[package]] @@ -7859,6 +7903,12 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" +[[package]] +name = "toml_writer" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" + [[package]] name = "tonic" version = "0.10.2" @@ -7870,7 +7920,7 @@ dependencies = [ "axum", "base64 0.21.7", "bytes", - "h2 0.3.26", + "h2 0.3.27", "http 0.2.12", "http-body 0.4.6", "hyper 0.14.32", @@ -8099,18 +8149,18 @@ dependencies = [ "petgraph", ] -[[package]] -name = "trim-in-place" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343e926fc669bc8cde4fa3129ab681c63671bae288b1f1081ceee6d9d37904fc" - [[package]] name = "try-lock" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "ttf-parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" + [[package]] name = "tungstenite" version = "0.21.0" @@ -8130,6 +8180,23 @@ dependencies = [ "utf-8", ] +[[package]] +name = "tungstenite" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadc29d668c91fcc564941132e17b28a7ceb2f3ebf0b9dae3e03fd7a6748eb0d" +dependencies = [ + "bytes", + "data-encoding", + "http 1.3.1", + "httparse", + "log", + "rand 0.9.1", + "sha1", + "thiserror 2.0.12", + "utf-8", +] + [[package]] name = "typeid" version = "1.0.3" @@ -8560,6 +8627,7 @@ dependencies = [ "cc", "downcast-rs", "rustix 0.38.44", + "scoped-tls", "smallvec", "wayland-sys", ] @@ -8608,7 +8676,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" dependencies = [ "proc-macro2", - "quick-xml", + "quick-xml 0.37.5", "quote", ] @@ -8618,6 +8686,8 @@ version = "0.31.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" dependencies = [ + "dlib", + "log", "pkg-config", ] @@ -8748,6 +8818,12 @@ dependencies = [ "rustix 0.38.44", ] +[[package]] +name = "widestring" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" + [[package]] name = "winapi" version = "0.3.9" @@ -9287,9 +9363,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" dependencies = [ "memchr", ] @@ -9476,9 +9552,9 @@ checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" [[package]] name = "xml-rs" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" +checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" [[package]] name = "yoke" @@ -9530,19 +9606,13 @@ dependencies = [ [[package]] name = "zbus" -version = "5.7.1" +version = "5.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3a7c7cee313d044fca3f48fa782cb750c79e4ca76ba7bc7718cd4024cdf6f68" +checksum = "597f45e98bc7e6f0988276012797855613cd8269e23b5be62cc4e5d28b7e515d" dependencies = [ "async-broadcast", - "async-executor", - "async-io 2.4.1", - "async-lock 3.4.0", - "async-process 2.3.1", "async-recursion", - "async-task", "async-trait", - "blocking", "enumflags2", "event-listener 5.3.0", "futures-core", @@ -9556,7 +9626,7 @@ dependencies = [ "tracing", "uds_windows", "windows-sys 0.59.0", - "winnow 0.7.11", + "winnow 0.7.12", "zbus_macros", "zbus_names", "zvariant", @@ -9564,9 +9634,9 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.7.1" +version = "5.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17e7e5eec1550f747e71a058df81a9a83813ba0f6a95f39c4e218bdc7ba366a" +checksum = "e5c8e4e14dcdd9d97a98b189cd1220f30e8394ad271e8c987da84f73693862c2" dependencies = [ "proc-macro-crate 3.3.0", "proc-macro2", @@ -9585,7 +9655,7 @@ checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" dependencies = [ "serde", "static_assertions", - "winnow 0.7.11", + "winnow 0.7.12", "zvariant", ] @@ -9795,33 +9865,33 @@ dependencies = [ [[package]] name = "zune-jpeg" -version = "0.4.18" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7384255a918371b5af158218d131530f694de9ad3815ebdd0453a940485cb0fa" +checksum = "2c9e525af0a6a658e031e95f14b7f889976b74a11ba0eca5a5fc9ac8a1c43a6a" dependencies = [ "zune-core", ] [[package]] name = "zvariant" -version = "5.5.3" +version = "5.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d30786f75e393ee63a21de4f9074d4c038d52c5b1bb4471f955db249f9dffb1" +checksum = "d91b3680bb339216abd84714172b5138a4edac677e641ef17e1d8cb1b3ca6e6f" dependencies = [ "endi", "enumflags2", "serde", "url", - "winnow 0.7.11", + "winnow 0.7.12", "zvariant_derive", "zvariant_utils", ] [[package]] name = "zvariant_derive" -version = "5.5.3" +version = "5.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75fda702cd42d735ccd48117b1630432219c0e9616bf6cb0f8350844ee4d9580" +checksum = "3a8c68501be459a8dbfffbe5d792acdd23b4959940fc87785fb013b32edbc208" dependencies = [ "proc-macro-crate 3.3.0", "proc-macro2", @@ -9841,5 +9911,5 @@ dependencies = [ "serde", "static_assertions", "syn 2.0.104", - "winnow 0.7.11", + "winnow 0.7.12", ] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index de3fa317..57957e60 100755 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -70,15 +70,15 @@ getrandom = "0.3.3" futures = "0.3.31" sys-locale = "0.3.2" async-trait = "0.1.88" -mihomo_api = { path = "src_crates/crate_mihomo_api" } +ab_glyph = "0.2.29" +tungstenite = "0.27.0" libc = "0.2.174" gethostname = "1.0.2" hmac = "0.12.1" sha2 = "0.10.9" hex = "0.4.3" scopeguard = "1.2.0" -tauri-plugin-notification = "2.3.0" -dashmap = "7.0.0-rc2" +kode-bridge = "0.1.0" [target.'cfg(windows)'.dependencies] runas = "=1.2.0" @@ -142,9 +142,7 @@ crate-type = ["staticlib", "cdylib", "rlib"] criterion = "0.6.0" tempfile = "3.20.0" -[workspace] -members = ["src_crates/crate_mihomo_api"] - -[[bench]] -name = "draft_benchmark" -harness = false +# [patch.crates-io] +# bitflags = { git = "https://github.com/bitflags/bitflags", rev = "2.9.0" } +# zerocopy = { git = "https://github.com/google/zerocopy", rev = "v0.8.24" } +# tungstenite = { git = "https://github.com/snapview/tungstenite-rs", rev = "v0.26.2" } diff --git a/src-tauri/src/ipc/general.rs b/src-tauri/src/ipc/general.rs new file mode 100644 index 00000000..c00d165b --- /dev/null +++ b/src-tauri/src/ipc/general.rs @@ -0,0 +1,130 @@ +use kode_bridge::{errors::AnyError, IpcHttpClient}; +use serde_json::json; + +pub struct IpcManager { + client: IpcHttpClient, +} + +impl IpcManager { + pub async fn new(socket_path: &str) -> Self { + IpcManager { + client: IpcHttpClient::new(socket_path).await, + } + } +} + +impl IpcManager { + pub async fn send_request( + &self, + method: &str, + path: &str, + body: Option<&serde_json::Value>, + ) -> Result { + // Ok(self.client.request(method, path, body).await?.json()?) + let response = self.client.request(method, path, body).await?; + if method == "PATCH" { + if response.status == 204 { + Ok(serde_json::json!({"code": 204})) + } else { + Ok(response.json()?) + } + } else if method == "PUT" { + Ok(json!(response.body)) + } else { + Ok(response.json()?) + } + } + + pub async fn get_refresh_proxies(&self) -> Result { + let url = "/proxies"; + self.send_request("GET", url, None).await + } + pub async fn get_providers_proxies(&self) -> Result { + let url = "/providers/proxies"; + self.send_request("GET", url, None).await + } + + pub async fn close_all_connections(&self) -> Result<(), AnyError> { + let url = "/connections"; + let response = self.send_request("DELETE", url, None).await?; + if response["code"] == 204 { + Ok(()) + } else { + Err(AnyError::from( + response["message"] + .as_str() + .unwrap_or("unknown error") + .to_string(), + )) + } + } +} + +impl IpcManager { + pub async fn is_mihomo_running(&self) -> Result<(), AnyError> { + let url = "/version"; + let _response = self.send_request("GET", url, None).await?; + Ok(()) + } + + pub async fn put_configs_force(&self, clash_config_path: &str) -> Result<(), AnyError> { + let url = "/configs?force=true"; + let payload = serde_json::json!({ + "path": clash_config_path, + }); + let _response = self.send_request("PUT", url, Some(&payload)).await?; + Ok(()) + } + + pub async fn patch_configs(&self, config: serde_json::Value) -> Result<(), AnyError> { + let url = "/configs"; + let response = self.send_request("PATCH", url, Some(&config)).await?; + if response["code"] == 204 { + Ok(()) + } else { + Err(AnyError::from( + response["message"] + .as_str() + .unwrap_or("unknown error") + .to_string(), + )) + } + } + + pub async fn test_proxy_delay( + &self, + name: &str, + test_url: Option, + timeout: i32, + ) -> Result { + let test_url = + test_url.unwrap_or_else(|| "https://cp.cloudflare.com/generate_204".to_string()); + let url = format!( + "/proxies/{}/delay?url={}&timeout={}", + name, test_url, timeout + ); + let response = self.send_request("GET", &url, None).await?; + Ok(response) + } + + pub async fn get_connections(&self) -> Result { + let url = "/connections"; + let response = self.send_request("GET", url, None).await?; + Ok(response) + } + + pub async fn delete_connection(&self, id: &str) -> Result<(), AnyError> { + let url = format!("/connections/{}", id); + let response = self.send_request("DELETE", &url, None).await?; + if response["code"] == 204 { + Ok(()) + } else { + Err(AnyError::from( + response["message"] + .as_str() + .unwrap_or("unknown error") + .to_string(), + )) + } + } +} diff --git a/src-tauri/src/ipc/mod.rs b/src-tauri/src/ipc/mod.rs new file mode 100644 index 00000000..6fb21e98 --- /dev/null +++ b/src-tauri/src/ipc/mod.rs @@ -0,0 +1,3 @@ +pub mod general; + +pub use general::IpcManager; diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index b2f8a1dd..389f5260 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -3,6 +3,7 @@ pub mod config; mod core; mod enhance; mod feat; +mod ipc; mod module; mod process; mod state; diff --git a/src-tauri/src/module/mihomo.rs b/src-tauri/src/module/mihomo.rs index c11ea58b..5a98743e 100644 --- a/src-tauri/src/module/mihomo.rs +++ b/src-tauri/src/module/mihomo.rs @@ -1,5 +1,7 @@ use crate::config::Config; -use mihomo_api; +use crate::ipc::IpcManager; +#[cfg(unix)] +use crate::utils::dirs::{ipc_path, path_to_str}; use once_cell::sync::Lazy; use parking_lot::{Mutex, RwLock}; use std::time::{Duration, Instant}; @@ -15,7 +17,7 @@ pub struct Rate { } // 缓存MihomoManager实例 struct MihomoCache { - manager: mihomo_api::MihomoManager, + manager: IpcManager, created_at: Instant, server: String, } @@ -34,7 +36,7 @@ impl MihomoManager { &INSTANCE } - pub fn global() -> mihomo_api::MihomoManager { + pub fn global() -> IpcManager { let instance = MihomoManager::__global(); // 尝试从缓存读取(只需读锁) @@ -66,7 +68,7 @@ impl MihomoManager { if cache_entry.server == current_server && cache_entry.created_at.elapsed() < CACHE_TTL { - return cache_entry.manager.clone(); + return cache_entry.manager; } } } @@ -74,13 +76,16 @@ impl MihomoManager { // 创建新实例 let (current_server, headers) = MihomoManager::get_clash_client_info() .unwrap_or_else(|| (String::new(), HeaderMap::new())); - let manager = mihomo_api::MihomoManager::new(current_server.clone(), headers); + // ! unix + #[cfg(unix)] + let manager = IpcManager::new(path_to_str(ipc_path()?)); + // ! windows // 更新缓存 { let mut cache = instance.mihomo_cache.write(); *cache = Some(MihomoCache { - manager: manager.clone(), + manager: manager, created_at: Instant::now(), server: current_server, }); diff --git a/src-tauri/src/utils/dirs.rs b/src-tauri/src/utils/dirs.rs index 23b3a1ab..bafdc67d 100644 --- a/src-tauri/src/utils/dirs.rs +++ b/src-tauri/src/utils/dirs.rs @@ -242,3 +242,21 @@ pub fn get_encryption_key() -> Result> { Ok(key) } } + +#[cfg(target_os = "macos")] +pub fn ipc_path() -> Result { + let res_dir = app_resources_dir()?; + Ok(res_dir.join("mihomo.sock")) +} + +#[cfg(target_os = "linux")] +pub fn ipc_path() -> Result { + let res_dir = app_resources_dir()?; + Ok(res_dir.join("mihomo.sock")) +} + +#[cfg(target_os = "windows")] +pub fn ipc_path() -> Result { + let res_dir = app_resources_dir()?; + Ok(res_dir.join(r"\\.\pipe\mihomo")) +} diff --git a/src-tauri/src_crates/crate_mihomo_api/.env b/src-tauri/src_crates/crate_mihomo_api/.env deleted file mode 100644 index 0055075b..00000000 --- a/src-tauri/src_crates/crate_mihomo_api/.env +++ /dev/null @@ -1,2 +0,0 @@ -# LOCAL_SOCK="/Users/tunglies/Library/Application Support/io.github.clash-verge-rev.clash-verge-rev.dev/mihomo.sock" -LOCAL_SOCK="/Users/tunglies/Library/Application Support/io.github.clash-verge-rev.clash-verge-rev/mihomo.sock" diff --git a/src-tauri/src_crates/crate_mihomo_api/Cargo.toml b/src-tauri/src_crates/crate_mihomo_api/Cargo.toml deleted file mode 100644 index f1e30a48..00000000 --- a/src-tauri/src_crates/crate_mihomo_api/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "mihomo_api" -edition = "2024" - -[dependencies] -reqwest = { version = "0.12.22", features = ["json"] } -serde = { version = "1.0.219", features = ["derive"] } -serde_json = "1.0.140" -tokio = { version = "1.46.1", features = ["rt", "macros", "time"] } - -[dev-dependencies] diff --git a/src-tauri/src_crates/crate_mihomo_api/src/lib.rs b/src-tauri/src_crates/crate_mihomo_api/src/lib.rs deleted file mode 100644 index ecbee81f..00000000 --- a/src-tauri/src_crates/crate_mihomo_api/src/lib.rs +++ /dev/null @@ -1,147 +0,0 @@ -use reqwest::{Method, header::HeaderMap}; -use serde_json::{Value, json}; -use std::time::Duration; -pub mod model; -pub use model::MihomoManager; - -impl MihomoManager { - pub fn new(mihomo_server: String, headers: HeaderMap) -> Self { - let client = reqwest::ClientBuilder::new() - .default_headers(headers) - .no_proxy() - .timeout(Duration::from_secs(15)) - .pool_max_idle_per_host(5) - .pool_idle_timeout(Duration::from_secs(15)) - .build() - .expect("Failed to build reqwest client"); - - Self { - mihomo_server, - client, - } - } - - async fn send_request( - &self, - method: Method, - url: String, - data: Option, - ) -> Result { - let client_response = self - .client - .request(method.clone(), &url) - .json(&data.unwrap_or(json!({}))) - .send() - .await - .map_err(|e| e.to_string())?; - - let response = match method { - Method::PATCH => { - let status = client_response.status(); - if status.as_u16() == 204 { - json!({"code": 204}) - } else { - client_response - .json::() - .await - .map_err(|e| e.to_string())? - } - } - Method::PUT => json!(client_response.text().await.map_err(|e| e.to_string())?), - _ => client_response - .json::() - .await - .map_err(|e| e.to_string())?, - }; - Ok(response) - } - - pub async fn get_refresh_proxies(&self) -> Result { - let url = format!("{}/proxies", self.mihomo_server); - let proxies = self.send_request(Method::GET, url, None).await?; - Ok(proxies) - } - - pub async fn get_providers_proxies(&self) -> Result { - let url = format!("{}/providers/proxies", self.mihomo_server); - let providers_proxies = self.send_request(Method::GET, url, None).await?; - Ok(providers_proxies) - } - - pub async fn close_all_connections(&self) -> Result<(), String> { - let url = format!("{}/connections", self.mihomo_server); - let response = self.send_request(Method::DELETE, url, None).await?; - if response["code"] == 204 { - Ok(()) - } else { - Err(response["message"] - .as_str() - .unwrap_or("unknown error") - .to_string()) - } - } -} - -impl MihomoManager { - pub async fn is_mihomo_running(&self) -> Result<(), String> { - let url = format!("{}/version", self.mihomo_server); - let _response = self.send_request(Method::GET, url, None).await?; - Ok(()) - } - - pub async fn put_configs_force(&self, clash_config_path: &str) -> Result<(), String> { - let url = format!("{}/configs?force=true", self.mihomo_server); - let payload = serde_json::json!({ - "path": clash_config_path, - }); - let _response = self.send_request(Method::PUT, url, Some(payload)).await?; - Ok(()) - } - - pub async fn patch_configs(&self, config: serde_json::Value) -> Result<(), String> { - let url = format!("{}/configs", self.mihomo_server); - let response = self.send_request(Method::PATCH, url, Some(config)).await?; - if response["code"] == 204 { - Ok(()) - } else { - Err(response["message"] - .as_str() - .unwrap_or("unknown error") - .to_string()) - } - } - - pub async fn test_proxy_delay( - &self, - name: &str, - test_url: Option, - timeout: i32, - ) -> Result { - let test_url = test_url.unwrap_or("https://cp.cloudflare.com/generate_204".to_string()); - let url = format!( - "{}/proxies/{}/delay?url={}&timeout={}", - self.mihomo_server, name, test_url, timeout - ); - let response = self.send_request(Method::GET, url, None).await?; - Ok(response) - } - - pub async fn get_connections(&self) -> Result { - let url = format!("{}/connections", self.mihomo_server); - let response = self.send_request(Method::GET, url, None).await?; - Ok(response) - } - - pub async fn delete_connection(&self, id: &str) -> Result<(), String> { - let url = format!("{}/connections/{}", self.mihomo_server, id); - let response = self.send_request(Method::DELETE, url, None).await?; - if response["code"] == 204 { - Ok(()) - } else { - Err(response["message"] - .as_str() - .unwrap_or("unknown error") - .to_string()) - } - } -} diff --git a/src-tauri/src_crates/crate_mihomo_api/src/model.rs b/src-tauri/src_crates/crate_mihomo_api/src/model.rs deleted file mode 100644 index aed81a95..00000000 --- a/src-tauri/src_crates/crate_mihomo_api/src/model.rs +++ /dev/null @@ -1,5 +0,0 @@ -#[derive(Clone)] -pub struct MihomoManager { - pub(crate) mihomo_server: String, - pub(crate) client: reqwest::Client, -} diff --git a/src-tauri/src_crates/crate_mihomo_api/tests/test_mihomo_api.rs b/src-tauri/src_crates/crate_mihomo_api/tests/test_mihomo_api.rs deleted file mode 100644 index bee8d8d3..00000000 --- a/src-tauri/src_crates/crate_mihomo_api/tests/test_mihomo_api.rs +++ /dev/null @@ -1,7 +0,0 @@ -use reqwest::header::HeaderMap; - -#[test] -fn test_mihomo_manager_init() { - let _ = mihomo_api::MihomoManager::new("url".into(), HeaderMap::new()); - assert_eq!(true, true); -}