Skip to main content

fips_core/endpoint/
nostr.rs

1use super::*;
2
3impl FipsEndpoint {
4    /// Snapshot signed machine-rating events for peers with enough local
5    /// health evidence. Event signing remains inside the FIPS node identity.
6    pub async fn peer_rating_events(
7        &self,
8        scope: impl Into<String>,
9    ) -> Result<Vec<nostr::Event>, FipsEndpointError> {
10        let (response_tx, response_rx) = oneshot::channel();
11        self.control(
12            "peer rating snapshot",
13            NodeEndpointControlCommand::PeerRatingEvents {
14                scope: scope.into(),
15                response_tx,
16            },
17            response_rx,
18        )
19        .await?
20        .map_err(FipsEndpointError::Node)
21    }
22
23    /// Feed a signed Nostr discovery or rating event into FIPS.
24    /// Unsupported, invalid, stale, or incorrectly addressed events return
25    /// `false`.
26    pub async fn ingest_nostr_event(&self, event: nostr::Event) -> Result<bool, FipsEndpointError> {
27        let (response_tx, response_rx) = oneshot::channel();
28        self.control(
29            "Nostr event ingest",
30            NodeEndpointControlCommand::IngestNostrEvent { event, response_tx },
31            response_rx,
32        )
33        .await
34    }
35
36    /// Compatibility name for callers that only feed discovery events.
37    pub async fn ingest_nostr_discovery_event(
38        &self,
39        event: nostr::Event,
40    ) -> Result<bool, FipsEndpointError> {
41        self.ingest_nostr_event(event).await
42    }
43
44    #[deprecated(since = "0.3.98", note = "use ingest_nostr_discovery_event")]
45    pub async fn ingest_nostr_pubsub_event(
46        &self,
47        event: nostr::Event,
48    ) -> Result<bool, FipsEndpointError> {
49        self.ingest_nostr_event(event).await
50    }
51
52    /// Snapshot the endpoint addresses this node is currently advertising via
53    /// Nostr discovery.
54    pub async fn local_advertised_endpoints(
55        &self,
56    ) -> Result<Vec<crate::discovery::nostr::OverlayEndpointAdvert>, FipsEndpointError> {
57        let (response_tx, response_rx) = oneshot::channel();
58        self.control(
59            "local advert snapshot",
60            NodeEndpointControlCommand::LocalAdvertSnapshot { response_tx },
61            response_rx,
62        )
63        .await
64    }
65
66    /// Return the signed local peer advert for an external peerfinding provider.
67    ///
68    /// This only creates the ordinary kind 37195 event; it does not select or
69    /// contact relays. `None` means advertising is disabled or no local
70    /// transport currently has an advert-eligible endpoint.
71    pub async fn local_nostr_discovery_advert_event(
72        &self,
73    ) -> Result<Option<nostr::Event>, FipsEndpointError> {
74        let (response_tx, response_rx) = oneshot::channel();
75        match self
76            .control(
77                "local Nostr discovery advert",
78                NodeEndpointControlCommand::LocalNostrDiscoveryAdvertEvent { response_tx },
79                response_rx,
80            )
81            .await?
82        {
83            Ok(event) => Ok(event),
84            Err(error) => Err(FipsEndpointError::Node(error)),
85        }
86    }
87
88    /// Snapshot live Nostr relay states used by the embedded endpoint.
89    pub async fn relay_statuses(&self) -> Result<Vec<FipsEndpointRelayStatus>, FipsEndpointError> {
90        let (response_tx, response_rx) = oneshot::channel();
91        self.control(
92            "relay snapshot",
93            NodeEndpointControlCommand::RelaySnapshot { response_tx },
94            response_rx,
95        )
96        .await
97        .map(|relays| {
98            relays
99                .into_iter()
100                .map(FipsEndpointRelayStatus::from)
101                .collect()
102        })
103    }
104
105    /// Replace Nostr discovery relays without rebuilding the endpoint.
106    pub async fn update_relays(&self, advert_relays: Vec<String>) -> Result<(), FipsEndpointError> {
107        let (response_tx, response_rx) = oneshot::channel();
108        self.control(
109            "relay update",
110            NodeEndpointControlCommand::UpdateRelays {
111                advert_relays,
112                response_tx,
113            },
114            response_rx,
115        )
116        .await?
117        .map_err(FipsEndpointError::Node)
118    }
119}