rune_wasm/
time.rs

1use js_sys::Promise;
2use rune::runtime::VmResult;
3use rune::{Any, ContextError, Module};
4use wasm_bindgen::prelude::*;
5use wasm_bindgen_futures::JsFuture;
6
7#[wasm_bindgen(module = "/module.js")]
8extern "C" {
9    fn js_sleep(ms: i32) -> Promise;
10}
11
12/// The wasm 'time' module.
13pub fn module() -> Result<Module, ContextError> {
14    let mut module = Module::with_crate("time")?;
15    module.ty::<Duration>()?;
16    module
17        .function("from_secs", Duration::from_secs)
18        .build_associated::<Duration>()?;
19    module.function("sleep", sleep).build()?;
20    Ok(module)
21}
22
23#[derive(Any)]
24#[rune(item = ::time)]
25struct Duration(i32);
26
27impl Duration {
28    fn from_secs(value: i64) -> Self {
29        Self(value as i32 * 1000)
30    }
31}
32
33async fn sleep(duration: Duration) -> VmResult<()> {
34    let promise = js_sleep(duration.0);
35    let js_fut = JsFuture::from(promise);
36
37    if js_fut.await.is_err() {
38        return VmResult::panic("Sleep errored");
39    }
40
41    VmResult::Ok(())
42}