use std::{io, sync::Arc}; use actix_web::{get, middleware::Logger, post, web, App, HttpResponse, HttpServer, Responder}; use actix_web_lab::{extract::Path, respond::Html}; mod broadcast; use self::broadcast::Broadcaster; #[actix_web::main] async fn main() -> io::Result<()> { env_logger::init_from_env(env_logger::Env::new().default_filter_or("info")); let data = Broadcaster::create(); log::info!("starting HTTP server at http://localhost:8080"); HttpServer::new(move || { App::new() .app_data(web::Data::from(Arc::clone(&data))) .service(index) .service(event_stream) .service(broadcast_msg) .wrap(Logger::default()) }) .bind(("127.0.0.1", 8080))? .workers(2) .run() .await } #[get("/")] async fn index() -> impl Responder { Html(include_str!("index.html").to_owned()) } #[get("/events")] async fn event_stream(broadcaster: web::Data) -> impl Responder { broadcaster.new_client().await } #[post("/broadcast/{msg}")] async fn broadcast_msg( broadcaster: web::Data, Path((msg,)): Path<(String,)>, ) -> impl Responder { broadcaster.broadcast(&msg).await; HttpResponse::Ok().body("msg sent") }