From 430beebc46be1dc87a993c2f7442c5c22076f458 Mon Sep 17 00:00:00 2001 From: Yusuke Sakurai Date: Fri, 5 Jun 2020 04:13:33 +0900 Subject: [PATCH] doc: Improved ws example and README (#5636) --- std/ws/README.md | 88 +++++++++++++++++++++------------------- std/ws/example_server.ts | 81 ++++++++++++++++++------------------ std/ws/example_test.ts | 2 + std/ws/test.ts | 4 +- 4 files changed, 91 insertions(+), 84 deletions(-) create mode 100644 std/ws/example_test.ts diff --git a/std/ws/README.md b/std/ws/README.md index c166a5fb6b..0c3b7a2a27 100644 --- a/std/ws/README.md +++ b/std/ws/README.md @@ -7,58 +7,62 @@ ws module is made to provide helpers to create WebSocket client/server. ### Server ```ts -import { serve } from "https://deno.land/std/http/server.ts"; +// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. +import { serve } from "../../http/server.ts"; import { acceptWebSocket, isWebSocketCloseEvent, isWebSocketPingEvent, -} from "https://deno.land/std/ws/mod.ts"; - -/** websocket echo server */ -const port = Deno.args[0] || "8080"; -console.log(`websocket server is running on :${port}`); -for await (const req of serve(`:${port}`)) { - const { conn, r: bufReader, w: bufWriter, headers } = req; + WebSocket, +} from "../../ws/mod.ts"; +async function handleWs(sock: WebSocket) { + console.log("socket connected!"); try { - const sock = await acceptWebSocket({ + for await (const ev of sock) { + if (typeof ev === "string") { + // text message + console.log("ws:Text", ev); + await sock.send(ev); + } else if (ev instanceof Uint8Array) { + // binary message + console.log("ws:Binary", ev); + } else if (isWebSocketPingEvent(ev)) { + const [, body] = ev; + // ping + console.log("ws:Ping", body); + } else if (isWebSocketCloseEvent(ev)) { + // close + const { code, reason } = ev; + console.log("ws:Close", code, reason); + } + } + } catch (err) { + console.error(`failed to receive frame: ${err}`); + + if (!sock.isClosed) { + await sock.close(1000).catch(console.error); + } + } +} + +if (import.meta.main) { + /** websocket echo server */ + const port = Deno.args[0] || "8080"; + console.log(`websocket server is running on :${port}`); + for await (const req of serve(`:${port}`)) { + const { conn, r: bufReader, w: bufWriter, headers } = req; + acceptWebSocket({ conn, bufReader, bufWriter, headers, - }); - - console.log("socket connected!"); - - try { - for await (const ev of sock) { - if (typeof ev === "string") { - // text message - console.log("ws:Text", ev); - await sock.send(ev); - } else if (ev instanceof Uint8Array) { - // binary message - console.log("ws:Binary", ev); - } else if (isWebSocketPingEvent(ev)) { - const [, body] = ev; - // ping - console.log("ws:Ping", body); - } else if (isWebSocketCloseEvent(ev)) { - // close - const { code, reason } = ev; - console.log("ws:Close", code, reason); - } - } - } catch (err) { - console.error(`failed to receive frame: ${err}`); - - if (!sock.isClosed) { - await sock.close(1000).catch(console.error); - } - } - } catch (err) { - console.error(`failed to accept websocket: ${err}`); - await req.respond({ status: 400 }); + }) + .then(handleWs) + .catch(async (e) => { + console.error(`failed to accept websocket: ${err}`); + await req.respond({ status: 400 }); + }); } } ``` diff --git a/std/ws/example_server.ts b/std/ws/example_server.ts index 3a98159571..0d0b286079 100644 --- a/std/ws/example_server.ts +++ b/std/ws/example_server.ts @@ -4,54 +4,55 @@ import { acceptWebSocket, isWebSocketCloseEvent, isWebSocketPingEvent, + WebSocket, } from "./mod.ts"; +async function handleWs(sock: WebSocket): Promise { + console.log("socket connected!"); + try { + for await (const ev of sock) { + if (typeof ev === "string") { + // text message + console.log("ws:Text", ev); + await sock.send(ev); + } else if (ev instanceof Uint8Array) { + // binary message + console.log("ws:Binary", ev); + } else if (isWebSocketPingEvent(ev)) { + const [, body] = ev; + // ping + console.log("ws:Ping", body); + } else if (isWebSocketCloseEvent(ev)) { + // close + const { code, reason } = ev; + console.log("ws:Close", code, reason); + } + } + } catch (err) { + console.error(`failed to receive frame: ${err}`); + + if (!sock.isClosed) { + await sock.close(1000).catch(console.error); + } + } +} + if (import.meta.main) { /** websocket echo server */ const port = Deno.args[0] || "8080"; console.log(`websocket server is running on :${port}`); for await (const req of serve(`:${port}`)) { const { conn, r: bufReader, w: bufWriter, headers } = req; - - try { - const sock = await acceptWebSocket({ - conn, - bufReader, - bufWriter, - headers, + acceptWebSocket({ + conn, + bufReader, + bufWriter, + headers, + }) + .then(handleWs) + .catch(async (e) => { + console.error(`failed to accept websocket: ${e}`); + await req.respond({ status: 400 }); }); - - console.log("socket connected!"); - - try { - for await (const ev of sock) { - if (typeof ev === "string") { - // text message - console.log("ws:Text", ev); - await sock.send(ev); - } else if (ev instanceof Uint8Array) { - // binary message - console.log("ws:Binary", ev); - } else if (isWebSocketPingEvent(ev)) { - const [, body] = ev; - // ping - console.log("ws:Ping", body); - } else if (isWebSocketCloseEvent(ev)) { - // close - const { code, reason } = ev; - console.log("ws:Close", code, reason); - } - } - } catch (err) { - console.error(`failed to receive frame: ${err}`); - - if (!sock.isClosed) { - await sock.close(1000).catch(console.error); - } - } - } catch (err) { - console.error(`failed to accept websocket: ${err}`); - await req.respond({ status: 400 }); - } } } diff --git a/std/ws/example_test.ts b/std/ws/example_test.ts new file mode 100644 index 0000000000..7e68dc38b4 --- /dev/null +++ b/std/ws/example_test.ts @@ -0,0 +1,2 @@ +import "./example_client.ts"; +import "./example_server.ts"; diff --git a/std/ws/test.ts b/std/ws/test.ts index a1c396b186..9ef6ff94b3 100644 --- a/std/ws/test.ts +++ b/std/ws/test.ts @@ -283,8 +283,8 @@ function dummyConn(r: Reader, w: Writer): Conn { return { rid: -1, closeWrite: (): void => {}, - read: (x): Promise => r.read(x), - write: (x): Promise => w.write(x), + read: (x: Uint8Array): Promise => r.read(x), + write: (x: Uint8Array): Promise => w.write(x), close: (): void => {}, localAddr: { transport: "tcp", hostname: "0.0.0.0", port: 0 }, remoteAddr: { transport: "tcp", hostname: "0.0.0.0", port: 0 },