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

View File

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