skyway_webrtc_gateway_api/peer/
mod.rs

1/// Functions in this module are responsible for concealing the raw APIs
2pub(crate) mod api;
3pub(crate) mod formats;
4
5use futures::channel::mpsc;
6use futures::*;
7use serde::{Deserialize, Serialize};
8
9use crate::error;
10use crate::peer::formats::EventEnum;
11pub use formats::{
12    CreatePeerQuery, CreatedResponse, PeerCallEvent, PeerCloseEvent, PeerConnectionEvent,
13    PeerErrorEvent, PeerId, PeerInfo, PeerOpenEvent, PeerStatusMessage, Token,
14};
15
16/// Request to create Peer.
17///
18/// It's bindings for POST /peers
19///
20/// [API](http://35.200.46.204/#/1.peers/peer)
21///
22/// Notice: This api call does not guarantee that WebRTC Gateway creates a Peer Object successfully.
23/// You need to wait OPEN event
24/// This function returns PeerInfo just for starting receiving events
25pub async fn create<'a>(
26    api_key: impl Into<String>,
27    domain: impl Into<String>,
28    peer_id: PeerId,
29    turn: bool,
30) -> Result<PeerInfo, error::Error> {
31    let base_url = crate::base_url();
32    let result = api::create_peer(base_url, api_key, domain, peer_id, turn).await?;
33    Ok(result.params)
34}
35
36/// Listen an event of a Peer Object.
37///
38/// It's bindings for GET /peers/{peer_id}/events
39///
40/// [API](http://35.200.46.204/#/1.peers/peer_event)
41pub async fn event<'a>(peer_info: PeerInfo) -> Result<PeerEventEnum, error::Error> {
42    let base_url = crate::base_url();
43    let event = api::event(base_url, &peer_info).await?;
44    Ok(match event {
45        EventEnum::TIMEOUT => PeerEventEnum::TIMEOUT,
46        EventEnum::CLOSE(event) => PeerEventEnum::CLOSE(event),
47        EventEnum::OPEN(event) => PeerEventEnum::OPEN(event),
48        EventEnum::CONNECTION(event) => PeerEventEnum::CONNECTION(event),
49        EventEnum::CALL(event) => PeerEventEnum::CALL(event),
50        EventEnum::ERROR(event) => PeerEventEnum::ERROR(event),
51    })
52}
53
54/// Listen events of a Peer Object.
55///
56/// It's bindings for GET /peers/{peer_id}/events
57///
58/// [API](http://35.200.46.204/#/1.peers/peer_event)
59///
60/// This function need to repeat long-polling to WebRTC Gateway's peer event API.
61/// When the API returns TIMEOUT events, this function ignore them and keep listening events.
62/// It keep listening events till receiving CLOSE event or HTTP Error Codes.
63pub async fn listen_events<'a>(
64    peer_info: PeerInfo,
65    mut event_sender: mpsc::Sender<PeerEventEnum>,
66) -> Result<(), error::Error> {
67    let base_url = crate::base_url();
68    loop {
69        let result = api::event(base_url, &peer_info).await?;
70
71        match result {
72            EventEnum::TIMEOUT => {}
73            EventEnum::CLOSE(event) => {
74                if event_sender
75                    .send(PeerEventEnum::CLOSE(event))
76                    .await
77                    .is_err()
78                {
79                    return Err(error::Error::create_local_error("peer_create_and_listen_events send OPEN event, but observer doesn't receive i, but observer doesn't receive it."));
80                };
81                event_sender.close_channel();
82                break;
83            }
84            EventEnum::OPEN(event) => {
85                if event_sender.send(PeerEventEnum::OPEN(event)).await.is_err() {
86                    return Err(error::Error::create_local_error("peer_create_and_listen_events send OPEN event, but observer doesn't receive i, but observer doesn't receive it."));
87                };
88            }
89            EventEnum::CONNECTION(event) => {
90                if event_sender
91                    .send(PeerEventEnum::CONNECTION(event))
92                    .await
93                    .is_err()
94                {
95                    return Err(error::Error::create_local_error("peer_create_and_listen_events send OPEN event, but observer doesn't receive i, but observer doesn't receive it."));
96                };
97            }
98            EventEnum::CALL(event) => {
99                if event_sender.send(PeerEventEnum::CALL(event)).await.is_err() {
100                    return Err(error::Error::create_local_error("peer_create_and_listen_events send OPEN event, but observer doesn't receive i, but observer doesn't receive it."));
101                };
102            }
103            EventEnum::ERROR(event) => {
104                if event_sender
105                    .send(PeerEventEnum::ERROR(event))
106                    .await
107                    .is_err()
108                {
109                    return Err(error::Error::create_local_error("peer_create_and_listen_events send OPEN event, but observer doesn't receive i, but observer doesn't receive it."));
110                };
111            }
112        }
113    }
114    Ok(())
115}
116
117/// Release PeerObject
118///
119/// It's bindings for DELETE /peers/{peer_id}
120///
121/// [API](http://35.200.46.204/#/1.peers/peer_destroy)
122pub async fn delete(peer_info: &PeerInfo) -> Result<(), error::Error> {
123    let base_url = crate::base_url();
124    api::delete_peer(base_url, peer_info).await
125}
126
127/// Get status of PeerObject
128///
129/// It's bindings for GET /peers/{peer_id}/status
130///
131/// [API](http://35.200.46.204/#/1.peers/peer_status)
132pub async fn status(peer_info: &PeerInfo) -> Result<formats::PeerStatusMessage, error::Error> {
133    let base_url = crate::base_url();
134    api::status(base_url, peer_info).await
135}
136
137/// Response from GET /peers/{peer_id}/events
138///
139/// [API](http://35.200.46.204/#/1.peers/peer_event)
140#[derive(Serialize, Deserialize, Debug, Clone, PartialOrd, PartialEq)]
141#[serde(tag = "event")]
142pub enum PeerEventEnum {
143    OPEN(PeerOpenEvent),
144    CLOSE(PeerCloseEvent),
145    CONNECTION(PeerConnectionEvent),
146    CALL(PeerCallEvent),
147    ERROR(PeerErrorEvent),
148    TIMEOUT,
149}