summaryrefslogtreecommitdiff
path: root/ws/example_client.ts
diff options
context:
space:
mode:
authorYusuke Sakurai <kerokerokerop@gmail.com>2019-05-15 04:19:12 +0900
committerRyan Dahl <ry@tinyclouds.org>2019-05-14 15:19:11 -0400
commite3e9269c76299df99975e17a04b4d1b1ca39dfcb (patch)
treec0bab4773a25589edaea12287c6a8422bd5208f1 /ws/example_client.ts
parenta3de8c3d8a376049a37f8193c8538acc0d7a88f3 (diff)
feat: ws client (denoland/deno_std#394)
Original: https://github.com/denoland/deno_std/commit/782e3f690ffb9ee0dd89a5a64a3f2b753899719b
Diffstat (limited to 'ws/example_client.ts')
-rw-r--r--ws/example_client.ts55
1 files changed, 55 insertions, 0 deletions
diff --git a/ws/example_client.ts b/ws/example_client.ts
new file mode 100644
index 000000000..16f37d021
--- /dev/null
+++ b/ws/example_client.ts
@@ -0,0 +1,55 @@
+import {
+ connectWebSocket,
+ isWebSocketCloseEvent,
+ isWebSocketPingEvent,
+ isWebSocketPongEvent
+} from "../ws/mod.ts";
+import { encode } from "../strings/strings.ts";
+import { BufReader } from "../io/bufio.ts";
+import { TextProtoReader } from "../textproto/mod.ts";
+import { blue, green, red, yellow } from "../colors/mod.ts";
+
+const endpoint = Deno.args[1] || "ws://127.0.0.1:8080";
+/** simple websocket cli */
+async function main(): Promise<void> {
+ const sock = await connectWebSocket(endpoint);
+ console.log(green("ws connected! (type 'close' to quit)"));
+ (async function(): Promise<void> {
+ for await (const msg of sock.receive()) {
+ if (typeof msg === "string") {
+ console.log(yellow("< " + msg));
+ } else if (isWebSocketPingEvent(msg)) {
+ console.log(blue("< ping"));
+ } else if (isWebSocketPongEvent(msg)) {
+ console.log(blue("< pong"));
+ } else if (isWebSocketCloseEvent(msg)) {
+ console.log(red(`closed: code=${msg.code}, reason=${msg.reason}`));
+ }
+ }
+ })();
+ const tpr = new TextProtoReader(new BufReader(Deno.stdin));
+ while (true) {
+ await Deno.stdout.write(encode("> "));
+ const [line, err] = await tpr.readLine();
+ if (err) {
+ console.error(red(`failed to read line from stdin: ${err}`));
+ break;
+ }
+ if (line === "close") {
+ break;
+ } else if (line === "ping") {
+ await sock.ping();
+ } else {
+ await sock.send(line);
+ }
+ // FIXME: Without this, sock.receive() won't resolved though it is readable...
+ await new Promise((resolve): void => setTimeout(resolve, 0));
+ }
+ await sock.close(1000);
+ // FIXME: conn.close() won't shutdown process...
+ Deno.exit(0);
+}
+
+if (import.meta.main) {
+ main();
+}