maps-service/validation/src/main.rs

66 lines
2.3 KiB
Rust
Raw Normal View History

2024-12-11 02:04:02 +00:00
mod types;
2024-12-03 05:09:59 +00:00
mod nats_types;
2024-12-03 05:15:10 +00:00
mod validator;
mod publish_new;
mod publish_fix;
2024-11-26 01:30:55 +00:00
2024-12-03 06:09:01 +00:00
#[allow(dead_code)]
#[derive(Debug)]
2024-12-11 02:04:02 +00:00
pub enum StartupError{
API(api::ReqwestError),
NatsConnect(async_nats::ConnectError),
2024-12-12 05:07:51 +00:00
NatsGetStream(async_nats::jetstream::context::GetStreamError),
2024-12-11 02:04:02 +00:00
NatsStartup(types::NatsStartupError),
2024-12-12 01:43:01 +00:00
GRPCConnect(tonic::transport::Error),
2024-12-03 06:09:01 +00:00
}
2024-12-03 06:52:01 +00:00
impl std::fmt::Display for StartupError{
fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{
write!(f,"{self:?}")
}
}
impl std::error::Error for StartupError{}
2024-12-03 06:09:01 +00:00
2024-12-07 05:00:19 +00:00
pub const GROUP_STRAFESNET:u64=6980477;
2024-12-03 05:15:10 +00:00
#[tokio::main]
2024-12-03 06:09:01 +00:00
async fn main()->Result<(),StartupError>{
2024-12-11 01:39:08 +00:00
// talk to roblox through STRAFESNET_CI2 account
let cookie=std::env::var("RBXCOOKIE").expect("RBXCOOKIE env required");
let cookie_context=rbx_asset::cookie::CookieContext::new(rbx_asset::cookie::Cookie::new(cookie));
2024-12-03 06:52:01 +00:00
// maps-service api
2024-12-11 01:39:08 +00:00
let api_host=std::env::var("API_HOST").expect("API_HOST env required");
let api=api::Context::new(api_host).map_err(StartupError::API)?;
2024-12-03 06:52:01 +00:00
// nats
2024-12-11 01:39:08 +00:00
let nats_host=std::env::var("NATS_HOST").expect("NATS_HOST env required");
2024-12-12 05:07:51 +00:00
let nasty=async_nats::connect(nats_host).await.map_err(StartupError::NatsConnect)?; // use nats jetstream
let stream=async_nats::jetstream::new(nasty)
.get_stream("maptest").await.map_err(StartupError::NatsGetStream)?;
2024-12-03 06:52:01 +00:00
2024-12-12 01:43:01 +00:00
// data-service grpc for creating map entries
let data_host=std::env::var("DATA_HOST").expect("DATA_HOST env required");
2024-12-11 02:04:02 +00:00
let maps_grpc=crate::types::MapsServiceClient::connect(data_host).await.map_err(StartupError::GRPCConnect)?;
2024-12-12 01:43:01 +00:00
2024-12-13 00:41:34 +00:00
// Create a signal listener for SIGTERM
let mut sig_term = tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate()).expect("Failed to create SIGTERM signal listener");
2024-12-03 06:52:01 +00:00
// connect to nats
let (publish_new,publish_fix,validator)=tokio::try_join!(
2024-12-12 05:07:51 +00:00
publish_new::Publisher::new(stream.clone(),cookie_context.clone(),api.clone(),maps_grpc),
publish_fix::Publisher::new(stream.clone(),cookie_context.clone(),api.clone()),
// clone nats here because it's dropped within the function scope,
// meanining the last reference is dropped...
2024-12-12 05:07:51 +00:00
validator::Validator::new(stream.clone(),cookie_context,api)
2024-12-11 02:04:02 +00:00
).map_err(StartupError::NatsStartup)?;
2024-12-03 06:52:01 +00:00
2024-12-13 00:41:34 +00:00
// nats consumer threads
tokio::spawn(publish_new.run());
tokio::spawn(publish_fix.run());
2024-12-13 00:41:34 +00:00
tokio::spawn(validator.run());
2024-12-03 06:52:01 +00:00
2024-12-13 00:41:34 +00:00
sig_term.recv().await;
2024-12-03 06:52:01 +00:00
2024-12-03 06:09:01 +00:00
Ok(())
2024-11-26 01:30:55 +00:00
}