mirror of
https://github.com/twonlyapp/twonly-app.git
synced 2026-05-25 09:02:13 +00:00
fix: background message fetching reliability
Some checks are pending
Flutter analyze & test / flutter_analyze_and_test (push) Waiting to run
Some checks are pending
Flutter analyze & test / flutter_analyze_and_test (push) Waiting to run
This commit is contained in:
parent
fc5c74eaed
commit
927589a505
3 changed files with 30 additions and 6 deletions
|
|
@ -1,5 +1,10 @@
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 0.2.17
|
||||||
|
|
||||||
|
- Fix: Issue with receiving messages when user closed app while decrypting
|
||||||
|
- Fix: Background message fetching reliability.
|
||||||
|
|
||||||
## 0.2.16
|
## 0.2.16
|
||||||
|
|
||||||
- Fix: Images not shown after opening due to cleanup
|
- Fix: Images not shown after opening due to cleanup
|
||||||
|
|
@ -14,7 +19,7 @@
|
||||||
- New: Tutorial on how to use zoom.
|
- New: Tutorial on how to use zoom.
|
||||||
- New: Manage storage view.
|
- New: Manage storage view.
|
||||||
- Improved: Media thumbnails for faster loading.
|
- Improved: Media thumbnails for faster loading.
|
||||||
- Fix: Some message where not marked as opened.
|
- Fix: Some messages were not marked as opened.
|
||||||
|
|
||||||
## 0.2.12
|
## 0.2.12
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -101,12 +101,20 @@ class ApiService {
|
||||||
Uri.parse(apiUrl),
|
Uri.parse(apiUrl),
|
||||||
pingInterval: const Duration(seconds: 30),
|
pingInterval: const Duration(seconds: 30),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
try {
|
||||||
|
await channel.ready.timeout(const Duration(seconds: 10));
|
||||||
|
} catch (e) {
|
||||||
|
channel.sink.close().ignore();
|
||||||
|
rethrow;
|
||||||
|
}
|
||||||
|
|
||||||
_channel = channel;
|
_channel = channel;
|
||||||
_channel!.stream.listen(_onData, onDone: _onDone, onError: _onError);
|
_channel!.stream.listen(_onData, onDone: _onDone, onError: _onError);
|
||||||
await _channel!.ready;
|
|
||||||
Log.info('websocket connected to $apiUrl');
|
Log.info('websocket connected to $apiUrl');
|
||||||
return true;
|
return true;
|
||||||
} catch (e, s) {
|
} catch (e, s) {
|
||||||
|
_channel = null;
|
||||||
if (kDebugMode) {
|
if (kDebugMode) {
|
||||||
print('DEBUG: _connectTo caught exception: $e\n$s');
|
print('DEBUG: _connectTo caught exception: $e\n$s');
|
||||||
}
|
}
|
||||||
|
|
@ -156,6 +164,7 @@ class ApiService {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> onClosed() async {
|
Future<void> onClosed() async {
|
||||||
|
if (_channel == null) return;
|
||||||
Log.info('websocket connection closed');
|
Log.info('websocket connection closed');
|
||||||
_channel = null;
|
_channel = null;
|
||||||
isAuthenticated = false;
|
isAuthenticated = false;
|
||||||
|
|
@ -187,15 +196,19 @@ class ApiService {
|
||||||
_reconnectionDelay = 3;
|
_reconnectionDelay = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> close(Function callback) async {
|
Future<void> close(Function? callback) async {
|
||||||
Log.info('closing websocket connection');
|
Log.info('closing websocket connection');
|
||||||
if (_channel != null) {
|
if (_channel != null) {
|
||||||
await _channel!.sink.close();
|
try {
|
||||||
|
await _channel!.sink.close().timeout(const Duration(seconds: 2));
|
||||||
|
} catch (e) {
|
||||||
|
Log.warn('Timeout or error closing websocket: $e');
|
||||||
|
}
|
||||||
await onClosed();
|
await onClosed();
|
||||||
callback();
|
callback?.call();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
callback();
|
callback?.call();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> listenToNetworkChanges() async {
|
Future<void> listenToNetworkChanges() async {
|
||||||
|
|
|
||||||
|
|
@ -119,9 +119,15 @@ Future<void> handlePeriodicTask({int lastExecutionInSecondsLimit = 120}) async {
|
||||||
if (!shouldBeExecuted) return;
|
if (!shouldBeExecuted) return;
|
||||||
|
|
||||||
Log.info('eu.twonly.periodic_task was called.');
|
Log.info('eu.twonly.periodic_task was called.');
|
||||||
|
AppState.gotMessageFromServer = false;
|
||||||
|
|
||||||
final stopwatch = Stopwatch()..start();
|
final stopwatch = Stopwatch()..start();
|
||||||
|
|
||||||
|
// Issue: Because the background isolate can be reused across multiple periodic tasks,
|
||||||
|
// the API connection state might be stale or disconnected from a previous run.
|
||||||
|
// Explicitly close it here to ensure a clean slate before connecting.
|
||||||
|
await apiService.close(null);
|
||||||
|
|
||||||
if (!await apiService.connect()) {
|
if (!await apiService.connect()) {
|
||||||
Log.info('Could not connect to the api. Returning early.');
|
Log.info('Could not connect to the api. Returning early.');
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue