From 633ae39622d64d58c59c83fa95e9a65295396500 Mon Sep 17 00:00:00 2001 From: Shroominic Date: Thu, 11 Sep 2025 13:39:29 +0100 Subject: [PATCH] optimize startup time and announcement fetching --- routstr/nip91.py | 56 +++++++++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/routstr/nip91.py b/routstr/nip91.py index 4d4ab59d..3a0a40d2 100644 --- a/routstr/nip91.py +++ b/routstr/nip91.py @@ -292,18 +292,27 @@ async def _determine_provider_id(public_key_hex: str, relay_urls: list[str]) -> logger.info(f"Using configured provider_id from env: {explicit}") return explicit - latest_event: dict[str, Any] | None = None - latest_ts = -1 - for relay_url in relay_urls: + async def query_single_relay(relay_url: str) -> list[dict[str, Any]]: try: events, _ok = await query_nip91_events(relay_url, public_key_hex, None) - for ev in events: - ts = int(ev.get("created_at", 0)) - if ts > latest_ts: - latest_event = ev - latest_ts = ts + return events except Exception: - continue + return [] + + # Query all relays concurrently + all_events_lists = await asyncio.gather( + *[query_single_relay(relay_url) for relay_url in relay_urls] + ) + + latest_event: dict[str, Any] | None = None + latest_ts = -1 + + for events_list in all_events_lists: + for ev in events_list: + ts = int(ev.get("created_at", 0)) + if ts > latest_ts: + latest_event = ev + latest_ts = ts existing_d = _get_single_tag_value(latest_event, "d") if latest_event else None if existing_d: @@ -367,20 +376,7 @@ async def announce_provider() -> None: private_key_hex, public_key_hex = keypair logger.info(f"Using Nostr pubkey: {public_key_hex}") - # Configure relays first (RELAYS only) - relay_urls = [u.strip() for u in getattr(settings, "relays", []) if u.strip()] - if not relay_urls: - relay_urls = [ - "wss://relay.nostr.band", - "wss://relay.damus.io", - "wss://nos.lol", - ] - - # Determine a stable provider_id - provider_id = await _determine_provider_id(public_key_hex, relay_urls) - logger.info(f"Using provider_id: {provider_id}") - - # Core settings only (no ROUTSTR_* vars) + # Resolve settings and determine if we can publish BEFORE touching relays try: base_url: str | None = settings.http_url onion_url: str | None = settings.onion_url @@ -400,7 +396,6 @@ async def announce_provider() -> None: logger.info(f"Discovered onion URL via Tor volume: {onion_url}") mint_urls = cashu_mints if cashu_mints else None - # Build endpoint URLs (skip defaults like localhost) endpoint_urls: list[str] = [] if base_url and base_url.strip() and base_url.strip() != "http://localhost:8000": endpoint_urls.append(base_url.strip()) @@ -418,6 +413,19 @@ async def announce_provider() -> None: ) return + # Only now configure relays and determine provider_id (may query relays) + relay_urls = [u.strip() for u in getattr(settings, "relays", []) if u.strip()] + if not relay_urls: + relay_urls = [ + "wss://relay.nostr.band", + "wss://relay.damus.io", + "wss://relay.routstr.com", + "wss://nos.lol", + ] + + provider_id = await _determine_provider_id(public_key_hex, relay_urls) + logger.info(f"Using provider_id: {provider_id}") + # Build metadata metadata = { "name": provider_name,