skyway_webrtc_gateway_api/peer/
mod.rs1pub(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
16pub 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
36pub 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
54pub 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
117pub 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
127pub 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#[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}