pub mod v1 {
use ruma_common::{
OwnedRoomId, OwnedServerName,
api::{auth_scheme::AccessToken, request, response},
metadata,
};
metadata! {
method: POST,
rate_limited: true,
authentication: AccessToken,
history: {
unstable => "/_matrix/client/unstable/io.element.msc4195/rtc/livekit/get_token",
}
}
#[request]
pub struct Request {
#[serde(skip_serializing_if = "Option::is_none")]
pub server_name: Option<OwnedServerName>,
pub url: String,
pub room_id: OwnedRoomId,
pub slot_id: String,
pub member_id: String,
}
impl Request {
pub fn new(url: String, room_id: OwnedRoomId, slot_id: String, member_id: String) -> Self {
Self { server_name: None, url, room_id, slot_id, member_id }
}
}
#[response]
pub struct Response {
pub jwt: String,
}
impl Response {
pub fn new(jwt: String) -> Self {
Self { jwt }
}
}
#[cfg(all(test, feature = "client"))]
mod tests {
use std::borrow::Cow;
use ruma_common::{
api::{OutgoingRequestExt as _, SupportedVersions, auth_scheme::SendAccessToken},
owned_room_id, owned_server_name,
};
use serde_json::{Value as JsonValue, json};
use super::Request;
fn serialize_request(request: Request) -> (http::request::Parts, JsonValue) {
let supported =
SupportedVersions { versions: Default::default(), features: Default::default() };
let (parts, body) = request
.try_into_http_request::<Vec<u8>>(
"https://homeserver.tld",
SendAccessToken::IfRequired("auth_tok"),
Cow::Owned(supported),
)
.unwrap()
.into_parts();
(parts, serde_json::from_slice(&body).unwrap())
}
#[test]
fn serialize_request_without_server_name() {
let request = Request::new(
"wss://livekit.example.com".to_owned(),
owned_room_id!("!tDLCaLXijNtYcJZEey:example.com"),
"the_id".to_owned(),
"xyzABCDEF10123".to_owned(),
);
let (parts, body) = serialize_request(request);
assert_eq!("POST", parts.method.as_str());
assert_eq!(
"https://homeserver.tld/_matrix/client/unstable/io.element.msc4195/rtc/livekit/get_token",
parts.uri.to_string()
);
assert_eq!(
body,
json!({
"url": "wss://livekit.example.com",
"room_id": "!tDLCaLXijNtYcJZEey:example.com",
"slot_id": "the_id",
"member_id": "xyzABCDEF10123",
})
);
}
#[test]
fn serialize_request_with_server_name() {
let mut request = Request::new(
"wss://livekit.example.com".to_owned(),
owned_room_id!("!tDLCaLXijNtYcJZEey:example.com"),
"the_id".to_owned(),
"xyzABCDEF10123".to_owned(),
);
request.server_name = Some(owned_server_name!("example.com"));
let (_parts, body) = serialize_request(request);
assert_eq!(
body,
json!({
"server_name": "example.com",
"url": "wss://livekit.example.com",
"room_id": "!tDLCaLXijNtYcJZEey:example.com",
"slot_id": "the_id",
"member_id": "xyzABCDEF10123",
})
);
}
}
#[cfg(all(test, feature = "server"))]
mod server_tests {
use ruma_common::api::IncomingRequestExt as _;
use super::Request;
#[test]
fn deserialize_request() {
let request = http::Request::builder()
.method("POST")
.uri("/_matrix/client/unstable/io.element.msc4195/rtc/livekit/get_token")
.body(
br#"{
"url": "wss://livekit.example.org",
"room_id": "!tDLCaLXijNtYcJZEey:example.org",
"slot_id": "the_id",
"member_id": "xyzABCDEF10123"
}"# as &[u8],
)
.unwrap();
let request = Request::try_from_http_request(request, &[] as &[&str]).unwrap();
assert_eq!(request.server_name, None);
assert_eq!(request.url, "wss://livekit.example.org");
assert_eq!(request.room_id, "!tDLCaLXijNtYcJZEey:example.org");
assert_eq!(request.slot_id, "the_id");
assert_eq!(request.member_id, "xyzABCDEF10123");
}
}
}