From cdebde07d2821a840fd602d807ab39f57926ff47 Mon Sep 17 00:00:00 2001 From: "Sergey B." Date: Tue, 24 Mar 2026 13:21:39 +0300 Subject: [PATCH] feat: timeout for relay connection --- settings.tpl.toml | 2 ++ src/app/context.rs | 1 + src/config/types.rs | 7 +++++++ src/util.rs | 18 +++++++++++++++++- 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/settings.tpl.toml b/settings.tpl.toml index 56a312f7..a030e67f 100644 --- a/settings.tpl.toml +++ b/settings.tpl.toml @@ -21,6 +21,8 @@ payment_retries_interval = 60 [nostr] nsec_privkey = 'nsec1...' relays = ['ws://localhost:7000'] +# Seconds to wait for relay connections at startup before continuing (default: 5) +# relay_connection_timeout_secs = 5 [mostro] # NIP-01 Kind 0 Metadata (optional) diff --git a/src/app/context.rs b/src/app/context.rs index 58f1def7..cd17a82b 100644 --- a/src/app/context.rs +++ b/src/app/context.rs @@ -262,6 +262,7 @@ pub mod test_utils { nsec_privkey: "nsec13as48eum93hkg7plv526r9gjpa0uc52zysqm93pmnkca9e69x6tsdjmdxd" .to_string(), relays: vec!["wss://relay.test".to_string()], + relay_connection_timeout_secs: 5, }, mostro: MostroSettings::default(), lightning: LightningSettings::default(), diff --git a/src/config/types.rs b/src/config/types.rs index 748e38a6..6b2c8696 100644 --- a/src/config/types.rs +++ b/src/config/types.rs @@ -129,6 +129,13 @@ pub struct NostrSettings { pub nsec_privkey: String, /// Nostr relays list pub relays: Vec, + /// Seconds to wait for relay connections at startup before continuing (default: 5) + #[serde(default = "default_relay_connection_timeout_secs")] + pub relay_connection_timeout_secs: u64, +} + +fn default_relay_connection_timeout_secs() -> u64 { + 5 } /// RPC configuration settings #[derive(Debug, Deserialize, Clone)] diff --git a/src/util.rs b/src/util.rs index 78deffad..3b51f102 100644 --- a/src/util.rs +++ b/src/util.rs @@ -779,8 +779,24 @@ pub async fn connect_nostr() -> Result { .map_err(|e| MostroInternalErr(ServiceError::NostrError(e.to_string())))?; } - // Connect to relays and keep connection alive + let timeout = + std::time::Duration::from_secs(nostr_settings.relay_connection_timeout_secs); client.connect().await; + client.wait_for_connection(timeout).await; + + let connected = client + .relays() + .await + .values() + .filter(|r| r.is_connected()) + .count(); + + if connected == 0 { + tracing::error!("No Nostr relays connected after timeout of {}s", nostr_settings.relay_connection_timeout_secs); + return Err(MostroInternalErr(ServiceError::NostrError( + "No relays connected".to_string(), + ))); + } Ok(client) }