From 6ba858dfbb4da78dccf6aacc299930a0428e6d7b Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Fri, 7 Mar 2025 00:31:41 -0800 Subject: [PATCH] node: fix test-net-connect-reset.js (#17823) --- src/bun.js/bindings/ErrorCode.cpp | 4 ++++ src/js/builtins.d.ts | 2 ++ src/js/node/net.ts | 16 +++++++++++----- .../node/test/parallel/test-net-connect-reset.js | 13 +++++++++++++ 4 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 test/js/node/test/parallel/test-net-connect-reset.js diff --git a/src/bun.js/bindings/ErrorCode.cpp b/src/bun.js/bindings/ErrorCode.cpp index 898b363ae4..270380e662 100644 --- a/src/bun.js/bindings/ErrorCode.cpp +++ b/src/bun.js/bindings/ErrorCode.cpp @@ -1635,6 +1635,10 @@ JSC_DEFINE_HOST_FUNCTION(Bun::jsFunctionMakeErrorWithCode, (JSC::JSGlobalObject return JSC::JSValue::encode(createError(globalObject, ErrorCode::ERR_DIR_CLOSED, "Directory handle was closed"_s)); case ErrorCode::ERR_SERVER_ALREADY_LISTEN: return JSC::JSValue::encode(createError(globalObject, ErrorCode::ERR_SERVER_ALREADY_LISTEN, "Listen method has been called more than once without closing."_s)); + case ErrorCode::ERR_SOCKET_CLOSED: + return JSC::JSValue::encode(createError(globalObject, ErrorCode::ERR_SOCKET_CLOSED, "Socket is closed"_s)); + case ErrorCode::ERR_SOCKET_CLOSED_BEFORE_CONNECTION: + return JSC::JSValue::encode(createError(globalObject, ErrorCode::ERR_SOCKET_CLOSED_BEFORE_CONNECTION, "Socket closed before the connection was established"_s)); default: { break; diff --git a/src/js/builtins.d.ts b/src/js/builtins.d.ts index db1705497e..365ca07a67 100644 --- a/src/js/builtins.d.ts +++ b/src/js/builtins.d.ts @@ -636,6 +636,8 @@ declare function $ERR_STREAM_PUSH_AFTER_EOF(): Error; declare function $ERR_STREAM_UNABLE_TO_PIPE(): Error; declare function $ERR_ILLEGAL_CONSTRUCTOR(): TypeError; declare function $ERR_SERVER_ALREADY_LISTEN(): Error; +declare function $ERR_SOCKET_CLOSED(): Error; +declare function $ERR_SOCKET_CLOSED_BEFORE_CONNECTION(): Error; /** * Convert a function to a class-like object. diff --git a/src/js/node/net.ts b/src/js/node/net.ts index 485645d61f..85cc101c76 100644 --- a/src/js/node/net.ts +++ b/src/js/node/net.ts @@ -1007,6 +1007,11 @@ const Socket = (function (InternalSocket) { } } + _reset() { + this.resetAndClosing = true; + return this.destroy(); + } + get readyState() { if (this.connecting) return "opening"; if (this.readable) { @@ -1037,13 +1042,14 @@ const Socket = (function (InternalSocket) { resetAndDestroy() { if (this._handle) { if (this.connecting) { - this.once("connect", () => this._handle?.terminate()); + this.once("connect", () => this._reset()); } else { - this._handle.terminate(); + this._reset(); } } else { - this.destroy($ERR_SOCKET_CLOSED_BEFORE_CONNECTION("ERR_SOCKET_CLOSED_BEFORE_CONNECTION")); + this.destroy($ERR_SOCKET_CLOSED()); } + return this; } setKeepAlive(enable = false, initialDelayMsecs = 0) { @@ -1155,7 +1161,7 @@ const Socket = (function (InternalSocket) { this._pendingData = chunk; this._pendingEncoding = encoding; function onClose() { - callback($ERR_SOCKET_CLOSED_BEFORE_CONNECTION("ERR_SOCKET_CLOSED_BEFORE_CONNECTION")); + callback($ERR_SOCKET_CLOSED_BEFORE_CONNECTION()); } this.once("connect", function connect() { this.off("close", onClose); @@ -1168,7 +1174,7 @@ const Socket = (function (InternalSocket) { this.#writeCallback = null; const socket = this._handle; if (!socket) { - callback($ERR_SOCKET_CLOSED("Socket is closed")); + callback($ERR_SOCKET_CLOSED()); return false; } const success = socket.$write(chunk, encoding); diff --git a/test/js/node/test/parallel/test-net-connect-reset.js b/test/js/node/test/parallel/test-net-connect-reset.js new file mode 100644 index 0000000000..1f3e806aa9 --- /dev/null +++ b/test/js/node/test/parallel/test-net-connect-reset.js @@ -0,0 +1,13 @@ +'use strict'; +const common = require('../common'); +const net = require('net'); + +const socket = new net.Socket(); +socket.resetAndDestroy(); +// Emit error if socket is not connecting/connected +socket.on('error', common.mustCall( + common.expectsError({ + code: 'ERR_SOCKET_CLOSED', + name: 'Error' + })) +);