aboutsummaryrefslogtreecommitdiffstats
path: root/teleterm-web
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-11-15 13:31:52 -0500
committerJesse Luehrs <doy@tozt.net>2019-11-15 13:31:52 -0500
commit009454efadc2f3ab6e965cfb6045693cdc7b5021 (patch)
tree722dfa47f01e53043bcc99c9a45cccd742d7d94f /teleterm-web
parentbbf15cfef8134da720a27bd71a93efcb8467025b (diff)
downloadteleterm-009454efadc2f3ab6e965cfb6045693cdc7b5021.tar.gz
teleterm-009454efadc2f3ab6e965cfb6045693cdc7b5021.zip
add basic websocket client
Diffstat (limited to 'teleterm-web')
-rw-r--r--teleterm-web/Cargo.toml13
-rw-r--r--teleterm-web/src/lib.rs49
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(())
+}