twetch_sdk/chat/
message.rs

1use crate::api::Api;
2use anyhow::Result;
3use bsv_wasm::{AESAlgorithms, AES};
4use js_sys::decode_uri_component;
5use serde::*;
6use serde_json::json;
7use std::str;
8use wasm_bindgen::prelude::*;
9
10#[wasm_bindgen]
11#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
12pub struct Message {
13    plaintext: String,
14}
15
16impl Message {
17    pub fn encrypt(key: &[u8], plaintext: String) -> Option<String> {
18        let iv = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1];
19        let result = match AES::encrypt(key, iv, plaintext.as_bytes(), AESAlgorithms::AES128_CTR) {
20            Ok(v) => v,
21            Err(_) => return None,
22        };
23
24        Some(hex::encode(result))
25    }
26
27    pub async fn create(
28        key: String,
29        conversation_id: String,
30        user_id: String,
31        description: String,
32        token: String,
33    ) -> Result<Message> {
34        println!(
35            "{:?} {:?} {:?} {:?} {:?}",
36            key, conversation_id, user_id, description, token
37        );
38
39        let encrypted = Message::encrypt(&hex::decode(key).unwrap(), description.clone());
40
41        let payload = json!({
42            "payload": {
43                "description": encrypted,
44                "userId": user_id,
45                "conversationId": conversation_id
46            }
47        });
48
49        println!("payload {:?}", payload);
50
51        let api = Api { token };
52        let res = api.create_message(payload).await?;
53
54        println!("message create response {:?}", res);
55
56        Ok(Message {
57            plaintext: description,
58        })
59    }
60}
61
62#[wasm_bindgen]
63impl Message {
64    #[wasm_bindgen(js_name = encrypt)]
65    pub fn encrypt_wasm(key: &[u8], plaintext: String) -> Option<String> {
66        Message::encrypt(key, plaintext)
67    }
68
69    #[wasm_bindgen(js_name = decrypt)]
70    pub fn decrypt(key: &[u8], description: &[u8]) -> Option<Message> {
71        let iv = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1];
72        let result = match AES::decrypt(key, iv, description, AESAlgorithms::AES128_CTR) {
73            Ok(v) => v,
74            Err(_) => return None,
75        };
76
77        let utf8 = match str::from_utf8(&result) {
78            Ok(v) => v,
79            Err(_) => return None,
80        };
81
82        let decoded_utf8 = match decode_uri_component(&utf8) {
83            Ok(v) => v,
84            Err(_) => return None,
85        };
86
87        return Some(Message {
88            plaintext: decoded_utf8.into(),
89        });
90    }
91
92    #[wasm_bindgen(js_name = plaintext)]
93    pub fn plaintext(&self) -> String {
94        return self.plaintext.clone();
95    }
96}