Skip to content

Instantly share code, notes, and snippets.

@serby
Last active October 22, 2018 14:48
Show Gist options
  • Save serby/ff600a16d7ddc50d8d84cda346c61bce to your computer and use it in GitHub Desktop.
Save serby/ff600a16d7ddc50d8d84cda346c61bce to your computer and use it in GitHub Desktop.
const createServer = require('./server')
const componentLoader = require('component-loader')
const glob = require('glob')
const { join } = require('path')
// Use this for standard environment setup that is need on all entry points.
// This will often be where components are initialised
module.exports = (serviceLocator, jobRunnerMode = false, cb) => {
const server = createServer(serviceLocator)
const componentGlobs = [
join(__dirname, '/../components/service/**/init.js')
]
if (!jobRunnerMode) componentGlobs.push(join(__dirname, '/../components/worker/**/init.js'))
const componentPaths = [].concat.apply(
[],
componentGlobs.map(path => glob.sync(path))
)
const components = componentPaths.map(p => require(p))
serviceLocator
.register('server', server)
// Allow possible switching of router away from express
.register('router', server)
componentLoader(
components,
loadComponentFn => loadComponentFn.bind(null, serviceLocator),
cb
)
}
const bootstrap = require('./bootstrap')
const serviceLocator = require('service-locator')()
const createServerCluster = require('express-server-cluster')
const env = process.env.NODE_ENV || 'development'
const inDevelopmentMode = env === 'development'
// Only have debug logging on development
const logLevel = process.env.LOG_LEVEL || (inDevelopmentMode ? 'debug' : 'info')
const bunyan = require('bunyan')
const mailer = require('../lib/mailer')
const Metrics = require('cf-metrics')
const UberCache = require('uber-cache')
const createConfigury = require('configury')
const join = require('path').join
const config = createConfigury(join(__dirname, '/../config.json'))(
process.env.NODE_ENV
)
serviceLocator
.register('env', env)
.register('config', config)
.register(
'logger',
bunyan.createLogger({
name: 'worker',
stream: process.stdout,
level: logLevel
})
)
.register('cache', new UberCache())
.register('mailer', mailer(serviceLocator.config.mailAuth))
.register(
'metrics',
new Metrics(config.statsd.server, config.statsd.port, {
client: config.client,
platform: config.platform,
application: 'worker',
environment: config.env,
logger: serviceLocator.logger
})
)
const jobToRun = process.argv.length >= 3 && process.argv[2]
bootstrap(serviceLocator, jobToRun, error => {
if (error) throw error
if (jobToRun) {
console.log(process.argv, process.argv[2])
const createRunner = require('../' + jobToRun)
const runner = createRunner(serviceLocator)
const job = { attrs: `Test Running ${jobToRun}` }
runner(job, (err, results) => {
if (err) {
serviceLocator.logger.error(err)
process.exit(1)
}
console.dir(results, { depth: null, color: true })
process.exit(0)
})
} else {
serviceLocator.server.on('started', httpServer => {
serviceLocator.register('httpServer', httpServer)
serviceLocator.logger.info(
'Server running: ' +
'http://localhost:' +
serviceLocator.config.workerPort
)
})
serviceLocator.server.on('requestError', (error, req) => {
serviceLocator.logger.error('Request Error', error.stack, req.url)
})
const options = {
port: process.env.PORT || serviceLocator.config.workerPort,
numProcesses: serviceLocator.config.workerNumProcesses
}
createServerCluster(serviceLocator.server, serviceLocator.logger, options)
}
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment