Add live_kit_server::api::Client::{create,delete}_room
This commit is contained in:
parent
e39c7c62e4
commit
75c339851f
3 changed files with 66 additions and 34 deletions
3
Cargo.lock
generated
3
Cargo.lock
generated
|
@ -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",
|
||||||
]
|
]
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue