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
12pub 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}