mirror of
https://github.com/StarCitizenToolBox/app.git
synced 2026-02-12 02:00:22 +00:00
fix: async runtime error
This commit is contained in:
@@ -76,8 +76,7 @@ pub struct DownloadGlobalStat {
|
||||
/// - default_download_dir: The default directory to store downloads
|
||||
/// - upload_limit_bps: Upload speed limit in bytes per second (0 = unlimited)
|
||||
/// - download_limit_bps: Download speed limit in bytes per second (0 = unlimited)
|
||||
#[frb(sync)]
|
||||
pub fn downloader_init(
|
||||
pub async fn downloader_init(
|
||||
working_dir: String,
|
||||
default_download_dir: String,
|
||||
upload_limit_bps: Option<u32>,
|
||||
@@ -88,60 +87,57 @@ pub fn downloader_init(
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let rt = tokio::runtime::Handle::current();
|
||||
rt.block_on(async {
|
||||
let _lock = SESSION_INIT_LOCK.lock().await;
|
||||
|
||||
// Double check after acquiring lock
|
||||
if SESSION.read().is_some() {
|
||||
return Ok(());
|
||||
}
|
||||
let _lock = SESSION_INIT_LOCK.lock().await;
|
||||
|
||||
// Double check after acquiring lock
|
||||
if SESSION.read().is_some() {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
// Working directory for persistence and session data
|
||||
let working_folder = PathBuf::from(&working_dir);
|
||||
std::fs::create_dir_all(&working_folder)?;
|
||||
|
||||
// Default download folder
|
||||
let output_folder = PathBuf::from(&default_download_dir);
|
||||
std::fs::create_dir_all(&output_folder)?;
|
||||
|
||||
// Create persistence folder for session state in working directory
|
||||
let persistence_folder = working_folder.join("rqbit-session");
|
||||
std::fs::create_dir_all(&persistence_folder)?;
|
||||
|
||||
// DHT persistence file in working directory
|
||||
let dht_persistence_file = working_folder.join("dht.json");
|
||||
// Working directory for persistence and session data
|
||||
let working_folder = PathBuf::from(&working_dir);
|
||||
std::fs::create_dir_all(&working_folder)?;
|
||||
|
||||
// Default download folder
|
||||
let output_folder = PathBuf::from(&default_download_dir);
|
||||
std::fs::create_dir_all(&output_folder)?;
|
||||
|
||||
// Create persistence folder for session state in working directory
|
||||
let persistence_folder = working_folder.join("rqbit-session");
|
||||
std::fs::create_dir_all(&persistence_folder)?;
|
||||
|
||||
// DHT persistence file in working directory
|
||||
let dht_persistence_file = working_folder.join("dht.json");
|
||||
|
||||
let session = Session::new_with_opts(
|
||||
output_folder,
|
||||
SessionOptions {
|
||||
disable_dht: false,
|
||||
disable_dht_persistence: false,
|
||||
// Configure DHT persistence to use working directory
|
||||
dht_config: Some(PersistentDhtConfig {
|
||||
config_filename: Some(dht_persistence_file),
|
||||
..Default::default()
|
||||
}),
|
||||
// Enable JSON-based session persistence for task recovery
|
||||
persistence: Some(SessionPersistenceConfig::Json {
|
||||
folder: Some(persistence_folder),
|
||||
}),
|
||||
fastresume: false,
|
||||
// Configure rate limits
|
||||
ratelimits: LimitsConfig {
|
||||
upload_bps: upload_limit_bps.and_then(NonZeroU32::new),
|
||||
download_bps: download_limit_bps.and_then(NonZeroU32::new),
|
||||
},
|
||||
let session = Session::new_with_opts(
|
||||
output_folder,
|
||||
SessionOptions {
|
||||
disable_dht: false,
|
||||
disable_dht_persistence: false,
|
||||
// Configure DHT persistence to use working directory
|
||||
dht_config: Some(PersistentDhtConfig {
|
||||
config_filename: Some(dht_persistence_file),
|
||||
..Default::default()
|
||||
}),
|
||||
// Enable JSON-based session persistence for task recovery
|
||||
persistence: Some(SessionPersistenceConfig::Json {
|
||||
folder: Some(persistence_folder),
|
||||
}),
|
||||
fastresume: false,
|
||||
// Configure rate limits
|
||||
ratelimits: LimitsConfig {
|
||||
upload_bps: upload_limit_bps.and_then(NonZeroU32::new),
|
||||
download_bps: download_limit_bps.and_then(NonZeroU32::new),
|
||||
},
|
||||
)
|
||||
.await
|
||||
.context("Failed to create rqbit session")?;
|
||||
..Default::default()
|
||||
},
|
||||
)
|
||||
.await
|
||||
.context("Failed to create rqbit session")?;
|
||||
|
||||
*SESSION.write() = Some(session);
|
||||
*SESSION.write() = Some(session);
|
||||
|
||||
Ok(())
|
||||
})
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Check if the downloader is initialized
|
||||
|
||||
@@ -401,33 +401,38 @@ fn wire__crate__api__downloader_api__downloader_has_active_tasks_impl(
|
||||
)
|
||||
}
|
||||
fn wire__crate__api__downloader_api__downloader_init_impl(
|
||||
port_: flutter_rust_bridge::for_generated::MessagePort,
|
||||
working_dir: impl CstDecode<String>,
|
||||
default_download_dir: impl CstDecode<String>,
|
||||
upload_limit_bps: impl CstDecode<Option<u32>>,
|
||||
download_limit_bps: impl CstDecode<Option<u32>>,
|
||||
) -> flutter_rust_bridge::for_generated::WireSyncRust2DartDco {
|
||||
FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::<flutter_rust_bridge::for_generated::DcoCodec, _>(
|
||||
) {
|
||||
FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::<flutter_rust_bridge::for_generated::DcoCodec, _, _, _>(
|
||||
flutter_rust_bridge::for_generated::TaskInfo {
|
||||
debug_name: "downloader_init",
|
||||
port: None,
|
||||
mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync,
|
||||
port: Some(port_),
|
||||
mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal,
|
||||
},
|
||||
move || {
|
||||
let api_working_dir = working_dir.cst_decode();
|
||||
let api_default_download_dir = default_download_dir.cst_decode();
|
||||
let api_upload_limit_bps = upload_limit_bps.cst_decode();
|
||||
let api_download_limit_bps = download_limit_bps.cst_decode();
|
||||
transform_result_dco::<_, _, flutter_rust_bridge::for_generated::anyhow::Error>(
|
||||
(move || {
|
||||
let output_ok = crate::api::downloader_api::downloader_init(
|
||||
api_working_dir,
|
||||
api_default_download_dir,
|
||||
api_upload_limit_bps,
|
||||
api_download_limit_bps,
|
||||
)?;
|
||||
Ok(output_ok)
|
||||
})(),
|
||||
)
|
||||
move |context| async move {
|
||||
transform_result_dco::<_, _, flutter_rust_bridge::for_generated::anyhow::Error>(
|
||||
(move || async move {
|
||||
let output_ok = crate::api::downloader_api::downloader_init(
|
||||
api_working_dir,
|
||||
api_default_download_dir,
|
||||
api_upload_limit_bps,
|
||||
api_download_limit_bps,
|
||||
)
|
||||
.await?;
|
||||
Ok(output_ok)
|
||||
})()
|
||||
.await,
|
||||
)
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
||||
@@ -4093,12 +4098,14 @@ mod io {
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
pub extern "C" fn frbgen_starcitizen_doctor_wire__crate__api__downloader_api__downloader_init(
|
||||
port_: i64,
|
||||
working_dir: *mut wire_cst_list_prim_u_8_strict,
|
||||
default_download_dir: *mut wire_cst_list_prim_u_8_strict,
|
||||
upload_limit_bps: *mut u32,
|
||||
download_limit_bps: *mut u32,
|
||||
) -> flutter_rust_bridge::for_generated::WireSyncRust2DartDco {
|
||||
) {
|
||||
wire__crate__api__downloader_api__downloader_init_impl(
|
||||
port_,
|
||||
working_dir,
|
||||
default_download_dir,
|
||||
upload_limit_bps,
|
||||
|
||||
Reference in New Issue
Block a user