aboutsummaryrefslogtreecommitdiff
path: root/test/bun.js/socket/echo.js
blob: f026377399eee205bda7f229c5c12a13bfc5e3f0 (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
function createOptions(type, message, closeOnDone) {
  let buffers = [];
  let report = function () {
    report = function () {};
    const data = new Uint8Array(
      buffers.reduce(function (sum, buffer) {
        return sum + buffer.length;
      }, 0),
    );
    buffers.reduce(function (offset, buffer) {
      data.set(buffer, offset);
      return offset + buffer.length;
    }, 0);
    console.log(type, "GOT", new TextDecoder().decode(data));
  };

  let done = closeOnDone
    ? function (socket, sent) {
        socket.data[sent ? "sent" : "received"] = true;
        if (socket.data.sent && socket.data.received) {
          done = function () {};
          closeOnDone(socket);
        }
      }
    : function () {};

  function drain(socket) {
    const message = socket.data.message;
    const written = socket.write(message);
    if (written < message.length) {
      socket.data.message = message.slice(written);
    } else {
      done(socket, true);
    }
  }

  return {
    hostname: "localhost",
    port: 12345,
    socket: {
      close() {
        report();
        console.log(type, "CLOSED");
      },
      data(socket, buffer) {
        buffers.push(buffer);
        done(socket);
      },
      drain: drain,
      // end() {
      //   report();
      //   console.log(type, "ENDED");
      // },
      error(socket, err) {
        console.log(type, "ERRED", err);
      },
      open(socket) {
        console.log(type, "OPENED");
        drain(socket);
      },
    },
    data: {
      sent: false,
      received: false,
      message: message,
    },
  };
}

const server = Bun.listen(
  createOptions("[Server]", "response", socket => {
    server.stop();
    socket.end();
  }),
);
Bun.connect(createOptions("[Client]", "request"));