#[cfg(feature = "browser")]
pub(crate) type JsErr = wasm_bindgen::JsValue;
#[cfg(feature = "nodejs")]
pub(crate) type JsErr = napi::Error;
#[cfg(feature = "browser")]
pub(crate) fn from_str_err(msg: &str) -> JsErr {
wasm_bindgen::JsValue::from_str(msg)
}
#[cfg(feature = "nodejs")]
pub(crate) fn from_str_err(msg: &str) -> JsErr {
napi::Error::from_reason(msg)
}
#[cfg(feature = "browser")]
pub(crate) type JsBytes = js_sys::Uint8Array;
#[cfg(feature = "nodejs")]
pub(crate) type JsBytes = napi::bindgen_prelude::Buffer;
#[cfg(feature = "browser")]
pub(crate) fn bytes_to_js(bytes: &[u8]) -> JsBytes {
js_sys::Uint8Array::from(bytes)
}
#[cfg(feature = "nodejs")]
pub(crate) fn bytes_to_js(bytes: &[u8]) -> JsBytes {
napi::bindgen_prelude::Buffer::from(bytes)
}
pub(crate) fn js_to_bytes(js_bytes: &JsBytes) -> Vec<u8> {
js_bytes.to_vec()
}
#[cfg(feature = "browser")]
pub(crate) struct AsyncCell<T>(std::cell::RefCell<T>);
#[cfg(feature = "nodejs")]
pub(crate) struct AsyncCell<T>(tokio::sync::Mutex<T>);
#[cfg(feature = "browser")]
impl<T> AsyncCell<T> {
pub fn new(val: T) -> Self {
Self(std::cell::RefCell::new(val))
}
#[allow(unknown_lints, clippy::unused_async, clippy::unused_async_trait_impl)]
pub async fn lock(&self) -> std::cell::RefMut<'_, T> {
self.0.borrow_mut()
}
pub fn borrow(&self) -> std::cell::Ref<'_, T> {
self.0.borrow()
}
}
#[cfg(feature = "nodejs")]
impl<T: Send> AsyncCell<T> {
pub fn new(val: T) -> Self {
Self(tokio::sync::Mutex::new(val))
}
pub async fn lock(&self) -> impl core::ops::DerefMut<Target = T> + '_ {
self.0.lock().await
}
}
#[cfg(feature = "browser")]
pub type JsU64 = u64;
#[cfg(feature = "nodejs")]
pub type JsU64 = napi::bindgen_prelude::BigInt;
#[inline]
pub fn js_u64_to_u64(val: JsU64) -> u64 {
#[cfg(feature = "browser")]
{
val
}
#[cfg(feature = "nodejs")]
{
let (signed, value, lossless) = val.get_u64();
if signed || !lossless {
panic!(
"BigInt value is outside the u64 range (0..2^64); \
got signed={signed}, lossless={lossless}"
);
}
value
}
}
#[inline]
pub fn u64_to_js_u64(val: u64) -> JsU64 {
#[cfg(feature = "browser")]
{
val
}
#[cfg(feature = "nodejs")]
{
napi::bindgen_prelude::BigInt::from(val)
}
}
#[cfg(feature = "browser")]
pub(crate) fn maybe_wrap_send<F: std::future::Future>(
future: F,
) -> impl std::future::Future<Output = F::Output> {
future
}
#[cfg(feature = "nodejs")]
pub(crate) fn maybe_wrap_send<F: std::future::Future>(
future: F,
) -> impl std::future::Future<Output = F::Output> + Send {
struct AssertSend<F>(F);
unsafe impl<F> Send for AssertSend<F> {}
impl<F: std::future::Future> std::future::Future for AssertSend<F> {
type Output = F::Output;
fn poll(
self: std::pin::Pin<&mut Self>,
cx: &mut std::task::Context<'_>,
) -> std::task::Poll<Self::Output> {
unsafe { self.map_unchecked_mut(|s| &mut s.0) }.poll(cx)
}
}
AssertSend(future)
}
#[cfg(feature = "browser")]
pub(crate) type ClientAuth = crate::web_keystore::WebKeyStore<miden_client::crypto::RandomCoin>;
#[cfg(feature = "nodejs")]
pub(crate) type ClientAuth = miden_client::keystore::FilesystemKeyStore;