//! Abstraction over an executor so we can spawn tasks under WASM the same way //! we do usually. #[cfg(target_arch = "wasm32")] use std::{ pin::Pin, task::{Context, Poll}, }; #[cfg(target_arch = "wasm32")] use futures::{future::RemoteHandle, Future, FutureExt}; #[cfg(not(target_arch = "wasm32"))] pub use tokio::spawn; #[cfg(target_arch = "wasm32")] use wasm_bindgen_futures::spawn_local; #[cfg(target_arch = "wasm32")] pub fn spawn(future: F) -> JoinHandle where F: Future + 'static, { let fut = future.unit_error(); let (fut, handle) = fut.remote_handle(); spawn_local(fut); JoinHandle { handle } } #[cfg(target_arch = "wasm32")] #[derive(Debug)] pub struct JoinHandle { handle: RemoteHandle>, } #[cfg(target_arch = "wasm32")] impl Future for JoinHandle { type Output = Result; fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { Pin::new(&mut self.handle).poll(cx) } }