allow connecting a socket again after its connection was closed (#10781)

Co-authored-by: Georgijs Vilums <=>
Co-authored-by: gvilums <gvilums@users.noreply.github.com>
This commit is contained in:
Georgijs
2024-05-02 20:36:58 -07:00
committed by GitHub
parent 94bf404c41
commit ec6110e7e3
2 changed files with 35 additions and 2 deletions

View File

@@ -598,6 +598,11 @@ const Socket = (function (InternalSocket) {
} catch (error) {
process.nextTick(emitErrorAndCloseNextTick, this, error);
}
// reset the underlying writable object when establishing a new connection
// this is a function on `Duplex`, originally defined on `Writable`
// https://github.com/nodejs/node/blob/c5cfdd48497fe9bd8dbd55fd1fca84b321f48ec1/lib/net.js#L311
// https://github.com/nodejs/node/blob/c5cfdd48497fe9bd8dbd55fd1fca84b321f48ec1/lib/net.js#L1126
this._undestroy();
return this;
}

View File

@@ -1,6 +1,6 @@
import { ServerWebSocket, TCPSocket, Socket as _BunSocket, TCPSocketListener } from "bun";
import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from "bun:test";
import { connect, isIP, isIPv4, isIPv6, Socket, createConnection } from "net";
import { connect, isIP, isIPv4, isIPv6, Socket, createConnection, Server } from "net";
import { realpathSync, mkdtempSync } from "fs";
import { tmpdir } from "os";
import { join } from "path";
@@ -35,7 +35,7 @@ it("should support net.isIPv6()", () => {
describe("net.Socket read", () => {
var unix_servers = 0;
for (let [message, label] of [
// ["Hello World!".repeat(1024), "long message"],
["Hello World!".repeat(1024), "long message"],
["Hello!", "short message"],
]) {
describe(label, () => {
@@ -354,6 +354,34 @@ describe("net.Socket write", () => {
socket.end();
}),
);
it("should allow reconnecting after end()", async () => {
const server = new Server(socket => socket.end());
const port = await new Promise(resolve => {
server.once("listening", () => resolve(server.address().port));
server.listen();
});
const socket = new Socket();
socket.on("data", data => console.log(data.toString()));
socket.on("error", err => console.error(err));
async function run() {
return new Promise((resolve, reject) => {
socket.once("connect", (...args) => {
socket.write("script\n", err => {
if (err) return reject(err);
socket.end(() => setTimeout(resolve, 3));
});
});
socket.connect(port, "127.0.0.1");
});
}
for (let i = 0; i < 10; i++) {
await run();
}
});
});
it("should handle connection error", done => {