lj_sketch/src/main.rs

71 lines
2.1 KiB
Rust
Raw Permalink Normal View History

2023-08-07 20:37:41 +00:00
mod gen_server;
mod ws_client;
2023-08-08 12:14:34 +00:00
mod line;
2023-08-07 20:37:41 +00:00
2023-08-07 18:28:11 +00:00
use axum::{
extract::{
2023-08-07 20:37:41 +00:00
ws::WebSocketUpgrade,
2023-08-07 18:28:11 +00:00
TypedHeader,
},
response::IntoResponse,
routing::get,
Router,
Extension
};
2023-08-08 12:14:34 +00:00
use axum::extract::connect_info::ConnectInfo;
2023-08-07 18:28:11 +00:00
use std::{net::SocketAddr, path::PathBuf};
use tower_http::{
services::ServeDir,
trace::{DefaultMakeSpan, TraceLayer},
};
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
2023-08-08 12:14:34 +00:00
use tokio::sync::mpsc::Sender;
use gen_server::GSMsg;
2023-08-07 18:28:11 +00:00
const LISTEN_ON : &str = "0.0.0.0:3000";
#[tokio::main]
2024-02-29 14:54:45 +00:00
async fn main() -> anyhow::Result<()> {
2023-08-07 18:28:11 +00:00
tracing_subscriber::registry()
2024-02-29 14:54:45 +00:00
//.with(tracing_subscriber::EnvFilter::try_from_default_env()
.with(tracing_subscriber::EnvFilter::try_from_env("LJ_SKETCH")
2023-08-25 18:47:24 +00:00
.unwrap_or_else(|_| "lj_sketch=info,tower_http=info".into()))
2023-08-07 18:28:11 +00:00
.with(tracing_subscriber::fmt::layer())
.init();
2023-08-08 12:14:34 +00:00
let gs_tx = gen_server::spawn();
let assets_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("pub");
2023-08-07 18:28:11 +00:00
let app = Router::new()
.fallback_service(ServeDir::new(assets_dir)
.append_index_html_on_directories(true))
2023-08-07 20:37:41 +00:00
.route("/ws", get(ws_handler))
2023-08-08 12:14:34 +00:00
.layer(Extension(gs_tx))
.layer(TraceLayer::new_for_http()
.make_span_with(DefaultMakeSpan::default()
.include_headers(false)));
2023-08-07 20:37:41 +00:00
2024-02-29 14:54:45 +00:00
let addr : SocketAddr = LISTEN_ON.parse()?;
tracing::info!("listening on {}", addr);
2023-08-07 18:28:11 +00:00
axum::Server::bind(&addr)
.serve(app.into_make_service_with_connect_info::<SocketAddr>())
2024-02-29 14:54:45 +00:00
.await?;
Ok(())
2023-08-07 18:28:11 +00:00
}
async fn ws_handler(
ws: WebSocketUpgrade,
2023-08-08 12:14:34 +00:00
Extension(gs_tx): Extension<Sender<GSMsg>>,
2023-08-07 18:28:11 +00:00
user_agent: Option<TypedHeader<axum::headers::UserAgent>>,
ConnectInfo(addr): ConnectInfo<SocketAddr>,
) -> impl IntoResponse {
let user_agent = if let Some(TypedHeader(user_agent)) = user_agent {
user_agent.to_string()
} else {
String::from("Unknown browser")
};
2023-08-08 12:14:34 +00:00
tracing::info!("{addr} connected [{user_agent}].");
ws.on_upgrade(move |socket| ws_client::handle_socket(socket, addr, gs_tx))
2023-08-07 18:28:11 +00:00
}