openmina_node_common/service/rpc/
stats.rs

1#[cfg(target_family = "wasm")]
2use gloo_utils::format::JsValueSerdeExt;
3#[cfg(target_family = "wasm")]
4use node::rpc::*;
5#[cfg(target_family = "wasm")]
6use wasm_bindgen::prelude::*;
7
8use super::RpcSender;
9
10#[derive(Clone)]
11#[cfg_attr(target_family = "wasm", wasm_bindgen)]
12pub struct Stats {
13    #[allow(unused)]
14    sender: RpcSender,
15}
16
17impl Stats {
18    pub fn new(sender: RpcSender) -> Self {
19        Self { sender }
20    }
21}
22
23#[cfg(target_family = "wasm")]
24#[cfg_attr(target_family = "wasm", wasm_bindgen)]
25impl Stats {
26    pub async fn actions(&self, id: JsValue) -> Result<JsValue, JsValue> {
27        let query = if id.is_falsy() {
28            ActionStatsQuery::SinceStart
29        } else if id.as_string().is_some_and(|s| s == "latest") {
30            ActionStatsQuery::ForLatestBlock
31        } else {
32            let id = id.into_serde().map_err(|err| err.to_string())?;
33            ActionStatsQuery::ForBlockWithId(id)
34        };
35
36        let res = self
37            .sender
38            .oneshot_request::<RpcActionStatsGetResponse>(RpcRequest::ActionStatsGet(query))
39            .await
40            .flatten();
41        Ok(JsValue::from_serde(&res).unwrap_or_default())
42    }
43
44    pub async fn sync(&self, limit: Option<usize>) -> JsValue {
45        let query = SyncStatsQuery { limit };
46        let res = self
47            .sender
48            .oneshot_request::<RpcSyncStatsGetResponse>(RpcRequest::SyncStatsGet(query))
49            .await
50            .flatten();
51        JsValue::from_serde(&res).unwrap_or_default()
52    }
53
54    pub async fn block_producer(&self) -> JsValue {
55        let res = self
56            .sender
57            .oneshot_request::<RpcBlockProducerStatsGetResponse>(RpcRequest::BlockProducerStatsGet)
58            .await
59            .flatten();
60        JsValue::from_serde(&res).unwrap_or_default()
61    }
62}