提交 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 -}  
1 1
2 // # Igloo 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,11 +3,19 @@
3 3
4 var winston = require('winston') 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,6 +19,8 @@
19 "dependencies": { 19 "dependencies": {
20 "async": "~0.2.10", 20 "async": "~0.2.10",
21 "body-parser": "~1.2.0", 21 "body-parser": "~1.2.0",
  22 + "bootable": "^0.2.3",
  23 + "bootable-environment": "^0.2.0",
22 "chalk": "^0.4.0", 24 "chalk": "^0.4.0",
23 "commander": "^2.2.0", 25 "commander": "^2.2.0",
24 "connect-flash": "~0.1.1", 26 "connect-flash": "~0.1.1",
注册登录 后发表评论