Skip to main content

worker/
rpc_stub_forward.rs

1use std::collections::HashMap;
2
3use wasm_bindgen::{JsCast, JsValue};
4
5use crate::{Fetcher, Result, Stub};
6
7#[derive(Debug, Clone)]
8pub struct RpcStubForward {
9    target: JsValue,
10    namespace: Option<String>,
11    metadata: HashMap<String, String>,
12}
13
14impl RpcStubForward {
15    pub fn new(target: JsValue) -> Self {
16        Self {
17            target,
18            namespace: None,
19            metadata: HashMap::new(),
20        }
21    }
22
23    pub fn with_namespace(mut self, namespace: impl Into<String>) -> Self {
24        self.namespace = Some(namespace.into());
25        self
26    }
27
28    pub fn with_metadata(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
29        self.metadata.insert(key.into(), value.into());
30        self
31    }
32
33    pub fn into_rpc<T: JsCast>(self) -> T {
34        self.target.unchecked_into()
35    }
36
37    pub fn to_wire(&self) -> Result<JsValue> {
38        let obj = js_sys::Object::new();
39        js_sys::Reflect::set(&obj, &JsValue::from("version"), &JsValue::from("1"))?;
40        js_sys::Reflect::set(&obj, &JsValue::from("target"), &self.target)?;
41
42        if let Some(namespace) = &self.namespace {
43            js_sys::Reflect::set(&obj, &JsValue::from("namespace"), &JsValue::from(namespace))?;
44        }
45
46        let metadata = serde_wasm_bindgen::to_value(&self.metadata)?;
47        js_sys::Reflect::set(&obj, &JsValue::from("metadata"), &metadata)?;
48
49        Ok(obj.into())
50    }
51
52    pub fn from_wire(wire: JsValue) -> Result<Self> {
53        let target = js_sys::Reflect::get(&wire, &JsValue::from("target"))?;
54
55        let namespace = js_sys::Reflect::get(&wire, &JsValue::from("namespace"))?
56            .as_string();
57
58        let metadata_value = js_sys::Reflect::get(&wire, &JsValue::from("metadata"))?;
59        let metadata = if metadata_value.is_undefined() || metadata_value.is_null() {
60            HashMap::new()
61        } else {
62            serde_wasm_bindgen::from_value(metadata_value)?
63        };
64
65        Ok(Self {
66            target,
67            namespace,
68            metadata,
69        })
70    }
71}
72
73impl From<Fetcher> for RpcStubForward {
74    fn from(value: Fetcher) -> Self {
75        let target: JsValue = value.into_rpc();
76        Self::new(target)
77    }
78}
79
80impl From<Stub> for RpcStubForward {
81    fn from(value: Stub) -> Self {
82        let target: JsValue = value.into_rpc();
83        Self::new(target)
84    }
85}