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}")]
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>;

View File

@ -182,9 +182,9 @@ where
}
}
}
// TODO: Add proper JSON RPC response/error handling...
Err(PubsubClientError::UnexpectedMessageError(format!(
"msg={message_text:?}"
Err(PubsubClientError::UnexpectedSubscriptionResponse(format!(
"msg={message_text}"
)))
}
@ -228,21 +228,17 @@ where
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(node_version) = version_map.get("solana-core") {
let node_version = semver::Version::parse(
node_version.as_str().unwrap_or_default(),
)
.map_err(|e| {
PubsubClientError::RequestError(format!(
"failed to parse cluster version: {e}"
))
})?;
return Ok(node_version);
if let Some(node_version) = node_version.as_str() {
if let Ok(parsed) = semver::Version::parse(node_version) {
return Ok(parsed);
}
}
}
}
}
// TODO: Add proper JSON RPC response/error handling...
Err(PubsubClientError::UnexpectedMessageError(format!(
"msg={message_text:?}"
Err(PubsubClientError::UnexpectedGetVersionResponse(format!(
"msg={message_text}"
)))
}
@ -253,19 +249,19 @@ where
if message.is_ping() {
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 Some(Object(params)) = json_msg.get("params") {
if let Some(result) = params.get("result") {
let x: T = serde_json::from_value::<T>(result.clone()).unwrap();
return Ok(Some(x));
if let Ok(x) = serde_json::from_value::<T>(result.clone()) {
return Ok(Some(x));
}
}
}
}
// TODO: Add proper JSON RPC response/error handling...
Err(PubsubClientError::UnexpectedMessageError(format!(
"msg={message_text:?}"
"msg={message_text}"
)))
}