Cleanly shutdown on ctrl_c

Signed-off-by: pep <pep@bouah.net>
This commit is contained in:
pep 2025-05-03 13:29:43 +02:00
commit e064263f96
3 changed files with 54 additions and 22 deletions

View file

@ -33,10 +33,10 @@ use clap::{command, value_parser, Arg};
use hyper::{server::conn::http1, service::service_fn};
use hyper_util::rt::tokio::{TokioIo, TokioTimer};
use log::error;
use tokio::{net::TcpListener, sync::mpsc};
use tokio::{net::TcpListener, signal::ctrl_c, sync::mpsc};
#[tokio::main]
async fn main() -> Result<!, Error> {
async fn main() -> Result<(), Error> {
pretty_env_logger::init();
let matches = command!()
@ -60,9 +60,12 @@ async fn main() -> Result<!, Error> {
config.nickname,
);
tokio::task::spawn(async move {
let xmpp_handle = tokio::task::spawn(async move {
bot.receive(value_rx).await;
error!("XMPP client exited early");
match bot.disconnect().await {
Err(err) => error!("XMPP disconnect error: {err}"),
_ => (),
}
});
let tcp_bind = TcpListener::bind(config.addr).await?;
@ -71,24 +74,35 @@ async fn main() -> Result<!, Error> {
let value_tx = value_tx.clone();
let secret = config.secret.clone();
if let Ok((tcp, _)) = tcp_bind.accept().await {
let io = TokioIo::new(tcp);
tokio::task::spawn(async move {
if let Err(err) = http1::Builder::new()
.timer(TokioTimer::new())
.serve_connection(
io,
service_fn(|request| {
let value_tx = value_tx.clone();
let secret = secret.clone();
async move { hooks(request, &secret, value_tx).await }
}),
)
.await
{
println!("Error serving connection: {:?}", err);
tokio::select! {
accept = tcp_bind.accept() => {
if let Ok((tcp, _)) = accept {
let io = TokioIo::new(tcp);
tokio::task::spawn(async move {
if let Err(err) = http1::Builder::new()
.timer(TokioTimer::new())
.serve_connection(
io,
service_fn(|request| {
let value_tx = value_tx.clone();
let secret = secret.clone();
async move { hooks(request, &secret, value_tx).await }
}),
)
.await
{
println!("Error serving connection: {:?}", err);
}
});
}
});
},
_ = ctrl_c() => {
break;
},
}
}
let _ = xmpp_handle.await;
Ok(())
}