use crate::common::MessageParser;
use crate::server::connection::ConnectionManager;
use crate::server::events::{ServerMessageWrapper, observer::ConnectionHandlerObserverAdapter};
use crate::transport::events::ConnectionObserver;
use std::sync::Arc;
use tracing::error;
pub struct ServerCoreRef {
pub device_manager: Option<Arc<crate::server::device::DeviceManager>>,
pub event_handler: Option<Arc<dyn crate::server::events::handler::ServerEventHandler>>,
}
pub trait ServerMessageObserverFactory: Send + Sync {
fn create_observer(
&self,
manager: Arc<ConnectionManager>,
parser: MessageParser,
event_handler: Arc<dyn crate::server::events::handler::ServerEventHandler>,
connection_id: String,
core_ref: Arc<ServerCoreRef>,
core: Arc<crate::server::transports::server_core::ServerCore>,
) -> Arc<dyn ConnectionObserver>;
}
pub struct DefaultServerMessageObserverFactory {
device_manager: Option<Arc<crate::server::device::DeviceManager>>,
event_handler: Option<Arc<dyn crate::server::events::handler::ServerEventHandler>>,
}
impl DefaultServerMessageObserverFactory {
pub fn new() -> Self {
Self {
device_manager: None,
event_handler: None,
}
}
pub fn with_device_manager(
mut self,
device_manager: Option<Arc<crate::server::device::DeviceManager>>,
) -> Self {
self.device_manager = device_manager;
self
}
pub fn with_event_handler(
mut self,
event_handler: Option<Arc<dyn crate::server::events::handler::ServerEventHandler>>,
) -> Self {
self.event_handler = event_handler;
self
}
}
impl Default for DefaultServerMessageObserverFactory {
fn default() -> Self {
Self::new()
}
}
impl ServerMessageObserverFactory for DefaultServerMessageObserverFactory {
fn create_observer(
&self,
manager: Arc<ConnectionManager>,
parser: MessageParser,
event_handler: Arc<dyn crate::server::events::handler::ServerEventHandler>,
connection_id: String,
core_ref: Arc<ServerCoreRef>,
_core: Arc<crate::server::transports::server_core::ServerCore>,
) -> Arc<dyn ConnectionObserver> {
let device_manager = self
.device_manager
.clone()
.or_else(|| core_ref.device_manager.clone());
let event_handler = Some(event_handler)
.or_else(|| self.event_handler.clone())
.or_else(|| core_ref.event_handler.clone())
.ok_or_else(|| {
error!("[DefaultServerMessageObserverFactory] ServerEventHandler is required but not provided");
"ServerEventHandler is required"
})
.expect("ServerEventHandler is required");
let wrapper = Arc::new(ServerMessageWrapper::new(
event_handler,
Some(Arc::clone(&manager)),
device_manager,
parser.clone(), ));
Arc::new(ConnectionHandlerObserverAdapter::new(
wrapper,
connection_id,
manager,
Some(_core),
))
}
}
pub struct ChainedObserverFactory {
factories: Vec<Arc<dyn ServerMessageObserverFactory>>,
}
impl ChainedObserverFactory {
pub fn new() -> Self {
Self {
factories: Vec::new(),
}
}
pub fn add_factory(mut self, factory: Arc<dyn ServerMessageObserverFactory>) -> Self {
self.factories.push(factory);
self
}
}
impl Default for ChainedObserverFactory {
fn default() -> Self {
Self::new()
}
}
impl ServerMessageObserverFactory for ChainedObserverFactory {
fn create_observer(
&self,
manager: Arc<ConnectionManager>,
parser: MessageParser,
event_handler: Arc<dyn crate::server::events::handler::ServerEventHandler>,
connection_id: String,
core_ref: Arc<ServerCoreRef>,
core: Arc<crate::server::transports::server_core::ServerCore>,
) -> Arc<dyn ConnectionObserver> {
if self.factories.len() == 1 {
return self.factories[0].create_observer(
manager,
parser,
event_handler,
connection_id,
core_ref,
core,
);
}
let observers: Vec<Arc<dyn ConnectionObserver>> = self
.factories
.iter()
.map(|factory| {
factory.create_observer(
Arc::clone(&manager),
parser.clone(),
Arc::clone(&event_handler),
connection_id.clone(),
Arc::clone(&core_ref),
Arc::clone(&core),
)
})
.collect();
Arc::new(ChainedObserver { observers })
}
}
struct ChainedObserver {
observers: Vec<Arc<dyn ConnectionObserver>>,
}
impl crate::transport::events::ConnectionObserver for ChainedObserver {
fn on_event(&self, event: &crate::transport::events::ConnectionEvent) {
for observer in &self.observers {
observer.on_event(event);
}
}
}