use js_sys::Reflect;
use wasm_bindgen::{JsCast, JsValue};
use crate::{Error, ErrorKind};
fn is_windows() -> bool {
let global = js_sys::global();
let navigator = if let Some(window) = global.dyn_ref::<web_sys::Window>() {
Reflect::get(&window.navigator(), &JsValue::from_str("platform")).ok()
} else if let Some(worker) = global.dyn_ref::<web_sys::WorkerGlobalScope>() {
Reflect::get(&worker.navigator(), &JsValue::from_str("platform")).ok()
} else {
None
};
navigator.and_then(|v| v.as_string()).map(|p| p.starts_with("Win")).unwrap_or(false)
}
pub(crate) fn network_error_as_stall(js_err: JsValue) -> Error {
if is_windows() {
if let Some(js_error) = js_err.dyn_ref::<js_sys::Error>() {
let name = js_error.name().as_string().unwrap_or_default();
if name == "NetworkError" {
let msg = js_error.message().as_string().unwrap_or_default();
web_sys::console::warn_1(
&format!("[webusb-web] remapping NetworkError to Stall (Windows): {msg:?}").into(),
);
return Error::new(ErrorKind::Stall, msg);
}
}
}
js_err.into()
}