aboutsummaryrefslogtreecommitdiffstats
path: root/teleterm-web/src/lib.rs
blob: eeba28fa97293cd4f97540b253220e228b7857f1 (plain) (blame)
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
use wasm_bindgen::prelude::*;
use wasm_bindgen::JsCast as _;

#[wasm_bindgen]
extern "C" {
    #[wasm_bindgen(js_namespace = console)]
    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/ws")?;

    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;
            }
        }
        match cloned_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();

    Ok(())
}