From bdf0e63279fc4aa7e26bb95a9b79db3d88e7bb3c Mon Sep 17 00:00:00 2001 From: Ren Amamiya Date: Sun, 27 Sep 2026 10:42:12 +0700 Subject: [PATCH] run bootstrap on demand --- crates/signed_state/src/backend.rs | 77 ++++++++++++++---------------- 1 file changed, 35 insertions(+), 42 deletions(-) diff --git a/crates/signed_state/src/backend.rs b/crates/signed_state/src/backend.rs index ccdf0cc..5eb45d6 100644 --- a/crates/signed_state/src/backend.rs +++ b/crates/signed_state/src/backend.rs @@ -151,9 +151,10 @@ impl Backend { pump.detach(); cx.defer(move |cx| { - if let Err(error) = weak.update(cx, |this, cx| this.bootstrap(cx)) { - log::warn!("backend dropped before bootstrap could run: {error}"); - } + weak.update(cx, |this, cx| { + this.restore_session(cx); + }) + .ok(); }); Self { @@ -167,42 +168,6 @@ impl Backend { } } - fn bootstrap(&mut self, cx: &mut Context) { - let client = self.client.clone(); - - let task = cx.background_spawn(async move { - for url in BOOTSTRAP_RELAYS { - client.add_relay(url).await?; - } - - for url in INDEXER_RELAYS { - client - .add_relay(url) - .capabilities(RelayCapabilities::DISCOVERY) - .await?; - } - - client.connect().await; - - Ok::<(), Error>(()) - }); - - let notify_task: Task> = cx.spawn(async move |this, cx| { - match task.await { - Ok(()) => { - this.update(cx, |this, cx| { - this.restore_session(cx); - })?; - } - Err(e) => { - this.update(cx, |_this, cx| cx.emit(BackendEvent::error(e.to_string())))?; - } - } - Ok::<(), Error>(()) - }); - notify_task.detach(); - } - /// Restore the saved session from the Keyring. /// /// - Emits [`BackendEvent::SignerRequired`] when no credential is stored. @@ -227,7 +192,9 @@ impl Backend { let result = async { if content.starts_with("nsec1") { let keys = Keys::new(SecretKey::parse(&content)?); - this.update(cx, |this, cx| this.set_signer(keys, cx))?; + this.update(cx, |this, cx| { + this.set_signer(keys, cx); + })?; } else if content.starts_with("bunker://") { let (base, keys) = extract_master_key(&content); let uri = NostrConnectUri::parse(base)?; @@ -238,14 +205,19 @@ impl Backend { None, )?; signer.auth_url_handler(SignedAuthUrlHandler); - this.update(cx, |this, cx| this.set_signer(signer, cx))?; + + this.update(cx, |this, cx| { + this.set_signer(signer, cx); + })?; } else if content.starts_with("ncryptsec1") { this.update(cx, |this, cx| { this.passphrase_required = true; cx.emit(BackendEvent::PassphraseRequired); })?; } else { - this.update(cx, |_this, cx| cx.emit(BackendEvent::SignerRequired))?; + this.update(cx, |_this, cx| { + cx.emit(BackendEvent::SignerRequired); + })?; } Ok::<_, Error>(()) @@ -1424,10 +1396,29 @@ async fn connect_repo_relays( Ok(()) } +/// Add and connect the startup relays. +async fn ensure_bootstrap_relays(client: &Client) -> Result<(), Error> { + for url in BOOTSTRAP_RELAYS { + client.add_relay(url).and_connect().await?; + } + + for url in INDEXER_RELAYS { + client + .add_relay(url) + .capabilities(RelayCapabilities::DISCOVERY) + .and_connect() + .await?; + } + + Ok(()) +} + pub(crate) async fn subscribe_bootstrap_only( client: &Client, filters: Vec, ) -> Result<(), Error> { + ensure_bootstrap_relays(client).await?; + let opts = SubscribeAutoCloseOptions::default() .exit_policy(ReqExitPolicy::ExitOnEOSE) .timeout(Some(Duration::from_secs(10))); @@ -1447,6 +1438,8 @@ pub(crate) async fn sync_bootstrap_only( filter: Filter, opts: SyncOptions, ) -> Result { + ensure_bootstrap_relays(client).await?; + let output = client .sync(filter) .with(BOOTSTRAP_RELAYS)