aboutsummaryrefslogtreecommitdiff
path: root/src/js/node/net.js
diff options
context:
space:
mode:
authorGravatar dave caruso <me@paperdave.net> 2023-09-14 20:30:30 -0400
committerGravatar GitHub <noreply@github.com> 2023-09-14 17:30:30 -0700
commite8d58f24af4e3e12794894b2419d5cb37960b77e (patch)
tree381ad2d4d4d5aa418d437abb6b7ab14655b9f814 /src/js/node/net.js
parent07b10bbc16ab16ba73f3990f3b888e98661aabea (diff)
downloadbun-e8d58f24af4e3e12794894b2419d5cb37960b77e.tar.gz
bun-e8d58f24af4e3e12794894b2419d5cb37960b77e.tar.zst
bun-e8d58f24af4e3e12794894b2419d5cb37960b77e.zip
fix(runtime): emit `node:net` connect error event vs throw (#5336)
* fix(runtime): emit `node:net` connect error event vs throw * oops * finally * ok * we are good
Diffstat (limited to 'src/js/node/net.js')
-rw-r--r--src/js/node/net.js120
1 files changed, 67 insertions, 53 deletions
diff --git a/src/js/node/net.js b/src/js/node/net.js
index f0873ae22..5283538c3 100644
--- a/src/js/node/net.js
+++ b/src/js/node/net.js
@@ -66,6 +66,11 @@ const bunSocketServerOptions = Symbol.for("::bunnetserveroptions::");
const bunSocketInternal = Symbol.for("::bunnetsocketinternal::");
const bunTLSConnectOptions = Symbol.for("::buntlsconnectoptions::");
+function endNT(socket, callback, err) {
+ socket.end();
+ callback(err);
+}
+
var SocketClass;
const Socket = (function (InternalSocket) {
SocketClass = InternalSocket;
@@ -446,34 +451,11 @@ const Socket = (function (InternalSocket) {
} else if (connectListener) this.on("connect", connectListener);
// start using existing connection
- if (connection) {
- const socket = connection[bunSocketInternal];
-
- if (socket) {
- this.connecting = true;
- this.#upgraded = true;
- const result = socket.upgradeTLS({
- data: this,
- tls,
- socket: Socket.#Handlers,
- });
- if (result) {
- const [raw, tls] = result;
- // replace socket
- connection[bunSocketInternal] = raw;
- raw.timeout(raw.timeout);
- raw.connecting = false;
- this[bunSocketInternal] = tls;
- } else {
- this[bunSocketInternal] = null;
- throw new Error("Invalid socket");
- }
- } else {
- // wait to be connected
- connection.once("connect", () => {
- const socket = connection[bunSocketInternal];
- if (!socket) return;
+ try {
+ if (connection) {
+ const socket = connection[bunSocketInternal];
+ if (socket) {
this.connecting = true;
this.#upgraded = true;
const result = socket.upgradeTLS({
@@ -481,7 +463,6 @@ const Socket = (function (InternalSocket) {
tls,
socket: Socket.#Handlers,
});
-
if (result) {
const [raw, tls] = result;
// replace socket
@@ -493,38 +474,66 @@ const Socket = (function (InternalSocket) {
this[bunSocketInternal] = null;
throw new Error("Invalid socket");
}
+ } else {
+ // wait to be connected
+ connection.once("connect", () => {
+ const socket = connection[bunSocketInternal];
+ if (!socket) return;
+
+ this.connecting = true;
+ this.#upgraded = true;
+ const result = socket.upgradeTLS({
+ data: this,
+ tls,
+ socket: Socket.#Handlers,
+ });
+
+ if (result) {
+ const [raw, tls] = result;
+ // replace socket
+ connection[bunSocketInternal] = raw;
+ raw.timeout(raw.timeout);
+ raw.connecting = false;
+ this[bunSocketInternal] = tls;
+ } else {
+ this[bunSocketInternal] = null;
+ throw new Error("Invalid socket");
+ }
+ });
+ }
+ } else if (path) {
+ // start using unix socket
+ bunConnect({
+ data: this,
+ unix: path,
+ socket: Socket.#Handlers,
+ tls,
+ }).catch(error => {
+ this.emit("error", error);
+ this.emit("close");
+ });
+ } else {
+ // default start
+ bunConnect({
+ data: this,
+ hostname: host || "localhost",
+ port: port,
+ socket: Socket.#Handlers,
+ tls,
+ }).catch(error => {
+ this.emit("error", error);
+ this.emit("close");
});
}
- } else if (path) {
- // start using unix socket
- bunConnect({
- data: this,
- unix: path,
- socket: Socket.#Handlers,
- tls,
- }).catch(error => {
- this.emit("error", error);
- this.emit("close");
- });
- } else {
- // default start
- bunConnect({
- data: this,
- hostname: host || "localhost",
- port: port,
- socket: Socket.#Handlers,
- tls,
- }).catch(error => {
- this.emit("error", error);
- this.emit("close");
- });
+ } catch (error) {
+ process.nextTick(emitErrorAndCloseNextTick, this, error);
}
return this;
}
_destroy(err, callback) {
- this[bunSocketInternal]?.end();
- callback(err);
+ const socket = this[bunSocketInternal];
+ socket && process.nextTick(endNT, socket, callback, err);
}
_final(callback) {
@@ -864,6 +873,11 @@ function emitErrorNextTick(self, error) {
self.emit("error", error);
}
+function emitErrorAndCloseNextTick(self, error) {
+ self.emit("error", error);
+ self.emit("close");
+}
+
function emitListeningNextTick(self, onListen) {
if (typeof onListen === "function") {
try {