signer-daemon 0.3.1

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,
  ) -> anyhow::Result<()> {
    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(())
  }
}