Files
bun.sh/test/bun.js/socket/echo.js
Alex Lam S.L 04b00229cf fix lingering process by dead sockets (#1700)
`Bun.listen()` and `Bun.connect()` would create sockets that under certain conditions with calls to `.end()` or `.stop`,  prevents the process from exiting gracefully.
2023-01-02 02:24:23 -08:00

71 lines
1.7 KiB
JavaScript

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