veilid/veilid-tools/src/wasm.rs

54 lines
1.3 KiB
Rust
Raw Normal View History

2022-11-26 21:37:23 -05:00
use super::*;
use core::sync::atomic::{AtomicI8, Ordering};
use js_sys::{global, Reflect};
2022-11-27 10:52:07 -05:00
use wasm_bindgen::prelude::*;
2022-11-26 21:37:23 -05:00
#[wasm_bindgen]
extern "C" {
// Use `js_namespace` here to bind `console.log(..)` instead of just
// `log(..)`
#[wasm_bindgen(js_namespace = console, js_name = log)]
pub fn console_log(s: &str);
#[wasm_bindgen]
pub fn alert(s: &str);
}
pub fn is_browser() -> bool {
static CACHE: AtomicI8 = AtomicI8::new(-1);
let cache = CACHE.load(Ordering::Relaxed);
if cache != -1 {
return cache != 0;
}
let res = Reflect::has(&global().as_ref(), &"window".into()).unwrap_or_default();
CACHE.store(res as i8, Ordering::Relaxed);
res
}
2022-11-27 10:52:07 -05:00
pub fn is_browser_https() -> bool {
static CACHE: AtomicI8 = AtomicI8::new(-1);
let cache = CACHE.load(Ordering::Relaxed);
if cache != -1 {
return cache != 0;
}
2022-11-26 21:37:23 -05:00
2022-11-27 10:52:07 -05:00
let res = js_sys::eval("window.location.protocol === 'https'")
.map(|res| res.is_truthy())
.unwrap_or_default();
2022-11-26 21:37:23 -05:00
2022-11-27 10:52:07 -05:00
CACHE.store(res as i8, Ordering::Relaxed);
2022-11-26 21:37:23 -05:00
2022-11-27 10:52:07 -05:00
res
}
2022-11-26 21:37:23 -05:00
#[derive(ThisError, Debug, Clone, Eq, PartialEq)]
#[error("JsValue error")]
pub struct JsValueError(String);
pub fn map_jsvalue_error(x: JsValue) -> JsValueError {
JsValueError(x.as_string().unwrap_or_default())
}