iota_json_rpc/
bridge_api.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;
6
7use async_trait::async_trait;
8use iota_core::authority::AuthorityState;
9use iota_json_rpc_api::{BridgeReadApiOpenRpc, BridgeReadApiServer, JsonRpcMetrics};
10use iota_open_rpc::Module;
11use iota_types::bridge::{BridgeSummary, BridgeTrait, get_bridge_obj_initial_shared_version};
12use jsonrpsee::{RpcModule, core::RpcResult};
13use tracing::instrument;
14
15use crate::{IotaRpcModule, authority_state::StateRead, error::Error, logger::FutureWithTracing};
16
17#[derive(Clone)]
18pub struct BridgeReadApi {
19    state: Arc<dyn StateRead>,
20    pub metrics: Arc<JsonRpcMetrics>,
21}
22
23impl BridgeReadApi {
24    pub fn new(state: Arc<AuthorityState>, metrics: Arc<JsonRpcMetrics>) -> Self {
25        Self { state, metrics }
26    }
27}
28
29#[async_trait]
30impl BridgeReadApiServer for BridgeReadApi {
31    #[instrument(skip(self))]
32    async fn get_latest_bridge(&self) -> RpcResult<BridgeSummary> {
33        async move {
34            self.state
35                .get_bridge()
36                .map_err(Error::from)?
37                .try_into_bridge_summary()
38                .map_err(Error::from)
39        }
40        .trace()
41        .await
42    }
43
44    #[instrument(skip(self))]
45    async fn get_bridge_object_initial_shared_version(&self) -> RpcResult<u64> {
46        async move {
47            Ok(
48                get_bridge_obj_initial_shared_version(self.state.get_object_store())?
49                    .ok_or(Error::Unexpected(
50                        "Failed to find Bridge object initial version".to_string(),
51                    ))?
52                    .into(),
53            )
54        }
55        .trace()
56        .await
57    }
58}
59
60impl IotaRpcModule for BridgeReadApi {
61    fn rpc(self) -> RpcModule<Self> {
62        self.into_rpc()
63    }
64
65    fn rpc_doc_module() -> Module {
66        BridgeReadApiOpenRpc::module_doc()
67    }
68}