aboutsummaryrefslogtreecommitdiff
path: root/test/bun.js/socket/echo.js
blob: e864f1b2b9f6ddf7d4583c998163d03cae4a8d9d (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
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"));