Sfoglia il codice sorgente

fix(hermes): handle non-existent ids on ws

Ali Behjati 2 anni fa
parent
commit
f36bd21f31
3 ha cambiato i file con 32 aggiunte e 6 eliminazioni
  1. 1 1
      hermes/Cargo.lock
  2. 1 1
      hermes/Cargo.toml
  3. 30 4
      hermes/src/api/ws.rs

+ 1 - 1
hermes/Cargo.lock

@@ -1764,7 +1764,7 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
 
 [[package]]
 name = "hermes"
-version = "0.1.9"
+version = "0.1.10"
 dependencies = [
  "anyhow",
  "axum",

+ 1 - 1
hermes/Cargo.toml

@@ -1,6 +1,6 @@
 [package]
 name                   = "hermes"
-version                = "0.1.9"
+version                = "0.1.10"
 edition                = "2021"
 
 [dependencies]

+ 30 - 4
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<PriceIdentifier> = 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 }) => {