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

@ -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,23 +53,17 @@ 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();
try {
final ( lastRequestDeviceUuid, lastRequestStatus) = lastRequest;
final (lastRequestDeviceUuid, lastRequestStatus) = lastRequest;
return decoratee.controlDevice(
deviceUuid: lastRequestDeviceUuid,
status: lastRequestStatus,