const http = require('http') const cfg = require('./config') const logger = require('./logger') const helper = require('./helper') const { lookup } = require('./utils/dns-utils') exports.stop = function (cliOptionsOrConfig, done) { cliOptionsOrConfig = cliOptionsOrConfig || {} const log = logger.create('stopper') done = helper.isFunction(done) ? done : process.exit let config if (cliOptionsOrConfig instanceof cfg.Config) { config = cliOptionsOrConfig } else { logger.setupFromConfig({ colors: cliOptionsOrConfig.colors, logLevel: cliOptionsOrConfig.logLevel }) const deprecatedCliOptionsMessage = 'Passing raw CLI options to `stopper(config, done)` is deprecated. Use ' + '`parseConfig(configFilePath, cliOptions, {promiseConfig: true, throwErrors: true})` ' + 'to prepare a processed `Config` instance and pass that as the ' + '`config` argument instead.' log.warn(deprecatedCliOptionsMessage) try { config = cfg.parseConfig( cliOptionsOrConfig.configFile, cliOptionsOrConfig, { promiseConfig: false, throwErrors: true } ) } catch (parseConfigError) { // TODO: change how `done` falls back to exit in next major version // SEE: https://github.com/karma-runner/karma/pull/3635#discussion_r565399378 done(1) } } const request = http.request({ hostname: config.hostname, path: config.urlRoot + 'stop', port: config.port, method: 'GET', lookup }) request.on('response', function (response) { if (response.statusCode === 200) { log.info('Server stopped.') done(0) } else { log.error(`Server returned status code: ${response.statusCode}`) done(1) } }) request.on('error', function (e) { if (e.code === 'ECONNREFUSED') { log.error(`There is no server listening on port ${config.port}`) done(1, e.code) } else { throw e } }) request.end() }