feat(upload): Add transfer_speed for downloading and uploading files (#1797)

Co-authored-by: Victor Aremu <me@victorare.mu>
Co-authored-by: Fabian-Lars <github@fabianlars.de>
This commit is contained in:
Artaza Sameen
2024-11-05 03:11:48 +05:30
committed by GitHub
parent e0d2e2c53f
commit 87cc58527d
4 changed files with 74 additions and 1 deletions
+52
View File
@@ -0,0 +1,52 @@
// Copyright 2019-2023 Tauri Programme within The Commons Conservancy
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
use std::time::Instant;
// The TransferStats struct is used to track and calculate the transfer speed of data chunks over time.
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
start_time: Instant, // Time when the current period started
granularity: u32, // Time period (in milliseconds) over which the transfer speed is calculated
}
impl TransferStats {
// Initializes a new TransferStats instance with the specified granularity.
pub fn start(granularity: u32) -> Self {
Self {
accumulated_chunk_len: 0,
accumulated_time: 0,
transfer_speed: 0,
start_time: Instant::now(),
granularity,
}
}
// Records the transfer of a data chunk and updates the transfer speed if the granularity period has elapsed.
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.accumulated_time += it_took;
// If the accumulated time exceeds the granularity, calculate the transfer speed.
if self.accumulated_time >= self.granularity as u128 {
self.transfer_speed =
(self.accumulated_chunk_len as u128 / self.accumulated_time * 1024) as u64;
self.accumulated_chunk_len = 0;
self.accumulated_time = 0;
}
// Reset the start time for the next period.
self.start_time = now;
}
}
// 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
}
}