From 5dadd205f5596c9607457dd015a2f9d7fc48a2db Mon Sep 17 00:00:00 2001 From: sid <140138716+514sid@users.noreply.github.com> Date: Mon, 11 Nov 2024 20:54:59 +0400 Subject: [PATCH] feat(upload): add `progressTotal` to event payload (#2033) Co-authored-by: Fabian-Lars --- .changes/add-total-transferred-field.md | 6 ++++++ plugins/upload/guest-js/index.ts | 1 + plugins/upload/src/lib.rs | 3 +++ plugins/upload/src/transfer_stats.rs | 11 +++++++---- 4 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 .changes/add-total-transferred-field.md diff --git a/.changes/add-total-transferred-field.md b/.changes/add-total-transferred-field.md new file mode 100644 index 000000000..ac11352f3 --- /dev/null +++ b/.changes/add-total-transferred-field.md @@ -0,0 +1,6 @@ +--- +"upload": "minor" +"upload-js": "minor" +--- + +Added a new field `progressTotal` to track the total amount of data transferred during the upload/download process. diff --git a/plugins/upload/guest-js/index.ts b/plugins/upload/guest-js/index.ts index 7c5bf7963..d036f00a8 100644 --- a/plugins/upload/guest-js/index.ts +++ b/plugins/upload/guest-js/index.ts @@ -6,6 +6,7 @@ import { invoke, Channel } from '@tauri-apps/api/core' interface ProgressPayload { progress: number + progressTotal: number total: number transferSpeed: number } diff --git a/plugins/upload/src/lib.rs b/plugins/upload/src/lib.rs index 6a399fd1e..d8f5f43c4 100644 --- a/plugins/upload/src/lib.rs +++ b/plugins/upload/src/lib.rs @@ -61,6 +61,7 @@ impl Serialize for Error { #[serde(rename_all = "camelCase")] struct ProgressPayload { progress: u64, + progress_total: u64, total: u64, transfer_speed: u64, } @@ -99,6 +100,7 @@ async fn download( stats.record_chunk_transfer(chunk.len()); let _ = on_progress.send(ProgressPayload { progress: chunk.len() as u64, + progress_total: stats.total_transferred, total, transfer_speed: stats.transfer_speed, }); @@ -153,6 +155,7 @@ fn file_to_body(channel: Channel, file: File) -> reqwest::Body stats.record_chunk_transfer(progress as usize); let _ = channel.send(ProgressPayload { progress, + progress_total: stats.total_transferred, total, transfer_speed: stats.transfer_speed, }); diff --git a/plugins/upload/src/transfer_stats.rs b/plugins/upload/src/transfer_stats.rs index 0ae32ec80..2f3a39464 100644 --- a/plugins/upload/src/transfer_stats.rs +++ b/plugins/upload/src/transfer_stats.rs @@ -4,11 +4,12 @@ use std::time::Instant; -// The TransferStats struct is used to track and calculate the transfer speed of data chunks over time. +// The TransferStats struct tracks both transfer speed and cumulative transfer progress. pub struct TransferStats { accumulated_chunk_len: usize, // Total length of chunks transferred in the current period accumulated_time: u128, // Total time taken for the transfers in the current period pub transfer_speed: u64, // Calculated transfer speed in bytes per second + pub total_transferred: u64, // Cumulative total of all transferred data start_time: Instant, // Time when the current period started granularity: u32, // Time period (in milliseconds) over which the transfer speed is calculated } @@ -20,18 +21,20 @@ impl TransferStats { accumulated_chunk_len: 0, accumulated_time: 0, transfer_speed: 0, + total_transferred: 0, start_time: Instant::now(), granularity, } } - // Records the transfer of a data chunk and updates the transfer speed if the granularity period has elapsed. + // Records the transfer of a data chunk and updates both transfer speed and total progress. pub fn record_chunk_transfer(&mut self, chunk_len: usize) { let now = Instant::now(); let it_took = now.duration_since(self.start_time).as_millis(); self.accumulated_chunk_len += chunk_len; + self.total_transferred += chunk_len as u64; self.accumulated_time += it_took; - // If the accumulated time exceeds the granularity, calculate the transfer speed. + // Calculate transfer speed if accumulated time exceeds granularity. if self.accumulated_time >= self.granularity as u128 { self.transfer_speed = (self.accumulated_chunk_len as u128 / self.accumulated_time * 1024) as u64; @@ -47,6 +50,6 @@ impl TransferStats { // Provides a default implementation for TransferStats with a granularity of 500 milliseconds. impl Default for TransferStats { fn default() -> Self { - Self::start(500) // Default granularity is 500 + Self::start(500) // Default granularity is 500 ms } }