diff --git a/Cargo.lock b/Cargo.lock index e499807..04016b6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1691,6 +1691,7 @@ checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" name = "fastwave" version = "0.1.0" dependencies = [ + "futures", "once_cell", "serde", "serde_json", @@ -1840,12 +1841,13 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", + "futures-executor", "futures-io", "futures-sink", "futures-task", @@ -1870,9 +1872,9 @@ checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -1943,6 +1945,7 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ + "futures-channel", "futures-core", "futures-io", "futures-macro", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index f0b386c..8884690 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -24,6 +24,7 @@ tauri = { version = "=2.0.0-beta.22", features = ["macos-private-api", "linux-ip tauri-plugin-window-state = "=2.0.0-beta.9" tauri-plugin-dialog = "=2.0.0-beta.9" once_cell = "1.19.0" +futures = "0.3.30" # wasmtime = "22.0.0" # wasmtime-wasi = "22.0.0" diff --git a/src-tauri/src/component_manager.rs b/src-tauri/src/component_manager.rs index 8d92458..69faa11 100644 --- a/src-tauri/src/component_manager.rs +++ b/src-tauri/src/component_manager.rs @@ -79,7 +79,7 @@ pub async fn remove_all_decoders() -> RemovedDecodersCount { // All Release // FW.add_decoders(["../../test_files/components/rust_decoder/rust_decoder.wasm", "../../test_files/components/javascript_decoder/javascript_decoder.wasm", "../../test_files/components/python_decoder/python_decoder.wasm"]) pub async fn add_decoders(decoder_paths: Vec) -> AddedDecodersCount { - println!("decoders in Tauri: {decoder_paths:#?}"); + println!("Decoders: {decoder_paths:#?}"); println!("Current dir: {:#?}", std::env::current_dir().unwrap()); let mut added_decoders_count = 0; diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 9a2cb18..0d2df5b 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -87,15 +87,27 @@ async fn load_signal_and_get_timeline( var_format, |mut value: String| { Box::pin(async { - let decoders = component_manager::DECODERS.read().await; - let mut store_lock = component_manager::STORE.lock().await; - let mut store = store_lock.as_context_mut(); - for decoder in decoders.iter() { - value = decoder - .component_decoder_decoder() - .call_format_signal_value(&mut store, &value) - .unwrap() - } + // We need to spawn a (non-runtime-specific?) blocking task before calling component methods to prevent this error: + // "Cannot start a runtime from within a runtime. This happens because a function (like `block_on`) attempted to block the current thread while the thread is being used to drive asynchronous tasks." + // @TODO Workaround? Is it a problem only for non-Rust components? Is it needed only when there is a problem in the component (e.g. "`Err` value: wasm trap: cannot enter component instance"?) + // let value = std::thread::spawn(move || { + // futures::executor::block_on(async move { + let decoders = component_manager::DECODERS.read().await; + let mut store_lock = component_manager::STORE.lock().await; + let mut store = store_lock.as_context_mut(); + + for decoder in decoders.iter() { + value = decoder + .component_decoder_decoder() + .call_format_signal_value(&mut store, &value) + // @TODO Resolve panic when running non-Rust components: + // `Err` value: wasm trap: cannot enter component instance + // https://github.com/bytecodealliance/wasmtime/issues/8670 ? + .unwrap() + } + // value + // }) + // }).join().unwrap(); value }) }, diff --git a/test_files/components/javascript_decoder/javascript_decoder.wasm b/test_files/components/javascript_decoder/javascript_decoder.wasm index 56fc06f..de92508 100644 Binary files a/test_files/components/javascript_decoder/javascript_decoder.wasm and b/test_files/components/javascript_decoder/javascript_decoder.wasm differ diff --git a/test_files/components/javascript_decoder/src/index.js b/test_files/components/javascript_decoder/src/index.js index 4b33938..add3212 100644 --- a/test_files/components/javascript_decoder/src/index.js +++ b/test_files/components/javascript_decoder/src/index.js @@ -10,7 +10,7 @@ export const decoder = { return name }, formatSignalValue(value) { - value + "!" + return value + "!" } }