2021-07-21 15:43:05 +08:00
|
|
|
use crate::entities::ObservableSubject;
|
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! {
|
|
|
|
static ref R2F_STREAM_SENDER: RwLock<RustStreamSender> = RwLock::new(RustStreamSender::new());
|
|
|
|
}
|
|
|
|
|
|
|
|
pub struct RustStreamSender {
|
2021-08-30 16:18:58 +08:00
|
|
|
#[allow(dead_code)]
|
2021-07-21 15:43:05 +08:00
|
|
|
isolate: Option<allo_isolate::Isolate>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl RustStreamSender {
|
|
|
|
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));
|
|
|
|
}
|
|
|
|
|
2021-08-30 16:18:58 +08:00
|
|
|
#[allow(dead_code)]
|
2021-07-21 15:43:05 +08:00
|
|
|
fn inner_post(&self, observable_subject: ObservableSubject) -> Result<(), String> {
|
|
|
|
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) {
|
|
|
|
match R2F_STREAM_SENDER.write() {
|
|
|
|
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-08-22 15:32:48 +08:00
|
|
|
pub fn post(_observable_subject: ObservableSubject) -> Result<(), String> {
|
2021-07-21 15:43:05 +08:00
|
|
|
#[cfg(feature = "dart")]
|
|
|
|
match R2F_STREAM_SENDER.read() {
|
2021-08-23 22:10:36 +08:00
|
|
|
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(())
|
|
|
|
}
|
|
|
|
}
|