genotype_wasm 0.17.0

Genotype language Wasm crate
use crate::prelude::internal::*;

pub struct GtwmInterop {
    backend_request_handler: Function,
}

impl GtwmInterop {
    pub fn new(backend_request_handler: Function) -> Self {
        Self {
            backend_request_handler,
        }
    }
}

impl GtbRemoteInterop for GtwmInterop {
    fn send_request<'a>(
        &'a self,
        request: GtbRemoteBackendRequest,
    ) -> LocalBoxFuture<'a, Result<GtbRemoteBackendRequestResponse>> {
        async move {
            let request = serde_wasm_bindgen::to_value(&request).map_err(|err| {
                miette!("Wasm interop failed to serialize remote backend request: {err}")
            })?;

            let response = self
                .backend_request_handler
                .call1(&JsValue::NULL, &request)
                .map_err(|err| {
                    miette!(
                        "Wasm interop remote request failed: {}",
                        js_error_to_string(err)
                    )
                })?;

            let promise: Promise = response
                .dyn_into()
                .map_err(|_| miette!("Wasm interop request handler did not return a Promise"))?;
            let response = JsFuture::from(promise).await.map_err(|err| {
                miette!(
                    "Wasm interop remote request promise rejected: {}",
                    js_error_to_string(err)
                )
            })?;

            serde_wasm_bindgen::from_value(response).map_err(|err| {
                miette!("Wasm interop failed to deserialize remote backend response: {err}")
            })
        }
        .boxed_local()
    }
}