flare_core/server/events/
factory.rs1use crate::common::MessageParser;
6use crate::server::connection::ConnectionManager;
7use crate::server::events::{ServerMessageWrapper, observer::ConnectionHandlerObserverAdapter};
8use crate::transport::events::ConnectionObserver;
9use std::sync::Arc;
10use tracing::error;
11
12pub struct ServerCoreRef {
16 pub device_manager: Option<Arc<crate::server::device::DeviceManager>>,
17 pub event_handler: Option<Arc<dyn crate::server::events::handler::ServerEventHandler>>,
18}
19
20pub trait ServerMessageObserverFactory: Send + Sync {
51 fn create_observer(
64 &self,
65 manager: Arc<ConnectionManager>,
66 parser: MessageParser,
67 event_handler: Arc<dyn crate::server::events::handler::ServerEventHandler>,
68 connection_id: String,
69 core_ref: Arc<ServerCoreRef>,
70 core: Arc<crate::server::transports::server_core::ServerCore>,
71 ) -> Arc<dyn ConnectionObserver>;
72}
73
74pub struct DefaultServerMessageObserverFactory {
91 device_manager: Option<Arc<crate::server::device::DeviceManager>>,
93 event_handler: Option<Arc<dyn crate::server::events::handler::ServerEventHandler>>,
95}
96
97impl DefaultServerMessageObserverFactory {
98 pub fn new() -> Self {
100 Self {
101 device_manager: None,
102 event_handler: None,
103 }
104 }
105
106 pub fn with_device_manager(
108 mut self,
109 device_manager: Option<Arc<crate::server::device::DeviceManager>>,
110 ) -> Self {
111 self.device_manager = device_manager;
112 self
113 }
114
115 pub fn with_event_handler(
117 mut self,
118 event_handler: Option<Arc<dyn crate::server::events::handler::ServerEventHandler>>,
119 ) -> Self {
120 self.event_handler = event_handler;
121 self
122 }
123}
124
125impl Default for DefaultServerMessageObserverFactory {
126 fn default() -> Self {
127 Self::new()
128 }
129}
130
131impl ServerMessageObserverFactory for DefaultServerMessageObserverFactory {
133 fn create_observer(
134 &self,
135 manager: Arc<ConnectionManager>,
136 parser: MessageParser,
137 event_handler: Arc<dyn crate::server::events::handler::ServerEventHandler>,
138 connection_id: String,
139 core_ref: Arc<ServerCoreRef>,
140 _core: Arc<crate::server::transports::server_core::ServerCore>,
141 ) -> Arc<dyn ConnectionObserver> {
142 let device_manager = self
144 .device_manager
145 .clone()
146 .or_else(|| core_ref.device_manager.clone());
147
148 let event_handler = Some(event_handler)
150 .or_else(|| self.event_handler.clone())
151 .or_else(|| core_ref.event_handler.clone())
152 .ok_or_else(|| {
153 error!("[DefaultServerMessageObserverFactory] ServerEventHandler is required but not provided");
154 "ServerEventHandler is required"
155 })
156 .expect("ServerEventHandler is required");
157
158 let wrapper = Arc::new(ServerMessageWrapper::new(
160 event_handler,
161 Some(Arc::clone(&manager)),
162 device_manager,
163 parser.clone(), ));
165
166 Arc::new(ConnectionHandlerObserverAdapter::new(
169 wrapper,
170 connection_id,
171 manager,
172 Some(_core),
173 ))
174 }
175}
176
177pub struct ChainedObserverFactory {
198 factories: Vec<Arc<dyn ServerMessageObserverFactory>>,
199}
200
201impl ChainedObserverFactory {
202 pub fn new() -> Self {
204 Self {
205 factories: Vec::new(),
206 }
207 }
208
209 pub fn add_factory(mut self, factory: Arc<dyn ServerMessageObserverFactory>) -> Self {
211 self.factories.push(factory);
212 self
213 }
214}
215
216impl Default for ChainedObserverFactory {
217 fn default() -> Self {
218 Self::new()
219 }
220}
221
222impl ServerMessageObserverFactory for ChainedObserverFactory {
223 fn create_observer(
224 &self,
225 manager: Arc<ConnectionManager>,
226 parser: MessageParser,
227 event_handler: Arc<dyn crate::server::events::handler::ServerEventHandler>,
228 connection_id: String,
229 core_ref: Arc<ServerCoreRef>,
230 core: Arc<crate::server::transports::server_core::ServerCore>,
231 ) -> Arc<dyn ConnectionObserver> {
232 if self.factories.len() == 1 {
234 return self.factories[0].create_observer(
235 manager,
236 parser,
237 event_handler,
238 connection_id,
239 core_ref,
240 core,
241 );
242 }
243
244 let observers: Vec<Arc<dyn ConnectionObserver>> = self
246 .factories
247 .iter()
248 .map(|factory| {
249 factory.create_observer(
250 Arc::clone(&manager),
251 parser.clone(),
252 Arc::clone(&event_handler),
253 connection_id.clone(),
254 Arc::clone(&core_ref),
255 Arc::clone(&core),
256 )
257 })
258 .collect();
259
260 Arc::new(ChainedObserver { observers })
262 }
263}
264
265struct ChainedObserver {
269 observers: Vec<Arc<dyn ConnectionObserver>>,
270}
271
272impl crate::transport::events::ConnectionObserver for ChainedObserver {
273 fn on_event(&self, event: &crate::transport::events::ConnectionEvent) {
274 for observer in &self.observers {
275 observer.on_event(event);
276 }
277 }
278}