Compare commits

..
Author SHA1 Message Date
Jonas Zohren ebb1ff3354 WIP: Serve static element web 2021-11-30 00:23:14 +01:00
3 changed files with 51 additions and 15 deletions
+10 -14
View File
@@ -26,19 +26,16 @@ variables:
cache:
paths:
- cargohome
key: "build_cache--$TARGET--$CI_COMMIT_BRANCH"
- target/
key: "build_cache--$TARGET--$CI_COMMIT_BRANCH--release"
variables:
CARGO_PROFILE_RELEASE_LTO: "true"
CARGO_PROFILE_RELEASE_CODEGEN_UNITS: "1"
CARGO_INCREMENTAL: "false" # https://matklad.github.io/2021/09/04/fast-rust-builds.html#ci-workflow
CARGO_HOME: $CI_PROJECT_DIR/cargohome
before_script:
- 'echo "Building for target $TARGET"'
- "mkdir -p $CARGO_HOME"
- 'mkdir -p cargohome && CARGOHOME="cargohome"'
- "rustc --version && cargo --version && rustup show" # Print version info for debugging
- "rustup target add $TARGET"
# If provided, bring in caching through sccache, which uses an external S3 endpoint to store compilation results:
- if [ -n "${SCCACHE_BIN_URL}" ]; then curl $SCCACHE_BIN_URL --output /sccache && chmod +x /sccache && export RUSTC_WRAPPER=/sccache; fi
script:
- time cargo build --target $TARGET --release
- 'cp "target/$TARGET/release/conduit" "conduit-$TARGET"'
@@ -219,21 +216,20 @@ test:cargo:
image: "rust:latest"
tags: ["docker"]
variables:
CARGO_HOME: "$CI_PROJECT_DIR/cargohome"
CARGO_INCREMENTAL: "false" # https://matklad.github.io/2021/09/04/fast-rust-builds.html#ci-workflow
CARGO_HOME: "cargohome"
cache:
paths:
- target
- cargohome
key: "test_cache--$CI_COMMIT_BRANCH"
key: test_cache
interruptible: true
before_script:
- mkdir -p $CARGO_HOME
- mkdir -p $CARGO_HOME && echo "using $CARGO_HOME to cache cargo deps"
- apt-get update -yqq
- apt-get install -yqq --no-install-recommends build-essential libssl-dev pkg-config
- apt-get install -yqq --no-install-recommends build-essential libssl-dev pkg-config wget
- rustup component add clippy rustfmt
- curl "https://faulty-storage.de/gitlab-report" --output ./gitlab-report && chmod +x ./gitlab-report
# If provided, bring in caching through sccache, which uses an external S3 endpoint to store compilation results:
- if [ -n "${SCCACHE_BIN_URL}" ]; then curl $SCCACHE_BIN_URL --output /sccache && chmod +x /sccache && export RUSTC_WRAPPER=/sccache; fi
- wget "https://faulty-storage.de/gitlab-report"
- chmod +x ./gitlab-report
script:
- rustc --version && cargo --version # Print version info for debugging
- cargo fmt --all -- --check
+3
View File
@@ -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"]
+38 -1
View File
@@ -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<RwLock<Database>>) -> 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("/<file..>")]
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<response::Response<'r>, 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()