diff options
Diffstat (limited to 'teleterm-web/src/lib.rs')
-rw-r--r-- | teleterm-web/src/lib.rs | 99 |
1 files changed, 61 insertions, 38 deletions
diff --git a/teleterm-web/src/lib.rs b/teleterm-web/src/lib.rs index 4d3e84d..8b770a5 100644 --- a/teleterm-web/src/lib.rs +++ b/teleterm-web/src/lib.rs @@ -1,5 +1,7 @@ -use wasm_bindgen::prelude::*; -use wasm_bindgen::JsCast as _; +mod prelude; +mod ws; + +use crate::prelude::*; #[wasm_bindgen] extern "C" { @@ -7,44 +9,65 @@ extern "C" { fn log(s: &str); } -#[wasm_bindgen(start)] -pub fn main() -> Result<(), JsValue> { - log("loaded"); - - let ws = web_sys::WebSocket::new("ws://127.0.0.1:4145/watch")?; - - let msg_cb = - Closure::wrap(Box::new(move |event: web_sys::MessageEvent| { - log(&format!("message {:?}", event)); - }) as Box<dyn FnMut(web_sys::MessageEvent)>); - ws.set_onmessage(Some(msg_cb.as_ref().unchecked_ref())); - msg_cb.forget(); - - let err_cb = Closure::wrap(Box::new(move |event: web_sys::ErrorEvent| { - log(&format!("error {:?}", event)); - }) as Box<dyn FnMut(web_sys::ErrorEvent)>); - ws.set_onerror(Some(err_cb.as_ref().unchecked_ref())); - err_cb.forget(); - - let cloned_ws = ws.clone(); - let open_cb = Closure::wrap(Box::new(move |_| { - log("opened"); - match cloned_ws.send_with_str("ping1") { - Ok(_) => log("sent ping1 successfully"), - Err(e) => { - log(&format!("error sending ping: {:?}", e)); - return; +const WATCH_URL: &str = "ws://127.0.0.1:4145/watch"; + +#[derive(Clone)] +enum Msg { + Connected(JsValue), + Disconnected(JsValue), + Message(MessageEvent), + Error(JsValue), +} + +struct Model { + ws: 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 }) +} + +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; + } } - } - match cloned_ws.send_with_str("ping2") { - Ok(_) => log("sent ping2 successfully"), - Err(e) => { - log(&format!("error sending ping: {:?}", e)); + match model.ws.send_with_str("ping2") { + Ok(_) => log("sent ping2 successfully"), + Err(e) => { + log(&format!("error sending ping: {:?}", e)); + } } } - }) as Box<dyn FnMut(JsValue)>); - ws.set_onopen(Some(open_cb.as_ref().unchecked_ref())); - open_cb.forget(); + Msg::Disconnected(_) => { + log("disconnected"); + } + Msg::Message(msg) => { + log(&format!("message {:?}", msg)); + } + Msg::Error(e) => { + log(&format!("error {:?}", e)); + } + } +} + +fn view(_model: &Model) -> impl View<Msg> { + log("view"); + vec![seed::h1!["it's a seed app"]] +} - Ok(()) +#[wasm_bindgen(start)] +pub fn start() { + log("start"); + seed::App::build(init, update, view).build_and_start(); } |