bitwarden_ipc/wasm/
message.rs

1use std::str;
2
3use wasm_bindgen::prelude::*;
4
5use crate::{
6    endpoint::Endpoint,
7    message::{IncomingMessage, OutgoingMessage},
8};
9
10#[wasm_bindgen]
11impl OutgoingMessage {
12    #[wasm_bindgen(constructor)]
13    pub fn new(payload: Vec<u8>, destination: Endpoint, topic: Option<String>) -> OutgoingMessage {
14        OutgoingMessage {
15            payload,
16            destination,
17            topic,
18        }
19    }
20
21    /// Create a new message and encode the payload as JSON.
22    pub fn new_json_payload(
23        payload: JsValue,
24        destination: Endpoint,
25        topic: Option<String>,
26    ) -> Result<OutgoingMessage, JsValue> {
27        let payload = js_sys::JSON::stringify(&payload)?;
28        let payload: String = payload
29            .as_string()
30            .ok_or_else(|| JsValue::from_str("Failed to convert JSON payload to string"))?;
31        let payload = payload.into_bytes();
32        Ok(OutgoingMessage {
33            payload,
34            destination,
35            topic,
36        })
37    }
38}
39
40#[wasm_bindgen]
41impl IncomingMessage {
42    #[wasm_bindgen(constructor)]
43    pub fn new(
44        payload: Vec<u8>,
45        destination: Endpoint,
46        source: Endpoint,
47        topic: Option<String>,
48    ) -> IncomingMessage {
49        IncomingMessage {
50            payload,
51            destination,
52            source,
53            topic,
54        }
55    }
56
57    /// Try to parse the payload as JSON.
58    #[wasm_bindgen(
59        return_description = "The parsed JSON value, or undefined if the payload is not valid JSON."
60    )]
61    pub fn parse_payload_as_json(&self) -> JsValue {
62        str::from_utf8(&self.payload)
63            .ok()
64            .and_then(|payload| js_sys::JSON::parse(payload).ok())
65            .unwrap_or(JsValue::UNDEFINED)
66    }
67}