upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/src/lib/client.rs
diff options
context:
space:
mode:
authorDanConwayDev <DanConwayDev@protonmail.com>2024-11-27 17:08:25 +0000
committerDanConwayDev <DanConwayDev@protonmail.com>2024-11-27 17:08:25 +0000
commit83448a99aaf18c7a045a081c5de0c22bc4a83de1 (patch)
tree28076a33b40e63937d79a8fe8d54b58d42db092c /src/lib/client.rs
parent5478aa74cc26452809e499a461067ca9744cb7ce (diff)
chore: bump rust-nosrt v0.37.0
use RelayUrl in repo_ref which I had resisted as it mutates relay urls when printed to append a slash
Diffstat (limited to 'src/lib/client.rs')
-rw-r--r--src/lib/client.rs73
1 files changed, 35 insertions, 38 deletions
diff --git a/src/lib/client.rs b/src/lib/client.rs
index 7093dd5..051aa3d 100644
--- a/src/lib/client.rs
+++ b/src/lib/client.rs
@@ -30,11 +30,11 @@ use indicatif::{MultiProgress, ProgressBar, ProgressDrawTarget, ProgressState, P
30#[cfg(test)] 30#[cfg(test)]
31use mockall::*; 31use mockall::*;
32use nostr::{nips::nip01::Coordinate, Event}; 32use nostr::{nips::nip01::Coordinate, Event};
33use nostr_database::NostrDatabase; 33use nostr_database::NostrEventsDatabase;
34use nostr_lmdb::NostrLMDB; 34use nostr_lmdb::NostrLMDB;
35use nostr_sdk::{ 35use nostr_sdk::{
36 prelude::RelayLimits, EventBuilder, EventId, Kind, NostrSigner, Options, PublicKey, 36 prelude::RelayLimits, EventBuilder, EventId, Kind, NostrSigner, Options, PublicKey, RelayUrl,
37 SingleLetterTag, Timestamp, Url, 37 SingleLetterTag, Timestamp,
38}; 38};
39 39
40use crate::{ 40use crate::{
@@ -63,7 +63,7 @@ pub trait Connect {
63 fn default() -> Self; 63 fn default() -> Self;
64 fn new(opts: Params) -> Self; 64 fn new(opts: Params) -> Self;
65 async fn set_signer(&mut self, signer: Arc<dyn NostrSigner>); 65 async fn set_signer(&mut self, signer: Arc<dyn NostrSigner>);
66 async fn connect(&self, relay_url: &Url) -> Result<()>; 66 async fn connect(&self, relay_url: &RelayUrl) -> Result<()>;
67 async fn disconnect(&self) -> Result<()>; 67 async fn disconnect(&self) -> Result<()>;
68 fn get_fallback_relays(&self) -> &Vec<String>; 68 fn get_fallback_relays(&self) -> &Vec<String>;
69 fn get_more_fallback_relays(&self) -> &Vec<String>; 69 fn get_more_fallback_relays(&self) -> &Vec<String>;
@@ -82,7 +82,7 @@ pub trait Connect {
82 ) -> Result<Vec<nostr::Event>>; 82 ) -> Result<Vec<nostr::Event>>;
83 async fn get_events_per_relay( 83 async fn get_events_per_relay(
84 &self, 84 &self,
85 relays: Vec<Url>, 85 relays: Vec<RelayUrl>,
86 filters: Vec<nostr::Filter>, 86 filters: Vec<nostr::Filter>,
87 progress_reporter: MultiProgress, 87 progress_reporter: MultiProgress,
88 ) -> Result<(Vec<Result<Vec<nostr::Event>>>, MultiProgress)>; 88 ) -> Result<(Vec<Result<Vec<nostr::Event>>>, MultiProgress)>;
@@ -172,7 +172,7 @@ impl Connect for Client {
172 self.client.set_signer(signer).await; 172 self.client.set_signer(signer).await;
173 } 173 }
174 174
175 async fn connect(&self, relay_url: &Url) -> Result<()> { 175 async fn connect(&self, relay_url: &RelayUrl) -> Result<()> {
176 self.client 176 self.client
177 .add_relay(relay_url) 177 .add_relay(relay_url)
178 .await 178 .await
@@ -244,7 +244,7 @@ impl Connect for Client {
244 ) -> Result<Vec<nostr::Event>> { 244 ) -> Result<Vec<nostr::Event>> {
245 let (relay_results, _) = self 245 let (relay_results, _) = self
246 .get_events_per_relay( 246 .get_events_per_relay(
247 relays.iter().map(|r| Url::parse(r).unwrap()).collect(), 247 relays.iter().map(|r| RelayUrl::parse(r).unwrap()).collect(),
248 filters, 248 filters,
249 MultiProgress::new(), 249 MultiProgress::new(),
250 ) 250 )
@@ -254,7 +254,7 @@ impl Connect for Client {
254 254
255 async fn get_events_per_relay( 255 async fn get_events_per_relay(
256 &self, 256 &self,
257 relays: Vec<Url>, 257 relays: Vec<RelayUrl>,
258 filters: Vec<nostr::Filter>, 258 filters: Vec<nostr::Filter>,
259 progress_reporter: MultiProgress, 259 progress_reporter: MultiProgress,
260 ) -> Result<(Vec<Result<Vec<nostr::Event>>>, MultiProgress)> { 260 ) -> Result<(Vec<Result<Vec<nostr::Event>>>, MultiProgress)> {
@@ -335,8 +335,8 @@ impl Connect for Client {
335 let fallback_relays = &self 335 let fallback_relays = &self
336 .fallback_relays 336 .fallback_relays
337 .iter() 337 .iter()
338 .filter_map(|r| Url::parse(r).ok()) 338 .filter_map(|r| RelayUrl::parse(r).ok())
339 .collect::<HashSet<Url>>(); 339 .collect::<HashSet<RelayUrl>>();
340 340
341 let mut request = create_relays_request( 341 let mut request = create_relays_request(
342 git_repo_path, 342 git_repo_path,
@@ -359,17 +359,17 @@ impl Connect for Client {
359 // don't look for events on blaster 359 // don't look for events on blaster
360 .filter(|&r| !r.as_str().contains("nostr.mutinywallet.com")) 360 .filter(|&r| !r.as_str().contains("nostr.mutinywallet.com"))
361 .cloned() 361 .cloned()
362 .collect::<HashSet<Url>>() 362 .collect::<HashSet<RelayUrl>>()
363 .difference(&processed_relays) 363 .difference(&processed_relays)
364 .cloned() 364 .cloned()
365 .collect::<HashSet<Url>>(); 365 .collect::<HashSet<RelayUrl>>();
366 if relays.is_empty() { 366 if relays.is_empty() {
367 break; 367 break;
368 } 368 }
369 let profile_relays_only = request 369 let profile_relays_only = request
370 .user_relays_for_profiles 370 .user_relays_for_profiles
371 .difference(&request.repo_relays) 371 .difference(&request.repo_relays)
372 .collect::<HashSet<&Url>>(); 372 .collect::<HashSet<&RelayUrl>>();
373 for relay in &request.repo_relays { 373 for relay in &request.repo_relays {
374 self.client 374 self.client
375 .add_relay(relay.as_str()) 375 .add_relay(relay.as_str())
@@ -469,11 +469,7 @@ impl Connect for Client {
469 processed_relays.extend(relays.clone()); 469 processed_relays.extend(relays.clone());
470 470
471 if let Ok(repo_ref) = get_repo_ref_from_cache(git_repo_path, repo_coordinates).await { 471 if let Ok(repo_ref) = get_repo_ref_from_cache(git_repo_path, repo_coordinates).await {
472 request.repo_relays = repo_ref 472 request.repo_relays = repo_ref.relays.iter().cloned().collect();
473 .relays
474 .iter()
475 .filter_map(|r| Url::parse(r).ok())
476 .collect();
477 } 473 }
478 474
479 request.user_relays_for_profiles = { 475 request.user_relays_for_profiles = {
@@ -486,7 +482,7 @@ impl Connect for Client {
486 { 482 {
487 if let Ok(user_ref) = get_user_ref_from_cache(git_repo_path, user).await { 483 if let Ok(user_ref) = get_user_ref_from_cache(git_repo_path, user).await {
488 for r in user_ref.relays.write() { 484 for r in user_ref.relays.write() {
489 if let Ok(url) = Url::parse(&r) { 485 if let Ok(url) = RelayUrl::parse(&r) {
490 set.insert(url); 486 set.insert(url);
491 } 487 }
492 } 488 }
@@ -905,7 +901,7 @@ async fn create_relays_request(
905 git_repo_path: Option<&Path>, 901 git_repo_path: Option<&Path>,
906 repo_coordinates: &HashSet<Coordinate>, 902 repo_coordinates: &HashSet<Coordinate>,
907 user_profiles: &HashSet<PublicKey>, 903 user_profiles: &HashSet<PublicKey>,
908 fallback_relays: HashSet<Url>, 904 fallback_relays: HashSet<RelayUrl>,
909) -> Result<FetchRequest> { 905) -> Result<FetchRequest> {
910 let repo_ref = get_repo_ref_from_cache(git_repo_path, repo_coordinates).await; 906 let repo_ref = get_repo_ref_from_cache(git_repo_path, repo_coordinates).await;
911 907
@@ -1026,7 +1022,7 @@ async fn create_relays_request(
1026 { 1022 {
1027 if let Ok(user_ref) = get_user_ref_from_cache(git_repo_path, user).await { 1023 if let Ok(user_ref) = get_user_ref_from_cache(git_repo_path, user).await {
1028 for r in user_ref.relays.write() { 1024 for r in user_ref.relays.write() {
1029 if let Ok(url) = Url::parse(&r) { 1025 if let Ok(url) = RelayUrl::parse(&r) {
1030 set.insert(url); 1026 set.insert(url);
1031 } 1027 }
1032 } 1028 }
@@ -1068,17 +1064,13 @@ async fn create_relays_request(
1068 let relays = { 1064 let relays = {
1069 let mut relays = fallback_relays; 1065 let mut relays = fallback_relays;
1070 if let Ok(repo_ref) = &repo_ref { 1066 if let Ok(repo_ref) = &repo_ref {
1071 for r in &repo_ref.relays { 1067 for r in repo_ref.relays.clone() {
1072 if let Ok(url) = Url::parse(r) { 1068 relays.insert(r);
1073 relays.insert(url);
1074 }
1075 } 1069 }
1076 } 1070 }
1077 for c in repo_coordinates { 1071 for c in repo_coordinates {
1078 for r in &c.relays { 1072 for r in &c.relays {
1079 if let Ok(url) = Url::parse(r) { 1073 relays.insert(r.clone());
1080 relays.insert(url);
1081 }
1082 } 1074 }
1083 } 1075 }
1084 relays 1076 relays
@@ -1500,8 +1492,8 @@ impl Display for FetchReport {
1500 1492
1501#[derive(Default, Clone)] 1493#[derive(Default, Clone)]
1502pub struct FetchRequest { 1494pub struct FetchRequest {
1503 repo_relays: HashSet<Url>, 1495 repo_relays: HashSet<RelayUrl>,
1504 selected_relay: Option<Url>, 1496 selected_relay: Option<RelayUrl>,
1505 relay_column_width: usize, 1497 relay_column_width: usize,
1506 repo_coordinates_without_relays: Vec<(Coordinate, Option<Timestamp>)>, 1498 repo_coordinates_without_relays: Vec<(Coordinate, Option<Timestamp>)>,
1507 state: Option<(Timestamp, EventId)>, 1499 state: Option<(Timestamp, EventId)>,
@@ -1510,7 +1502,7 @@ pub struct FetchRequest {
1510 missing_contributor_profiles: HashSet<PublicKey>, 1502 missing_contributor_profiles: HashSet<PublicKey>,
1511 existing_events: HashSet<EventId>, 1503 existing_events: HashSet<EventId>,
1512 profiles_to_fetch_from_user_relays: HashMap<PublicKey, (Timestamp, Timestamp)>, 1504 profiles_to_fetch_from_user_relays: HashMap<PublicKey, (Timestamp, Timestamp)>,
1513 user_relays_for_profiles: HashSet<Url>, 1505 user_relays_for_profiles: HashSet<RelayUrl>,
1514} 1506}
1515 1507
1516pub async fn fetching_with_report( 1508pub async fn fetching_with_report(
@@ -1646,7 +1638,7 @@ pub async fn send_events(
1646 git_repo_path: Option<&Path>, 1638 git_repo_path: Option<&Path>,
1647 events: Vec<nostr::Event>, 1639 events: Vec<nostr::Event>,
1648 my_write_relays: Vec<String>, 1640 my_write_relays: Vec<String>,
1649 repo_read_relays: Vec<String>, 1641 repo_read_relays: Vec<RelayUrl>,
1650 animate: bool, 1642 animate: bool,
1651 silent: bool, 1643 silent: bool,
1652) -> Result<()> { 1644) -> Result<()> {
@@ -1659,7 +1651,12 @@ pub async fn send_events(
1659 }, 1651 },
1660 ] 1652 ]
1661 .concat(); 1653 .concat();
1662 let mut relays: Vec<&String> = vec![]; 1654 let mut relays: Vec<&str> = vec![];
1655
1656 let repo_read_relays = repo_read_relays
1657 .iter()
1658 .map(|r| r.to_string())
1659 .collect::<Vec<String>>();
1663 1660
1664 let all = &[ 1661 let all = &[
1665 repo_read_relays.clone(), 1662 repo_read_relays.clone(),
@@ -1722,7 +1719,7 @@ pub async fn send_events(
1722 1719
1723 #[allow(clippy::borrow_deref_ref)] 1720 #[allow(clippy::borrow_deref_ref)]
1724 join_all(relays.iter().map(|&relay| async { 1721 join_all(relays.iter().map(|&relay| async {
1725 let relay_clean = remove_trailing_slash(&*relay); 1722 let relay_clean = remove_trailing_slash(relay);
1726 let details = format!( 1723 let details = format!(
1727 "{}{}{} {}", 1724 "{}{}{} {}",
1728 if my_write_relays 1725 if my_write_relays
@@ -1735,7 +1732,7 @@ pub async fn send_events(
1735 }, 1732 },
1736 if repo_read_relays 1733 if repo_read_relays
1737 .iter() 1734 .iter()
1738 .any(|r| relay_clean.eq(&remove_trailing_slash(r))) 1735 .any(|r| relay_clean.eq(&remove_trailing_slash(&r.to_string())))
1739 { 1736 {
1740 " [repo-relay]" 1737 " [repo-relay]"
1741 } else { 1738 } else {
@@ -1763,7 +1760,7 @@ pub async fn send_events(
1763 let mut failed = false; 1760 let mut failed = false;
1764 for event in &events { 1761 for event in &events {
1765 match client 1762 match client
1766 .send_event_to(git_repo_path, relay.as_str(), event.clone()) 1763 .send_event_to(git_repo_path, relay, event.clone())
1767 .await 1764 .await
1768 { 1765 {
1769 Ok(_) => pb.inc(1), 1766 Ok(_) => pb.inc(1),
@@ -1793,8 +1790,8 @@ pub async fn send_events(
1793 Ok(()) 1790 Ok(())
1794} 1791}
1795 1792
1796fn remove_trailing_slash(s: &String) -> String { 1793fn remove_trailing_slash(s: &str) -> String {
1797 match s.as_str().strip_suffix('/') { 1794 match s.strip_suffix('/') {
1798 Some(s) => s, 1795 Some(s) => s,
1799 None => s, 1796 None => s,
1800 } 1797 }