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"));
|