Refactor websocket

This commit is contained in:
Tobias Reisinger 2026-09-02 00:25:56 +02:00
commit f3d367e479
Signed by: serguzim
GPG key ID: 13AD60C237A28DFE
22 changed files with 924 additions and 773 deletions

View file

@ -1,6 +1,5 @@
use std::net::TcpListener;
use actix::{Actor, Arbiter};
use actix_cors::Cors;
use actix_web::middleware::TrailingSlash;
use actix_web::{middleware, web, App, HttpServer};
@ -8,13 +7,14 @@ use emgauwa_common::db::DbController;
use emgauwa_common::errors::EmgauwaError;
use emgauwa_common::utils::{drop_privileges, init_logging};
use serde_json::Value;
use tokio::spawn;
use utoipa_swagger_ui::SwaggerUi;
use crate::app_state::AppState;
use crate::server::WsServer;
mod app_state;
mod handlers;
mod settings;
mod server;
#[actix_web::main]
async fn main() -> Result<(), std::io::Error> {
@ -34,17 +34,8 @@ async fn main() -> Result<(), std::io::Error> {
.map_err(EmgauwaError::from)?;
conn.close().await.map_err(EmgauwaError::from)?;
let app_state_arbiter = Arbiter::with_tokio_rt(|| {
tokio::runtime::Builder::new_multi_thread()
.worker_threads(2)
.enable_all()
.build()
.unwrap()
});
let app_state_pool = pool.clone();
let app_state = Actor::start_in_arbiter(&app_state_arbiter.handle(), move |_| {
AppState::new(app_state_pool)
});
let (ws_server, ws_server_tx) = WsServer::new(pool.clone());
let ws_server = spawn(ws_server.run());
let api_v1_json: Value =
serde_json::from_str(include_str!("../api.v1.json")).map_err(EmgauwaError::from)?;
@ -55,7 +46,7 @@ async fn main() -> Result<(), std::io::Error> {
settings.server.port
);
HttpServer::new(move || {
let http_server = HttpServer::new(move || {
let cors = Cors::default().allow_any_method().allow_any_header();
let origins = settings.origins.clone();
@ -70,8 +61,8 @@ async fn main() -> Result<(), std::io::Error> {
.wrap(cors)
.wrap(middleware::Logger::default())
.app_data(web::JsonConfig::default().error_handler(handlers::json_error_handler))
.app_data(web::Data::new(ws_server_tx.clone()))
.app_data(web::Data::new(pool.clone()))
.app_data(web::Data::new(app_state.clone()))
.app_data(web::Data::new(settings.clone()))
.service(
SwaggerUi::new("/api/docs/{_:.*}")
@ -115,6 +106,8 @@ async fn main() -> Result<(), std::io::Error> {
})
.workers((pool_size / 2) as usize)
.listen(listener)?
.run()
.await
.run();
tokio::try_join!(http_server, async move { ws_server.await.unwrap() })?;
Ok(())
}