提交 8e4dc1fa26a5067b6b1824d1c33dc8d436062869

作者 Nick Baugh
1 个父辈 1a4babef

cleanup

1   -/**
2   - * Module dependencies.
3   - */
4   -var config = require('./index');
5   -
6   -
7   -/**
8   - * Initialize settings.
9   - */
10   -exports = module.exports = function(lib, app) {
11   - var settings = new Settings(config);
12   - return settings;
13   -}
14   -
15   -
16   -/**
17   - * Component annotations.
18   - */
19   -exports['@singleton'] = true;
20   -
21   -
22   -/**
23   - * Settings component
24   - */
25   -
26   -function Settings(initial) {
27   - if(initial)
28   - this._hash = initial;
29   - else
30   - this._hash = {};
31   -}
32   -
33   -Settings.prototype.get = function(key) {
34   - return this._hash[key];
35   -}
36   -
37   -Settings.prototype.set = function(key, val) {
38   - this._hash[key] = val;
39   -}
\ No newline at end of file
1 1
2 2 // # Igloo
3 3
4   -var async = require('async')
5   -var config = require('./config')
6   -var schemas = require('./schemas')
7   -var lib = require('./lib')(config)
8   -var app = require('./config/app')
9   -
10   -module.exports = igloo
11   -
12   -function igloo(callback) {
13   -
14   - async.parallel({
15   - db: lib.mongo,
16   - sessions: lib.redis
17   - }, loadConnections)
18   -
19   - function loadConnections(err, connections) {
20   - if (err) return callback(err)
21   - lib.db = connections.db
22   - lib.config.session.store = lib.sessions = connections.sessions
23   - schemas(lib, loadSchemas)
24   - }
  4 +var path = require('path')
  5 +var IoC = require('electrolyte')
  6 +var os = require('os')
  7 +var cluster = require('cluster')
  8 +
  9 +IoC.loader(IoC.node(path.join(__dirname, 'lib')))
  10 +
  11 +//
  12 +// Inspired by `bixby-express` and Jared Hanson
  13 +//
  14 +
  15 +var logger = IoC.create('logger')
  16 +var settings = IoC.create('settings')
  17 +var app = IoC.create('app')
  18 +
  19 +exports = module.exports = app
  20 +
  21 +if (cluster.isMaster && settings.server.clusterEnabled) {
  22 +
  23 + var clusterSize = settings.server.clusterSize || os.cpus().length
25 24
26   - function loadSchemas(err, lib) {
27   - if (err) return callback(err)
28   - app(lib, callback)
  25 + logger.info('creating cluster with %d workers', clusterSize)
  26 +
  27 + for (var i=0; i<clusterSize; i++) {
  28 + logger.info('spawning worker #%d', i + 1)
  29 + cluster.fork()
29 30 }
30 31
31   -}
  32 + cluster.on('fork', function(worker) {
  33 + logger.info('worker #%s with pid %d spawned', worker.id, worker.process.pid)
  34 + })
32 35
33   -if (!module.parent)
34   - igloo(function(err, app) {
35   - if (err) return lib.logger.error(err)
36   - app.listen(config.port, function() {
37   - lib.logger.info('igloo started at %s://%s:%d', config.protocol, config.host, config.port)
  36 + cluster.on('online', function(worker) {
  37 + logger.info('worker #%s with pid %d online', worker.id, worker.process.pid)
  38 + })
  39 +
  40 + cluster.on('listening', function(worker, addr) {
  41 + logger.info('worker #%s with pid %d listening on %s:%d', worker.id, worker.process.pid, addr.address, addr.port)
  42 + })
  43 +
  44 + cluster.on('disconnect', function(worker) {
  45 + logger.info('worker #%s with pid %d disconnected', worker.id, worker.process.pid)
  46 + })
  47 +
  48 + cluster.on('exit', function(worker, code, signal) {
  49 + logger.error('worker #%s with pid %d exited with code/signal', worker.id, worker.process.pid, signal || code)
  50 + if (worker.suicide) return
  51 + logger.info('worker #%s restarting', worker.id)
  52 + cluster.fork()
  53 + })
  54 +
  55 +} else {
  56 +
  57 + app.boot(function(err) {
  58 +
  59 + if (err) {
  60 + logger.error(err)
  61 + process.exit(0)
  62 + return
  63 + }
  64 +
  65 + logger.info('app booted')
  66 +
  67 + app.listen(settings.server.port, settings.server.host, function() {
  68 + var addr = this.address()
  69 + logger.info('app listening on %s:%d', addr.address, addr.port)
38 70 })
  71 +
39 72 })
  73 +
  74 +}
... ...
  1 +
  2 +// # app
  3 +
  4 +var express = require('express')
  5 +var bootable = require('bootable')
  6 +var IoC = require('electrolyte')
  7 +var bootableEnvironment = require('bootable-environment')
  8 +
  9 +exports = module.exports = function(logger, settings) {
  10 +
  11 + var app = bootable(express())
  12 + app.phase(bootableEnvironment())
  13 + app.phase(bootable.initializers())
  14 + app.phase(bootable.routes())
  15 +
  16 + return app
  17 +
  18 +}
  19 +
  20 +exports['@singleton'] = true
  21 +exports['@require'] = [ 'logger', 'settings' ]
... ...
  1 +
  2 +// # config
  3 +
  4 +exports = module.exports = function() {
  5 +
  6 + return {
  7 + defaults: {
  8 + server: {
  9 + host: 'localhost',
  10 + clusterEnabled: true
  11 + },
  12 + cookieParser: '',
  13 + mongo: {
  14 + host: 'localhost',
  15 + port: '27017',
  16 + opts: {}
  17 + },
  18 + redis: {
  19 + host: 'localhost',
  20 + port: 6379,
  21 + maxAge: 24 * 60 * 60 * 1000
  22 + }
  23 + },
  24 + development: {
  25 + server: {
  26 + env: 'development',
  27 + port: 3000,
  28 + },
  29 + mongo: {
  30 + dbname: 'igloo-development',
  31 + },
  32 + redis: {
  33 + prefix: 'igloo-development'
  34 + }
  35 + },
  36 + production: {
  37 + server: {
  38 + env: 'production',
  39 + port: 80,
  40 + },
  41 + mongo: {
  42 + dbname: 'igloo-production',
  43 + },
  44 + redis: {
  45 + prefix: 'igloo-production'
  46 + }
  47 + }
  48 + }
  49 +
  50 +}
  51 +
  52 +exports['@singleton'] = true
... ...
1   -
2   -//
3   -// # data node
4   -//
5   -// This is the missing data injection functionality in
6   -// electrolyte. Based on electrolyte/loaders/node.js, the
7   -// default script loader.
8   -//
9   -
10   -var _ = require('underscore')
11   -
12   -module.exports = function(data, options) {
13   -
14   - if (_.isString(options))
15   - options = {
16   - dirname: options
17   - }
18   -
19   - return function(id) {
20   -
21   - var newId = null
22   -
23   - if (id) {
24   - var dir = options.dirname + '/'
25   - if (id.indexOf(dir) === 0)
26   - newId = id.substr(dir.length)
27   - }
28   -
29   - if (newId)
30   - return data[newId]
31   -
32   - return data
33   -
34   - }
35   -
36   -}
1   -
2   -// # lib
3   -
4   -module.exports = function(config) {
5   - var lib = {
6   - config: config,
7   - logger: require('./logger')
8   - }
9   - lib.mongo = require('./mongo')(lib)
10   - lib.redis = require('./redis')(lib)
11   - return lib
12   -}
... ... @@ -3,11 +3,19 @@
3 3
4 4 var winston = require('winston')
5 5
6   -var logger = module.exports = new (winston.Logger)({
7   - transports: [
8   - new (winston.transports.Console)({
9   - colorize: true
10   - })
11   - ]
12   -})
  6 +exports = module.exports = function(settings) {
13 7
  8 + var logger = module.exports = new (winston.Logger)({
  9 + transports: [
  10 + new (winston.transports.Console)({
  11 + colorize: true
  12 + })
  13 + ]
  14 + })
  15 +
  16 + return logger
  17 +
  18 +}
  19 +
  20 +exports['@singleton'] = true
  21 +exports['@require'] = [ 'settings' ]
... ...
  1 +
  2 +// # settings
  3 +
  4 +var _ = require('underscore')
  5 +
  6 +exports = module.exports = function(config) {
  7 +
  8 + var settings = {}
  9 +
  10 + _.defaults(settings, config.defaults)
  11 +
  12 + var env = process.env.NODE_ENV || 'development'
  13 +
  14 + _.defaults(settings, config[env])
  15 +
  16 + return settings
  17 +
  18 +}
  19 +
  20 +exports['@singleton'] = true
  21 +exports['@require'] = [ 'config' ]
... ...
... ... @@ -19,6 +19,8 @@
19 19 "dependencies": {
20 20 "async": "~0.2.10",
21 21 "body-parser": "~1.2.0",
  22 + "bootable": "^0.2.3",
  23 + "bootable-environment": "^0.2.0",
22 24 "chalk": "^0.4.0",
23 25 "commander": "^2.2.0",
24 26 "connect-flash": "~0.1.1",
... ...
注册登录 后发表评论