diff options
Diffstat (limited to 'rest/src/main.rs')
| -rw-r--r-- | rest/src/main.rs | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/rest/src/main.rs b/rest/src/main.rs new file mode 100644 index 0000000..ae993d9 --- /dev/null +++ b/rest/src/main.rs @@ -0,0 +1,46 @@ +use std::{convert::Infallible, sync::Arc}; + +use crate::{config::Config, ratelimit::Ratelimiter}; +use common::{ + config::Settings, + log::{error, info}, + redis_crate::Client, +}; +use hyper::{server::conn::AddrStream, service::make_service_fn, Server}; +use std::net::ToSocketAddrs; +use tokio::sync::Mutex; + +use crate::proxy::ServiceProxy; + +mod config; +mod proxy; +mod ratelimit; + +#[tokio::main] +async fn main() { + let settings: Settings<Config> = Settings::new("rest").unwrap(); + let config = Arc::new(settings.config); + let redis_client: Client = settings.redis.into(); + let redis = Arc::new(Mutex::new( + redis_client.get_async_connection().await.unwrap(), + )); + let ratelimiter = Arc::new(Ratelimiter::new(redis)); + + let addr = format!("{}:{}", config.server.address, config.server.port) + .to_socket_addrs() + .unwrap() + .next() + .unwrap(); + + let service_fn = make_service_fn(move |_: &AddrStream| { + let service_proxy = ServiceProxy::new(config.clone(), ratelimiter.clone()); + async move { Ok::<_, Infallible>(service_proxy) } + }); + + let server = Server::bind(&addr).serve(service_fn); + + info!("starting ratelimit server"); + if let Err(e) = server.await { + error!("server error: {}", e); + } +} |
