This should reconnect when the connection is lost

This commit is contained in:
Erwin Boskma 2023-09-28 20:37:45 +02:00
parent 92580d86d2
commit f42b201791
Signed by: erwin
SSH key fingerprint: SHA256:9LmFDe1C6jSrEyqxxvX8NtJBmcbB105XoqyUZF092bg
3 changed files with 34 additions and 13 deletions

View file

@ -113,6 +113,8 @@
rust-analyzer
taplo
gitflow
dsniff # has the tcpkill command to test dropped connections
];
};

View file

@ -284,7 +284,7 @@ impl HomeAssistant {
"Received '{message_type}', we're currently not handling that."
)
}
HomeAssistantError::JsonError(e) => error!("{e}"),
HomeAssistantError::JsonError(e) => error!("Error deserializing JSON: {e}"),
}
} else {
error!("{e}");
@ -294,10 +294,14 @@ impl HomeAssistant {
},
Err(e) => {
error!("Error in receiving message: {e}");
break;
// break;
}
}
None => break,
None => {
// I recon we should reconnect here. Probably.
error!("Received 'None' from handle_message");
break;
},
},
_ = ping_interval.tick() => {
if self.auth_complete {
@ -307,7 +311,7 @@ impl HomeAssistant {
ws_stream.send(ping_message.to_message()).await?;
}
}
},
}
}

View file

@ -5,7 +5,8 @@ use clap::Parser;
use color_eyre::{eyre::WrapErr, Result};
use serde_json::json;
use std::fmt::Display;
use tracing::debug;
use tokio::signal::unix::SignalKind;
use tracing::{debug, error};
use tracing_error::ErrorLayer;
use tracing_subscriber::{prelude::*, EnvFilter, Registry};
use tracing_tree::HierarchicalLayer;
@ -127,19 +128,33 @@ async fn main() -> Result<()> {
.wrap_err_with(|| format!("Unable to execute command {cmd}"))?;
} else {
debug!("Retrieving state of '{entity}' on '{host}'");
let ha = homeassistant::HomeAssistant::builder()
.host(host)
.entity(entity)
.token(token)
.insecure(insecure)
.format(format)
.build();
ha.open_connection().await.unwrap_or(());
loop {
tokio::select! {
_ = homeassistant::HomeAssistant::builder()
.host(host.clone())
.entity(entity.clone())
.token(token.clone())
.insecure(insecure)
.format(format)
.build().open_connection() => {
error!("Connection closed? Reconnecting...");
},
_ = tokio::signal::ctrl_c() => break,
_ = sig_term() => break,
};
}
}
}
Ok(())
}
async fn sig_term() -> Result<()> {
tokio::signal::unix::signal(SignalKind::terminate())?
.recv()
.await;
Ok(())
}
fn setup(debug: bool) -> Result<()> {
if debug {
std::env::set_var("RUST_LOG", "debug");