auto retry on offline when already connected (#14124)
When controlled peer is reconnecting after signout/switch user, auto retry for 30s (matches server's peer offline threshold) instead of immediately showing "Remote desktop is offline" error. Ref: https://github.com/rustdesk/rustdesk/discussions/14048 Signed-off-by: 21pages <sunboeasy@gmail.com>
This commit is contained in:
@@ -120,6 +120,7 @@ class FfiModel with ChangeNotifier {
|
|||||||
late VirtualMouseMode virtualMouseMode;
|
late VirtualMouseMode virtualMouseMode;
|
||||||
Timer? _timer;
|
Timer? _timer;
|
||||||
var _reconnects = 1;
|
var _reconnects = 1;
|
||||||
|
DateTime? _offlineReconnectStartTime;
|
||||||
bool _viewOnly = false;
|
bool _viewOnly = false;
|
||||||
bool _showMyCursor = false;
|
bool _showMyCursor = false;
|
||||||
WeakReference<FFI> parent;
|
WeakReference<FFI> parent;
|
||||||
@@ -783,7 +784,8 @@ class FfiModel with ChangeNotifier {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> updateCurDisplay(SessionID sessionId, {updateCursorPos = false}) async {
|
Future<void> updateCurDisplay(SessionID sessionId,
|
||||||
|
{updateCursorPos = false}) async {
|
||||||
final newRect = displaysRect();
|
final newRect = displaysRect();
|
||||||
if (newRect == null) {
|
if (newRect == null) {
|
||||||
return;
|
return;
|
||||||
@@ -939,11 +941,46 @@ class FfiModel with ChangeNotifier {
|
|||||||
showPrivacyFailedDialog(
|
showPrivacyFailedDialog(
|
||||||
sessionId, type, title, text, link, hasRetry, dialogManager);
|
sessionId, type, title, text, link, hasRetry, dialogManager);
|
||||||
} else {
|
} else {
|
||||||
final hasRetry = evt['hasRetry'] == 'true';
|
var hasRetry = evt['hasRetry'] == 'true';
|
||||||
|
if (!hasRetry) {
|
||||||
|
hasRetry = shouldAutoRetryOnOffline(type, title, text);
|
||||||
|
}
|
||||||
showMsgBox(sessionId, type, title, text, link, hasRetry, dialogManager);
|
showMsgBox(sessionId, type, title, text, link, hasRetry, dialogManager);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Auto-retry check for "Remote desktop is offline" error.
|
||||||
|
/// returns true to auto-retry, false otherwise.
|
||||||
|
bool shouldAutoRetryOnOffline(
|
||||||
|
String type,
|
||||||
|
String title,
|
||||||
|
String text,
|
||||||
|
) {
|
||||||
|
if (type == 'error' &&
|
||||||
|
title == 'Connection Error' &&
|
||||||
|
text == 'Remote desktop is offline' &&
|
||||||
|
_pi.isSet.isTrue) {
|
||||||
|
// Auto retry for ~30s (server's peer offline threshold) when controlled peer's account changes
|
||||||
|
// (e.g., signout, switch user, login into OS) causes temporary offline via websocket/tcp connection.
|
||||||
|
// The actual wait may exceed 30s (e.g., 20s elapsed + 16s next retry = 36s), which is acceptable
|
||||||
|
// since the controlled side reconnects quickly after account changes.
|
||||||
|
// Uses time-based check instead of _reconnects count because user can manually retry.
|
||||||
|
// https://github.com/rustdesk/rustdesk/discussions/14048
|
||||||
|
if (_offlineReconnectStartTime == null) {
|
||||||
|
// First offline, record time and start retry
|
||||||
|
_offlineReconnectStartTime = DateTime.now();
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
final elapsed =
|
||||||
|
DateTime.now().difference(_offlineReconnectStartTime!).inSeconds;
|
||||||
|
if (elapsed < 30) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
handleToast(Map<String, dynamic> evt, SessionID sessionId, String peerId) {
|
handleToast(Map<String, dynamic> evt, SessionID sessionId, String peerId) {
|
||||||
final type = evt['type'] ?? 'info';
|
final type = evt['type'] ?? 'info';
|
||||||
final text = evt['text'] ?? '';
|
final text = evt['text'] ?? '';
|
||||||
@@ -1001,6 +1038,7 @@ class FfiModel with ChangeNotifier {
|
|||||||
_reconnects *= 2;
|
_reconnects *= 2;
|
||||||
} else {
|
} else {
|
||||||
_reconnects = 1;
|
_reconnects = 1;
|
||||||
|
_offlineReconnectStartTime = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1323,6 +1361,7 @@ class FfiModel with ChangeNotifier {
|
|||||||
}
|
}
|
||||||
if (displays.isNotEmpty) {
|
if (displays.isNotEmpty) {
|
||||||
_reconnects = 1;
|
_reconnects = 1;
|
||||||
|
_offlineReconnectStartTime = null;
|
||||||
waitForFirstImage.value = true;
|
waitForFirstImage.value = true;
|
||||||
isRefreshing = false;
|
isRefreshing = false;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user