use tokio_util::sync::CancellationToken;
use crate::client::CyclesClient;
use crate::models::{ExtendRequest, ReservationId};
pub(crate) fn start_heartbeat(
client: CyclesClient,
reservation_id: ReservationId,
ttl_ms: u64,
cancel: CancellationToken,
) -> tokio::task::JoinHandle<()> {
let interval = std::time::Duration::from_millis((ttl_ms / 2).max(1_000));
tokio::spawn(async move {
loop {
tokio::select! {
() = cancel.cancelled() => break,
() = tokio::time::sleep(interval) => {
let req = ExtendRequest::new(ttl_ms);
let result = client.extend_reservation(&reservation_id, &req).await;
if let Err(e) = result {
tracing::warn!(
reservation_id = %reservation_id,
error = %e,
"heartbeat extend failed"
);
}
}
}
}
})
}