diff --git a/lib/commands/app/backup.dart b/lib/commands/app/backup.dart index 9558200..ca2d9aa 100644 --- a/lib/commands/app/backup.dart +++ b/lib/commands/app/backup.dart @@ -135,7 +135,7 @@ final class AppBackupCommand extends Command with Disposable { @override Future dispose() async { _client?.close(); - await _file?.safeDelete(); _monitor?.dispose(); + await _file?.safeDelete(); } } diff --git a/lib/commands/app/commit.dart b/lib/commands/app/commit.dart index c947110..14cf318 100644 --- a/lib/commands/app/commit.dart +++ b/lib/commands/app/commit.dart @@ -100,7 +100,7 @@ final class AppCommitCommand extends Command with Disposable { @override Future dispose() async { - await _file?.safeDelete(); _monitor?.dispose(); + await _file?.safeDelete(); } } diff --git a/lib/commands/app/upload.dart b/lib/commands/app/upload.dart index c2eba3d..5d96e0b 100644 --- a/lib/commands/app/upload.dart +++ b/lib/commands/app/upload.dart @@ -87,7 +87,7 @@ final class AppUploadCommand extends Command with Disposable { @override Future dispose() async { - await _file?.safeDelete(); _monitor?.dispose(); + await _file?.safeDelete(); } } diff --git a/lib/commands/team/backup.dart b/lib/commands/team/backup.dart index 8e68fc2..c3b2732 100644 --- a/lib/commands/team/backup.dart +++ b/lib/commands/team/backup.dart @@ -135,7 +135,7 @@ final class TeamBackupCommand extends Command with Disposable { @override Future dispose() async { _client?.close(); - await _file?.safeDelete(); _monitor?.dispose(); + await _file?.safeDelete(); } } diff --git a/lib/commands/team/commit.dart b/lib/commands/team/commit.dart index 2cb1986..1bfb7af 100644 --- a/lib/commands/team/commit.dart +++ b/lib/commands/team/commit.dart @@ -100,7 +100,7 @@ final class TeamCommitCommand extends Command with Disposable { @override FutureOr dispose() async { - await _file?.safeDelete(); _monitor?.dispose(); + await _file?.safeDelete(); } } diff --git a/lib/utils/speed_monitor.dart b/lib/utils/speed_monitor.dart index 5e253a5..e82c2cc 100644 --- a/lib/utils/speed_monitor.dart +++ b/lib/utils/speed_monitor.dart @@ -2,7 +2,7 @@ import "dart:collection"; import "package:discloud/cli/disposable.dart"; -final class _SpeedSample with LinkedListEntry<_SpeedSample> { +final class _SpeedSample { _SpeedSample(this.units) : time = DateTime.now().microsecondsSinceEpoch; final int units; @@ -14,46 +14,35 @@ class SpeedMonitor implements Disposable { static const double _zero = 0; /// Creates a [SpeedMonitor] - factory SpeedMonitor() => ._(samples: .new()); + factory SpeedMonitor() => ._(queue: .new()); const SpeedMonitor._({ - required this._samples, + required this._queue, this._windowDuration = const .new(seconds: 1), }); - /// The duration of the sliding window used for speed calculation. + final Queue<_SpeedSample> _queue; final Duration _windowDuration; - /// A linked list of samples currently within the time window. - final LinkedList<_SpeedSample> _samples; - @override void dispose() { - _samples.clear(); + _queue.clear(); } /// Adds a sample of the [totalProcessedUnits] and returns the current speed. double add(int totalProcessedUnits) { final _SpeedSample last = .new(totalProcessedUnits); - _samples.add(last); + _queue + ..removeWhere((s) => last.time - s.time > _windowDuration.inMicroseconds) + ..add(last); - _SpeedSample first = _samples.first; + final first = _queue.first; if (first == last) return _zero; - int baseDeltaTime = last.time - first.time; - - while (baseDeltaTime > _windowDuration.inMicroseconds) { - first.unlink(); - first = _samples.first; - baseDeltaTime = last.time - first.time; - } - - final deltaTime = baseDeltaTime / _windowDuration.inMicroseconds; - - final deltaUnits = last.units - first.units; - - return deltaUnits / deltaTime; + return last.units - + first.units / last.time - + first.time / _windowDuration.inMicroseconds; } }