net: emit 'connection' event rather than storing connectionListener seperately + add captureRejectionSymbol

This commit is contained in:
pfg
2025-06-10 15:18:22 -07:00
parent c38bace86c
commit d5711646c8
2 changed files with 32 additions and 13 deletions

View File

@@ -360,7 +360,7 @@ const ServerHandlers: SocketHandler<NetSocket> = {
const self = socket.data as any as NetServer;
socket[kServerSocket] = self._handle;
const options = self[bunSocketServerOptions];
const { pauseOnConnect, connectionListener, [kSocketClass]: SClass, requestCert, rejectUnauthorized } = options;
const { pauseOnConnect, [kSocketClass]: SClass, requestCert, rejectUnauthorized } = options;
const _socket = new SClass({}) as NetSocket | TLSSocket;
_socket.isServer = true;
_socket._requestCert = requestCert;
@@ -409,12 +409,7 @@ const ServerHandlers: SocketHandler<NetSocket> = {
_socket.pause();
}
if (typeof connectionListener === "function") {
this.pauseOnConnect = pauseOnConnect;
if (!isTLS) {
connectionListener.$call(self, _socket);
}
}
this.pauseOnConnect = pauseOnConnect;
self.emit("connection", _socket);
// the duplex implementation start paused, so we resume when pauseOnConnect is falsy
if (!pauseOnConnect && !isTLS) {
@@ -455,10 +450,6 @@ const ServerHandlers: SocketHandler<NetSocket> = {
} else {
self.authorized = true;
}
const connectionListener = server[bunSocketServerOptions]?.connectionListener;
if (typeof connectionListener === "function") {
connectionListener.$call(server, self);
}
server.emit("secureConnection", self);
// after secureConnection event we emmit secure and secureConnect
self.emit("secure", self);
@@ -2073,8 +2064,13 @@ function Server(options?, connectionListener?) {
if (typeof options === "function") {
connectionListener = options;
options = {};
this.on("connection", connectionListener);
} else if (options == null || typeof options === "object") {
options = { ...options };
if (typeof connectionListener === "function") {
this.on("connection", connectionListener);
}
} else {
throw $ERR_INVALID_ARG_TYPE("options", ["Object", "Function"], options);
}
@@ -2105,7 +2101,6 @@ function Server(options?, connectionListener?) {
this.pauseOnConnect = Boolean(pauseOnConnect);
this.noDelay = noDelay;
options.connectionListener = connectionListener;
this[bunSocketServerOptions] = options;
if (options.blockList) {
@@ -2442,6 +2437,16 @@ Server.prototype.getsockname = function getsockname(out) {
return out;
};
Server.prototype[EventEmitter.captureRejectionSymbol] = function (err, event, sock) {
switch (event) {
case "connection":
sock.destroy(err);
break;
default:
this.emit("error", err);
}
};
function emitErrorNextTick(self, error) {
self.emit("error", error);
}

View File

@@ -5,6 +5,7 @@ const { Duplex } = require("node:stream");
const addServerName = $newZigFunction("socket.zig", "jsAddServerName", 3);
const { throwNotImplemented } = require("internal/shared");
const { throwOnInvalidTLSArray, DEFAULT_CIPHERS, validateCiphers } = require("internal/tls");
const EventEmitter = require("node:events");
const { Server: NetServer, Socket: NetSocket } = net;
@@ -501,7 +502,11 @@ function Server(options, secureConnectionListener): void {
return new Server(options, secureConnectionListener);
}
NetServer.$apply(this, [options, secureConnectionListener]);
NetServer.$apply(this, [options, () => {}]);
if (secureConnectionListener) {
this.on("secureConnection", secureConnectionListener);
}
this.key = undefined;
this.cert = undefined;
@@ -631,6 +636,15 @@ function Server(options, secureConnectionListener): void {
this.setSecureContext(options);
}
$toClass(Server, "Server", NetServer);
Server.prototype[EventEmitter.captureRejectionSymbol] = function (err, event, sock) {
switch (event) {
case "secureConnection":
sock.destroy(err);
break;
default:
ReflectApply(net.Server.prototype[SymbolFor("nodejs.rejection")], this, [err, event, sock]);
}
};
function createServer(options, connectionListener) {
return new Server(options, connectionListener);