rust: add webhook receiver

This commit is contained in:
pabloFuente 2024-05-16 16:21:48 +02:00
parent 8e2de0a90a
commit 56c749c36c
2 changed files with 33 additions and 12 deletions

View File

@ -7,10 +7,6 @@ edition = "2021"
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"

View File

@ -1,18 +1,19 @@
use axum::http::HeaderMap;
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 livekit_api::access_token::AccessToken;
use livekit_api::access_token::TokenVerifier;
use livekit_api::access_token::VideoGrants;
use livekit_api::webhooks::WebhookReceiver;
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
@ -25,7 +26,10 @@ async fn main() {
.allow_origin(Any)
.allow_headers([CONTENT_TYPE]);
let app = Router::new().route("/token", post(create_token)).layer(cors);
let app = Router::new()
.route("/token", post(create_token))
.route("/webhook", post(receive_webhook))
.layer(cors);
let listener = tokio::net::TcpListener::bind("0.0.0.0:".to_string() + &server_port)
.await
@ -44,10 +48,10 @@ async fn create_token(payload: Option<Json<Value>>) -> (StatusCode, Json<String>
.get("participantName")
.expect("participantName is required");
let token = access_token::AccessToken::with_api_key(&livekit_api_key, &livekit_api_secret)
let 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 {
.with_grants(VideoGrants {
room_join: true,
room: room_name.to_string(),
..Default::default()
@ -55,7 +59,7 @@ async fn create_token(payload: Option<Json<Value>>) -> (StatusCode, Json<String>
.to_jwt()
.unwrap();
info!(
println!(
"Sending token for room {} to participant {}",
room_name, participant_name
);
@ -68,3 +72,24 @@ async fn create_token(payload: Option<Json<Value>>) -> (StatusCode, Json<String>
);
}
}
async fn receive_webhook(headers: HeaderMap, body: String) -> StatusCode {
let token_verifier = TokenVerifier::new().unwrap();
let webhook_receiver = WebhookReceiver::new(token_verifier);
let jwt: &str = headers
.get("Authorization")
.expect("Authorization header is required")
.to_str()
.unwrap();
let res = webhook_receiver.receive(&body, jwt);
if let Ok(event) = res {
println!("LiveKit WebHook: {:?}", event);
return StatusCode::OK;
} else {
println!("Error validating webhook event: {:?}", res);
return StatusCode::UNAUTHORIZED;
}
}