1#![allow(unused_imports)]
6
7mod client;
8mod common;
9mod error;
10mod feature;
11mod meminfos;
12mod response;
13mod rusages;
14mod self_proc_stats;
15mod stream;
16mod summary;
17mod system_proc_stats;
18mod vhost;
19
20pub use client::Client;
21pub use common::{Hls, Kbps, Publish};
22pub use error::SrsClientError;
23pub use response::{SrsClientResp, SrsClientRespData};
24pub use stream::{Audio, Stream, Video};
25pub use summary::{Summary, Tests, Urls};
26pub use vhost::Vhost;
27
28use reqwest::{Client as ReqwestClient, Response as ReqwestResponse};
29use url::Url;
30
31#[derive(Clone, Debug)]
36pub struct SrsClient {
37 http_client: ReqwestClient,
38 base_url: Url,
39}
40
41impl SrsClient {
42 pub fn build<S: Into<String>>(base_url: S) -> Result<Self, SrsClientError> {
51 let base_url = Url::parse(&base_url.into())
52 .and_then(|url| url.join("/api/v1/"))
53 .map_err(SrsClientError::IncorrectBaseUrl)?;
54 tracing::debug!("base_url: {base_url}");
55 Ok(Self {
56 http_client: ReqwestClient::new(),
57 base_url,
58 })
59 }
60
61 async fn get(&self, url: &str) -> Result<ReqwestResponse, SrsClientError> {
62 self.http_client
63 .get(
64 self.base_url
65 .join(url)
66 .map_err(SrsClientError::IncorrectApiUrl)?,
67 )
68 .send()
69 .await
70 .map_err(SrsClientError::RequestFailed)
71 }
72
73 async fn delete(&self, url: &str) -> Result<ReqwestResponse, SrsClientError> {
74 self.http_client
75 .delete(
76 self.base_url
77 .join(url)
78 .map_err(SrsClientError::IncorrectApiUrl)?,
79 )
80 .send()
81 .await
82 .map_err(SrsClientError::RequestFailed)
83 }
84
85 async fn process_resp(&self, resp: ReqwestResponse) -> Result<SrsClientResp, SrsClientError> {
86 if !resp.status().is_success() {
87 return Err(SrsClientError::BadStatus(resp.status()));
88 }
89 tracing::debug!("processing request to: {}", resp.url());
91 let resp = resp
92 .json::<SrsClientResp>()
93 .await
94 .map_err(SrsClientError::DeserializeError)?;
95 Ok(resp)
96 }
97
98 pub async fn kickoff_client<T: Into<String>>(
108 self,
109 id: T,
110 ) -> Result<SrsClientResp, SrsClientError> {
111 let resp = self.delete(&format!("clients/{}/", id.into())).await?;
112 self.process_resp(resp).await
113 }
114
115 pub async fn get_version(self) -> Result<SrsClientResp, SrsClientError> {
122 let resp = self.get("versions").await?;
123 self.process_resp(resp).await
124 }
125
126 pub async fn get_summaries(self) -> Result<SrsClientResp, SrsClientError> {
133 let resp = self.get("summaries").await?;
134 self.process_resp(resp).await
135 }
136
137 pub async fn get_summary(self) -> Result<Option<Summary>, SrsClientError> {
144 let response = self.get_summaries().await?;
145 match response.data {
146 SrsClientRespData::Summary(summary) => Ok(Some(summary)),
147 _ => Err(SrsClientError::UnexpectedResponse("summary")),
148 }
149 }
150
151 pub async fn get_requests(self) -> Result<SrsClientResp, SrsClientError> {
158 let resp = self.get("requests").await?;
159 self.process_resp(resp).await
160 }
161
162 pub async fn get_requests_summary(self) -> Result<Option<Summary>, SrsClientError> {
169 let response = self.get_requests().await?;
170 match response.data {
171 SrsClientRespData::Summary(summary) => Ok(Some(summary)),
172 _ => Err(SrsClientError::UnexpectedResponse("requests summary")),
173 }
174 }
175
176 pub async fn get_configs(self) -> Result<SrsClientResp, SrsClientError> {
183 let resp = self.get("configs").await?;
184 self.process_resp(resp).await
185 }
186
187 pub async fn get_configs_summary(self) -> Result<Option<Summary>, SrsClientError> {
194 let response = self.get_configs().await?;
195 match response.data {
196 SrsClientRespData::Summary(summary) => Ok(Some(summary)),
197 _ => Err(SrsClientError::UnexpectedResponse("configs summary")),
198 }
199 }
200
201 pub async fn get_vhosts(self) -> Result<SrsClientResp, SrsClientError> {
208 let resp = self.get("vhosts").await?;
209 self.process_resp(resp).await
210 }
211
212 pub async fn get_vhost<T: Into<String>>(self, id: T) -> Result<SrsClientResp, SrsClientError> {
219 let resp = self.get(&format!("vhosts/{}", id.into())).await?;
220 self.process_resp(resp).await
221 }
222
223 pub async fn get_vhost_list(self) -> Result<Vec<Vhost>, SrsClientError> {
230 let response = self.get_vhosts().await?;
231 match response.data {
232 SrsClientRespData::Vhosts { vhosts } => Ok(vhosts),
233 _ => Err(SrsClientError::UnexpectedResponse("vhosts")),
234 }
235 }
236
237 pub async fn get_vhost_item<T: Into<String>>(
244 self,
245 id: T,
246 ) -> Result<Option<Vhost>, SrsClientError> {
247 let response = self.get_vhost(id).await?;
248 match response.data {
249 SrsClientRespData::Vhost { vhost } => Ok(Some(vhost)),
250 _ => Err(SrsClientError::UnexpectedResponse("vhost")),
251 }
252 }
253
254 pub async fn get_streams(self) -> Result<SrsClientResp, SrsClientError> {
261 let resp = self.get("streams").await?;
262 self.process_resp(resp).await
263 }
264
265 pub async fn get_streams_page(
272 self,
273 start: i64,
274 count: i64,
275 ) -> Result<SrsClientResp, SrsClientError> {
276 let resp = self
277 .get(&format!("streams?start={start}&count={count}"))
278 .await?;
279 self.process_resp(resp).await
280 }
281
282 pub async fn get_stream<T: Into<String>>(self, id: T) -> Result<SrsClientResp, SrsClientError> {
289 let resp = self.get(&format!("streams/{}", id.into())).await?;
290 self.process_resp(resp).await
291 }
292
293 pub async fn get_stream_list(self) -> Result<Vec<Stream>, SrsClientError> {
300 let response = self.get_streams().await?;
301 match response.data {
302 SrsClientRespData::Streams { streams } => Ok(streams),
303 _ => Err(SrsClientError::UnexpectedResponse("streams")),
304 }
305 }
306
307 pub async fn get_stream_page_list(
314 self,
315 start: i64,
316 count: i64,
317 ) -> Result<Vec<Stream>, SrsClientError> {
318 let response = self.get_streams_page(start, count).await?;
319 match response.data {
320 SrsClientRespData::Streams { streams } => Ok(streams),
321 _ => Err(SrsClientError::UnexpectedResponse("streams page")),
322 }
323 }
324
325 pub async fn get_stream_item<T: Into<String>>(
332 self,
333 id: T,
334 ) -> Result<Option<Stream>, SrsClientError> {
335 let response = self.get_stream(id).await?;
336 match response.data {
337 SrsClientRespData::Stream { stream } => Ok(Some(stream)),
338 _ => Err(SrsClientError::UnexpectedResponse("stream")),
339 }
340 }
341
342 pub async fn get_clients(self) -> Result<SrsClientResp, SrsClientError> {
349 let resp = self.get("clients").await?;
350 self.process_resp(resp).await
351 }
352
353 pub async fn get_clients_page(
360 self,
361 start: i64,
362 count: i64,
363 ) -> Result<SrsClientResp, SrsClientError> {
364 let resp = self
365 .get(&format!("clients?start={start}&count={count}"))
366 .await?;
367 self.process_resp(resp).await
368 }
369
370 pub async fn get_client<T: Into<String>>(self, id: T) -> Result<SrsClientResp, SrsClientError> {
377 let resp = self.get(&format!("clients/{}", id.into())).await?;
378 self.process_resp(resp).await
379 }
380
381 pub async fn get_client_list(self) -> Result<Vec<Client>, SrsClientError> {
388 let response = self.get_clients().await?;
389 match response.data {
390 SrsClientRespData::Clients { clients } => Ok(clients),
391 _ => Err(SrsClientError::UnexpectedResponse("clients")),
392 }
393 }
394
395 pub async fn get_client_page_list(
402 self,
403 start: i64,
404 count: i64,
405 ) -> Result<Vec<Client>, SrsClientError> {
406 let response = self.get_clients_page(start, count).await?;
407 match response.data {
408 SrsClientRespData::Clients { clients } => Ok(clients),
409 _ => Err(SrsClientError::UnexpectedResponse("clients page")),
410 }
411 }
412
413 pub async fn get_client_item<T: Into<String>>(
420 self,
421 id: T,
422 ) -> Result<Option<Client>, SrsClientError> {
423 let response = self.get_client(id).await?;
424 match response.data {
425 SrsClientRespData::Client { client } => Ok(Some(client)),
426 _ => Err(SrsClientError::UnexpectedResponse("client")),
427 }
428 }
429
430 pub async fn get_features(self) -> Result<SrsClientResp, SrsClientError> {
437 let resp = self.get("features").await?;
438 self.process_resp(resp).await
439 }
440
441 pub async fn get_rusages(self) -> Result<SrsClientResp, SrsClientError> {
448 let resp = self.get("rusages").await?;
449 self.process_resp(resp).await
450 }
451
452 pub async fn get_self_proc_stats(self) -> Result<SrsClientResp, SrsClientError> {
459 let resp = self.get("self_proc_stats").await?;
460 self.process_resp(resp).await
461 }
462
463 pub async fn get_system_proc_stats(self) -> Result<SrsClientResp, SrsClientError> {
470 let resp = self.get("system_proc_stats").await?;
471 self.process_resp(resp).await
472 }
473
474 pub async fn get_meminfos(self) -> Result<SrsClientResp, SrsClientError> {
481 let resp = self.get("meminfos").await?;
482 self.process_resp(resp).await
483 }
484}