verdaccio
Version:
A lightweight private npm proxy registry
125 lines (124 loc) • 4.22 kB
JavaScript
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