improve pubsub error handling (#31669)
Co-authored-by: Maximilian Schneider <max@mango.markets>
This commit is contained in:
parent
8fbe471cc8
commit
4eea22cf5f
|
@ -240,6 +240,12 @@ pub enum PubsubClientError {
|
||||||
|
|
||||||
#[error("request error: {0}")]
|
#[error("request error: {0}")]
|
||||||
RequestError(String),
|
RequestError(String),
|
||||||
|
|
||||||
|
#[error("could not find subscription id: {0}")]
|
||||||
|
UnexpectedSubscriptionResponse(String),
|
||||||
|
|
||||||
|
#[error("could not find node version: {0}")]
|
||||||
|
UnexpectedGetVersionResponse(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
type UnsubscribeFn = Box<dyn FnOnce() -> BoxFuture<'static, ()> + Send>;
|
type UnsubscribeFn = Box<dyn FnOnce() -> BoxFuture<'static, ()> + Send>;
|
||||||
|
|
|
@ -182,9 +182,9 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// TODO: Add proper JSON RPC response/error handling...
|
|
||||||
Err(PubsubClientError::UnexpectedMessageError(format!(
|
Err(PubsubClientError::UnexpectedSubscriptionResponse(format!(
|
||||||
"msg={message_text:?}"
|
"msg={message_text}"
|
||||||
)))
|
)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -228,21 +228,17 @@ where
|
||||||
if let Ok(json_msg) = serde_json::from_str::<Map<String, Value>>(message_text) {
|
if let Ok(json_msg) = serde_json::from_str::<Map<String, Value>>(message_text) {
|
||||||
if let Some(Object(version_map)) = json_msg.get("result") {
|
if let Some(Object(version_map)) = json_msg.get("result") {
|
||||||
if let Some(node_version) = version_map.get("solana-core") {
|
if let Some(node_version) = version_map.get("solana-core") {
|
||||||
let node_version = semver::Version::parse(
|
if let Some(node_version) = node_version.as_str() {
|
||||||
node_version.as_str().unwrap_or_default(),
|
if let Ok(parsed) = semver::Version::parse(node_version) {
|
||||||
)
|
return Ok(parsed);
|
||||||
.map_err(|e| {
|
}
|
||||||
PubsubClientError::RequestError(format!(
|
}
|
||||||
"failed to parse cluster version: {e}"
|
|
||||||
))
|
|
||||||
})?;
|
|
||||||
return Ok(node_version);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// TODO: Add proper JSON RPC response/error handling...
|
|
||||||
Err(PubsubClientError::UnexpectedMessageError(format!(
|
Err(PubsubClientError::UnexpectedGetVersionResponse(format!(
|
||||||
"msg={message_text:?}"
|
"msg={message_text}"
|
||||||
)))
|
)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -253,19 +249,19 @@ where
|
||||||
if message.is_ping() {
|
if message.is_ping() {
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
}
|
}
|
||||||
let message_text = &message.into_text().unwrap();
|
let message_text = &message.into_text()?;
|
||||||
if let Ok(json_msg) = serde_json::from_str::<Map<String, Value>>(message_text) {
|
if let Ok(json_msg) = serde_json::from_str::<Map<String, Value>>(message_text) {
|
||||||
if let Some(Object(params)) = json_msg.get("params") {
|
if let Some(Object(params)) = json_msg.get("params") {
|
||||||
if let Some(result) = params.get("result") {
|
if let Some(result) = params.get("result") {
|
||||||
let x: T = serde_json::from_value::<T>(result.clone()).unwrap();
|
if let Ok(x) = serde_json::from_value::<T>(result.clone()) {
|
||||||
return Ok(Some(x));
|
return Ok(Some(x));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Add proper JSON RPC response/error handling...
|
|
||||||
Err(PubsubClientError::UnexpectedMessageError(format!(
|
Err(PubsubClientError::UnexpectedMessageError(format!(
|
||||||
"msg={message_text:?}"
|
"msg={message_text}"
|
||||||
)))
|
)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue