fix(llc): retry queue now follows the creation date

This commit is contained in:
Salvatore Giordano
2021-12-03 15:38:23 +01:00
parent 1b14e7f223
commit 7547bd6b86
3 changed files with 14 additions and 13 deletions
@@ -1698,7 +1698,7 @@ class ChannelClientState {
} }
_channelState = _channelState.copyWith( _channelState = _channelState.copyWith(
messages: newMessages, messages: newMessages..sort(_sortByCreatedAt),
channel: _channelState.channel?.copyWith( channel: _channelState.channel?.copyWith(
lastMessageAt: message.createdAt, lastMessageAt: message.createdAt,
), ),
@@ -88,20 +88,24 @@ class RetryQueue {
_isRetrying = true; _isRetrying = true;
logger?.info('Started retrying failed messages'); logger?.info('Started retrying failed messages');
for (var i = 0; i < _messageQueue.length; ++i) { while (_messageQueue.isNotEmpty) {
logger?.info('${_messageQueue.length} messages remaining in the queue'); logger?.info('${_messageQueue.length} messages remaining in the queue');
final message = _messageQueue.toList()[i]; final message = _messageQueue.first;
await _runAndRetry(message); final succeeded = await _runAndRetry(message);
if (!succeeded) {
_messageQueue.toList().forEach(_sendFailedEvent);
break;
}
} }
_isRetrying = false; _isRetrying = false;
} }
Future<void> _runAndRetry(Message message) async { Future<bool> _runAndRetry(Message message) async {
var attempt = 1; var attempt = 1;
final maxAttempt = _retryPolicy.maxRetryAttempts; final maxAttempt = _retryPolicy.maxRetryAttempts;
// early return in case maxAttempt is less than 0 // early return in case maxAttempt is less than 0
if (attempt > maxAttempt) return; if (attempt > maxAttempt) return false;
// ignore: literal_only_boolean_expressions // ignore: literal_only_boolean_expressions
while (true) { while (true) {
@@ -110,11 +114,11 @@ class RetryQueue {
await _retryMessage(message); await _retryMessage(message);
logger?.info('Message (${message.id}) sent successfully'); logger?.info('Message (${message.id}) sent successfully');
_messageQueue.removeMessage(message); _messageQueue.removeMessage(message);
return; return true;
} catch (e) { } catch (e) {
if (e is! StreamChatNetworkError || !e.isRetriable) { if (e is! StreamChatNetworkError || !e.isRetriable) {
_messageQueue.removeMessage(message); _messageQueue.removeMessage(message);
return; return true;
} }
// retry logic // retry logic
final maxAttempt = _retryPolicy.maxRetryAttempts; final maxAttempt = _retryPolicy.maxRetryAttempts;
@@ -150,6 +154,7 @@ class RetryQueue {
} }
} }
} }
return false;
} }
void _sendFailedEvent(Message message) { void _sendFailedEvent(Message message) {
@@ -533,11 +533,7 @@ class _MessageActionsModalState extends State<MessageActionsModal> {
onTap: () { onTap: () {
Navigator.pop(context); Navigator.pop(context);
final channel = StreamChannel.of(context).channel; final channel = StreamChannel.of(context).channel;
if (isUpdateFailed) { channel.state?.retryFailedMessages();
channel.updateMessage(widget.message);
} else {
channel.sendMessage(widget.message);
}
}, },
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric(vertical: 11, horizontal: 16), padding: const EdgeInsets.symmetric(vertical: 11, horizontal: 16),