use std::sync::Arc;
use crate::edge::EdgeClient;
use crate::error::Result;
use crate::traits::ServiceHandler;
use crate::types::EdgeConfig;
pub async fn edge_worker(services: Vec<Arc<dyn ServiceHandler>>) -> Result<()> {
let api_key = std::env::var("DINK_EDGE_KEY")
.or_else(|_| std::env::var("DINK_API_KEY"))
.map_err(|_| {
crate::error::DinkError::Config("DINK_EDGE_KEY or DINK_API_KEY must be set".into())
})?;
let server_url = std::env::var("DINK_SERVER_URL").ok();
let edge_name = std::env::var("EDGE_NAME").ok();
let config = EdgeConfig {
api_key,
server_url,
edge_name,
..Default::default()
};
let client = EdgeClient::connect(config).await?;
for svc in services {
client.expose_service(svc).await?;
}
let mut sigint = tokio::signal::unix::signal(tokio::signal::unix::SignalKind::interrupt())
.map_err(|e| crate::error::DinkError::Connection(e.to_string()))?;
let mut sigterm = tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate())
.map_err(|e| crate::error::DinkError::Connection(e.to_string()))?;
tokio::select! {
_ = sigint.recv() => {
tracing::info!("received SIGINT, shutting down");
}
_ = sigterm.recv() => {
tracing::info!("received SIGTERM, shutting down");
}
}
client.disconnect().await?;
Ok(())
}