diff options
author | 2023-01-02 12:24:23 +0200 | |
---|---|---|
committer | 2023-01-02 02:24:23 -0800 | |
commit | 04b00229cf2408d4af742cb4cc890fd76c4fad1b (patch) | |
tree | c4acccebe3b3d01f9c3cdaa8778786ad67f14678 /test/bun.js/socket/echo.js | |
parent | 8a29c643025c73312da001c5fa4caf0ccf0528fa (diff) | |
download | bun-04b00229cf2408d4af742cb4cc890fd76c4fad1b.tar.gz bun-04b00229cf2408d4af742cb4cc890fd76c4fad1b.tar.zst bun-04b00229cf2408d4af742cb4cc890fd76c4fad1b.zip |
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.
Diffstat (limited to 'test/bun.js/socket/echo.js')
-rw-r--r-- | test/bun.js/socket/echo.js | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/test/bun.js/socket/echo.js b/test/bun.js/socket/echo.js new file mode 100644 index 000000000..e864f1b2b --- /dev/null +++ b/test/bun.js/socket/echo.js @@ -0,0 +1,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")); |