MatrixGW/src/main.rs
Pierre HUBERT 0b16fd2202
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/tag Build is failing
Release v1.0.0
2025-03-04 19:32:56 +01:00

81 lines
3.2 KiB
Rust

use actix_remote_ip::RemoteIPConfig;
use actix_session::config::SessionLifecycle;
use actix_session::{storage::RedisSessionStore, SessionMiddleware};
use actix_web::cookie::Key;
use actix_web::{web, App, HttpServer};
use matrix_gateway::app_config::AppConfig;
use matrix_gateway::broadcast_messages::BroadcastMessage;
use matrix_gateway::server::{api, web_ui};
use matrix_gateway::sync_client;
use matrix_gateway::user::UserConfig;
#[tokio::main]
async fn main() -> std::io::Result<()> {
env_logger::init_from_env(env_logger::Env::new().default_filter_or("info"));
UserConfig::create_bucket_if_required()
.await
.expect("Failed to create bucket!");
let secret_key = Key::from(AppConfig::get().secret().as_bytes());
let redis_store = RedisSessionStore::new(AppConfig::get().redis_connection_string())
.await
.expect("Failed to connect to Redis!");
let (ws_tx, _) = tokio::sync::broadcast::channel::<BroadcastMessage>(16);
// Launch sync manager
tokio::spawn(sync_client::sync_client_manager(ws_tx.clone()));
log::info!(
"Starting to listen on {} for {}",
AppConfig::get().listen_address,
AppConfig::get().website_origin
);
HttpServer::new(move || {
App::new()
// Add session management to your application using Redis for session state storage
.wrap(
SessionMiddleware::builder(redis_store.clone(), secret_key.clone())
.cookie_name("matrixgw-session".to_string())
.session_lifecycle(SessionLifecycle::BrowserSession(Default::default()))
.build(),
)
.app_data(web::Data::new(RemoteIPConfig {
proxy: AppConfig::get().proxy_ip.clone(),
}))
.app_data(web::Data::new(ws_tx.clone()))
// Web configuration routes
.route("/assets/{tail:.*}", web::get().to(web_ui::static_file))
.route("/", web::get().to(web_ui::home))
.route("/", web::post().to(web_ui::home))
.route("/oidc_cb", web::get().to(web_ui::oidc_cb))
.route("/sign_out", web::get().to(web_ui::sign_out))
.route("/ws_debug", web::get().to(web_ui::ws_debug))
// API routes
.route("/api", web::get().to(api::api_home))
.route("/api", web::post().to(api::api_home))
.route("/api/account/whoami", web::get().to(api::account::who_am_i))
.route("/api/room/joined", web::get().to(api::room::joined_rooms))
.route("/api/room/{room_id}", web::get().to(api::room::info))
.route(
"/api/media/{server_name}/{media_id}/download",
web::get().to(api::media::download),
)
.route(
"/api/media/{server_name}/{media_id}/thumbnail",
web::get().to(api::media::thumbnail),
)
.route(
"/api/profile/{user_id}",
web::get().to(api::profile::get_profile),
)
.service(web::resource("/api/ws").route(web::get().to(api::ws::ws)))
})
.workers(4)
.bind(&AppConfig::get().listen_address)?
.run()
.await
}