iota_network/randomness/
server.rs

1// Copyright (c) Mysten Labs, Inc.
2// Modifications Copyright (c) 2024 IOTA Stiftung
3// SPDX-License-Identifier: Apache-2.0
4
5use anemo::{Request, Response};
6use tokio::sync::mpsc;
7
8use super::{Randomness, RandomnessMessage, SendSignaturesRequest};
9
10pub(super) struct Server {
11    pub(super) sender: mpsc::WeakSender<RandomnessMessage>,
12}
13
14#[anemo::async_trait]
15impl Randomness for Server {
16    async fn send_signatures(
17        &self,
18        request: Request<SendSignaturesRequest>,
19    ) -> Result<Response<()>, anemo::rpc::Status> {
20        let sender = self
21            .sender
22            .upgrade()
23            .ok_or_else(|| anemo::rpc::Status::internal("shutting down"))?;
24        let peer_id = *request
25            .peer_id()
26            .ok_or_else(|| anemo::rpc::Status::internal("missing peer ID"))?;
27        let SendSignaturesRequest {
28            epoch,
29            round,
30            partial_sigs,
31            sig,
32        } = request.into_inner();
33        let _ = sender // throw away error, caller will retry
34            .send(RandomnessMessage::ReceiveSignatures(
35                peer_id,
36                epoch,
37                round,
38                partial_sigs,
39                sig,
40            ))
41            .await;
42        Ok(anemo::Response::new(()))
43    }
44}