yew_debugger/
lib.rs

1#[macro_use]
2pub mod macros;
3
4use base64::{engine::general_purpose as b64_general_purpose, Engine as _};
5use gloo::utils::format::JsValueSerdeExt;
6use serde_json::json;
7use std::{
8    cell::RefCell,
9    fmt::Debug,
10    sync::atomic::{AtomicUsize, Ordering},
11};
12use wasm_bindgen::{JsCast, JsValue};
13use web_sys::DedicatedWorkerGlobalScope;
14
15pub trait YewComponentMessage: Debug {}
16
17pub trait YewComponentModel: Debug {}
18
19pub trait YewComponentDebug<Model: YewComponentModel, Message: YewComponentMessage> {
20    thread_local! {
21        static MSG_ID: RefCell<AtomicUsize> = const {
22            RefCell::new(AtomicUsize::new(0))};
23
24    }
25    fn send_to_debbuger(model: &Model, msg: &Message) {
26        let msg_id = Self::MSG_ID.with(|inner| inner.borrow_mut().fetch_add(1, Ordering::SeqCst));
27        let encoded_model = b64_general_purpose::STANDARD.encode(format!("{:#?}", model));
28        let event = json! {
29            {
30                "model": encoded_model,
31                "metadata": {
32                    "msg_id": msg_id,
33                    "msg": format!("{:#?}",msg),
34                }
35            }
36        };
37
38        let api = "yew-debugger-collector";
39        let message_to_debbuger = json! {
40        {
41            "api": api,
42            "event": event,
43        }
44
45        };
46        let global_scope: DedicatedWorkerGlobalScope = js_sys::global().unchecked_into();
47
48        let _ = global_scope
49            .post_message(&JsValue::from_serde(&message_to_debbuger).unwrap_or_default());
50    }
51}