|
use super::*; |
|
use std::sync::mpsc::{Receiver, Sender}; |
|
use wasm_bindgen::prelude::*; |
|
|
|
#[wasm_bindgen] |
|
extern "C" { |
|
|
|
#[wasm_bindgen(js_namespace = ["window", "__TAURI__", "core"])] |
|
async fn invoke(cmd: &str, args: JsValue) -> JsValue; |
|
#[wasm_bindgen(js_namespace = ["window", "__TAURI__", "core"], js_name="invoke")] |
|
async fn invoke_without_arg(cmd: &str) -> JsValue; |
|
} |
|
|
|
|
|
#[derive(Debug)] |
|
pub struct NodeRuntimeIO { |
|
|
|
#[cfg(any(not(feature = "tauri"), test))] |
|
sender: Sender<GraphRuntimeRequest>, |
|
#[cfg(all(feature = "tauri", not(test)))] |
|
sender: Sender<NodeGraphUpdate>, |
|
receiver: Receiver<NodeGraphUpdate>, |
|
} |
|
|
|
impl Default for NodeRuntimeIO { |
|
fn default() -> Self { |
|
Self::new() |
|
} |
|
} |
|
|
|
impl NodeRuntimeIO { |
|
|
|
pub fn new() -> Self { |
|
#[cfg(any(not(feature = "tauri"), test))] |
|
{ |
|
let (response_sender, response_receiver) = std::sync::mpsc::channel(); |
|
let (request_sender, request_receiver) = std::sync::mpsc::channel(); |
|
futures::executor::block_on(replace_node_runtime(NodeRuntime::new(request_receiver, response_sender))); |
|
|
|
Self { |
|
sender: request_sender, |
|
receiver: response_receiver, |
|
} |
|
} |
|
|
|
#[cfg(all(feature = "tauri", not(test)))] |
|
{ |
|
let (response_sender, response_receiver) = std::sync::mpsc::channel(); |
|
Self { |
|
sender: response_sender, |
|
receiver: response_receiver, |
|
} |
|
} |
|
} |
|
#[cfg(test)] |
|
pub fn with_channels(sender: Sender<GraphRuntimeRequest>, receiver: Receiver<NodeGraphUpdate>) -> Self { |
|
Self { sender, receiver } |
|
} |
|
|
|
|
|
pub fn send(&self, message: GraphRuntimeRequest) -> Result<(), String> { |
|
#[cfg(any(not(feature = "tauri"), test))] |
|
{ |
|
self.sender.send(message).map_err(|e| e.to_string()) |
|
} |
|
|
|
#[cfg(all(feature = "tauri", not(test)))] |
|
{ |
|
let serialized = ron::to_string(&message).map_err(|e| e.to_string()).unwrap(); |
|
wasm_bindgen_futures::spawn_local(async move { |
|
let js_message = create_message_object(&serialized); |
|
invoke("runtime_message", js_message).await; |
|
}); |
|
Ok(()) |
|
} |
|
} |
|
|
|
|
|
pub fn receive(&self) -> impl Iterator<Item = NodeGraphUpdate> + use<'_> { |
|
|
|
#[cfg(all(feature = "tauri", not(test)))] |
|
{ |
|
let sender = self.sender.clone(); |
|
|
|
wasm_bindgen_futures::spawn_local(async move { |
|
let messages = invoke_without_arg("poll_node_graph").await; |
|
let vec: Vec<_> = ron::from_str(&messages.as_string().unwrap()).unwrap(); |
|
for message in vec { |
|
sender.send(message).unwrap(); |
|
} |
|
}); |
|
} |
|
self.receiver.try_iter() |
|
} |
|
} |
|
|
|
#[cfg(all(feature = "tauri", not(test)))] |
|
pub fn create_message_object(message: &str) -> JsValue { |
|
let obj = js_sys::Object::new(); |
|
js_sys::Reflect::set(&obj, &JsValue::from_str("message"), &JsValue::from_str(message)).unwrap(); |
|
obj.into() |
|
} |
|
|