diff --git a/Cargo.toml b/Cargo.toml index 91c7e259..f436fcaa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -82,6 +82,9 @@ thread_local = "1.1.3" # used for TURN server authentication hmac = "0.11.0" sha-1 = "0.9.8" +# used to embed Element Web into Conduit +rust-embed="6.3.0" + [features] default = ["conduit_bin", "backend_sqlite"] diff --git a/src/main.rs b/src/main.rs index 56faa3e7..a23662d6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,11 +17,15 @@ mod pdu; mod ruma_wrapper; mod utils; +use std::ffi::OsStr; +use std::io::Cursor; +use std::path::PathBuf; use std::sync::Arc; use database::Config; pub use database::Database; pub use error::{Error, Result}; +use http::StatusCode; use opentelemetry::trace::{FutureExt, Tracer}; pub use pdu::PduEvent; pub use rocket::State; @@ -34,8 +38,12 @@ use rocket::{ providers::{Env, Format, Toml}, Figment, }, - routes, Request, + get, + http::{ContentType, Status}, + response, routes, Request, }; + +use rust_embed::RustEmbed; use tokio::sync::RwLock; use tracing_subscriber::{prelude::*, EnvFilter}; @@ -176,6 +184,7 @@ fn setup_rocket(config: Figment, data: Arc>) -> rocket::Rocket< server_server::claim_keys_route, ], ) + .mount("/", routes![dist]) .register( "/", catchers![ @@ -276,6 +285,34 @@ async fn main() { } } +#[derive(RustEmbed)] +#[folder = "element_web"] +struct ElementWebAsset; + +#[get("/")] +fn dist<'r>(file: PathBuf) -> response::Result<'r> { + let filename = file.display().to_string(); + + ElementWebAsset::get(&filename).map_or_else( + || Err(Status::NotFound), + |embedded_file| { + let ext = file + .as_path() + .extension() + .and_then(OsStr::to_str) + .ok_or_else(|| Status::new(400))?; + + let content_type = ContentType::from_extension(ext).ok_or_else(|| Status::new(400))?; + + let response: Result, Status> = response::Response::build() + .header(content_type) + .sized_body(embedded_file.data.len(), Cursor::new(embedded_file.data)) + .ok(); + return response; + }, + ) +} + #[catch(404)] fn not_found_catcher(_: &Request<'_>) -> String { "404 Not Found".to_owned()