aboutsummaryrefslogtreecommitdiff
path: root/test/bun.js/websocket-server.test.ts
blob: c40ee7c8b2fc9a61c0441e8940408849245cd9a9 (plain) (blame)
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import { file, gc, serve } from "bun";
import { afterEach, describe, it, expect } from "bun:test";
import { readFileSync } from "fs";
import { resolve } from "path";

var port = 4321;
function getPort() {
  if (port > 4444) {
    port = 4321;
  }

  return port++;
}

describe("websocket server", () => {
  it("can do hello world", async () => {
    var server = serve({
      port: getPort(),
      websocket: {
        open(ws) {
          ws.send("hello world");
        },
        message(ws, msg) {},
      },
      fetch(req) {
        return new Response("noooooo hello world");
      },
    });

    await new Promise((resolve, reject) => {
      const websocket = new WebSocket(`ws://localhost:${server.port}`);

      websocket.onmessage = (e) => {
        try {
          expect(e.data).toBe("hello world");
          resolve();
        } catch (r) {
          reject(r);
          return;
        } finally {
          server?.stop();
          websocket.close();
        }
      };
      websocket.onerror = (e) => {
        reject(e);
      };
    });
  });

  it("can do some back and forth", async () => {
    var dataCount = 0;
    var server = serve({
      port: getPort(),
      websocket: {
        accept(ws) {
          return { count: 0 };
        },
        open(ws) {
          ws.send("first");
        },
        message(ws, msg) {
          ws.send(`counter: ${dataCount++}`);
        },
      },
      fetch(req) {
        return new Response("noooooo hello world");
      },
    });

    await new Promise((resolve, reject) => {
      const websocket = new WebSocket(`ws://localhost:${server.port}`);

      var counter = 0;
      websocket.onmessage = (e) => {
        try {
          switch (counter++) {
            case 0: {
              expect(e.data).toBe("first");
              websocket.send("where are the loops");
              break;
            }
            case 1: {
              expect(e.data).toBe("counter: 0");
              websocket.send("br0ther may i have some loops");
              break;
            }
            case 2: {
              expect(e.data).toBe("counter: 1");
              websocket.send("br0ther may i have some loops");
              break;
            }
            case 3: {
              expect(e.data).toBe("counter: 2");
              resolve();
              break;
            }
          }
        } catch (r) {
          reject(r);
          console.error(r);
          server?.stop();
          console.log("i am closing!");
          websocket.close();
          return;
        } finally {
        }
      };
      websocket.onerror = (e) => {
        reject(e);
      };
    });
  });
});