aboutsummaryrefslogtreecommitdiffstats
path: root/teleterm-web/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'teleterm-web/src/lib.rs')
-rw-r--r--teleterm-web/src/lib.rs99
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();
}