diff --git a/flutter/lib/plugin/widget.dart b/flutter/lib/plugin/widget.dart index 69a3abda3..f624a0727 100644 --- a/flutter/lib/plugin/widget.dart +++ b/flutter/lib/plugin/widget.dart @@ -260,10 +260,15 @@ class PluginItem extends StatelessWidget { String? _getOption(OptionModel model, String key) { var v = model.value; if (v == null) { - if (peerId.isEmpty) { - v = bind.pluginGetSharedOption(id: pluginId, key: key); - } else { - v = bind.pluginGetSessionOption(id: pluginId, peer: peerId, key: key); + try { + if (peerId.isEmpty) { + v = bind.pluginGetSharedOption(id: pluginId, key: key); + } else { + v = bind.pluginGetSessionOption(id: pluginId, peer: peerId, key: key); + } + } catch (e) { + debugPrint('Failed to get option "$key", $e'); + v = null; } } return v; diff --git a/src/client/io_loop.rs b/src/client/io_loop.rs index 25a049c87..70558fbd4 100644 --- a/src/client/io_loop.rs +++ b/src/client/io_loop.rs @@ -965,10 +965,12 @@ impl Remote { // on connection established client #[cfg(all(feature = "flutter", feature = "plugin_framework"))] #[cfg(not(any(target_os = "android", target_os = "ios")))] - crate::plugin::handle_listen_event( - crate::plugin::EVENT_ON_CONN_CLIENT, - &self.handler.id, - ); + { + crate::plugin::handle_listen_event( + crate::plugin::EVENT_ON_CONN_CLIENT.to_owned(), + self.handler.id.clone(), + ) + } } if self.handler.is_file_transfer() { diff --git a/src/plugin/plugins.rs b/src/plugin/plugins.rs index e0918defb..39b53649d 100644 --- a/src/plugin/plugins.rs +++ b/src/plugin/plugins.rs @@ -422,8 +422,7 @@ pub fn handle_server_event(id: &str, peer: &str, event: &[u8]) -> ResultType<()> handle_event(METHOD_HANDLE_PEER, id, peer, event) } -#[inline] -pub fn handle_listen_event(event: &str, peer: &str) { +fn _handle_listen_event(event: String, peer: String) { let mut plugins = Vec::new(); for info in PLUGIN_INFO.read().unwrap().values() { if info.desc.listen_events().contains(&event.to_string()) { @@ -435,9 +434,7 @@ pub fn handle_listen_event(event: &str, peer: &str) { return; } - if let Ok(mut evt) = serde_json::to_string(&MsgListenEvent { - event: event.to_string(), - }) { + if let Ok(mut evt) = serde_json::to_string(&MsgListenEvent { event }) { let mut evt_bytes = evt.as_bytes().to_vec(); evt_bytes.push(0); let mut peer: String = peer.to_owned(); @@ -471,6 +468,11 @@ pub fn handle_listen_event(event: &str, peer: &str) { } } +#[inline] +pub fn handle_listen_event(event: String, peer: String) { + std::thread::spawn(|| _handle_listen_event(event, peer)); +} + #[inline] pub fn handle_client_event(id: &str, peer: &str, event: &[u8]) -> Message { let mut peer: String = peer.to_owned(); diff --git a/src/server/connection.rs b/src/server/connection.rs index 4e33c79bd..d88472bec 100644 --- a/src/server/connection.rs +++ b/src/server/connection.rs @@ -565,10 +565,12 @@ impl Connection { } #[cfg(all(feature = "flutter", feature = "plugin_framework"))] #[cfg(not(any(target_os = "android", target_os = "ios")))] - crate::plugin::handle_listen_event( - crate::plugin::EVENT_ON_CONN_CLOSE_SERVER, - &conn.lr.my_id, - ); + { + crate::plugin::handle_listen_event( + crate::plugin::EVENT_ON_CONN_CLOSE_SERVER.to_owned(), + conn.lr.my_id.clone(), + ); + } video_service::notify_video_frame_fetched(id, None); scrap::codec::Encoder::update(id, scrap::codec::EncodingUpdate::Remove); video_service::VIDEO_QOS.lock().unwrap().reset();