signer-daemon 0.3.2

Signer daemon package.
Documentation
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(())
    }
}