diff options
| author | Yusuke Sakurai <kerokerokerop@gmail.com> | 2019-05-15 04:19:12 +0900 |
|---|---|---|
| committer | Ryan Dahl <ry@tinyclouds.org> | 2019-05-14 15:19:11 -0400 |
| commit | e3e9269c76299df99975e17a04b4d1b1ca39dfcb (patch) | |
| tree | c0bab4773a25589edaea12287c6a8422bd5208f1 /ws/example_client.ts | |
| parent | a3de8c3d8a376049a37f8193c8538acc0d7a88f3 (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.ts | 55 |
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(); +} |
