From 37b11cef79568096baee4ba121f7a86003356c21 Mon Sep 17 00:00:00 2001 From: otsmr Date: Mon, 14 Jul 2025 01:20:06 +0200 Subject: [PATCH] fixing race condition --- lib/src/services/api/messages.dart | 33 +++++++++++++++-------- lib/src/services/api/server_messages.dart | 1 - pubspec.yaml | 2 +- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/lib/src/services/api/messages.dart b/lib/src/services/api/messages.dart index 22481ec..dfa7f99 100644 --- a/lib/src/services/api/messages.dart +++ b/lib/src/services/api/messages.dart @@ -4,6 +4,7 @@ import 'dart:io'; import 'package:cryptography_plus/cryptography_plus.dart'; import 'package:drift/drift.dart'; import 'package:fixnum/fixnum.dart'; +import 'package:mutex/mutex.dart'; import 'package:twonly/globals.dart'; import 'package:twonly/src/database/twonly_database.dart'; import 'package:twonly/src/database/tables/messages_table.dart'; @@ -19,18 +20,22 @@ import 'package:twonly/src/services/signal/encryption.signal.dart'; import 'package:twonly/src/utils/log.dart'; import 'package:twonly/src/utils/storage.dart'; +final lockRetransmission = Mutex(); + Future tryTransmitMessages() async { - final retransIds = - await twonlyDB.messageRetransmissionDao.getRetransmitAbleMessages(); + return await lockRetransmission.protect(() async { + final retransIds = + await twonlyDB.messageRetransmissionDao.getRetransmitAbleMessages(); - Log.info("Retransmitting ${retransIds.length} text messages"); + Log.info("Retransmitting ${retransIds.length} text messages"); - if (retransIds.isEmpty) return; + if (retransIds.isEmpty) return; - for (final retransId in retransIds) { - sendRetransmitMessage(retransId, fromRetransmissionDb: true); - //twonlyDB.messageRetransmissionDao.deleteRetransmissionById(retransId); - } + for (final retransId in retransIds) { + sendRetransmitMessage(retransId, fromRetransmissionDb: true); + //twonlyDB.messageRetransmissionDao.deleteRetransmissionById(retransId); + } + }); } Future sendRetransmitMessage(int retransId, @@ -45,6 +50,11 @@ Future sendRetransmitMessage(int retransId, return; } + if (retrans.acknowledgeByServerAt != null) { + Log.error("$retransId message already retransmitted"); + return; + } + MessageJson json = MessageJson.fromJson( jsonDecode( utf8.decode( @@ -52,15 +62,16 @@ Future sendRetransmitMessage(int retransId, ), ), ); - DateTime timestampToCheck = DateTime.parse("2025-06-24T12:00:00"); + + DateTime timestampToCheck = DateTime.parse("2025-07-14T00:36:00"); if (json.timestamp.isBefore(timestampToCheck)) { - Log.info("Deleting retransmission because it is before the update..."); + Log.info("Ignoring retransmission because it is before the update..."); await twonlyDB.messageRetransmissionDao .deleteRetransmissionById(retransId); return; } - Log.info("Retransmitting: ${json.kind} to ${retrans.contactId}"); + Log.info("Retransmitting $retransId: ${json.kind} to ${retrans.contactId}"); Contact? contact = await twonlyDB.contactsDao .getContactByUserId(retrans.contactId) diff --git a/lib/src/services/api/server_messages.dart b/lib/src/services/api/server_messages.dart index ca10938..27136ac 100644 --- a/lib/src/services/api/server_messages.dart +++ b/lib/src/services/api/server_messages.dart @@ -3,7 +3,6 @@ import 'dart:io'; import 'package:cryptography_plus/cryptography_plus.dart'; import 'package:drift/drift.dart'; import 'package:fixnum/fixnum.dart'; -import 'package:flutter/foundation.dart'; import 'package:libsignal_protocol_dart/libsignal_protocol_dart.dart'; import 'package:mutex/mutex.dart'; import 'package:twonly/globals.dart'; diff --git a/pubspec.yaml b/pubspec.yaml index b25b1ac..504d3ea 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ description: "twonly, a privacy-friendly way to connect with friends through sec # Prevent accidental publishing to pub.dev. publish_to: 'none' -version: 0.0.54+54 +version: 0.0.56+56 environment: sdk: ^3.6.0