diff --git a/lib/src/event.dart b/lib/src/event.dart index dd71135d..7656e241 100644 --- a/lib/src/event.dart +++ b/lib/src/event.dart @@ -116,6 +116,28 @@ class Event extends MatrixEvent { } this.stateKey = stateKey; this.originServerTs = originServerTs; + + // Mark event as failed to send if status is `sending` and event is older + // than the timeout. This should not happen with the deprecated Moor + // database! + if (status == 0 && room?.client?.database != null) { + // Age of this event in milliseconds + final age = DateTime.now().millisecondsSinceEpoch - + originServerTs.millisecondsSinceEpoch; + + if (age > room.client.sendMessageTimeoutSeconds * 1000) { + // Update this event in database and open timelines + final json = toJson(); + json['unsigned'] ??= {}; + json['unsigned'][messageSendingStatusKey] = -1; + room.client.handleSync(SyncUpdate() + ..rooms = (RoomsUpdate() + ..join = ({}..[room.id] = + (JoinedRoomUpdate() + ..timeline = (TimelineUpdate() + ..events = [MatrixEvent.fromJson(json)]))))); + } + } } static Map getMapFromPayload(dynamic payload) { diff --git a/test/timeline_test.dart b/test/timeline_test.dart index ab94d0e4..cd6a8882 100644 --- a/test/timeline_test.dart +++ b/test/timeline_test.dart @@ -346,7 +346,7 @@ void main() { 'sender': '@alice:example.com', 'status': 0, 'event_id': 'will-fail', - 'origin_server_ts': testTimeStamp + 'origin_server_ts': DateTime.now().millisecondsSinceEpoch, }, sortOrder: room.newSortOrder)); await Future.delayed(Duration(milliseconds: 50)); @@ -380,7 +380,7 @@ void main() { 'sender': '@alice:example.com', 'status': 0, 'event_id': 'transaction', - 'origin_server_ts': testTimeStamp + 'origin_server_ts': DateTime.now().millisecondsSinceEpoch, }, sortOrder: room.newSortOrder)); await Future.delayed(Duration(milliseconds: 50)); @@ -430,7 +430,7 @@ void main() { 'content': {'msgtype': 'm.text', 'body': 'Testcase'}, 'sender': '@alice:example.com', 'event_id': 'transaction', - 'origin_server_ts': testTimeStamp, + 'origin_server_ts': DateTime.now().millisecondsSinceEpoch, 'unsigned': { messageSendingStatusKey: 0, 'transaction_id': 'transaction', @@ -488,7 +488,7 @@ void main() { 'sender': '@alice:example.com', 'status': 0, 'event_id': 'transaction', - 'origin_server_ts': testTimeStamp + 'origin_server_ts': DateTime.now().millisecondsSinceEpoch, }, sortOrder: room.newSortOrder)); await Future.delayed(Duration(milliseconds: 50)); @@ -537,7 +537,7 @@ void main() { 'sender': '@alice:example.com', 'status': 0, 'event_id': 'transaction', - 'origin_server_ts': testTimeStamp + 'origin_server_ts': DateTime.now().millisecondsSinceEpoch, }, sortOrder: room.newSortOrder)); await Future.delayed(Duration(milliseconds: 50));