Skip to main content

ruma_client_api/rtc/livekit/
delegate_delayed_leave.rs

1//! `POST /_matrix/client/*/rtc/livekit/delegate_delayed_leave`
2//!
3//! Delegate the restarting of the delayed leave event of a MatrixRTC slot to the homeserver.
4
5pub mod v1 {
6    //! `/v1/` ([MSC])
7    //!
8    //! [MSC]: https://github.com/matrix-org/matrix-spec-proposals/pull/4195
9
10    use ruma_common::{
11        OwnedRoomId,
12        api::{auth_scheme::AccessToken, request, response},
13        metadata,
14    };
15
16    metadata! {
17        method: POST,
18        rate_limited: true,
19        authentication: AccessToken,
20        history: {
21            unstable => "/_matrix/client/unstable/io.element.msc4195/rtc/livekit/delegate_delayed_leave",
22        }
23    }
24
25    /// Request type for the `delegate_delayed_leave` endpoint.
26    #[request]
27    pub struct Request {
28        /// The WebSocket URL of the LiveKit SFU that the user has connected to.
29        pub url: String,
30
31        /// The room where the `m.rtc.member` event is present.
32        pub room_id: OwnedRoomId,
33
34        /// The slot ID from the `m.rtc.member` event.
35        pub slot_id: String,
36
37        /// The `member.id` property of the `m.rtc.member` event.
38        pub member_id: String,
39
40        /// The ID of the delayed `m.rtc.member` leave event to delegate.
41        pub delay_id: String,
42    }
43
44    impl Request {
45        /// Creates a new `Request` with the given SFU URL, room ID, slot ID, member ID and delay
46        /// ID.
47        pub fn new(
48            url: String,
49            room_id: OwnedRoomId,
50            slot_id: String,
51            member_id: String,
52            delay_id: String,
53        ) -> Self {
54            Self { url, room_id, slot_id, member_id, delay_id }
55        }
56    }
57
58    /// Response type for the `delegate_delayed_leave` endpoint.
59    #[response]
60    pub struct Response {}
61
62    impl Response {
63        /// Creates a new empty `Response`.
64        pub fn new() -> Self {
65            Self {}
66        }
67    }
68
69    #[cfg(all(test, feature = "client"))]
70    mod tests {
71        use std::borrow::Cow;
72
73        use ruma_common::{
74            api::{OutgoingRequestExt as _, SupportedVersions, auth_scheme::SendAccessToken},
75            owned_room_id,
76        };
77        use serde_json::json;
78
79        use super::Request;
80
81        #[test]
82        fn serialize_request() {
83            let request = Request::new(
84                "wss://livekit.example.com".to_owned(),
85                owned_room_id!("!tDLCaLXijNtYcJZEey:example.com"),
86                "the_id".to_owned(),
87                "xyzABCDEF10123".to_owned(),
88                "1234567890".to_owned(),
89            );
90
91            let supported =
92                SupportedVersions { versions: Default::default(), features: Default::default() };
93
94            let (parts, body) = request
95                .try_into_http_request::<Vec<u8>>(
96                    "https://homeserver.tld",
97                    SendAccessToken::IfRequired("auth_tok"),
98                    Cow::Owned(supported),
99                )
100                .unwrap()
101                .into_parts();
102            let body: serde_json::Value = serde_json::from_slice(&body).unwrap();
103
104            assert_eq!("POST", parts.method.as_str());
105            assert_eq!(
106                "https://homeserver.tld/_matrix/client/unstable/io.element.msc4195/rtc/livekit/delegate_delayed_leave",
107                parts.uri.to_string()
108            );
109            assert_eq!(
110                body,
111                json!({
112                    "url": "wss://livekit.example.com",
113                    "room_id": "!tDLCaLXijNtYcJZEey:example.com",
114                    "slot_id": "the_id",
115                    "member_id": "xyzABCDEF10123",
116                    "delay_id": "1234567890",
117                })
118            );
119        }
120    }
121
122    #[cfg(all(test, feature = "server"))]
123    mod server_tests {
124        use ruma_common::api::IncomingRequestExt as _;
125
126        use super::Request;
127
128        #[test]
129        fn deserialize_request() {
130            let request = http::Request::builder()
131                .method("POST")
132                .uri(
133                    "/_matrix/client/unstable/io.element.msc4195/rtc/livekit/delegate_delayed_leave",
134                )
135                .body(
136                    br#"{
137                        "url": "wss://livekit.example.org",
138                        "room_id": "!tDLCaLXijNtYcJZEey:example.org",
139                        "slot_id": "the_id",
140                        "member_id": "xyzABCDEF10123",
141                        "delay_id": "1234567890"
142                    }"# as &[u8],
143                )
144                .unwrap();
145
146            let request = Request::try_from_http_request(request, &[] as &[&str]).unwrap();
147
148            assert_eq!(request.url, "wss://livekit.example.org");
149            assert_eq!(request.room_id, "!tDLCaLXijNtYcJZEey:example.org");
150            assert_eq!(request.slot_id, "the_id");
151            assert_eq!(request.member_id, "xyzABCDEF10123");
152            assert_eq!(request.delay_id, "1234567890");
153        }
154    }
155}