use crate::{SignerDaemonCore, SignerDaemonState, entity::server, signer_remote::SignerRemote};
use sea_orm::prelude::*;
use std::collections::HashSet;
pub struct RemoteController {
core: SignerDaemonCore,
}
impl RemoteController {
pub fn new(core: SignerDaemonCore) -> Self {
Self { core }
}
pub async fn reconcile(&self, state: &mut SignerDaemonState) -> crate::DaemonResult<()> {
let mut remove_set = state
.remotes
.keys()
.map(|i| i.to_string())
.collect::<HashSet<String>>();
let servers = server::Entity::find()
.filter(server::Column::Enable.eq(true))
.all(&self.core.db)
.await?;
for server in servers {
if remove_set.remove(&server.addr.to_string()) {
continue;
}
let mut remote = SignerRemote::new(&server.addr);
remote
.open_eventsource(state.daemon.as_ref().unwrap().clone())
.await?;
state.remotes.insert(server.addr.to_string(), remote);
}
for remove in remove_set {
if let Some(mut rm) = state.remotes.remove(&remove) {
rm.close().await;
}
}
Ok(())
}
}