From 95b4b8b9478004709741957b6fa08efddc14bc93 Mon Sep 17 00:00:00 2001 From: xkeyC <3334969096@qq.com> Date: Wed, 7 Feb 2024 20:38:16 +0800 Subject: [PATCH] update Rust --- lib/common/rust/frb_generated.dart | 12 ++++---- rust/Cargo.toml | 7 ++++- rust/src/api/downloader_api.rs | 4 +-- rust/src/downloader/mod.rs | 4 +-- rust/src/frb_generated.rs | 47 +++++++----------------------- rust/src/http_package/dns.rs | 6 ++-- rust/src/http_package/mod.rs | 2 +- 7 files changed, 29 insertions(+), 53 deletions(-) diff --git a/lib/common/rust/frb_generated.dart b/lib/common/rust/frb_generated.dart index 95ffb9d..eef03c6 100644 --- a/lib/common/rust/frb_generated.dart +++ b/lib/common/rust/frb_generated.dart @@ -300,9 +300,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { // Codec=Dco (DartCObject based), see doc to use other codecs switch (raw[0]) { case 0: - return const MyDownloaderStatus_NoStart(); + return MyDownloaderStatus_NoStart(); case 1: - return const MyDownloaderStatus_Running(); + return MyDownloaderStatus_Running(); case 2: return MyDownloaderStatus_Pending( dco_decode_my_network_item_pending_type(raw[1]), @@ -312,7 +312,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { dco_decode_String(raw[1]), ); case 4: - return const MyDownloaderStatus_Finished(); + return MyDownloaderStatus_Finished(); default: throw Exception("unreachable"); } @@ -501,9 +501,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { var tag_ = sse_decode_i_32(deserializer); switch (tag_) { case 0: - return const MyDownloaderStatus_NoStart(); + return MyDownloaderStatus_NoStart(); case 1: - return const MyDownloaderStatus_Running(); + return MyDownloaderStatus_Running(); case 2: var var_field0 = sse_decode_my_network_item_pending_type(deserializer); return MyDownloaderStatus_Pending(var_field0); @@ -511,7 +511,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { var var_field0 = sse_decode_String(deserializer); return MyDownloaderStatus_Error(var_field0); case 4: - return const MyDownloaderStatus_Finished(); + return MyDownloaderStatus_Finished(); default: throw UnimplementedError(''); } diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 730c1a9..1e090a8 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -3,13 +3,17 @@ name = "rust" version = "0.1.0" edition = "2021" +[profile.release] +opt-level = "s" +strip = "debuginfo" + [lib] crate-type = ["cdylib", "staticlib"] [dependencies] flutter_rust_bridge = "=2.0.0-dev.23" http-downloader = { version = "0.3.2", features = ["status-tracker", "speed-tracker", "breakpoint-resume", "bson-file-archiver"] } -tokio = { version = "1", features = ["full"] } +tokio = { version = "1", features = ["rt", "rt-multi-thread", "macros"] } url = "2.5.0" uuid = { version = "1.7.0", features = ["v4", "fast-rng", "macro-diagnostics"] } async-std = "1.12.0" @@ -17,3 +21,4 @@ hyper = { version = "0.14.28"} once_cell = "1.19.0" reqwest = { version = "0.11", features = ["rustls-tls-native-roots", "cookies", "gzip", "brotli", "deflate", "multipart", "trust-dns", "json","stream"] } hickory-resolver = {version = "0.24.0", features = [ "dns-over-https-rustls","dns-over-rustls","native-certs"]} +anyhow = "1.0" diff --git a/rust/src/api/downloader_api.rs b/rust/src/api/downloader_api.rs index 02f471b..62bd13d 100644 --- a/rust/src/api/downloader_api.rs +++ b/rust/src/api/downloader_api.rs @@ -2,8 +2,8 @@ use std::sync::Arc; use crate::downloader::{do_cancel_download, do_start_download, DownloadCallbackData}; use crate::frb_generated::StreamSink; -pub fn start_download(url: String, save_path: String, file_name: String, connection_count: u8, sink: StreamSink) { - let _ = do_start_download(url, save_path, file_name, connection_count, Arc::new(sink)); +pub async fn start_download(url: String, save_path: String, file_name: String, connection_count: u8, sink: StreamSink) { + do_start_download(url, save_path, file_name, connection_count, Arc::new(sink)).await.unwrap(); } pub async fn cancel_download(id: String) { diff --git a/rust/src/downloader/mod.rs b/rust/src/downloader/mod.rs index f603e84..e7dcbb4 100644 --- a/rust/src/downloader/mod.rs +++ b/rust/src/downloader/mod.rs @@ -1,5 +1,4 @@ use std::collections::HashMap; -use std::error::Error; use std::num::{NonZeroU8, NonZeroUsize}; use std::path::PathBuf; use std::sync::Arc; @@ -63,8 +62,7 @@ pub async fn do_cancel_download(id: &str) { d.unwrap().cancel().await } -#[tokio::main] -pub async fn do_start_download(url: String, save_path: String, file_name: String, connection_count: u8, sink: Arc>) -> Result<(), Box> { +pub async fn do_start_download(url: String, save_path: String, file_name: String, connection_count: u8, sink: Arc>) -> anyhow::Result<()> { let save_dir = PathBuf::from(save_path); let test_url = Url::parse(&*url)?; diff --git a/rust/src/frb_generated.rs b/rust/src/frb_generated.rs index a87fef6..4e4d894 100644 --- a/rust/src/frb_generated.rs +++ b/rust/src/frb_generated.rs @@ -82,44 +82,17 @@ fn wire_start_download_impl( rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "start_download", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Stream, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, - ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::(flutter_rust_bridge::for_generated::TaskInfo{ debug_name: "start_download", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Stream }, move || { + let message = unsafe { flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire(ptr_, rust_vec_len_, data_len_) }; + let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_url = ::sse_decode(&mut deserializer); - let api_save_path = ::sse_decode(&mut deserializer); - let api_file_name = ::sse_decode(&mut deserializer); - let api_connection_count = ::sse_decode(&mut deserializer); - deserializer.end(); - move |context| { - transform_result_sse((move || { - Result::<_, ()>::Ok(crate::api::downloader_api::start_download( - api_url, - api_save_path, - api_file_name, - api_connection_count, - StreamSink::new( - context - .rust2dart_context() - .stream_sink::<_, crate::downloader::DownloadCallbackData>(), - ), - )) - })()) - } - }, - ) +let api_save_path = ::sse_decode(&mut deserializer); +let api_file_name = ::sse_decode(&mut deserializer); +let api_connection_count = ::sse_decode(&mut deserializer);deserializer.end(); move |context| async move { + transform_result_sse((move || async move { + Result::<_,()>::Ok(crate::api::downloader_api::start_download(api_url, api_save_path, api_file_name, api_connection_count, StreamSink::new(context.rust2dart_context().stream_sink::<_,crate::downloader::DownloadCallbackData>())).await) + })().await) + } }) } fn wire_fetch_impl( port_: flutter_rust_bridge::for_generated::MessagePort, diff --git a/rust/src/http_package/dns.rs b/rust/src/http_package/dns.rs index 3568a00..64b582e 100644 --- a/rust/src/http_package/dns.rs +++ b/rust/src/http_package/dns.rs @@ -43,12 +43,12 @@ impl Iterator for SocketAddrs { } } -fn new_resolver() -> io::Result { +fn new_resolver() -> anyhow::Result { let ali_ips: &[IpAddr] = &[ IpAddr::V4(Ipv4Addr::new(223, 5, 5, 5)), IpAddr::V4(Ipv4Addr::new(223, 6, 6, 6)), - IpAddr::V6("2400:3200::1".parse::().unwrap()), - IpAddr::V6("2400:3200:baba::1".parse::().unwrap()), + IpAddr::V6("2400:3200::1".parse::()?), + IpAddr::V6("2400:3200:baba::1".parse::()?), ]; let group = diff --git a/rust/src/http_package/mod.rs b/rust/src/http_package/mod.rs index b19123c..543fb16 100644 --- a/rust/src/http_package/mod.rs +++ b/rust/src/http_package/mod.rs @@ -48,7 +48,7 @@ pub async fn fetch( url: String, headers: Option>, input_data: Option>, -) -> reqwest::Result { +) -> anyhow::Result { let mut req = _mix_header(HTTP_CLIENT.request(method, url), headers); if input_data.is_some() { req = req.body(input_data.unwrap());