1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
use dbui_core::messages::{RequestMessage, ResponseMessage}; use dbui_core::result::Result; use std::rc::Rc; use web_sys::{Document, ErrorEvent, MessageEvent}; #[derive(Clone, Debug)] pub(crate) struct ClientContext { document: Document, ws: crate::ws::DbuiSocket } impl ClientContext { pub(crate) fn new() -> Result<Rc<ClientContext>> { let document = web_sys::window().unwrap().document().unwrap(); let url = &document.location().unwrap().href().unwrap(); let ws = crate::ws::DbuiSocket::new(&url)?; let rc = Rc::new(ClientContext { document, ws }); let ctx_open = Rc::clone(&rc); let on_open = Box::new(move |_j| { &ctx_open.on_open(); }); let ctx_msg = Rc::clone(&rc); let on_message = Box::new(move |m| { &ctx_msg.on_message(m); }); let ctx_error = Rc::clone(&rc); let on_error = Box::new(move |e| { &ctx_error.on_error(e); }); &rc.ws.set_callbacks(on_open, on_message, on_error); debug!("[{}] has started", dbui_core::cfg::APPNAME); Ok(rc) } fn send(&self, rm: RequestMessage) { self.ws.send(rm); } fn on_open(&self) { info!("on_open"); self.send(RequestMessage::Ping { v: 0 }); } fn on_message(&self, msg: MessageEvent) { let response_str = msg.data().as_string().expect("Can't convert received data to a string"); let response = ResponseMessage::from_json(&response_str).expect("Can't deserialize ResponseMessage"); info!("on_message: {:?}", response); } fn on_error(&self, e: ErrorEvent) { warn!("on_error: {:?}", e); } }