use rquickjs::function::{Func, Opt};
use rquickjs::{Ctx, Function, Object, Promise, Result, Value};
pub const TIMERS_MEMBERS: &[&str] = &[
"clearImmediate",
"clearInterval",
"clearTimeout",
"setImmediate",
"setInterval",
"setTimeout",
];
pub const TIMERS_PROMISES_MEMBERS: &[&str] = &["setImmediate", "setTimeout"];
pub fn timers_object<'js>(ctx: &Ctx<'js>) -> Result<Object<'js>> {
let timers = Object::new(ctx.clone())?;
for name in TIMERS_MEMBERS {
if let Ok(value) = ctx.globals().get::<_, Value<'js>>(*name) {
if !value.is_undefined() {
timers.set(*name, value)?;
}
}
}
Ok(timers)
}
fn timeout_promise<'js>(ctx: Ctx<'js>, delay: Opt<f64>, value: Opt<Value<'js>>) -> Result<Promise<'js>> {
let (promise, resolve, _reject) = ctx.promise()?;
let set_timeout: Function<'js> = ctx.globals().get("setTimeout")?;
let carried = value.0.unwrap_or_else(|| Value::new_undefined(ctx.clone()));
set_timeout.call::<_, Value<'js>>((resolve, delay.0.unwrap_or(0.0), carried))?;
Ok(promise)
}
fn immediate_promise<'js>(ctx: Ctx<'js>, value: Opt<Value<'js>>) -> Result<Promise<'js>> {
let (promise, resolve, _reject) = ctx.promise()?;
let set_immediate: Function<'js> = ctx.globals().get("setImmediate")?;
let carried = value.0.unwrap_or_else(|| Value::new_undefined(ctx.clone()));
set_immediate.call::<_, Value<'js>>((resolve, carried))?;
Ok(promise)
}
pub fn timers_promises_object<'js>(ctx: &Ctx<'js>) -> Result<Object<'js>> {
let timers = Object::new(ctx.clone())?;
timers.set("setTimeout", Func::from(timeout_promise))?;
timers.set("setImmediate", Func::from(immediate_promise))?;
Ok(timers)
}