@@ -1997,6 +1997,25 @@ dependencies = [
|
||||
"syn 2.0.95",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "h2"
|
||||
version = "0.3.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"fnv",
|
||||
"futures-core",
|
||||
"futures-sink",
|
||||
"futures-util",
|
||||
"http 0.2.12",
|
||||
"indexmap 2.7.0",
|
||||
"slab",
|
||||
"tokio",
|
||||
"tokio-util",
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "h2"
|
||||
version = "0.4.7"
|
||||
@@ -2008,7 +2027,7 @@ dependencies = [
|
||||
"fnv",
|
||||
"futures-core",
|
||||
"futures-sink",
|
||||
"http",
|
||||
"http 1.2.0",
|
||||
"indexmap 2.7.0",
|
||||
"slab",
|
||||
"tokio",
|
||||
@@ -2113,6 +2132,17 @@ dependencies = [
|
||||
"syn 1.0.109",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "http"
|
||||
version = "0.2.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"fnv",
|
||||
"itoa 1.0.14",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "http"
|
||||
version = "1.2.0"
|
||||
@@ -2124,6 +2154,17 @@ dependencies = [
|
||||
"itoa 1.0.14",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "http-body"
|
||||
version = "0.4.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"http 0.2.12",
|
||||
"pin-project-lite",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "http-body"
|
||||
version = "1.0.1"
|
||||
@@ -2131,7 +2172,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"http",
|
||||
"http 1.2.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2142,8 +2183,8 @@ checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"futures-util",
|
||||
"http",
|
||||
"http-body",
|
||||
"http 1.2.0",
|
||||
"http-body 1.0.1",
|
||||
"pin-project-lite",
|
||||
]
|
||||
|
||||
@@ -2153,12 +2194,19 @@ version = "1.9.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946"
|
||||
|
||||
[[package]]
|
||||
name = "httpdate"
|
||||
version = "1.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
|
||||
|
||||
[[package]]
|
||||
name = "hula"
|
||||
version = "2.6.1"
|
||||
dependencies = [
|
||||
"base64 0.22.1",
|
||||
"lazy_static",
|
||||
"reqwest 0.11.27",
|
||||
"rodio",
|
||||
"screenshots",
|
||||
"serde",
|
||||
@@ -2182,6 +2230,30 @@ dependencies = [
|
||||
"tauri-plugin-websocket",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hyper"
|
||||
version = "0.14.32"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"futures-channel",
|
||||
"futures-core",
|
||||
"futures-util",
|
||||
"h2 0.3.26",
|
||||
"http 0.2.12",
|
||||
"http-body 0.4.6",
|
||||
"httparse",
|
||||
"httpdate",
|
||||
"itoa 1.0.14",
|
||||
"pin-project-lite",
|
||||
"socket2",
|
||||
"tokio",
|
||||
"tower-service",
|
||||
"tracing",
|
||||
"want",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hyper"
|
||||
version = "1.5.2"
|
||||
@@ -2191,9 +2263,9 @@ dependencies = [
|
||||
"bytes",
|
||||
"futures-channel",
|
||||
"futures-util",
|
||||
"h2",
|
||||
"http",
|
||||
"http-body",
|
||||
"h2 0.4.7",
|
||||
"http 1.2.0",
|
||||
"http-body 1.0.1",
|
||||
"httparse",
|
||||
"itoa 1.0.14",
|
||||
"pin-project-lite",
|
||||
@@ -2209,8 +2281,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2"
|
||||
dependencies = [
|
||||
"futures-util",
|
||||
"http",
|
||||
"hyper",
|
||||
"http 1.2.0",
|
||||
"hyper 1.5.2",
|
||||
"hyper-util",
|
||||
"rustls",
|
||||
"rustls-pki-types",
|
||||
@@ -2220,6 +2292,19 @@ dependencies = [
|
||||
"webpki-roots",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hyper-tls"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"hyper 0.14.32",
|
||||
"native-tls",
|
||||
"tokio",
|
||||
"tokio-native-tls",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hyper-util"
|
||||
version = "0.1.10"
|
||||
@@ -2229,9 +2314,9 @@ dependencies = [
|
||||
"bytes",
|
||||
"futures-channel",
|
||||
"futures-util",
|
||||
"http",
|
||||
"http-body",
|
||||
"hyper",
|
||||
"http 1.2.0",
|
||||
"http-body 1.0.1",
|
||||
"hyper 1.5.2",
|
||||
"pin-project-lite",
|
||||
"socket2",
|
||||
"tokio",
|
||||
@@ -2906,6 +2991,23 @@ dependencies = [
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "native-tls"
|
||||
version = "0.2.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"log",
|
||||
"openssl",
|
||||
"openssl-probe",
|
||||
"openssl-sys",
|
||||
"schannel",
|
||||
"security-framework",
|
||||
"security-framework-sys",
|
||||
"tempfile",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ndk"
|
||||
version = "0.8.0"
|
||||
@@ -3398,6 +3500,60 @@ dependencies = [
|
||||
"pathdiff",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "openssl"
|
||||
version = "0.10.68"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5"
|
||||
dependencies = [
|
||||
"bitflags 2.6.0",
|
||||
"cfg-if",
|
||||
"foreign-types 0.3.2",
|
||||
"libc",
|
||||
"once_cell",
|
||||
"openssl-macros",
|
||||
"openssl-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "openssl-macros"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.95",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "openssl-probe"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
|
||||
|
||||
[[package]]
|
||||
name = "openssl-src"
|
||||
version = "300.4.1+3.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "faa4eac4138c62414b5622d1b31c5c304f34b406b013c079c2bbc652fdd6678c"
|
||||
dependencies = [
|
||||
"cc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "openssl-sys"
|
||||
version = "0.9.104"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741"
|
||||
dependencies = [
|
||||
"cc",
|
||||
"libc",
|
||||
"openssl-src",
|
||||
"pkg-config",
|
||||
"vcpkg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "option-ext"
|
||||
version = "0.2.0"
|
||||
@@ -4083,6 +4239,47 @@ version = "0.8.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
|
||||
|
||||
[[package]]
|
||||
name = "reqwest"
|
||||
version = "0.11.27"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62"
|
||||
dependencies = [
|
||||
"base64 0.21.7",
|
||||
"bytes",
|
||||
"encoding_rs",
|
||||
"futures-core",
|
||||
"futures-util",
|
||||
"h2 0.3.26",
|
||||
"http 0.2.12",
|
||||
"http-body 0.4.6",
|
||||
"hyper 0.14.32",
|
||||
"hyper-tls",
|
||||
"ipnet",
|
||||
"js-sys",
|
||||
"log",
|
||||
"mime",
|
||||
"native-tls",
|
||||
"once_cell",
|
||||
"percent-encoding",
|
||||
"pin-project-lite",
|
||||
"rustls-pemfile 1.0.4",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"serde_urlencoded",
|
||||
"sync_wrapper 0.1.2",
|
||||
"system-configuration 0.5.1",
|
||||
"tokio",
|
||||
"tokio-native-tls",
|
||||
"tokio-socks",
|
||||
"tower-service",
|
||||
"url",
|
||||
"wasm-bindgen",
|
||||
"wasm-bindgen-futures",
|
||||
"web-sys",
|
||||
"winreg 0.50.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "reqwest"
|
||||
version = "0.12.12"
|
||||
@@ -4096,11 +4293,11 @@ dependencies = [
|
||||
"encoding_rs",
|
||||
"futures-core",
|
||||
"futures-util",
|
||||
"h2",
|
||||
"http",
|
||||
"http-body",
|
||||
"h2 0.4.7",
|
||||
"http 1.2.0",
|
||||
"http-body 1.0.1",
|
||||
"http-body-util",
|
||||
"hyper",
|
||||
"hyper 1.5.2",
|
||||
"hyper-rustls",
|
||||
"hyper-util",
|
||||
"ipnet",
|
||||
@@ -4112,13 +4309,13 @@ dependencies = [
|
||||
"pin-project-lite",
|
||||
"quinn",
|
||||
"rustls",
|
||||
"rustls-pemfile",
|
||||
"rustls-pemfile 2.2.0",
|
||||
"rustls-pki-types",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"serde_urlencoded",
|
||||
"sync_wrapper",
|
||||
"system-configuration",
|
||||
"sync_wrapper 1.0.2",
|
||||
"system-configuration 0.6.1",
|
||||
"tokio",
|
||||
"tokio-rustls",
|
||||
"tokio-util",
|
||||
@@ -4260,6 +4457,15 @@ dependencies = [
|
||||
"zeroize",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustls-pemfile"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c"
|
||||
dependencies = [
|
||||
"base64 0.21.7",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustls-pemfile"
|
||||
version = "2.2.0"
|
||||
@@ -4304,6 +4510,15 @@ dependencies = [
|
||||
"winapi-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "schannel"
|
||||
version = "0.1.27"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d"
|
||||
dependencies = [
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "schemars"
|
||||
version = "0.8.21"
|
||||
@@ -4360,6 +4575,29 @@ dependencies = [
|
||||
"xcb",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "security-framework"
|
||||
version = "2.11.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
|
||||
dependencies = [
|
||||
"bitflags 2.6.0",
|
||||
"core-foundation 0.9.4",
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
"security-framework-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "security-framework-sys"
|
||||
version = "2.14.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32"
|
||||
dependencies = [
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "selectors"
|
||||
version = "0.22.0"
|
||||
@@ -5035,6 +5273,12 @@ dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sync_wrapper"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
|
||||
|
||||
[[package]]
|
||||
name = "sync_wrapper"
|
||||
version = "1.0.2"
|
||||
@@ -5064,6 +5308,17 @@ dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "system-configuration"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7"
|
||||
dependencies = [
|
||||
"bitflags 1.3.2",
|
||||
"core-foundation 0.9.4",
|
||||
"system-configuration-sys 0.5.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "system-configuration"
|
||||
version = "0.6.1"
|
||||
@@ -5072,7 +5327,17 @@ checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b"
|
||||
dependencies = [
|
||||
"bitflags 2.6.0",
|
||||
"core-foundation 0.9.4",
|
||||
"system-configuration-sys",
|
||||
"system-configuration-sys 0.6.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "system-configuration-sys"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9"
|
||||
dependencies = [
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -5180,7 +5445,7 @@ dependencies = [
|
||||
"glob",
|
||||
"gtk",
|
||||
"heck 0.5.0",
|
||||
"http",
|
||||
"http 1.2.0",
|
||||
"image",
|
||||
"jni",
|
||||
"libc",
|
||||
@@ -5193,7 +5458,7 @@ dependencies = [
|
||||
"percent-encoding",
|
||||
"plist",
|
||||
"raw-window-handle",
|
||||
"reqwest",
|
||||
"reqwest 0.12.12",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"serde_repr",
|
||||
@@ -5387,9 +5652,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e62a9bde54d6a0218b63f5a248f02056ad4316ba6ad81dfb9e4f73715df5deb1"
|
||||
dependencies = [
|
||||
"data-url",
|
||||
"http",
|
||||
"http 1.2.0",
|
||||
"regex",
|
||||
"reqwest",
|
||||
"reqwest 0.12.12",
|
||||
"schemars",
|
||||
"serde",
|
||||
"serde_json",
|
||||
@@ -5514,11 +5779,11 @@ dependencies = [
|
||||
"dirs 5.0.1",
|
||||
"flate2",
|
||||
"futures-util",
|
||||
"http",
|
||||
"http 1.2.0",
|
||||
"infer",
|
||||
"minisign-verify",
|
||||
"percent-encoding",
|
||||
"reqwest",
|
||||
"reqwest 0.12.12",
|
||||
"semver",
|
||||
"serde",
|
||||
"serde_json",
|
||||
@@ -5543,7 +5808,7 @@ dependencies = [
|
||||
"futures-util",
|
||||
"log",
|
||||
"read-progress-stream",
|
||||
"reqwest",
|
||||
"reqwest 0.12.12",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"tauri",
|
||||
@@ -5560,7 +5825,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "14055b796521e0facf6582256dea9322453595917851082610c557293862c966"
|
||||
dependencies = [
|
||||
"futures-util",
|
||||
"http",
|
||||
"http 1.2.0",
|
||||
"log",
|
||||
"rand 0.8.5",
|
||||
"serde",
|
||||
@@ -5580,7 +5845,7 @@ checksum = "2274ef891ccc0a8d318deffa9d70053f947664d12d58b9c0d1ae5e89237e01f7"
|
||||
dependencies = [
|
||||
"dpi",
|
||||
"gtk",
|
||||
"http",
|
||||
"http 1.2.0",
|
||||
"jni",
|
||||
"raw-window-handle",
|
||||
"serde",
|
||||
@@ -5598,7 +5863,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3707b40711d3b9f6519150869e358ffbde7c57567fb9b5a8b51150606939b2a0"
|
||||
dependencies = [
|
||||
"gtk",
|
||||
"http",
|
||||
"http 1.2.0",
|
||||
"jni",
|
||||
"log",
|
||||
"objc2",
|
||||
@@ -5629,7 +5894,7 @@ dependencies = [
|
||||
"dunce",
|
||||
"glob",
|
||||
"html5ever",
|
||||
"http",
|
||||
"http 1.2.0",
|
||||
"infer",
|
||||
"json-patch",
|
||||
"kuchikiki",
|
||||
@@ -5842,6 +6107,16 @@ dependencies = [
|
||||
"syn 2.0.95",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tokio-native-tls"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
|
||||
dependencies = [
|
||||
"native-tls",
|
||||
"tokio",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tokio-rustls"
|
||||
version = "0.26.1"
|
||||
@@ -5852,6 +6127,18 @@ dependencies = [
|
||||
"tokio",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tokio-socks"
|
||||
version = "0.5.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0d4770b8024672c1101b3f6733eab95b18007dbe0847a8afe341fcf79e06043f"
|
||||
dependencies = [
|
||||
"either",
|
||||
"futures-util",
|
||||
"thiserror 1.0.69",
|
||||
"tokio",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tokio-stream"
|
||||
version = "0.1.17"
|
||||
@@ -5971,7 +6258,7 @@ dependencies = [
|
||||
"futures-core",
|
||||
"futures-util",
|
||||
"pin-project-lite",
|
||||
"sync_wrapper",
|
||||
"sync_wrapper 1.0.2",
|
||||
"tokio",
|
||||
"tower-layer",
|
||||
"tower-service",
|
||||
@@ -6057,7 +6344,7 @@ dependencies = [
|
||||
"byteorder",
|
||||
"bytes",
|
||||
"data-encoding",
|
||||
"http",
|
||||
"http 1.2.0",
|
||||
"httparse",
|
||||
"log",
|
||||
"rand 0.8.5",
|
||||
@@ -7040,6 +7327,16 @@ dependencies = [
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winreg"
|
||||
version = "0.50.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"windows-sys 0.48.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winreg"
|
||||
version = "0.52.0"
|
||||
@@ -7077,7 +7374,7 @@ dependencies = [
|
||||
"gdkx11",
|
||||
"gtk",
|
||||
"html5ever",
|
||||
"http",
|
||||
"http 1.2.0",
|
||||
"javascriptcore-rs",
|
||||
"jni",
|
||||
"kuchikiki",
|
||||
|
||||
@@ -54,6 +54,11 @@ lazy_static = "1.4"
|
||||
screenshots = "0.5.4"
|
||||
base64 = "0.22.1"
|
||||
rodio = "0.17.3"
|
||||
reqwest = { version = "0.11", features = [
|
||||
"json",
|
||||
"socks",
|
||||
"native-tls-vendored",
|
||||
] }
|
||||
|
||||
|
||||
[features]
|
||||
|
||||
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 9.2 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 9.2 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.7 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 7.5 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 273 KiB After Width: | Height: | Size: 195 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 109 KiB After Width: | Height: | Size: 88 KiB |
@@ -7,6 +7,8 @@ use common_cmd::{
|
||||
set_height,
|
||||
};
|
||||
#[cfg(desktop)]
|
||||
mod proxy;
|
||||
#[cfg(desktop)]
|
||||
use desktops::common_cmd;
|
||||
#[cfg(desktop)]
|
||||
use desktops::init;
|
||||
@@ -14,14 +16,16 @@ use desktops::init;
|
||||
use desktops::tray;
|
||||
#[cfg(desktop)]
|
||||
use init::CustomInit;
|
||||
#[cfg(desktop)]
|
||||
use proxy::test_proxy;
|
||||
|
||||
// 移动端依赖
|
||||
#[cfg(mobile)]
|
||||
mod mobiles;
|
||||
#[cfg(mobile)]
|
||||
use mobiles::init;
|
||||
#[cfg(mobile)]
|
||||
use init::CustomInit;
|
||||
#[cfg(mobile)]
|
||||
use mobiles::init;
|
||||
|
||||
pub fn run() {
|
||||
#[cfg(desktop)]
|
||||
@@ -51,7 +55,8 @@ fn setup_desktop() {
|
||||
screenshot,
|
||||
audio,
|
||||
set_height,
|
||||
set_badge_count
|
||||
set_badge_count,
|
||||
test_proxy
|
||||
])
|
||||
.run(tauri::generate_context!())
|
||||
.expect("error while running tauri application");
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
use reqwest::{Client, Proxy};
|
||||
use std::time::Duration;
|
||||
|
||||
// 定义测试用的URL列表
|
||||
const TEST_URLS: [&str; 3] = [
|
||||
"https://www.baidu.com",
|
||||
"https://www.bing.com",
|
||||
"https://www.qq.com",
|
||||
];
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn test_proxy(proxy_type: String, proxy_host: String, proxy_port: u16) -> Result<bool, String> {
|
||||
if proxy_type.is_empty() {
|
||||
return Ok(true); // 不使用代理时直接返回成功
|
||||
}
|
||||
|
||||
let proxy_url = match proxy_type.as_str() {
|
||||
"http" => format!("http://{}:{}", proxy_host, proxy_port),
|
||||
"socks5" => format!("socks5://{}:{}", proxy_host, proxy_port),
|
||||
_ => return Err("不支持的代理类型".to_string()),
|
||||
};
|
||||
|
||||
// 构建代理客户端,移除了dns_resolver配置
|
||||
let client = Client::builder()
|
||||
.proxy(Proxy::all(&proxy_url).map_err(|e| format!("代理设置错误: {}", e))?)
|
||||
.timeout(Duration::from_secs(10))
|
||||
.build()
|
||||
.map_err(|e| format!("创建客户端失败: {}", e))?;
|
||||
|
||||
// 依次测试多个URL,直到有一个成功
|
||||
for url in TEST_URLS.iter() {
|
||||
match test_url(&client, url).await {
|
||||
Ok(_) => return Ok(true),
|
||||
Err(e) => {
|
||||
println!("测试 {} 失败: {}", url, e);
|
||||
// 如果是DNS错误,直接返回特定错误信息
|
||||
if e.contains("dns error") {
|
||||
return Err("DNS解析失败,请检查网络连接或代理设置".to_string());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Err("所有测试网站均无法连接,请检查代理设置".to_string())
|
||||
}
|
||||
|
||||
async fn test_url(client: &Client, url: &str) -> Result<(), String> {
|
||||
match client.get(url).send().await {
|
||||
Ok(response) => {
|
||||
if response.status().is_success() {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(format!("HTTP状态码错误: {}", response.status()))
|
||||
}
|
||||
}
|
||||
Err(e) => Err(format!("请求失败: {}", e)),
|
||||
}
|
||||
}
|
||||
@@ -22,7 +22,7 @@ export const getEnhancedFingerprint = async (): Promise<string> => {
|
||||
|
||||
// 创建新的Promise并保存引用
|
||||
fingerprintPromise = (async () => {
|
||||
console.time('🔍 设备指纹获取总耗时')
|
||||
const totalStart = performance.now()
|
||||
|
||||
try {
|
||||
// 检查缓存是否有效
|
||||
@@ -30,14 +30,14 @@ export const getEnhancedFingerprint = async (): Promise<string> => {
|
||||
if (cachedData) {
|
||||
const { fingerprint, timestamp } = JSON.parse(cachedData)
|
||||
if (Date.now() - timestamp < CACHE_DURATION) {
|
||||
console.timeEnd('🔍 设备指纹获取总耗时')
|
||||
console.log('✅ 使用缓存的设备指纹')
|
||||
const totalTime = performance.now() - totalStart
|
||||
console.log(`🔍 使用缓存的设备指纹,总耗时: ${totalTime.toFixed(2)}ms`)
|
||||
return fingerprint
|
||||
}
|
||||
}
|
||||
|
||||
console.time('📊 收集设备信息耗时')
|
||||
// 收集设备信息
|
||||
const deviceInfoStart = performance.now()
|
||||
const deviceInfo = {
|
||||
platform: await type(),
|
||||
screenSize: `${window.screen.width}x${window.screen.height}`,
|
||||
@@ -48,18 +48,20 @@ export const getEnhancedFingerprint = async (): Promise<string> => {
|
||||
language: navigator.language,
|
||||
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
|
||||
}
|
||||
console.timeEnd('📊 收集设备信息耗时')
|
||||
const deviceInfoTime = performance.now() - deviceInfoStart
|
||||
console.log(`📊 收集设备信息耗时: ${deviceInfoTime.toFixed(2)}ms`)
|
||||
|
||||
// 在主线程中获取基础浏览器指纹
|
||||
console.time('Worker: 基础指纹生成')
|
||||
const fpStart = performance.now()
|
||||
const fp = await FingerprintJS.load()
|
||||
const fpResult = await fp.get({
|
||||
debug: false
|
||||
})
|
||||
console.timeEnd('Worker: 基础指纹生成')
|
||||
const fpTime = performance.now() - fpStart
|
||||
console.log(`基础指纹生成耗时: ${fpTime.toFixed(2)}ms`)
|
||||
|
||||
// 创建 Promise 等待 Worker 返回结果
|
||||
console.time('🔨 Worker生成指纹耗时')
|
||||
// Worker处理
|
||||
const workerStart = performance.now()
|
||||
const fingerprint = await new Promise<string>((resolve) => {
|
||||
const handleMessage = (e: MessageEvent) => {
|
||||
const { type, fingerprint } = e.data
|
||||
@@ -76,7 +78,8 @@ export const getEnhancedFingerprint = async (): Promise<string> => {
|
||||
browserFingerprint: fpResult.visitorId
|
||||
})
|
||||
})
|
||||
console.timeEnd('🔨 Worker生成指纹耗时')
|
||||
const workerTime = performance.now() - workerStart
|
||||
console.log(`🔨 Worker生成指纹耗时: ${workerTime.toFixed(2)}ms`)
|
||||
|
||||
// 缓存结果
|
||||
if (fingerprint) {
|
||||
@@ -87,17 +90,16 @@ export const getEnhancedFingerprint = async (): Promise<string> => {
|
||||
timestamp: Date.now()
|
||||
})
|
||||
)
|
||||
console.log('✅ 生成新的设备指纹并缓存')
|
||||
}
|
||||
|
||||
console.timeEnd('🔍 设备指纹获取总耗时')
|
||||
const totalTime = performance.now() - totalStart
|
||||
console.log(`🔍 设备指纹获取总耗时: ${totalTime.toFixed(2)}ms`)
|
||||
return fingerprint
|
||||
} catch (error) {
|
||||
console.timeEnd('🔍 设备指纹获取总耗时')
|
||||
console.error('❌ 获取设备指纹失败:', error)
|
||||
const totalTime = performance.now() - totalStart
|
||||
console.error(`❌ 获取设备指纹失败,总耗时: ${totalTime.toFixed(2)}ms`, error)
|
||||
return ''
|
||||
} finally {
|
||||
// 清除正在进行的Promise引用
|
||||
fingerprintPromise = null
|
||||
}
|
||||
})()
|
||||
|
||||
@@ -74,6 +74,12 @@ async function Http<T = any>(
|
||||
fullResponse: boolean = false,
|
||||
abort?: AbortController
|
||||
): Promise<{ data: T; resp: Response } | T> {
|
||||
// 打印请求信息
|
||||
console.log(`🚀 发起请求 → ${options.method} ${url}`, {
|
||||
body: options.body,
|
||||
query: options.query
|
||||
})
|
||||
|
||||
// 默认重试配置
|
||||
const defaultRetryOptions: RetryOptions = {
|
||||
retries: 3,
|
||||
@@ -118,8 +124,15 @@ async function Http<T = any>(
|
||||
signal: abort?.signal
|
||||
}
|
||||
|
||||
// 打印请求头内容
|
||||
console.log(...httpHeaders)
|
||||
// 获取代理设置
|
||||
// const proxySettings = JSON.parse(localStorage.getItem('proxySettings') || '{}')
|
||||
// 如果设置了代理,添加代理配置 (BETA)
|
||||
// if (proxySettings.type && proxySettings.ip && proxySettings.port) {
|
||||
// // 使用 Rust 后端的代理客户端
|
||||
// fetchOptions.proxy = {
|
||||
// url: `${proxySettings.type}://${proxySettings.ip}:${proxySettings.port}`
|
||||
// }
|
||||
// }
|
||||
|
||||
// 判断是否需要添加请求体
|
||||
if (options.body) {
|
||||
@@ -160,6 +173,12 @@ async function Http<T = any>(
|
||||
// 解析响应数据
|
||||
const responseData = options.isBlob ? await response.arrayBuffer() : await response.json()
|
||||
|
||||
// 打印响应结果
|
||||
console.log(`✅ 请求成功 → ${options.method} ${url}`, {
|
||||
status: response.status,
|
||||
data: responseData
|
||||
})
|
||||
|
||||
// 若有success === false,需要重试
|
||||
if (responseData && responseData.success === false) {
|
||||
throw new AppException(responseData.message || url, {
|
||||
|
||||
@@ -357,7 +357,7 @@ const enterKey = (e: KeyboardEvent) => {
|
||||
onBeforeMount(async () => {
|
||||
// 如果不是自动登录且当前在登录页面,清除 TOKEN,防止用户直接使用控制台退出导致登录前还没有退出账号就继续登录
|
||||
if (!login.value.autoLogin && route.path === '/login' && TOKEN.value) {
|
||||
// await apis.logout()
|
||||
await apis.logout()
|
||||
isTrayMenuShow.value = false
|
||||
computedToken.clear()
|
||||
// 重新初始化 WebSocket 连接,此时传入 null 作为 token
|
||||
|
||||
@@ -12,14 +12,14 @@
|
||||
<n-collapse-transition :show="proxyType === 'http'">
|
||||
<n-flex vertical :size="10" justify="center">
|
||||
<p class="text-12px pt-14px">IP地址</p>
|
||||
<n-input
|
||||
class="rounded-6px text-12px"
|
||||
v-model:value="IP"
|
||||
type="text"
|
||||
placeholder="http://xxx 或者 https://xxx" />
|
||||
<n-input class="rounded-6px text-12px" v-model:value="IP" type="text" placeholder="例如:127.0.0.1" />
|
||||
|
||||
<p class="text-12px pt-14px">端口号</p>
|
||||
<n-input class="rounded-6px text-12px" v-model:value="port" type="text" placeholder="请输入端口号" />
|
||||
<n-input
|
||||
class="rounded-6px text-12px"
|
||||
v-model:value="port"
|
||||
type="text"
|
||||
placeholder="HTTP:7890 或 SOCKS5:7891" />
|
||||
</n-flex>
|
||||
|
||||
<p @click="proxyTest" class="text-(14px #13987f center) cursor-pointer pt-20px">网络代理测试</p>
|
||||
@@ -36,6 +36,7 @@
|
||||
<script setup lang="ts">
|
||||
import { lightTheme } from 'naive-ui'
|
||||
import router from '@/router'
|
||||
import { invoke } from '@tauri-apps/api/core'
|
||||
|
||||
const options = [
|
||||
{
|
||||
@@ -45,14 +46,81 @@ const options = [
|
||||
{
|
||||
label: 'HTTP代理',
|
||||
value: 'http'
|
||||
},
|
||||
{
|
||||
label: 'SOCKS5代理',
|
||||
value: 'socks5'
|
||||
}
|
||||
]
|
||||
const proxyType = ref(options[0].value)
|
||||
const IP = ref()
|
||||
const port = ref()
|
||||
|
||||
const handleSave = () => {}
|
||||
const proxyTest = () => {}
|
||||
const proxyType = ref(options[0].value)
|
||||
const IP = ref('')
|
||||
const port = ref('')
|
||||
|
||||
// 从本地存储加载代理设置
|
||||
onMounted(() => {
|
||||
const savedProxy = localStorage.getItem('proxySettings')
|
||||
if (savedProxy) {
|
||||
const settings = JSON.parse(savedProxy)
|
||||
proxyType.value = settings.type
|
||||
IP.value = settings.ip
|
||||
port.value = settings.port
|
||||
}
|
||||
})
|
||||
|
||||
// 保存代理设置
|
||||
const handleSave = async () => {
|
||||
try {
|
||||
if (proxyType.value && (!IP.value || !port.value)) {
|
||||
window.$message.warning('请填写完整的代理信息')
|
||||
return
|
||||
}
|
||||
|
||||
// 保存到本地存储
|
||||
const proxySettings = {
|
||||
type: proxyType.value,
|
||||
ip: IP.value,
|
||||
port: port.value
|
||||
}
|
||||
localStorage.setItem('proxySettings', JSON.stringify(proxySettings))
|
||||
|
||||
window.$message.success('代理设置保存成功')
|
||||
router.push('/login')
|
||||
} catch (error) {
|
||||
window.$message.error('代理设置失败:' + error)
|
||||
}
|
||||
}
|
||||
|
||||
// 测试代理连接
|
||||
const proxyTest = async () => {
|
||||
if (proxyType.value && (!IP.value || !port.value)) {
|
||||
window.$message.warning('请填写完整的代理信息')
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
window.$message.loading('正在测试代理连接...', {
|
||||
duration: 0
|
||||
})
|
||||
|
||||
const result = await invoke('test_proxy', {
|
||||
proxyType: proxyType.value,
|
||||
proxyHost: IP.value,
|
||||
proxyPort: Number(port.value)
|
||||
})
|
||||
|
||||
if (result) {
|
||||
window.$message.success('代理连接测试成功')
|
||||
} else {
|
||||
window.$message.error('代理连接测试失败')
|
||||
}
|
||||
} catch (error) {
|
||||
// 显示具体的错误信息
|
||||
window.$message.error(`代理测试失败: ${error}`)
|
||||
} finally {
|
||||
window.$message.destroyAll() // 清除loading消息
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
|
||||
@@ -49,15 +49,16 @@ const detectBrowserFeatures = async (): Promise<Record<string, boolean>> => {
|
||||
// 生成设备指纹
|
||||
const generateFingerprint = async (data: { deviceInfo: any; browserFingerprint: string }): Promise<string> => {
|
||||
try {
|
||||
console.time('Worker: 指纹生成总耗时')
|
||||
const totalStart = performance.now()
|
||||
|
||||
// 2. 浏览器特征检测
|
||||
console.time('Worker: 特征检测')
|
||||
const featureStart = performance.now()
|
||||
const browserFeatures = await detectBrowserFeatures()
|
||||
console.timeEnd('Worker: 特征检测')
|
||||
const featureTime = performance.now() - featureStart
|
||||
console.log(`Worker: 特征检测耗时: ${featureTime.toFixed(2)}ms`)
|
||||
|
||||
// 3. 组合所有特征
|
||||
console.time('Worker: SHA-256计算')
|
||||
const hashStart = performance.now()
|
||||
const combinedFingerprint = JSON.stringify({
|
||||
browserFingerprint: data.browserFingerprint,
|
||||
deviceInfo: data.deviceInfo,
|
||||
@@ -71,12 +72,14 @@ const generateFingerprint = async (data: { deviceInfo: any; browserFingerprint:
|
||||
const fingerprint = Array.from(new Uint8Array(fingerprintBuffer))
|
||||
.map((b) => b.toString(16).padStart(2, '0'))
|
||||
.join('')
|
||||
console.timeEnd('Worker: SHA-256计算')
|
||||
const hashTime = performance.now() - hashStart
|
||||
console.log(`Worker: SHA-256计算耗时: ${hashTime.toFixed(2)}ms`)
|
||||
|
||||
const totalTime = performance.now() - totalStart
|
||||
console.log(`Worker: 指纹生成总耗时: ${totalTime.toFixed(2)}ms`)
|
||||
|
||||
console.timeEnd('Worker: 指纹生成总耗时')
|
||||
return fingerprint
|
||||
} catch (error) {
|
||||
console.timeEnd('Worker: 指纹生成总耗时')
|
||||
console.error('Worker: ❌ 生成设备指纹失败:', error)
|
||||
return ''
|
||||
}
|
||||
|
||||