use js_sys::{Function, Promise};
use wasm_bindgen::JsCast;
use wasm_bindgen::JsValue;
use wasm_bindgen_futures::JsFuture;
#[derive(Clone)]
pub struct JsServerHandler {
on_request: Function,
}
impl JsServerHandler {
pub fn new(on_request: Function) -> Self {
Self { on_request }
}
pub async fn dispatch(&self, request: JsValue) -> Result<JsValue, JsValue> {
let out = self.on_request.call1(&JsValue::NULL, &request)?;
if out.is_instance_of::<Promise>() {
let p: Promise = out
.dyn_into()
.map_err(|_| JsValue::from_str("on_request returned non-promise value shape"))?;
JsFuture::from(p).await
} else {
Ok(out)
}
}
}