From 59dbb885aa82e8756f881702d26f7e4ad5cf40d8 Mon Sep 17 00:00:00 2001 From: thePR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com> Date: Sat, 19 Jul 2025 19:14:27 -0400 Subject: [PATCH] Improve sync error reporting --- src/nostr/client.py | 30 ++++++++++++++++++++++++++---- src/seedpass/core/manager.py | 24 +++++++++++++++++++++++- 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/src/nostr/client.py b/src/nostr/client.py index 16fcc94..5d67977 100644 --- a/src/nostr/client.py +++ b/src/nostr/client.py @@ -467,17 +467,39 @@ class NostrClient: return None await self._connect_async() + self.last_error = None pubkey = self.keys.public_key() f = Filter().author(pubkey).kind(Kind(KIND_MANIFEST)).limit(3) timeout = timedelta(seconds=10) - events = (await self.client.fetch_events(f, timeout)).to_vec() + try: + events = (await self.client.fetch_events(f, timeout)).to_vec() + except Exception as e: # pragma: no cover - network errors + self.last_error = str(e) + logger.error( + "Failed to fetch manifest from relays %s: %s", + self.relays, + e, + ) + return None + if not events: return None for manifest_event in events: - result = await self._fetch_chunks_with_retry(manifest_event) - if result is not None: - return result + try: + result = await self._fetch_chunks_with_retry(manifest_event) + if result is not None: + return result + except Exception as e: # pragma: no cover - network errors + self.last_error = str(e) + logger.error( + "Error retrieving snapshot from relays %s: %s", + self.relays, + e, + ) + + if self.last_error is None: + self.last_error = "Snapshot not found on relays" return None diff --git a/src/seedpass/core/manager.py b/src/seedpass/core/manager.py index 5ae332a..bf44ba7 100644 --- a/src/seedpass/core/manager.py +++ b/src/seedpass/core/manager.py @@ -1162,6 +1162,16 @@ class PasswordManager: try: result = await self.nostr_client.fetch_latest_snapshot() if not result: + if self.nostr_client.last_error: + logger.warning( + "Unable to fetch latest snapshot from Nostr relays %s: %s", + self.nostr_client.relays, + self.nostr_client.last_error, + ) + self.notify( + f"Sync failed: {self.nostr_client.last_error}", + level="WARNING", + ) return manifest, chunks = result encrypted = gzip.decompress(b"".join(chunks)) @@ -1177,7 +1187,19 @@ class PasswordManager: ): logger.info("Local database synchronized from Nostr.") except Exception as e: - logger.warning(f"Unable to sync index from Nostr: {e}") + logger.warning( + "Unable to sync index from Nostr relays %s: %s", + self.nostr_client.relays, + e, + ) + if self.nostr_client.last_error: + logger.warning( + "NostrClient last error: %s", self.nostr_client.last_error + ) + self.notify( + f"Sync failed: {self.nostr_client.last_error or e}", + level="WARNING", + ) finally: if getattr(self, "verbose_timing", False): duration = time.perf_counter() - start