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
use dbui_core::messages::RequestMessage; use dbui_core::result::Result; use wasm_bindgen::prelude::*; use wasm_bindgen::JsCast; use web_sys::{ErrorEvent, MessageEvent, WebSocket}; #[derive(Clone, Debug)] pub(crate) struct DbuiSocket { url: String, ws: WebSocket } impl DbuiSocket { pub(crate) fn new(curr_url: &str) -> Result<DbuiSocket> { let url = calc_url(curr_url); let ws = WebSocket::new(&url).expect("Can't create WebSocket"); Ok(DbuiSocket { url, ws }) } pub(crate) fn set_callbacks( &self, on_open: Box<dyn FnMut(JsValue)>, on_message: Box<dyn FnMut(MessageEvent)>, on_error: Box<dyn FnMut(ErrorEvent)> ) { let onmessage_callback = Closure::wrap(on_message); self.ws.set_onmessage(Some(onmessage_callback.as_ref().unchecked_ref())); onmessage_callback.forget(); let onerror_callback = Closure::wrap(on_error); self.ws.set_onerror(Some(onerror_callback.as_ref().unchecked_ref())); onerror_callback.forget(); let onopen_callback = Closure::wrap(on_open); self.ws.set_onopen(Some(onopen_callback.as_ref().unchecked_ref())); onopen_callback.forget(); } pub(crate) fn send(&self, msg: RequestMessage) { match &self.ws.send_with_str(&msg.to_json().expect("Can't serialize RequestMessage")) { Ok(_) => debug!("Message sent"), Err(err) => error!("Error sending message: [{:?}]", err) } } } fn calc_url(src: &str) -> String { let cleaned = src .trim_start_matches("http") .trim_start_matches("file") .trim_start_matches("ws") .trim_start_matches("s") .trim_start_matches("://"); let split: Vec<&str> = cleaned.splitn(2, '/').collect(); format!("ws://{}/connect", split[0]) }