diff options
author | Jesse Luehrs <doy@tozt.net> | 2019-11-15 13:31:52 -0500 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2019-11-15 13:31:52 -0500 |
commit | 009454efadc2f3ab6e965cfb6045693cdc7b5021 (patch) | |
tree | 722dfa47f01e53043bcc99c9a45cccd742d7d94f /teleterm-web | |
parent | bbf15cfef8134da720a27bd71a93efcb8467025b (diff) | |
download | teleterm-009454efadc2f3ab6e965cfb6045693cdc7b5021.tar.gz teleterm-009454efadc2f3ab6e965cfb6045693cdc7b5021.zip |
add basic websocket client
Diffstat (limited to 'teleterm-web')
-rw-r--r-- | teleterm-web/Cargo.toml | 13 | ||||
-rw-r--r-- | teleterm-web/src/lib.rs | 49 |
2 files changed, 62 insertions, 0 deletions
diff --git a/teleterm-web/Cargo.toml b/teleterm-web/Cargo.toml new file mode 100644 index 0000000..1793db3 --- /dev/null +++ b/teleterm-web/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "teleterm-web" +version = "0.1.0" +authors = ["Jesse Luehrs <doy@tozt.net>"] +edition = "2018" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +wasm-bindgen = "0.2" +web-sys = { version = "0.3", features = ["ErrorEvent", "MessageEvent", +"WebSocket"]} diff --git a/teleterm-web/src/lib.rs b/teleterm-web/src/lib.rs new file mode 100644 index 0000000..eeba28f --- /dev/null +++ b/teleterm-web/src/lib.rs @@ -0,0 +1,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(()) +} |