Files
aria2-rust-pro/crates/aria2-rust-pro-rpc/src/dispatcher/compat_support/rpc_surface.rs
T

92 lines
3.1 KiB
Rust

use super::{
AtomicU64, BtRuntimeCoordinatorAction, BtRuntimeCoordinatorStepReport,
BtRuntimeCoordinatorStepStatus, Digest, Ordering, RpcError, Sha1, SystemTime, UNIX_EPOCH,
};
/// Converts a successful or failed coordinator action result into a stable report row.
pub(in crate::dispatcher) fn push_bt_runtime_coordinator_result(
steps: &mut Vec<BtRuntimeCoordinatorStepReport>,
action: BtRuntimeCoordinatorAction,
result: Result<(), RpcError>,
) {
match result {
Ok(()) => steps.push(BtRuntimeCoordinatorStepReport {
action,
status: BtRuntimeCoordinatorStepStatus::Executed,
detail: None,
}),
Err(error) => steps.push(BtRuntimeCoordinatorStepReport {
action,
status: BtRuntimeCoordinatorStepStatus::Failed,
detail: Some(error.message),
}),
}
}
/// Builds a skipped coordinator action report row with a concise reason.
pub(in crate::dispatcher) fn skipped_bt_runtime_coordinator_step(
action: BtRuntimeCoordinatorAction,
detail: &str,
) -> BtRuntimeCoordinatorStepReport {
BtRuntimeCoordinatorStepReport {
action,
status: BtRuntimeCoordinatorStepStatus::Skipped,
detail: Some(detail.to_owned()),
}
}
/// Monotonic nonce mixed into generated session IDs.
static NEXT_SESSION_ID_NONCE: AtomicU64 = AtomicU64::new(1);
/// Generates a stable hex session identifier for RPC clients.
pub(in crate::dispatcher) fn generate_session_id() -> String {
let now_nanos = SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("system time should be after unix epoch")
.as_nanos();
let nonce = NEXT_SESSION_ID_NONCE.fetch_add(1, Ordering::Relaxed);
let mut sha1 = Sha1::new();
sha1.update(now_nanos.to_le_bytes());
sha1.update(std::process::id().to_le_bytes());
sha1.update(nonce.to_le_bytes());
let digest = sha1.finalize();
digest.iter().map(|byte| format!("{byte:02x}")).collect()
}
/// Returns the upstream-style enabled feature list reported by `getVersion`.
pub(in crate::dispatcher) fn rpc_enabled_features() -> &'static [&'static str] {
&[
"Async DNS",
"BitTorrent",
"GZip",
"HTTPS",
"Message Digest",
"Metalink",
"XML-RPC",
"SFTP",
]
}
/// Encodes bytes as an uppercase hexadecimal string.
pub(in crate::dispatcher) fn hex_string(bytes: &[u8]) -> String {
let mut out = String::with_capacity(bytes.len() * 2);
for byte in bytes {
out.push_str(&format!("{byte:02X}"));
}
out
}
/// Formats the share ratio text expected by aria2 RPC payloads.
pub(in crate::dispatcher) fn rpc_share_ratio_text(share_ratio_milli: Option<u64>) -> String {
share_ratio_milli
.map(|milli| format!("{:.3}", milli as f64 / 1000.0))
.unwrap_or_else(|| "0.000".to_owned())
}
/// Formats the share time text expected by aria2 RPC payloads.
pub(in crate::dispatcher) fn rpc_share_time_text(
snapshot: &aria2_rust_pro_core::ProgressSnapshot,
) -> String {
snapshot.share_time_secs.unwrap_or(0).to_string()
}