medea_control_api_proto/callback.rs
1//! API for receiving callbacks from a media server.
2
3use async_trait::async_trait;
4use derive_more::with_trait::From;
5use time::OffsetDateTime as DateTime;
6
7use crate::Fid;
8
9/// API for receiving callbacks from a media server.
10///
11/// Both API client and API server should implement this trait.
12#[async_trait]
13pub trait Api {
14 /// Error returned by this [`CallbackApi`].
15 ///
16 /// [`CallbackApi`]: Api
17 type Error;
18
19 /// Fires when a certain callback [`Event`] happens on a media server.
20 async fn on_event(&self, request: Request) -> Result<(), Self::Error>;
21}
22
23/// Request with a fired callback [`Event`] and its meta information.
24///
25/// Used for invoking and processing callbacks via [`CallbackApi::on_event()`].
26///
27/// [`CallbackApi::on_event()`]: Api::on_event
28#[derive(Debug)]
29pub struct Request {
30 /// FID (Full ID) of the media [`Element`], the occurred [`Event`] is
31 /// related to.
32 ///
33 /// [`Element`]: crate::Element
34 pub fid: Fid,
35
36 /// Occurred [`Event`].
37 pub event: Event,
38
39 /// [`DateTime`] when the [`Event`] occurred.
40 pub at: DateTime,
41}
42
43/// Possible callbacks events which may happen on a media server.
44#[derive(Clone, Copy, Debug, From)]
45pub enum Event {
46 /// [`Member`] joined a [`Room`].
47 ///
48 /// [`Member`]: crate::Member
49 /// [`Room`]: crate::Room
50 OnJoin(OnJoinEvent),
51
52 /// [`Member`] left its [`Room`].
53 ///
54 /// [`Member`]: crate::Member
55 /// [`Room`]: crate::Room
56 OnLeave(OnLeaveEvent),
57}
58
59/// [`Event`] notifying about a [`Member`] joining a [`Room`].
60///
61/// [`Member`]: crate::Member
62/// [`Room`]: crate::Room
63#[derive(Clone, Copy, Debug)]
64pub struct OnJoinEvent;
65
66/// [`Event`] notifying about a [`Member`] leaving its [`Room`].
67///
68/// [`Member`]: crate::Member
69/// [`Room`]: crate::Room
70#[derive(Clone, Copy, Debug)]
71pub struct OnLeaveEvent {
72 /// Reason of why the [`Member`] leaves.
73 ///
74 /// [`Member`]: crate::Member
75 pub reason: OnLeaveReason,
76}
77
78impl OnLeaveEvent {
79 /// Creates a new [`OnLeaveEvent`] with the provided [`OnLeaveReason`].
80 #[must_use]
81 pub const fn new(reason: OnLeaveReason) -> Self {
82 Self { reason }
83 }
84}
85
86/// Possible reasons of why a [`Member`] leaves its [`Room`].
87///
88/// [`Member`]: crate::Member
89/// [`Room`]: crate::Room
90#[derive(Clone, Copy, Debug)]
91pub enum OnLeaveReason {
92 /// [`Member`] was disconnected normally.
93 ///
94 /// [`Member`]: crate::Member
95 Disconnected,
96
97 /// Connection with the [`Member`] was lost.
98 ///
99 /// [`Member`]: crate::Member
100 Lost,
101
102 /// [`Member`] was forcibly disconnected by a media server.
103 ///
104 /// [`Member`]: crate::Member
105 Kicked,
106
107 /// Media server was shut down.
108 Shutdown,
109}