worker/
rpc_stub_forward.rs1use 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}