From bee67445a530f8ed69b6de37b62d599776ac4fd0 Mon Sep 17 00:00:00 2001 From: pabloFuente Date: Mon, 13 May 2024 11:24:54 +0200 Subject: [PATCH] Rust tutorial --- application-server/rust/.cargo/config.toml | 17 ++++++ application-server/rust/.env | 3 + application-server/rust/.gitignore | 14 +++++ application-server/rust/Cargo.toml | 16 +++++ application-server/rust/README.md | 18 ++++++ application-server/rust/src/main.rs | 70 ++++++++++++++++++++++ 6 files changed, 138 insertions(+) create mode 100644 application-server/rust/.cargo/config.toml create mode 100644 application-server/rust/.env create mode 100644 application-server/rust/.gitignore create mode 100644 application-server/rust/Cargo.toml create mode 100644 application-server/rust/README.md create mode 100644 application-server/rust/src/main.rs diff --git a/application-server/rust/.cargo/config.toml b/application-server/rust/.cargo/config.toml new file mode 100644 index 00000000..2dc4a504 --- /dev/null +++ b/application-server/rust/.cargo/config.toml @@ -0,0 +1,17 @@ +[target.x86_64-pc-windows-msvc] +rustflags = ["-C", "target-feature=+crt-static"] + +[target.aarch64-pc-windows-msvc] +rustflags = ["-C", "target-feature=+crt-static"] + +[target.x86_64-apple-darwin] +rustflags = ["-C", "link-args=-ObjC"] + +[target.aarch64-apple-darwin] +rustflags = ["-C", "link-args=-ObjC"] + +[target.aarch64-apple-ios] +rustflags = ["-C", "link-args=-ObjC"] + +[target.aarch64-apple-ios-sim] +rustflags = ["-C", "link-args=-ObjC"] \ No newline at end of file diff --git a/application-server/rust/.env b/application-server/rust/.env new file mode 100644 index 00000000..0fda5182 --- /dev/null +++ b/application-server/rust/.env @@ -0,0 +1,3 @@ +SERVER_PORT=6080 +LIVEKIT_API_KEY=devkey +LIVEKIT_API_SECRET=secret \ No newline at end of file diff --git a/application-server/rust/.gitignore b/application-server/rust/.gitignore new file mode 100644 index 00000000..ada8be92 --- /dev/null +++ b/application-server/rust/.gitignore @@ -0,0 +1,14 @@ +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb \ No newline at end of file diff --git a/application-server/rust/Cargo.toml b/application-server/rust/Cargo.toml new file mode 100644 index 00000000..ef1831ec --- /dev/null +++ b/application-server/rust/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "rust" +version = "0.1.0" +edition = "2021" + +[dependencies] +axum = "0.7.5" +tokio = { version = "1", features = ["full"] } +tower-http = { version = "0.5.2", features = ["cors"] } +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0.117" +livekit = "0.3.2" +livekit-api = "0.3.2" +dotenv = "0.15.0" +env_logger = "0.11.3" +log = "0.4.21" diff --git a/application-server/rust/README.md b/application-server/rust/README.md new file mode 100644 index 00000000..8ad52188 --- /dev/null +++ b/application-server/rust/README.md @@ -0,0 +1,18 @@ +#### Prerequisites + +To run this application you will need **Rust**: + +- [Rust](https://www.rust-lang.org/tools/install){:target="\_blank"} + +#### Download repository + +```bash +git clone https://github.com/OpenVidu/openvidu-livekit-tutorials.git +cd openvidu-livekit-tutorials/application-server/rust +``` + +#### Run application + +```bash +cargo run +``` diff --git a/application-server/rust/src/main.rs b/application-server/rust/src/main.rs new file mode 100644 index 00000000..2b239de3 --- /dev/null +++ b/application-server/rust/src/main.rs @@ -0,0 +1,70 @@ +use axum::{ + extract::Json, http::header::CONTENT_TYPE, http::Method, http::StatusCode, routing::post, + Router, +}; +use dotenv::dotenv; +use env_logger::Env; +use livekit_api::access_token; +use log::info; +use serde_json::Value; +use std::env; +use tower_http::cors::{Any, CorsLayer}; + +#[tokio::main] +async fn main() { + env_logger::Builder::from_env(Env::default().default_filter_or("info")).init(); // Init logger + dotenv().ok(); // Load environment variables from .env + + // Check that required environment variables are set + let server_port = env::var("SERVER_PORT").unwrap_or("6080".to_string()); + env::var("LIVEKIT_API_KEY").expect("LIVEKIT_API_KEY is not set"); + env::var("LIVEKIT_API_SECRET").expect("LIVEKIT_API_SECRET is not set"); + + let cors = CorsLayer::new() + .allow_methods([Method::POST]) + .allow_origin(Any) + .allow_headers([CONTENT_TYPE]); + + let app = Router::new().route("/token", post(get_token)).layer(cors); + + let listener = tokio::net::TcpListener::bind("0.0.0.0:".to_string() + &server_port) + .await + .unwrap(); + axum::serve(listener, app).await.unwrap(); +} + +async fn get_token(payload: Option>) -> (StatusCode, Json) { + if let Some(payload) = payload { + let livekit_api_key = env::var("LIVEKIT_API_KEY").expect("LIVEKIT_API_KEY is not set"); + let livekit_api_secret = + env::var("LIVEKIT_API_SECRET").expect("LIVEKIT_API_SECRET is not set"); + + let room_name = payload.get("roomName").expect("roomName is required"); + let participant_name = payload + .get("participantName") + .expect("participantName is required"); + + let token = access_token::AccessToken::with_api_key(&livekit_api_key, &livekit_api_secret) + .with_identity(&participant_name.to_string()) + .with_name(&participant_name.to_string()) + .with_grants(access_token::VideoGrants { + room_join: true, + room: room_name.to_string(), + ..Default::default() + }) + .to_jwt() + .unwrap(); + + info!( + "Sending token for room {} to participant {}", + room_name, participant_name + ); + + return (StatusCode::CREATED, Json(token)); + } else { + return ( + StatusCode::BAD_REQUEST, + Json("roomName and participantName are required".to_string()), + ); + } +}