1
0
mirror of https://gitlab.com/comunic/comunicapiv3 synced 2024-11-30 01:06:27 +00:00

Send calls configuration to RTC relay

This commit is contained in:
Pierre HUBERT 2021-02-08 18:00:03 +01:00
parent 9d67565517
commit a2b2fc89cf
2 changed files with 79 additions and 1 deletions

View File

@ -2,15 +2,68 @@
//! //!
//! @author Pierre Hubert //! @author Pierre Hubert
use actix::{ActorContext, StreamHandler}; use actix::{ActorContext, Addr, AsyncContext, Handler, StreamHandler};
use actix::prelude::*;
use actix_web_actors::ws::{Message, ProtocolError}; use actix_web_actors::ws::{Message, ProtocolError};
use serde::Serialize;
use crate::data::config::conf; use crate::data::config::conf;
use crate::helpers::events_helper;
use crate::helpers::events_helper::Event;
struct RtcRelayActor {} struct RtcRelayActor {}
#[derive(Message)]
#[rtype(result = "()")]
enum RTCMessages {
CLOSE
}
#[allow(non_snake_case)]
#[derive(Serialize)]
struct CallsConfig {
allowVideo: bool,
iceServers: Vec<String>,
}
#[derive(Serialize)]
struct CallsConfigWrapper {
title: String,
data: CallsConfig,
}
/// Current WebSocket connection
static mut ACTIVE_RTC_CONNECTION: Option<Addr<RtcRelayActor>> = None;
impl actix::Actor for RtcRelayActor { impl actix::Actor for RtcRelayActor {
type Context = actix_web_actors::ws::WebsocketContext<Self>; type Context = actix_web_actors::ws::WebsocketContext<Self>;
fn started(&mut self, ctx: &mut Self::Context) {
// Replace known address of actor
unsafe {
ACTIVE_RTC_CONNECTION = Some(ctx.address());
}
println!("Started new WebSocket connection to RTC relay!");
// Send calls configuration to server
ctx.text(serde_json::to_string(&CallsConfigWrapper {
title: "config".to_string(),
data: CallsConfig {
allowVideo: conf().rtc_relay.as_ref().unwrap().allow_video,
iceServers: conf().rtc_relay.as_ref().unwrap().ice_servers.clone(),
},
}).unwrap())
}
fn stopped(&mut self, _ctx: &mut Self::Context) {
println!("Closed connection to RTC relay.");
// Propagate information
if let Err(e) = events_helper::propagate_event(&Event::ClosedRTCRelayWebSocket) {
eprintln!("Failed to propagate rtc closed event! {:#?}", e);
}
}
} }
impl StreamHandler<Result<actix_web_actors::ws::Message, actix_web_actors::ws::ProtocolError>> for RtcRelayActor { impl StreamHandler<Result<actix_web_actors::ws::Message, actix_web_actors::ws::ProtocolError>> for RtcRelayActor {
@ -29,6 +82,23 @@ impl StreamHandler<Result<actix_web_actors::ws::Message, actix_web_actors::ws::P
} }
} }
impl Handler<RTCMessages> for RtcRelayActor {
type Result = ();
fn handle(&mut self, _msg: RTCMessages, ctx: &mut Self::Context) -> Self::Result {
ctx.close(None)
}
}
/// Get current actix connection
fn get_active_connection() -> Option<Addr<RtcRelayActor>> {
let conn;
unsafe {
conn = ACTIVE_RTC_CONNECTION.clone();
}
conn
}
/// Establish a new connection with the RTC relay /// Establish a new connection with the RTC relay
/// ///
/// Debug with /// Debug with
@ -63,6 +133,11 @@ pub async fn open_ws(req: actix_web::HttpRequest,
return Ok(actix_web::HttpResponse::Unauthorized().body("Invalid token!")); return Ok(actix_web::HttpResponse::Unauthorized().body("Invalid token!"));
} }
// Close previous connection (if any)
if let Some(conn) = get_active_connection() {
conn.do_send(RTCMessages::CLOSE);
}
// Start the actor // Start the actor
actix_web_actors::ws::start(RtcRelayActor {}, &req, stream) actix_web_actors::ws::start(RtcRelayActor {}, &req, stream)
} }

View File

@ -39,6 +39,9 @@ pub enum Event<'a> {
/// Deleted a comment /// Deleted a comment
DeletedComment(&'a Comment), DeletedComment(&'a Comment),
/// Connection to RTC relay was closed
ClosedRTCRelayWebSocket,
/// No event /// No event
None, None,
} }