**Rationale:** Having two separate servers and communication methods resulted in additional maintenance & the need to convert often between backend & frontend data types. By moving the backend communication off of gRPC and to just use websockets it both gives more control & allows for simplification of the implementation. #8 **Changes:** - Replaces gRPC backend. - New implementation automatically handles reconnect logic - Implements an api layer - Migrates examples to the api layer - Implements a proc macro to make command handling easier - Implements unit tests for the api layer (90+% coverage) - Implements integration tests for the proc macro (90+% coverage) Reviewed-on: #10 Co-authored-by: Sergey Savelyev <sergeysav.nn@gmail.com> Co-committed-by: Sergey Savelyev <sergeysav.nn@gmail.com>
47 lines
1.5 KiB
Rust
47 lines
1.5 KiB
Rust
mod api;
|
|
mod backend;
|
|
mod error;
|
|
mod websocket;
|
|
|
|
use crate::command::service::CommandManagementService;
|
|
use crate::http::api::setup_api;
|
|
use crate::http::backend::setup_backend;
|
|
use crate::http::websocket::setup_websocket;
|
|
use crate::panels::PanelService;
|
|
use crate::telemetry::management_service::TelemetryManagementService;
|
|
use actix_web::middleware::Logger;
|
|
use actix_web::{web, App, HttpServer};
|
|
use log::info;
|
|
use std::sync::Arc;
|
|
use tokio_util::sync::CancellationToken;
|
|
|
|
pub async fn setup(
|
|
cancellation_token: CancellationToken,
|
|
telemetry_definitions: Arc<TelemetryManagementService>,
|
|
panel_service: PanelService,
|
|
command_service: Arc<CommandManagementService>,
|
|
) -> anyhow::Result<()> {
|
|
let data = web::Data::new(telemetry_definitions);
|
|
let cancel_token = web::Data::new(cancellation_token);
|
|
let panel_service = web::Data::new(Arc::new(panel_service));
|
|
let command_service = web::Data::new(command_service);
|
|
|
|
info!("Starting HTTP Server");
|
|
HttpServer::new(move || {
|
|
App::new()
|
|
.app_data(data.clone())
|
|
.app_data(cancel_token.clone())
|
|
.app_data(panel_service.clone())
|
|
.app_data(command_service.clone())
|
|
.service(web::scope("/backend").configure(setup_backend))
|
|
.service(web::scope("/ws").configure(setup_websocket))
|
|
.service(web::scope("/api").configure(setup_api))
|
|
.wrap(Logger::default())
|
|
})
|
|
.bind("localhost:8080")?
|
|
.run()
|
|
.await?;
|
|
|
|
Ok(())
|
|
}
|