iota_network/discovery/
server.rs

1// Copyright (c) Mysten Labs, Inc.
2// Modifications Copyright (c) 2024 IOTA Stiftung
3// SPDX-License-Identifier: Apache-2.0
4
5use std::sync::{Arc, RwLock};
6
7use anemo::{Request, Response};
8use serde::{Deserialize, Serialize};
9
10use super::{Discovery, NodeInfo, State};
11
12#[derive(Clone, Debug, Serialize, Deserialize)]
13pub struct GetKnownPeersResponse {
14    pub own_info: NodeInfo,
15    pub known_peers: Vec<NodeInfo>,
16}
17
18pub(super) struct Server {
19    pub(super) state: Arc<RwLock<State>>,
20}
21
22#[anemo::async_trait]
23impl Discovery for Server {
24    async fn get_known_peers(
25        &self,
26        _request: Request<()>,
27    ) -> Result<Response<GetKnownPeersResponse>, anemo::rpc::Status> {
28        let state = self.state.read().unwrap();
29        let own_info = state
30            .our_info
31            .clone()
32            .ok_or_else(|| anemo::rpc::Status::internal("own_info has not been initialized yet"))?;
33        let known_peers = state.known_peers.values().cloned().collect();
34
35        Ok(Response::new(GetKnownPeersResponse {
36            own_info,
37            known_peers,
38        }))
39    }
40}