56 lines
1.7 KiB
Rust
Raw Normal View History

2021-10-14 14:34:22 +08:00
use crate::entities::SubscribeObject;
2021-08-20 22:00:03 +08:00
use bytes::Bytes;
2021-07-21 15:43:05 +08:00
use lazy_static::lazy_static;
use std::{convert::TryInto, sync::RwLock};
lazy_static! {
2021-10-05 11:46:56 +08:00
static ref DART_STREAM_SENDER: RwLock<DartStreamSender> = RwLock::new(DartStreamSender::new());
2021-07-21 15:43:05 +08:00
}
2021-10-05 11:46:56 +08:00
pub struct DartStreamSender {
#[allow(dead_code)]
2021-07-21 15:43:05 +08:00
isolate: Option<allo_isolate::Isolate>,
}
2021-10-05 11:46:56 +08:00
impl DartStreamSender {
2021-07-21 15:43:05 +08:00
fn new() -> Self { Self { isolate: None } }
fn inner_set_port(&mut self, port: i64) {
2021-07-21 22:41:44 +08:00
log::info!("Setup rust to flutter stream with port {}", port);
2021-07-21 15:43:05 +08:00
self.isolate = Some(allo_isolate::Isolate::new(port));
}
#[allow(dead_code)]
2021-10-14 14:34:22 +08:00
fn inner_post(&self, observable_subject: SubscribeObject) -> Result<(), String> {
2021-07-21 15:43:05 +08:00
match self.isolate {
Some(ref isolate) => {
2021-08-20 22:00:03 +08:00
let bytes: Bytes = observable_subject.try_into().unwrap();
isolate.post(bytes.to_vec());
2021-07-21 15:43:05 +08:00
Ok(())
},
None => Err("Isolate is not set".to_owned()),
}
}
pub fn set_port(port: i64) {
2021-10-05 11:46:56 +08:00
match DART_STREAM_SENDER.write() {
2021-07-21 15:43:05 +08:00
Ok(mut stream) => stream.inner_set_port(port),
Err(e) => {
let msg = format!("Get rust to flutter stream lock fail. {:?}", e);
log::error!("{:?}", msg);
},
}
}
2021-10-14 14:34:22 +08:00
pub fn post(_observable_subject: SubscribeObject) -> Result<(), String> {
2021-07-21 15:43:05 +08:00
#[cfg(feature = "dart")]
2021-10-05 11:46:56 +08:00
match DART_STREAM_SENDER.read() {
Ok(stream) => stream.inner_post(_observable_subject),
2021-07-21 15:43:05 +08:00
Err(e) => Err(format!("Get rust to flutter stream lock fail. {:?}", e)),
}
#[cfg(not(feature = "dart"))]
Ok(())
}
}