diff options
author | Andrey Trebler <at@edrilling.no> | 2020-05-04 18:27:06 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-04 12:27:06 -0400 |
commit | 796fc9bc3e8e4da7d53fb4617511ce4e2be22485 (patch) | |
tree | d2c140fcfb95a102b4b7b241f8edfe8fc7a971fe /std/ws/example_server.ts | |
parent | 38ecabf205336c2cf51f2a18919da3dcb1a7db97 (diff) |
BREAKING: make WebSocket directly implement AsyncIterable (#5044) (#5045)
Diffstat (limited to 'std/ws/example_server.ts')
-rw-r--r-- | std/ws/example_server.ts | 83 |
1 files changed, 40 insertions, 43 deletions
diff --git a/std/ws/example_server.ts b/std/ws/example_server.ts index 048198326..947b807ca 100644 --- a/std/ws/example_server.ts +++ b/std/ws/example_server.ts @@ -4,55 +4,52 @@ import { acceptWebSocket, isWebSocketCloseEvent, isWebSocketPingEvent, - WebSocket, } from "./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 { headers, conn } = req; - acceptWebSocket({ - conn, - headers, - bufReader: req.r, - bufWriter: req.w, - }) - .then( - async (sock: WebSocket): Promise<void> => { - console.log("socket connected!"); - const it = sock.receive(); - while (true) { - try { - const { done, value } = await it.next(); - if (done) { - break; - } - const ev = value; - 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 (e) { - console.error(`failed to receive frame: ${e}`); - await sock.close(1000).catch(console.error); - } + const { conn, r: bufReader, w: bufWriter, headers } = req; + + try { + const sock = await 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: Error): void => { - console.error(`failed to accept websocket: ${err}`); - }); + } 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 }); + } } |