twetch_sdk/chat/
message.rs1use 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}