stream_sender.rs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. use crate::entities::ObservableSubject;
  2. use bytes::Bytes;
  3. use lazy_static::lazy_static;
  4. use std::{convert::TryInto, sync::RwLock};
  5. lazy_static! {
  6. static ref R2F_STREAM_SENDER: RwLock<RustStreamSender> = RwLock::new(RustStreamSender::new());
  7. }
  8. pub struct RustStreamSender {
  9. #[allow(dead_code)]
  10. isolate: Option<allo_isolate::Isolate>,
  11. }
  12. impl RustStreamSender {
  13. fn new() -> Self { Self { isolate: None } }
  14. fn inner_set_port(&mut self, port: i64) {
  15. log::info!("Setup rust to flutter stream with port {}", port);
  16. self.isolate = Some(allo_isolate::Isolate::new(port));
  17. }
  18. #[allow(dead_code)]
  19. fn inner_post(&self, observable_subject: ObservableSubject) -> Result<(), String> {
  20. match self.isolate {
  21. Some(ref isolate) => {
  22. let bytes: Bytes = observable_subject.try_into().unwrap();
  23. isolate.post(bytes.to_vec());
  24. Ok(())
  25. },
  26. None => Err("Isolate is not set".to_owned()),
  27. }
  28. }
  29. pub fn set_port(port: i64) {
  30. match R2F_STREAM_SENDER.write() {
  31. Ok(mut stream) => stream.inner_set_port(port),
  32. Err(e) => {
  33. let msg = format!("Get rust to flutter stream lock fail. {:?}", e);
  34. log::error!("{:?}", msg);
  35. },
  36. }
  37. }
  38. pub fn post(_observable_subject: ObservableSubject) -> Result<(), String> {
  39. #[cfg(feature = "dart")]
  40. match R2F_STREAM_SENDER.read() {
  41. Ok(stream) => stream.inner_post(_observable_subject),
  42. Err(e) => Err(format!("Get rust to flutter stream lock fail. {:?}", e)),
  43. }
  44. #[cfg(not(feature = "dart"))]
  45. Ok(())
  46. }
  47. }