From f36bd21f310489ede9cbf559bb334856f6a01675 Mon Sep 17 00:00:00 2001 From: Ali Behjati Date: Fri, 11 Aug 2023 19:12:04 +0200 Subject: [PATCH] fix(hermes): handle non-existent ids on ws --- hermes/Cargo.lock | 2 +- hermes/Cargo.toml | 2 +- hermes/src/api/ws.rs | 34 ++++++++++++++++++++++++++++++---- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/hermes/Cargo.lock b/hermes/Cargo.lock index 2c598bf6..19aeaeb0 100644 --- a/hermes/Cargo.lock +++ b/hermes/Cargo.lock @@ -1764,7 +1764,7 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermes" -version = "0.1.9" +version = "0.1.10" dependencies = [ "anyhow", "axum", diff --git a/hermes/Cargo.toml b/hermes/Cargo.toml index 4c71c486..db16e3ea 100644 --- a/hermes/Cargo.toml +++ b/hermes/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "hermes" -version = "0.1.9" +version = "0.1.10" edition = "2021" [dependencies] diff --git a/hermes/src/api/ws.rs b/hermes/src/api/ws.rs index e8e7b1f9..8fde69ef 100644 --- a/hermes/src/api/ws.rs +++ b/hermes/src/api/ws.rs @@ -227,10 +227,36 @@ impl Subscriber { verbose, binary, }) => { - for id in ids { - let price_id: PriceIdentifier = id.into(); - self.price_feeds_with_config - .insert(price_id, PriceFeedClientConfig { verbose, binary }); + let price_ids: Vec = ids.into_iter().map(|id| id.into()).collect(); + let available_price_ids = self.store.get_price_feed_ids().await; + + let not_found_price_ids: Vec<&PriceIdentifier> = price_ids + .iter() + .filter(|price_id| !available_price_ids.contains(price_id)) + .collect(); + + // If there is a single price id that is not found, we don't subscribe to any of the + // asked correct price feed ids and return an error to be more explicit and clear. + if !not_found_price_ids.is_empty() { + self.sender + .send( + serde_json::to_string(&ServerMessage::Response( + ServerResponseMessage::Err { + error: format!( + "Price feed(s) with id(s) {:?} not found", + not_found_price_ids + ), + }, + ))? + .into(), + ) + .await?; + return Ok(()); + } else { + for price_id in price_ids { + self.price_feeds_with_config + .insert(price_id, PriceFeedClientConfig { verbose, binary }); + } } } Ok(ClientMessage::Unsubscribe { ids }) => {