improve pubsub error handling (#31669)

Co-authored-by: Maximilian Schneider <max@mango.markets>
This commit is contained in:
Maximilian Schneider 2023-05-19 18:46:09 +02:00 committed by GitHub
parent 8fbe471cc8
commit 4eea22cf5f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 20 deletions

View File

@ -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>;

View File

@ -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}"
))) )))
} }