diff --git a/src/js/node/net.ts b/src/js/node/net.ts index 840818c886..030d15680f 100644 --- a/src/js/node/net.ts +++ b/src/js/node/net.ts @@ -360,7 +360,7 @@ const ServerHandlers: SocketHandler = { 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 = { _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 = { } 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); } diff --git a/src/js/node/tls.ts b/src/js/node/tls.ts index 946e4e2b7e..49757b68f4 100644 --- a/src/js/node/tls.ts +++ b/src/js/node/tls.ts @@ -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);