(
&self,
options: &EngineOptions,
frontend: Option<Arc<dyn Frontend>>,
dcm: &Option<Arc<DeviceConfigurationManager>>,
)
| 137 | } |
| 138 | |
| 139 | pub async fn run( |
| 140 | &self, |
| 141 | options: &EngineOptions, |
| 142 | frontend: Option<Arc<dyn Frontend>>, |
| 143 | dcm: &Option<Arc<DeviceConfigurationManager>>, |
| 144 | ) -> Result<(), IntifaceEngineError> { |
| 145 | // Set up Frontend |
| 146 | if let Some(frontend) = &frontend { |
| 147 | let frontend_loop = frontend_external_event_loop(frontend.clone(), self.stop_token.clone()); |
| 148 | tokio::spawn(async move { |
| 149 | frontend_loop.await; |
| 150 | }); |
| 151 | |
| 152 | frontend.connect().await.unwrap(); |
| 153 | frontend.send(EngineMessage::EngineStarted {}).await; |
| 154 | } |
| 155 | |
| 156 | let mdns_service_metadata = |
| 157 | if options.broadcast_server_mdns() && options.websocket_port().is_some() { |
| 158 | Some(Arc::new(IntifaceMdnsServiceMetadata::new( |
| 159 | options.mdns_suffix().as_deref(), |
| 160 | ))) |
| 161 | } else { |
| 162 | None |
| 163 | }; |
| 164 | let mdns_publisher = Arc::new(Mutex::new(None::<IntifaceMdns>)); |
| 165 | let engine_server_created_sent = Arc::new(AtomicBool::new(false)); |
| 166 | let on_listener_bound = mdns_service_metadata.as_ref().map(|metadata| { |
| 167 | let metadata = Arc::clone(metadata); |
| 168 | let frontend = frontend.clone(); |
| 169 | let mdns_publisher = Arc::clone(&mdns_publisher); |
| 170 | let engine_server_created_sent = Arc::clone(&engine_server_created_sent); |
| 171 | Arc::new(move |port: u16| { |
| 172 | if !engine_server_created_sent.swap(true, Ordering::SeqCst) { |
| 173 | let metadata = Arc::clone(&metadata); |
| 174 | let frontend = frontend.clone(); |
| 175 | tokio::spawn(async move { |
| 176 | send_engine_server_created(frontend.as_ref(), Some(metadata.as_ref()), Some(port)) |
| 177 | .await; |
| 178 | }); |
| 179 | } |
| 180 | #[cfg(target_os = "ios")] |
| 181 | info!("Skipping Rust mDNS publisher on iOS; host app is expected to publish Bonjour"); |
| 182 | #[cfg(not(target_os = "ios"))] |
| 183 | { |
| 184 | let mut publisher = mdns_publisher.lock().unwrap(); |
| 185 | if publisher.is_none() { |
| 186 | *publisher = IntifaceMdns::new(metadata.as_ref(), port); |
| 187 | } |
| 188 | } |
| 189 | }) as Arc<dyn Fn(u16) + Send + Sync> |
| 190 | }); |
| 191 | |
| 192 | // Set up Repeater (if in repeater mode) |
| 193 | if options.repeater_mode() { |
| 194 | info!("Starting repeater"); |
| 195 | |
| 196 | let repeater = ButtplugRepeater::new( |
nothing calls this directly
no test coverage detected