1use rusnap_utils::{JsResult, RPCRequest};
2use serde::{Deserialize, Serialize};
3use serde_wasm_bindgen::Serializer;
4use wasm_bindgen::{prelude::wasm_bindgen, JsValue};
5
6use crate::{Error, Result};
7
8#[wasm_bindgen]
9extern "C" {
10 #[wasm_bindgen(js_namespace = snap, js_name = request, catch)]
11 async fn _request(args: JsValue) -> JsResult<JsValue>;
12}
13
14pub async fn request<P, R>(method: &'static str, params: P) -> Result<R>
20where
21 P: Serialize,
22 R: for<'de> Deserialize<'de>,
23{
24 let req = RPCRequest { method, params };
25
26 let sers = Serializer::default().serialize_maps_as_objects(true);
27
28 let req = req.serialize(&sers)?;
29
30 log::debug!("Rpc Call Request is: {:?}", req);
31
32 let resp = _request(req).await.map_err(Error::JsError)?;
33
34 log::debug!("Rpc Call Result is: {:?}", resp);
35
36 Ok(serde_wasm_bindgen::from_value(resp)?)
37}