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