hacker-challenge/legacy_challenge/src/main.rs
ghe0 d7b0c3fd2c
start rewrite based on ticket #2
keys go migrated to solana_sdk in a 01b889d
2024-09-10 03:11:46 +03:00

64 lines
1.9 KiB
Rust

mod persistence;
mod datastore;
use crate::grpc::challenge::NodeUpdate;
use tokio::sync::broadcast::Sender;
use tokio::task::JoinSet;
mod grpc;
mod http_server;
use crate::datastore::Store;
use std::fs::File;
use std::io::{BufRead, BufReader};
use std::sync::Arc;
use tokio::sync::broadcast;
use tokio::time::{sleep, Duration};
const INIT_NODES: &str = "detee_challenge_nodes";
const DISK_PERSISTENCE: &str = "detee_challenge_node_history";
async fn cycle_keys(ds: Arc<Store>, tx: Sender<NodeUpdate>) {
loop {
sleep(Duration::from_secs(60)).await;
let _ = tx.send(ds.reset_localhost_keys().await);
ds.remove_inactive_nodes().await;
}
}
#[tokio::main]
async fn main() {
let ds: Arc<Store> = Arc::new(Store::init(DISK_PERSISTENCE).await);
ds.reset_localhost_keys().await;
let (tx, mut _rx) = broadcast::channel(500);
let mut long_term_tasks = JoinSet::new();
let mut init_tasks = JoinSet::new();
long_term_tasks.spawn(cycle_keys(ds.clone(), tx.clone()));
long_term_tasks.spawn(http_server::init(ds.clone()));
long_term_tasks.spawn(grpc::server::MyServer::init(ds.clone(), tx.clone()).start());
let input = File::open(INIT_NODES).unwrap();
let buffered = BufReader::new(input);
for line in buffered.lines() {
init_tasks.spawn(
grpc::client::ConnManager::init(ds.clone(), tx.clone()).start_with_node(line.unwrap()),
);
}
let mut connection_count = 0;
while init_tasks.join_next().await.is_some() {
if connection_count < 3 {
long_term_tasks.spawn(grpc::client::ConnManager::init(ds.clone(), tx.clone()).start());
connection_count += 1;
}
}
while connection_count < 3 {
long_term_tasks.spawn(grpc::client::ConnManager::init(ds.clone(), tx.clone()).start());
connection_count += 1;
}
// exit no matter which task finished
long_term_tasks.join_next().await;
println!("Shutting down...");
}