summaryrefslogtreecommitdiff
path: root/std/ws/example_server.ts
blob: cd51ff94c7d722f1426cdbff69dc9b9bce531475 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
import { serve } from "../http/server.ts";
import {
  acceptWebSocket,
  isWebSocketCloseEvent,
  isWebSocketPingEvent,
  WebSocket
} from "./mod.ts";

/** websocket echo server */
const port = Deno.args[1] || "8080";
async function main(): Promise<void> {
  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);
            }
          }
        }
      )
      .catch(
        (err: Error): void => {
          console.error(`failed to accept websocket: ${err}`);
        }
      );
  }
}

if (import.meta.main) {
  main();
}