1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
use crate::peer_manager::PeerManagerError;
use anyhow::anyhow;
use diem_types::PeerId;
use futures::channel::{mpsc, oneshot};
use std::io;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum RpcError {
#[error("Error: {0:?}")]
Error(#[from] anyhow::Error),
#[error("IO error: {0}")]
IoError(#[from] io::Error),
#[error("Bcs error: {0:?}")]
BcsError(#[from] bcs::Error),
#[error("Failed to open substream, not connected with peer: {0}")]
NotConnected(PeerId),
#[error("Received invalid rpc response message")]
InvalidRpcResponse,
#[error("Received unexpected rpc response message; expected remote to half-close.")]
UnexpectedRpcResponse,
#[error("Received unexpected rpc request message; expected remote to half-close.")]
UnexpectedRpcRequest,
#[error("Application layer unexpectedly dropped response channel")]
UnexpectedResponseChannelCancel,
#[error("Error in application layer handling rpc request: {0:?}")]
ApplicationError(anyhow::Error),
#[error("Error sending on mpsc channel: {0:?}")]
MpscSendError(#[from] mpsc::SendError),
#[error("Too many pending RPCs: {0}")]
TooManyPending(u32),
#[error("Rpc timed out")]
TimedOut,
}
impl From<PeerManagerError> for RpcError {
fn from(err: PeerManagerError) -> Self {
match err {
PeerManagerError::NotConnected(peer_id) => RpcError::NotConnected(peer_id),
PeerManagerError::IoError(err) => RpcError::IoError(err),
err => RpcError::Error(anyhow!(err)),
}
}
}
impl From<oneshot::Canceled> for RpcError {
fn from(_: oneshot::Canceled) -> Self {
RpcError::UnexpectedResponseChannelCancel
}
}
impl From<tokio::time::error::Elapsed> for RpcError {
fn from(_err: tokio::time::error::Elapsed) -> RpcError {
RpcError::TimedOut
}
}