From 7a1b86c8d05256ea4d8fb2e93e960bc582d42219 Mon Sep 17 00:00:00 2001 From: Codex Bot Date: Sun, 19 Apr 2026 18:29:36 +0200 Subject: [PATCH] Harden local node sync and restart flow --- lib/app.dart | 23 +++++++++++++------- lib/services/windows_local_node_service.dart | 11 ++++++++-- lib/ui/screens/settings_screen.dart | 16 +++++++++----- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/lib/app.dart b/lib/app.dart index 278ef44..725d9d0 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -147,14 +147,21 @@ class _PeyaAppState extends ConsumerState { return; } } - try { - await ref - .read(walletControllerProvider.notifier) - .connectNode(config.nodeConfig); - await ref.read(walletControllerProvider.notifier).syncNow(); - return; - } catch (error) { - ref.read(loggerProvider).w('Failed to connect node: $error'); + final attempts = config.nodeConfig.mode == NodeMode.local ? 5 : 1; + for (var attempt = 0; attempt < attempts; attempt++) { + try { + await ref + .read(walletControllerProvider.notifier) + .connectNode(config.nodeConfig); + await ref.read(walletControllerProvider.notifier).syncNow(); + return; + } catch (error) { + if (attempt + 1 >= attempts) { + ref.read(loggerProvider).w('Failed to connect node: $error'); + return; + } + await Future.delayed(const Duration(seconds: 1)); + } } } diff --git a/lib/services/windows_local_node_service.dart b/lib/services/windows_local_node_service.dart index b4edfa7..ac8f394 100644 --- a/lib/services/windows_local_node_service.dart +++ b/lib/services/windows_local_node_service.dart @@ -39,12 +39,19 @@ class WindowsLocalNodeService implements LocalNodeService { @override Future stop() async { final effective = _resolveConfig(null); - final stopped = await _stopViaRpc(effective); + if (!await _isRpcAvailable(effective)) { + return true; + } + final rpcAccepted = await _stopViaRpc(effective); + final stopped = await _waitForStop(effective); if (!stopped) { _logger.w('Failed to stop local node via RPC.'); return false; } - return _waitForStop(effective); + if (!rpcAccepted) { + _logger.i('Local node stopped despite RPC response/read failure.'); + } + return true; } @override diff --git a/lib/ui/screens/settings_screen.dart b/lib/ui/screens/settings_screen.dart index 07c49e0..1564d02 100644 --- a/lib/ui/screens/settings_screen.dart +++ b/lib/ui/screens/settings_screen.dart @@ -391,11 +391,17 @@ class _LocalNodeControlsState extends ConsumerState<_LocalNodeControls> { final nodeConfig = config.nodeConfig; final walletState = ref.read(walletControllerProvider); if (walletState.walletInfo != null && nodeConfig.mode == NodeMode.local) { - try { - await ref.read(walletControllerProvider.notifier).connectNode(nodeConfig); - await ref.read(walletControllerProvider.notifier).syncNow(); - } catch (_) { - // Keep action successful if daemon started; sync errors surface through wallet state. + for (var attempt = 0; attempt < 5; attempt++) { + try { + await ref.read(walletControllerProvider.notifier).connectNode(nodeConfig); + await ref.read(walletControllerProvider.notifier).syncNow(); + break; + } catch (_) { + if (attempt == 4) { + break; + } + await Future.delayed(const Duration(seconds: 1)); + } } } return ok;