stopper.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. const http = require('http')
  2. const cfg = require('./config')
  3. const logger = require('./logger')
  4. const helper = require('./helper')
  5. const { lookup } = require('./utils/dns-utils')
  6. exports.stop = function (cliOptionsOrConfig, done) {
  7. cliOptionsOrConfig = cliOptionsOrConfig || {}
  8. const log = logger.create('stopper')
  9. done = helper.isFunction(done) ? done : process.exit
  10. let config
  11. if (cliOptionsOrConfig instanceof cfg.Config) {
  12. config = cliOptionsOrConfig
  13. } else {
  14. logger.setupFromConfig({
  15. colors: cliOptionsOrConfig.colors,
  16. logLevel: cliOptionsOrConfig.logLevel
  17. })
  18. const deprecatedCliOptionsMessage =
  19. 'Passing raw CLI options to `stopper(config, done)` is deprecated. Use ' +
  20. '`parseConfig(configFilePath, cliOptions, {promiseConfig: true, throwErrors: true})` ' +
  21. 'to prepare a processed `Config` instance and pass that as the ' +
  22. '`config` argument instead.'
  23. log.warn(deprecatedCliOptionsMessage)
  24. try {
  25. config = cfg.parseConfig(
  26. cliOptionsOrConfig.configFile,
  27. cliOptionsOrConfig,
  28. {
  29. promiseConfig: false,
  30. throwErrors: true
  31. }
  32. )
  33. } catch (parseConfigError) {
  34. // TODO: change how `done` falls back to exit in next major version
  35. // SEE: https://github.com/karma-runner/karma/pull/3635#discussion_r565399378
  36. done(1)
  37. }
  38. }
  39. const request = http.request({
  40. hostname: config.hostname,
  41. path: config.urlRoot + 'stop',
  42. port: config.port,
  43. method: 'GET',
  44. lookup
  45. })
  46. request.on('response', function (response) {
  47. if (response.statusCode === 200) {
  48. log.info('Server stopped.')
  49. done(0)
  50. } else {
  51. log.error(`Server returned status code: ${response.statusCode}`)
  52. done(1)
  53. }
  54. })
  55. request.on('error', function (e) {
  56. if (e.code === 'ECONNREFUSED') {
  57. log.error(`There is no server listening on port ${config.port}`)
  58. done(1, e.code)
  59. } else {
  60. throw e
  61. }
  62. })
  63. request.end()
  64. }