use crate::client::client::License;
use crate::errors::{LicenseError, LicenseResult};
use reqwest::Client;
use serde::{Deserialize, Serialize};
use std::time::Duration;
#[derive(Debug, Serialize)]
struct HeartbeatRequest {
license_id: String,
client_id: String,
}
#[derive(Debug, Deserialize)]
struct HeartbeatResponse {
success: bool,
}
pub async fn send_heartbeat(license: &License) -> LicenseResult<bool> {
let server_url = &license.server_url;
let client = Client::new();
let payload = HeartbeatRequest {
license_id: license.license_id.clone(),
client_id: license.client_id.clone(),
};
let resp = client
.post(format!("{}/heartbeat", server_url))
.json(&payload)
.timeout(Duration::from_secs(10))
.send()
.await?;
if !resp.status().is_success() {
return Err(LicenseError::ServerError(format!(
"Unexpected server response: {}",
resp.status()
)));
}
let heartbeat_response: HeartbeatResponse = resp.json().await.map_err(|e| {
LicenseError::ServerError(format!("Failed to parse heartbeat response: {e}"))
})?;
Ok(heartbeat_response.success)
}