node/rpc_effectful/
rpc_service.rs

1use crate::{
2    p2p::connection::P2pConnectionResponse,
3    rpc::{
4        RpcActionStatsGetResponse, RpcBestChainResponse, RpcBlockProducerStatsGetResponse,
5        RpcConsensusTimeGetResponse, RpcDiscoveryBoostrapStatsResponse,
6        RpcDiscoveryRoutingTableResponse, RpcGenesisBlockResponse, RpcGetBlockResponse,
7        RpcHealthCheckResponse, RpcHeartbeatGetResponse, RpcId,
8        RpcLedgerAccountDelegatorsGetResponse, RpcLedgerAccountsResponse,
9        RpcLedgerSlimAccountsResponse, RpcLedgerStatusGetResponse, RpcMessageProgressResponse,
10        RpcP2pConnectionOutgoingResponse, RpcPeersGetResponse, RpcPooledUserCommandsResponse,
11        RpcPooledZkappCommandsResponse, RpcReadinessCheckResponse, RpcScanStateSummaryGetResponse,
12        RpcSnarkPoolCompletedJobsResponse, RpcSnarkPoolGetResponse, RpcSnarkPoolJobGetResponse,
13        RpcSnarkPoolPendingJobsGetResponse, RpcSnarkerConfigGetResponse,
14        RpcSnarkerJobCommitResponse, RpcSnarkerJobSpecResponse, RpcSnarkerWorkersResponse,
15        RpcStatusGetResponse, RpcSyncStatsGetResponse, RpcTransactionInjectResponse,
16        RpcTransactionPoolResponse, RpcTransactionStatusGetResponse,
17        RpcTransitionFrontierUserCommandsResponse,
18    },
19    State,
20};
21use openmina_core::consensus::ConsensusConstants;
22use serde::{Deserialize, Serialize};
23use thiserror::Error;
24
25#[derive(Error, Serialize, Deserialize, Debug, Clone)]
26pub enum RespondError {
27    #[error("unknown rpc id")]
28    UnknownRpcId,
29    #[error("unexpected response type")]
30    UnexpectedResponseType,
31    #[error("responding failed")]
32    RespondingFailed,
33    #[error("{0}")]
34    Custom(String),
35}
36
37macro_rules! from_error {
38    ($error:ty) => {
39        impl From<$error> for RespondError {
40            fn from(value: $error) -> Self {
41                RespondError::Custom(value.to_string())
42            }
43        }
44    };
45}
46
47from_error!(serde_json::Error);
48
49pub trait RpcService {
50    fn respond_state_get(
51        &mut self,
52        rpc_id: RpcId,
53        response: (&State, Option<&str>),
54    ) -> Result<(), RespondError>;
55    fn respond_status_get(
56        &mut self,
57        rpc_id: RpcId,
58        response: RpcStatusGetResponse,
59    ) -> Result<(), RespondError>;
60    fn respond_heartbeat_get(
61        &mut self,
62        rpc_id: RpcId,
63        response: RpcHeartbeatGetResponse,
64    ) -> Result<(), RespondError>;
65    fn respond_action_stats_get(
66        &mut self,
67        rpc_id: RpcId,
68        response: RpcActionStatsGetResponse,
69    ) -> Result<(), RespondError>;
70    fn respond_sync_stats_get(
71        &mut self,
72        rpc_id: RpcId,
73        response: RpcSyncStatsGetResponse,
74    ) -> Result<(), RespondError>;
75    fn respond_block_producer_stats_get(
76        &mut self,
77        rpc_id: RpcId,
78        response: RpcBlockProducerStatsGetResponse,
79    ) -> Result<(), RespondError>;
80    fn respond_message_progress_stats_get(
81        &mut self,
82        rpc_id: RpcId,
83        response: RpcMessageProgressResponse,
84    ) -> Result<(), RespondError>;
85    fn respond_peers_get(
86        &mut self,
87        rpc_id: RpcId,
88        response: RpcPeersGetResponse,
89    ) -> Result<(), RespondError>;
90    fn respond_p2p_connection_outgoing(
91        &mut self,
92        rpc_id: RpcId,
93        response: RpcP2pConnectionOutgoingResponse,
94    ) -> Result<(), RespondError>;
95    fn respond_p2p_connection_incoming_answer(
96        &mut self,
97        rpc_id: RpcId,
98        response: P2pConnectionResponse,
99    ) -> Result<(), RespondError>;
100    fn respond_p2p_connection_incoming(
101        &mut self,
102        rpc_id: RpcId,
103        response: Result<(), String>,
104    ) -> Result<(), RespondError>;
105    fn respond_scan_state_summary_get(
106        &mut self,
107        rpc_id: RpcId,
108        response: RpcScanStateSummaryGetResponse,
109    ) -> Result<(), RespondError>;
110    fn respond_snark_pool_get(
111        &mut self,
112        rpc_id: RpcId,
113        response: RpcSnarkPoolGetResponse,
114    ) -> Result<(), RespondError>;
115    fn respond_snark_pool_job_get(
116        &mut self,
117        rpc_id: RpcId,
118        response: RpcSnarkPoolJobGetResponse,
119    ) -> Result<(), RespondError>;
120    fn respond_snark_pool_completed_jobs_get(
121        &mut self,
122        rpc_id: RpcId,
123        response: RpcSnarkPoolCompletedJobsResponse,
124    ) -> Result<(), RespondError>;
125    fn respond_snark_pool_pending_jobs_get(
126        &mut self,
127        rpc_id: RpcId,
128        response: RpcSnarkPoolPendingJobsGetResponse,
129    ) -> Result<(), RespondError>;
130    fn respond_snarker_config_get(
131        &mut self,
132        rpc_id: RpcId,
133        response: RpcSnarkerConfigGetResponse,
134    ) -> Result<(), RespondError>;
135    fn respond_snarker_job_commit(
136        &mut self,
137        rpc_id: RpcId,
138        response: RpcSnarkerJobCommitResponse,
139    ) -> Result<(), RespondError>;
140    fn respond_snarker_job_spec(
141        &mut self,
142        rpc_id: RpcId,
143        response: RpcSnarkerJobSpecResponse,
144    ) -> Result<(), RespondError>;
145    fn respond_snarker_workers(
146        &mut self,
147        rpc_id: RpcId,
148        response: RpcSnarkerWorkersResponse,
149    ) -> Result<(), RespondError>;
150    fn respond_health_check(
151        &mut self,
152        rpc_id: RpcId,
153        response: RpcHealthCheckResponse,
154    ) -> Result<(), RespondError>;
155    fn respond_discovery_routing_table(
156        &mut self,
157        rpc_id: RpcId,
158        response: RpcDiscoveryRoutingTableResponse,
159    ) -> Result<(), RespondError>;
160    fn respond_discovery_bootstrap_stats(
161        &mut self,
162        rpc_id: RpcId,
163        response: RpcDiscoveryBoostrapStatsResponse,
164    ) -> Result<(), RespondError>;
165    fn respond_readiness_check(
166        &mut self,
167        rpc_id: RpcId,
168        response: RpcReadinessCheckResponse,
169    ) -> Result<(), RespondError>;
170    fn respond_transaction_pool(
171        &mut self,
172        rpc_id: RpcId,
173        response: RpcTransactionPoolResponse,
174    ) -> Result<(), RespondError>;
175    fn respond_ledger_slim_accounts(
176        &mut self,
177        rpc_id: RpcId,
178        response: RpcLedgerSlimAccountsResponse,
179    ) -> Result<(), RespondError>;
180    fn respond_ledger_accounts(
181        &mut self,
182        rpc_id: RpcId,
183        response: RpcLedgerAccountsResponse,
184    ) -> Result<(), RespondError>;
185    fn respond_transaction_inject(
186        &mut self,
187        rpc_id: RpcId,
188        response: RpcTransactionInjectResponse,
189    ) -> Result<(), RespondError>;
190    fn respond_transition_frontier_commands(
191        &mut self,
192        rpc_id: RpcId,
193        response: RpcTransitionFrontierUserCommandsResponse,
194    ) -> Result<(), RespondError>;
195    fn respond_best_chain(
196        &mut self,
197        rpc_id: RpcId,
198        response: RpcBestChainResponse,
199    ) -> Result<(), RespondError>;
200    fn respond_consensus_constants(
201        &mut self,
202        rpc_id: RpcId,
203        response: ConsensusConstants,
204    ) -> Result<(), RespondError>;
205    fn respond_transaction_status(
206        &mut self,
207        rpc_id: RpcId,
208        response: RpcTransactionStatusGetResponse,
209    ) -> Result<(), RespondError>;
210    fn respond_block_get(
211        &mut self,
212        rpc_id: RpcId,
213        response: RpcGetBlockResponse,
214    ) -> Result<(), RespondError>;
215    fn respond_pooled_user_commands(
216        &mut self,
217        rpc_id: RpcId,
218        response: RpcPooledUserCommandsResponse,
219    ) -> Result<(), RespondError>;
220    fn respond_pooled_zkapp_commands(
221        &mut self,
222        rpc_id: RpcId,
223        response: RpcPooledZkappCommandsResponse,
224    ) -> Result<(), RespondError>;
225    fn respond_genesis_block(
226        &mut self,
227        rpc_id: RpcId,
228        response: RpcGenesisBlockResponse,
229    ) -> Result<(), RespondError>;
230    fn respond_consensus_time_get(
231        &mut self,
232        rpc_id: RpcId,
233        response: RpcConsensusTimeGetResponse,
234    ) -> Result<(), RespondError>;
235    fn respond_ledger_status_get(
236        &mut self,
237        rpc_id: RpcId,
238        response: RpcLedgerStatusGetResponse,
239    ) -> Result<(), RespondError>;
240    fn respond_ledger_account_delegators_get(
241        &mut self,
242        rpc_id: RpcId,
243        response: RpcLedgerAccountDelegatorsGetResponse,
244    ) -> Result<(), RespondError>;
245}