mirror of
https://github.com/tauri-apps/plugins-workspace.git
synced 2026-04-25 11:46:06 +02:00
5dadd205f5
Co-authored-by: Fabian-Lars <github@fabianlars.de>
56 lines
2.2 KiB
Rust
56 lines
2.2 KiB
Rust
// 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 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
|
|
}
|
|
|
|
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,
|
|
total_transferred: 0,
|
|
start_time: Instant::now(),
|
|
granularity,
|
|
}
|
|
}
|
|
// 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;
|
|
|
|
// 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;
|
|
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 ms
|
|
}
|
|
}
|