Refactor debounce duration handling in BatchControlDevicesService and ControlDeviceService

This commit is contained in:
Faris Armoush
2025-04-23 10:52:08 +03:00
parent 46860619a0
commit 2bb7a6950a
2 changed files with 18 additions and 28 deletions

View File

@ -11,7 +11,7 @@ abstract interface class BatchControlDevicesService {
});
}
class RemoteBatchControlDevicesService implements BatchControlDevicesService {
final class RemoteBatchControlDevicesService implements BatchControlDevicesService {
@override
Future<bool> batchControlDevices({
required List<String> uuids,
@ -44,14 +44,15 @@ class RemoteBatchControlDevicesService implements BatchControlDevicesService {
final class DebouncedBatchControlDevicesService
implements BatchControlDevicesService {
final BatchControlDevicesService decoratee;
final Duration _debounceDuration;
final List<(List<String> uuids, String code, Object value)> _pendingRequests = [];
bool _isProcessing = false;
final Duration debounceDuration;
final _pendingRequests = <(List<String> uuids, String code, Object value)>[];
var _isProcessing = false;
DebouncedBatchControlDevicesService({
required this.decoratee,
Duration debounceDuration = const Duration(milliseconds: 1500),
}) : _debounceDuration = debounceDuration;
this.debounceDuration = const Duration(milliseconds: 1500),
});
@override
Future<bool> batchControlDevices({
@ -61,17 +62,11 @@ final class DebouncedBatchControlDevicesService
}) async {
_pendingRequests.add((uuids, code, value));
if (_isProcessing) {
log(
'Request added to queue',
name: 'DebouncedBatchControlDevicesService',
);
return false;
}
if (_isProcessing) return false;
_isProcessing = true;
await Future.delayed(_debounceDuration);
await Future.delayed(debounceDuration);
final lastRequest = _pendingRequests.last;
_pendingRequests.clear();

View File

@ -36,14 +36,15 @@ final class RemoteControlDeviceService implements ControlDeviceService {
final class DebouncedControlDeviceService implements ControlDeviceService {
final ControlDeviceService decoratee;
final Duration _debounceDuration;
final List<(String deviceUuid, Status status)> _pendingRequests = [];
bool _isProcessing = false;
final Duration debounceDuration;
DebouncedControlDeviceService({
required this.decoratee,
Duration debounceDuration = const Duration(milliseconds: 1500),
}) : _debounceDuration = debounceDuration;
this.debounceDuration = const Duration(milliseconds: 1500),
});
final _pendingRequests = <(String deviceUuid, Status status)>[];
var _isProcessing = false;
@override
Future<bool> controlDevice({
@ -52,17 +53,11 @@ final class DebouncedControlDeviceService implements ControlDeviceService {
}) async {
_pendingRequests.add((deviceUuid, status));
if (_isProcessing) {
log(
'Request added to queue',
name: 'DebouncedControlDeviceService',
);
return false;
}
if (_isProcessing) return false;
_isProcessing = true;
await Future.delayed(_debounceDuration);
await Future.delayed(debounceDuration);
final lastRequest = _pendingRequests.last;
_pendingRequests.clear();