mirror of
https://github.com/oven-sh/bun
synced 2026-02-10 02:48:50 +00:00
`Bun.listen()` and `Bun.connect()` would create sockets that under certain conditions with calls to `.end()` or `.stop`, prevents the process from exiting gracefully.
71 lines
1.7 KiB
JavaScript
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"));
|