Add live_kit_server::api::Client::{create,delete}_room

This commit is contained in:
Antonio Scandurra 2022-10-17 11:24:09 +02:00
parent e39c7c62e4
commit 75c339851f
3 changed files with 66 additions and 34 deletions

3
Cargo.lock generated
View file

@ -3202,12 +3202,13 @@ name = "live_kit_server"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"futures 0.3.24",
"hmac 0.12.1", "hmac 0.12.1",
"hyper",
"jwt", "jwt",
"prost 0.8.0", "prost 0.8.0",
"prost-build", "prost-build",
"prost-types 0.8.0", "prost-types 0.8.0",
"reqwest",
"serde", "serde",
"sha2 0.10.6", "sha2 0.10.6",
] ]

View file

@ -10,11 +10,12 @@ doctest = false
[dependencies] [dependencies]
anyhow = "1.0.38" anyhow = "1.0.38"
futures = "0.3"
hmac = "0.12" hmac = "0.12"
jwt = "0.16" jwt = "0.16"
hyper = { version = "0.14", features = ["client", "http1"] }
prost = "0.8" prost = "0.8"
prost-types = "0.8" prost-types = "0.8"
reqwest = "0.11"
serde = { version = "1.0", features = ["derive", "rc"] } serde = { version = "1.0", features = ["derive", "rc"] }
sha2 = "0.10" sha2 = "0.10"

View file

@ -1,21 +1,24 @@
use crate::{proto, token}; use crate::{proto, token};
use anyhow::{anyhow, Result}; use anyhow::{anyhow, Result};
use hyper::{client::HttpConnector, header::AUTHORIZATION, Method, Request, Uri}; use prost::Message;
use reqwest::header::CONTENT_TYPE;
use std::future::Future; use std::future::Future;
pub struct Client { pub struct Client {
http: hyper::Client<HttpConnector>, http: reqwest::Client,
uri: Uri, uri: String,
key: String, key: String,
secret: String, secret: String,
} }
impl Client { impl Client {
pub fn new(uri: Uri, key: String, secret: String) -> Self { pub fn new(mut uri: String, key: String, secret: String) -> Self {
assert!(uri.scheme().is_some(), "base uri must have a scheme"); if uri.ends_with('/') {
assert!(uri.authority().is_some(), "base uri must have an authority"); uri.pop();
}
Self { Self {
http: hyper::Client::new(), http: reqwest::Client::new(),
uri, uri,
key, key,
secret, secret,
@ -23,39 +26,66 @@ impl Client {
} }
pub fn create_room(&self, name: String) -> impl Future<Output = Result<proto::Room>> { pub fn create_room(&self, name: String) -> impl Future<Output = Result<proto::Room>> {
let token = token::create( self.request(
&self.key, "twirp/livekit.RoomService/CreateRoom",
&self.secret,
None,
token::VideoGrant { token::VideoGrant {
room_create: Some(true), room_create: Some(true),
..Default::default() ..Default::default()
}, },
); proto::CreateRoomRequest {
name,
..Default::default()
},
)
}
pub fn delete_room(&self, name: String) -> impl Future<Output = Result<()>> {
let response = self.request(
"twirp/livekit.RoomService/DeleteRoom",
token::VideoGrant {
room_create: Some(true),
..Default::default()
},
proto::DeleteRoomRequest { room: name },
);
async move {
response.await?;
Ok(())
}
}
fn request<Req, Res>(
&self,
path: &str,
grant: token::VideoGrant,
body: Req,
) -> impl Future<Output = Result<Res>>
where
Req: Message,
Res: Default + Message,
{
let client = self.http.clone(); let client = self.http.clone();
let uri = Uri::builder() let token = token::create(&self.key, &self.secret, None, grant);
.scheme(self.uri.scheme().unwrap().clone()) let uri = format!("{}/{}", self.uri, path);
.authority(self.uri.authority().unwrap().clone())
.path_and_query("twirp/livekit.RoomService/CreateRoom")
.build();
async move { async move {
let token = token?; let token = token?;
let uri = uri?; let response = client
let body = proto::CreateRoomRequest { .post(&uri)
name: todo!(), .header(CONTENT_TYPE, "application/protobuf")
empty_timeout: todo!(), .bearer_auth(token)
max_participants: todo!(), .body(body.encode_to_vec())
node_id: todo!(), .send()
metadata: todo!(), .await?;
egress: todo!(), if response.status().is_success() {
}; Ok(Res::decode(response.bytes().await?)?)
let mut request = Request::builder() } else {
.uri(uri) Err(anyhow!(
.method(Method::POST) "POST {} failed with status code {:?}, {:?}",
.header(AUTHORIZATION, format!("Bearer {}", token)) uri,
.body(body); response.status(),
Err(anyhow!("yeah")) response.text().await
))
}
} }
} }
} }