aboutsummaryrefslogtreecommitdiffstats
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
parentbbf15cfef8134da720a27bd71a93efcb8467025b (diff)
downloadteleterm-009454efadc2f3ab6e965cfb6045693cdc7b5021.tar.gz
teleterm-009454efadc2f3ab6e965cfb6045693cdc7b5021.zip
add basic websocket client
-rw-r--r--Cargo.lock142
-rw-r--r--Cargo.toml3
-rw-r--r--Makefile10
-rw-r--r--teleterm-web/Cargo.toml13
-rw-r--r--teleterm-web/src/lib.rs49
5 files changed, 214 insertions, 3 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 40fbea6..b74188c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -25,6 +25,12 @@ dependencies = [
]
[[package]]
+name = "anyhow"
+version = "1.0.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57114fc2a6cc374bce195d3482057c846e706d252ff3604363449695684d7a0d"
+
+[[package]]
name = "arc-swap"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -177,6 +183,12 @@ dependencies = [
]
[[package]]
+name = "bumpalo"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad807f2fc2bf185eeb98ff3a901bd46dc5ad58163d0fa4577ba0d25674d71708"
+
+[[package]]
name = "byte-tools"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -785,6 +797,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1de41fb8dba9714efd92241565cdff73f78508c95697dd56787d3cba27e2353"
[[package]]
+name = "heck"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205"
+dependencies = [
+ "unicode-segmentation",
+]
+
+[[package]]
name = "hermit-abi"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -942,6 +963,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f"
[[package]]
+name = "js-sys"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8657b7ca06a6044ece477f6900bf7670f8b5fd0cce177a1d7094eef51e0adf4"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
name = "kernel32-sys"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1888,6 +1918,12 @@ dependencies = [
]
[[package]]
+name = "sourcefile"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3"
+
+[[package]]
name = "spin"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1991,6 +2027,14 @@ dependencies = [
]
[[package]]
+name = "teleterm-web"
+version = "0.1.0"
+dependencies = [
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
name = "tempdir"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2473,6 +2517,12 @@ dependencies = [
]
[[package]]
+name = "unicode-segmentation"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0"
+
+[[package]]
name = "unicode-width"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2627,6 +2677,89 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d"
[[package]]
+name = "wasm-bindgen"
+version = "0.2.54"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4568ae1b4e07ca907b1a4de41174eaa3e5be4066c024475586b7842725f69a9"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.54"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a00cfdce37367770062065fd3abb9278cbae86a0d918cacd0978a7acd51b481"
+dependencies = [
+ "bumpalo",
+ "lazy_static",
+ "log",
+ "proc-macro2 1.0.6",
+ "quote 1.0.2",
+ "syn 1.0.7",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.54"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c568f4d3cf6d7c1d72b165daf778fb0d6e09a24f96ac14fc8c4f66a96e86b72"
+dependencies = [
+ "quote 1.0.2",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.54"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "430d12539ae324d16097b399e9d07a6d5ce0173b2a61a2d02346ca7c198daffe"
+dependencies = [
+ "proc-macro2 1.0.6",
+ "quote 1.0.2",
+ "syn 1.0.7",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.54"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae7167f0bbffd7fac2b12da0fa1f834c1d84671a1ae3c93ac8bde2e97179c39"
+
+[[package]]
+name = "wasm-bindgen-webidl"
+version = "0.2.54"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3021567c515a746a64ad0b269d120d46e687c0c95702a4750623db935ae6b5e7"
+dependencies = [
+ "anyhow",
+ "heck",
+ "log",
+ "proc-macro2 1.0.6",
+ "quote 1.0.2",
+ "syn 1.0.7",
+ "wasm-bindgen-backend",
+ "weedle",
+]
+
+[[package]]
+name = "web-sys"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce8e893e021539beb87de8f06e77bdb390a3ab0db4cfeb569c4e377b55ed20de"
+dependencies = [
+ "anyhow",
+ "js-sys",
+ "sourcefile",
+ "wasm-bindgen",
+ "wasm-bindgen-webidl",
+]
+
+[[package]]
name = "webpki"
version = "0.19.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2637,6 +2770,15 @@ dependencies = [
]
[[package]]
+name = "weedle"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3bb43f70885151e629e2a19ce9e50bd730fd436cfd4b666894c9ce4de9141164"
+dependencies = [
+ "nom",
+]
+
+[[package]]
name = "winapi"
version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/Cargo.toml b/Cargo.toml
index ef797b3..d5299d2 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,2 +1,3 @@
[workspace]
-members = ["teleterm"]
+members = ["teleterm", "teleterm-web"]
+default-members = ["teleterm"]
diff --git a/Makefile b/Makefile
index 12d76a0..35d4c02 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,5 @@
-NAME = $(shell cargo read-manifest | jq -r '.name')
-VERSION = $(shell cargo read-manifest | jq -r '.version')
+NAME = $(shell cargo metadata --no-deps --format-version 1 --manifest-path teleterm/Cargo.toml | jq -r '.name')
+VERSION = $(shell cargo metadata --no-deps --format-version 1 --manifest-path teleterm/Cargo.toml | jq -r '.version')
INTERACTIVE_SUBCOMMANDS = stream watch record play
NONINTERACTIVE_SUBCOMMANDS = server
@@ -94,3 +94,9 @@ publish-arch: test pkg/$(ARCH_PACKAGE) pkg/$(ARCH_PACKAGE).minisig release-dir-a
install-arch: pkg/$(ARCH_PACKAGE)
@sudo pacman -U pkg/$(ARCH_PACKAGE)
.PHONY: install-arch
+
+wasm: target/wasm/teleterm_web_bg.wasm
+.PHONY: wasm
+
+target/wasm/teleterm_web_bg.wasm: teleterm-web/Cargo.toml teleterm-web/src/lib.rs
+ @wasm-pack build --no-typescript --target web --out-dir ../target/wasm teleterm-web
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(())
+}