diff options
Diffstat (limited to 'teleterm-web/src')
-rw-r--r-- | teleterm-web/src/lib.rs | 58 | ||||
-rw-r--r-- | teleterm-web/src/ws.rs | 26 |
2 files changed, 48 insertions, 36 deletions
diff --git a/teleterm-web/src/lib.rs b/teleterm-web/src/lib.rs index 8b770a5..99c68f1 100644 --- a/teleterm-web/src/lib.rs +++ b/teleterm-web/src/lib.rs @@ -13,51 +13,49 @@ const WATCH_URL: &str = "ws://127.0.0.1:4145/watch"; #[derive(Clone)] enum Msg { - Connected(JsValue), - Disconnected(JsValue), - Message(MessageEvent), - Error(JsValue), + Watch(ws::WebSocketEvent), } struct Model { - ws: WebSocket, + watch_conn: WebSocket, } fn init(_: Url, orders: &mut impl Orders<Msg>) -> Init<Model> { log("init"); - let ws = ws::connect(WATCH_URL, orders); - log("created ws"); - Init::new(Model { ws }) + let watch_conn = ws::connect(WATCH_URL, Msg::Watch, orders); + Init::new(Model { watch_conn }) } fn update(msg: Msg, model: &mut Model, _orders: &mut impl Orders<Msg>) { log("update"); match msg { - Msg::Connected(_) => { - log("connected"); - match model.ws.send_with_str("ping1") { - Ok(_) => log("sent ping1 successfully"), - Err(e) => { - log(&format!("error sending ping: {:?}", e)); - return; + Msg::Watch(event) => match event { + ws::WebSocketEvent::Connected(_) => { + log("connected"); + match model.watch_conn.send_with_str("ping1") { + Ok(_) => log("sent ping1 successfully"), + Err(e) => { + log(&format!("error sending ping: {:?}", e)); + return; + } } - } - match model.ws.send_with_str("ping2") { - Ok(_) => log("sent ping2 successfully"), - Err(e) => { - log(&format!("error sending ping: {:?}", e)); + match model.watch_conn.send_with_str("ping2") { + Ok(_) => log("sent ping2 successfully"), + Err(e) => { + log(&format!("error sending ping: {:?}", e)); + } } } - } - Msg::Disconnected(_) => { - log("disconnected"); - } - Msg::Message(msg) => { - log(&format!("message {:?}", msg)); - } - Msg::Error(e) => { - log(&format!("error {:?}", e)); - } + ws::WebSocketEvent::Disconnected(_) => { + log("disconnected"); + } + ws::WebSocketEvent::Message(msg) => { + log(&format!("message {:?}", msg)); + } + ws::WebSocketEvent::Error(e) => { + log(&format!("error {:?}", e)); + } + }, } } diff --git a/teleterm-web/src/ws.rs b/teleterm-web/src/ws.rs index a2ab566..d386651 100644 --- a/teleterm-web/src/ws.rs +++ b/teleterm-web/src/ws.rs @@ -1,33 +1,46 @@ use crate::prelude::*; use wasm_bindgen::JsCast as _; +#[derive(Clone)] +pub(crate) enum WebSocketEvent { + Connected(JsValue), + Disconnected(JsValue), + Message(MessageEvent), + Error(JsValue), +} + pub(crate) fn connect( url: &str, + msg: fn(WebSocketEvent) -> crate::Msg, orders: &mut impl Orders<crate::Msg>, ) -> WebSocket { let ws = WebSocket::new(url).unwrap(); register_ws_handler( WebSocket::set_onopen, - crate::Msg::Connected, + WebSocketEvent::Connected, + msg, &ws, orders, ); register_ws_handler( WebSocket::set_onclose, - crate::Msg::Disconnected, + WebSocketEvent::Disconnected, + msg, &ws, orders, ); register_ws_handler( WebSocket::set_onmessage, - crate::Msg::Message, + WebSocketEvent::Message, + msg, &ws, orders, ); register_ws_handler( WebSocket::set_onerror, - crate::Msg::Error, + WebSocketEvent::Error, + msg, &ws, orders, ); @@ -38,16 +51,17 @@ pub(crate) fn connect( fn register_ws_handler<T, F>( ws_cb_setter: fn(&WebSocket, Option<&js_sys::Function>), msg: F, + ws_msg: fn(WebSocketEvent) -> crate::Msg, ws: &web_sys::WebSocket, orders: &mut impl Orders<crate::Msg>, ) where T: wasm_bindgen::convert::FromWasmAbi + 'static, - F: Fn(T) -> crate::Msg + 'static, + F: Fn(T) -> WebSocketEvent + 'static, { let (app, msg_mapper) = (orders.clone_app(), orders.msg_mapper()); let closure = Closure::new(move |data| { - app.update(msg_mapper(msg(data))); + app.update(msg_mapper(ws_msg(msg(data)))); }); ws_cb_setter(ws, Some(closure.as_ref().unchecked_ref())); |