stopper.js 1.9 KB

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