UNPKG

verdaccio

Version:

A lightweight private npm proxy registry

125 lines (124 loc) 4.22 kB
import { API_ERROR } from "./constants.mjs"; import { logger } from "./logger/index.mjs"; import { initLogger, logHTTPSWarning } from "./utils.mjs"; import api_default from "../api/index.mjs"; import { displayExperimentsInfoBox } from "./experiments.mjs"; import _ from "lodash"; import { getListenAddress } from "@verdaccio/config"; import fs from "fs"; import URL from "url"; import { debug } from "console"; import constants from "constants"; import http from "http"; import https from "https"; //#region src/lib/bootstrap.ts /** * Trigger the server after configuration has been loaded. * @param {Object} config * @param {Object} cliArguments * @param {String} configPath * @param {String} pkgVersion * @param {String} pkgName * @deprecated use runServer instead */ function startVerdaccio(config, cliListen, configPath, pkgVersion, pkgName, callback) { if (_.isObject(config) === false) throw new Error(API_ERROR.CONFIG_BAD_FORMAT); initLogger(config); displayExperimentsInfoBox({ ...config?.flags || {}, ...config?.experiments || {} }); logger.warn("This is a deprecated method, please use runServer instead"); api_default(config).then((app) => { const addr = getListenAddress(cliListen ?? config?.listen, logger); let webServer; if (addr.proto === "https") webServer = handleHTTPS(app, configPath, config); else webServer = http.createServer(app); if (webServer && typeof config?.server?.keepAliveTimeout === "number") webServer.keepAliveTimeout = config.server.keepAliveTimeout * 1e3; unlinkAddressPath(addr); callback(webServer, addr, pkgName, pkgVersion); }); } function unlinkAddressPath(addr) { if (addr.path && fs.existsSync(addr.path)) fs.unlinkSync(addr.path); } function handleHTTPS(app, configPath, config) { try { let httpsOptions = { secureOptions: constants.SSL_OP_NO_SSLv2 | constants.SSL_OP_NO_SSLv3 }; const keyCertConfig = config.https; const pfxConfig = config.https; const missingKeyCert = !(keyCertConfig.key && keyCertConfig.cert); debug("missingKeyCert", missingKeyCert); const missingPfx = !pfxConfig.pfx; debug("missingPfx", missingPfx); if (missingKeyCert && missingPfx) { debug("No HTTPS configuration found"); logHTTPSWarning(configPath); throw new Error("No HTTPS configuration found"); } debug("HTTPS configuration found"); if (pfxConfig.pfx) { debug("Using PFX configuration"); const { pfx, passphrase } = pfxConfig; httpsOptions = _.assign(httpsOptions, { pfx: fs.readFileSync(pfx), passphrase: passphrase || "" }); } else { debug("Using Key/Cert configuration"); const { key, cert, ca } = keyCertConfig; httpsOptions = _.assign(httpsOptions, { key: fs.readFileSync(key), cert: fs.readFileSync(cert), ...ca && { ca: fs.readFileSync(ca) } }); } return https.createServer(httpsOptions, app); } catch (err) { logger.fatal({ err }, "cannot create https server: @{err.message}"); process.exit(2); } } /** * * @param webServer * @param addr * @param pkgName * @param pkgVersion * @deprecated use initServer instead */ function listenDefaultCallback(webServer, addr, pkgName, pkgVersion) { const server = webServer.listen(addr.port || addr.path, addr.host, () => { if (_.isFunction(process.send)) process.send({ verdaccio_started: true }); }).on("error", function(err) { logger.fatal({ err }, "cannot create http server: @{err.message}"); process.exit(2); }); function handleShutdownGracefully() { logger.fatal("received shutdown signal - closing server gracefully..."); server.close(() => { logger.info("server closed."); process.exit(0); }); } if (process.env.VERDACCIO_HANDLE_KILL_SIGNALS === "true") { process.on("SIGINT", handleShutdownGracefully); process.on("SIGTERM", handleShutdownGracefully); process.on("SIGHUP", handleShutdownGracefully); } logger.warn({ addr: addr.path ? URL.format({ protocol: "unix", pathname: addr.path }) : URL.format({ protocol: addr.proto, hostname: addr.host, port: addr.port, pathname: "/" }), version: pkgName + "/" + pkgVersion }, "http address - @{addr} - @{version}"); } //#endregion export { listenDefaultCallback, startVerdaccio }; //# sourceMappingURL=bootstrap.mjs.map