{"version":3,"file":"bootstrap.mjs","names":[],"sources":["../../src/lib/bootstrap.ts"],"sourcesContent":["import { debug } from 'console';\nimport constants from 'constants';\nimport express from 'express';\nimport { Application } from 'express';\nimport fs from 'fs';\nimport http from 'http';\nimport https from 'https';\nimport _ from 'lodash';\nimport URL from 'url';\n\nimport { getListenAddress } from '@verdaccio/config';\nimport { Callback, ConfigYaml, HttpsConfKeyCert, HttpsConfPfx } from '@verdaccio/types';\n\nimport endPointAPI from '../api/index';\nimport { API_ERROR } from './constants';\nimport { displayExperimentsInfoBox } from './experiments';\nimport { logger } from './logger';\nimport { initLogger, logHTTPSWarning } from './utils';\n\n/**\n * Trigger the server after configuration has been loaded.\n * @param {Object} config\n * @param {Object} cliArguments\n * @param {String} configPath\n * @param {String} pkgVersion\n * @param {String} pkgName\n * @deprecated use runServer instead\n */\nfunction startVerdaccio(\n  config: ConfigYaml,\n  cliListen: string,\n  configPath: string,\n  pkgVersion: string,\n  pkgName: string,\n  callback: Callback\n): void {\n  if (_.isObject(config) === false) {\n    throw new Error(API_ERROR.CONFIG_BAD_FORMAT);\n  }\n\n  initLogger(config);\n\n  // merge flags and experiments for backward compatibility\n  const flags = {\n    ...(config?.flags || {}),\n    ...(config?.experiments || {}),\n  };\n  displayExperimentsInfoBox(flags);\n  logger.warn('This is a deprecated method, please use runServer instead');\n\n  endPointAPI(config).then((app): void => {\n    const listen = cliListen ?? config?.listen;\n    const addr = getListenAddress(listen, logger);\n    let webServer;\n    if (addr.proto === 'https') {\n      webServer = handleHTTPS(app, configPath, config);\n    } else {\n      // http\n      webServer = http.createServer(app);\n    }\n    if (webServer && typeof config?.server?.keepAliveTimeout === 'number') {\n      // library definition for node is not up to date (doesn't contain recent 8.0 changes)\n      webServer.keepAliveTimeout = config.server.keepAliveTimeout * 1000;\n    }\n    unlinkAddressPath(addr);\n    callback(webServer, addr, pkgName, pkgVersion);\n  });\n}\n\nfunction unlinkAddressPath(addr) {\n  if (addr.path && fs.existsSync(addr.path)) {\n    fs.unlinkSync(addr.path);\n  }\n}\n\nfunction handleHTTPS(\n  app: express.Application,\n  configPath: string,\n  config: ConfigYaml\n): https.Server {\n  try {\n    let httpsOptions = {\n      secureOptions: constants.SSL_OP_NO_SSLv2 | constants.SSL_OP_NO_SSLv3, // disable insecure SSLv2 and SSLv3\n    };\n    const keyCertConfig = config.https as HttpsConfKeyCert;\n    const pfxConfig = config.https as HttpsConfPfx;\n\n    const missingKeyCert = !(keyCertConfig.key && keyCertConfig.cert);\n    debug('missingKeyCert', missingKeyCert);\n    const missingPfx = !pfxConfig.pfx;\n    debug('missingPfx', missingPfx);\n\n    if (missingKeyCert && missingPfx) {\n      debug('No HTTPS configuration found');\n      logHTTPSWarning(configPath);\n      throw new Error('No HTTPS configuration found');\n    }\n\n    debug('HTTPS configuration found');\n    if (pfxConfig.pfx) {\n      debug('Using PFX configuration');\n      const { pfx, passphrase } = pfxConfig;\n      httpsOptions = _.assign(httpsOptions, {\n        pfx: fs.readFileSync(pfx),\n        passphrase: passphrase || '',\n      });\n    } else {\n      debug('Using Key/Cert configuration');\n      const { key, cert, ca } = keyCertConfig;\n      httpsOptions = _.assign(httpsOptions, {\n        key: fs.readFileSync(key),\n        cert: fs.readFileSync(cert),\n        ...(ca && {\n          ca: fs.readFileSync(ca),\n        }),\n      });\n    }\n    return https.createServer(httpsOptions, app);\n  } catch (err: any) {\n    // catch errors related to certificate loading\n    logger.fatal({ err: err }, 'cannot create https server: @{err.message}');\n    process.exit(2);\n  }\n}\n/**\n *\n * @param webServer\n * @param addr\n * @param pkgName\n * @param pkgVersion\n * @deprecated use initServer instead\n */\nfunction listenDefaultCallback(\n  webServer: Application,\n  addr: any,\n  pkgName: string,\n  pkgVersion: string\n): void {\n  const server = webServer\n    .listen(addr.port || addr.path, addr.host, (): void => {\n      // send a message for tests\n      if (_.isFunction(process.send)) {\n        process.send({\n          verdaccio_started: true,\n        });\n      }\n    })\n    .on('error', function (err): void {\n      logger.fatal({ err: err }, 'cannot create http server: @{err.message}');\n      process.exit(2);\n    });\n\n  function handleShutdownGracefully() {\n    logger.fatal('received shutdown signal - closing server gracefully...');\n    server.close(() => {\n      logger.info('server closed.');\n      process.exit(0);\n    });\n  }\n\n  // handle shutdown signals nicely when environment says so\n  if (process.env.VERDACCIO_HANDLE_KILL_SIGNALS === 'true') {\n    process.on('SIGINT', handleShutdownGracefully);\n    process.on('SIGTERM', handleShutdownGracefully);\n    process.on('SIGHUP', handleShutdownGracefully);\n  }\n\n  logger.warn(\n    {\n      addr: addr.path\n        ? URL.format({\n            protocol: 'unix',\n            pathname: addr.path,\n          })\n        : URL.format({\n            protocol: addr.proto,\n            hostname: addr.host,\n            port: addr.port,\n            pathname: '/',\n          }),\n      version: pkgName + '/' + pkgVersion,\n    },\n    'http address - @{addr} - @{version}'\n  );\n}\n\nexport { startVerdaccio, listenDefaultCallback };\n"],"mappings":"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"}