Răsfoiți Sursa

Do not connect to ws if there are no active subscription

Cesar Rodas 1 lună în urmă
părinte
comite
8a0369076e
1 a modificat fișierele cu 15 adăugiri și 0 ștergeri
  1. 15 0
      crates/cdk/src/wallet/subscription/ws.rs

+ 15 - 0
crates/cdk/src/wallet/subscription/ws.rs

@@ -1,6 +1,7 @@
 use std::collections::{HashMap, HashSet};
 use std::collections::{HashMap, HashSet};
 use std::sync::atomic::AtomicUsize;
 use std::sync::atomic::AtomicUsize;
 use std::sync::Arc;
 use std::sync::Arc;
+use std::time::Duration;
 
 
 use cdk_common::subscription::Params;
 use cdk_common::subscription::Params;
 use cdk_common::ws::{WsMessageOrResponse, WsMethodRequest, WsRequest, WsUnsubscribeRequest};
 use cdk_common::ws::{WsMessageOrResponse, WsMethodRequest, WsRequest, WsUnsubscribeRequest};
@@ -8,6 +9,7 @@ use cdk_common::ws::{WsMessageOrResponse, WsMethodRequest, WsRequest, WsUnsubscr
 use cdk_common::{Method, RoutePath};
 use cdk_common::{Method, RoutePath};
 use futures::{SinkExt, StreamExt};
 use futures::{SinkExt, StreamExt};
 use tokio::sync::{mpsc, RwLock};
 use tokio::sync::{mpsc, RwLock};
+use tokio::time::sleep;
 use tokio_tungstenite::connect_async;
 use tokio_tungstenite::connect_async;
 use tokio_tungstenite::tungstenite::client::IntoClientRequest;
 use tokio_tungstenite::tungstenite::client::IntoClientRequest;
 use tokio_tungstenite::tungstenite::Message;
 use tokio_tungstenite::tungstenite::Message;
@@ -61,6 +63,12 @@ pub async fn ws_main(
     let mut failure_count = 0;
     let mut failure_count = 0;
 
 
     loop {
     loop {
+        if subscriptions.read().await.is_empty() {
+            // No active subscription
+            sleep(Duration::from_millis(100)).await;
+            continue;
+        }
+
         let mut request_clone = request.clone();
         let mut request_clone = request.clone();
         #[cfg(feature = "auth")]
         #[cfg(feature = "auth")]
         {
         {
@@ -260,6 +268,13 @@ pub async fn ws_main(
                     if let Some(json) = get_unsub_request(subid) {
                     if let Some(json) = get_unsub_request(subid) {
                         let _ = write.send(Message::Text(json.into())).await;
                         let _ = write.send(Message::Text(json.into())).await;
                     }
                     }
+
+                    if subscription.is_empty() {
+                        if let Err(err) = write.send(Message::Close(None)).await {
+                            tracing::error!("Closing error {err:?}");
+                        }
+                        break;
+                    }
                 }
                 }
             }
             }
         }
         }