libp2p_webtransport_websys/
utils.rs1use std::{io, sync::LazyLock};
2
3use js_sys::{Promise, Reflect};
4use send_wrapper::SendWrapper;
5use wasm_bindgen::{JsCast, JsValue};
6
7use crate::Error;
8
9type Closure = wasm_bindgen::closure::Closure<dyn FnMut(JsValue)>;
10static DO_NOTHING: LazyLock<SendWrapper<Closure>> = LazyLock::new(|| {
11 let cb = Closure::new(|_| {});
12 SendWrapper::new(cb)
13});
14
15pub(crate) fn detach_promise(promise: Promise) {
22 let _ = promise.catch(&DO_NOTHING);
25}
26
27pub(crate) fn to_js_type<T>(value: impl Into<JsValue>) -> Result<T, Error>
37where
38 T: JsCast + From<JsValue>,
39{
40 let value = value.into();
41
42 if value.has_type::<T>() {
43 Ok(value.unchecked_into())
44 } else if value.has_type::<js_sys::Error>() {
45 Err(Error::from_js_value(value))
46 } else {
47 Err(Error::JsCastFailed)
48 }
49}
50
51pub(crate) fn parse_reader_response(resp: &JsValue) -> Result<Option<JsValue>, JsValue> {
54 let value = Reflect::get(resp, &JsValue::from_str("value"))?;
55 let done = Reflect::get(resp, &JsValue::from_str("done"))?
56 .as_bool()
57 .unwrap_or_default();
58
59 if value.is_undefined() || done {
60 Ok(None)
61 } else {
62 Ok(Some(value))
63 }
64}
65
66pub(crate) fn to_io_error(value: JsValue) -> io::Error {
67 io::Error::new(io::ErrorKind::Other, Error::from_js_value(value))
68}