diff --git a/lib/AppSpine.coffee b/lib/AppSpine.coffee index 0348491..fa98d5d 100644 --- a/lib/AppSpine.coffee +++ b/lib/AppSpine.coffee @@ -1,14 +1,9 @@ -colors = require('colors') EventEmitter2 = require('eventemitter2').EventEmitter2 -tracer = require('tracer') +tracer = require 'tracer' +typeOf = require 'typeof' +async = require 'async' -loggerColorFilters = - # log : colors.black, - trace : colors.magenta, - debug : colors.blue, - info : colors.green, - warn : colors.yellow, - error : [ colors.red, colors.bold ] +loggerColorFilters = require './loggerColorFilters' module.exports = class AppSpine extends EventEmitter2 logger: null @@ -17,6 +12,7 @@ module.exports = class AppSpine extends EventEmitter2 @config.emitter ?= {} super @config.emitter @setupLogger() + @init() if @config.initializers? getEnvironment: -> @config.env or process.env.NODE_ENV or 'development' @@ -42,17 +38,81 @@ module.exports = class AppSpine extends EventEmitter2 isProd: -> @isProduction() - configure: (env, fn) -> - fn() if @getEnvironment() is env + configure: (env..., fn) -> + fn() if @getEnvironment() in env require: (path) -> require(path)(@) setupLogger: -> @config.logger ?= {} - @config.logger.format ?= "[{{title}}] {{timestamp}} ({{file}}:{{line}}): {{message}}" - @config.logger.filters ?= loggerColorFilters + @config.logger.format ?= require './loggerFormat' + @config.logger.filters ?= require './loggerColorFilters' @config.logger.dateformat ?= "HH:MM:ss" @config.logger.level ?= if @isDev() then 'log' else 'warn' - @logger = tracer.colorConsole @config.logger \ No newline at end of file + @logger = tracer.colorConsole @config.logger + + init: (initializers, cb) -> + start = Date.now() + + switch arguments.length + when 0 + initializers = @config.initializers + cb = -> + when 1 + if typeOf(arguments[0]) is 'function' and @config.initializers? + initializers = @config.initializers + cb = arguments[0] + else if typeOf(arguments[0]) is 'object' + initializers = arguments[0] + cb = -> + + @_initializers = initializers + + wrap = (name, fn) => + (done) => + initStart = Date.now() + fn (err) => + return done(err) if err? + @logger.info "#{name} is ready (#{Date.now() - initStart} ms)" + done() + + tasks = {} + + for name, initializer of initializers + tasks[name] = switch typeOf initializer + when 'function' then wrap name, initializer + when 'object' + fn = wrap name, initializer.init + + if initializer.depend? + initializer.depend.concat [fn] + else + fn + + + async.auto tasks, (err) => + return @logger.error err if err? + @logger.info "Application is ready (#{Date.now() - start} ms)" + @emit 'ready' + cb() + + close: (cb = ->) -> + return unless @_initializers? + tasks = [] + + addTask = (name, initializer) => + tasks.push (done) => + start = Date.now() + initializer.close (err) => + @logger.trace "#{name} has been closed (#{Date.now() - start} ms)" + done err + + for name, initializer of @_initializers when initializer.close? + addTask name, initializer + + async.parallel tasks, (err) => + cb(err) + @logger.error err if err? + diff --git a/lib/loggerColorFilters.coffee b/lib/loggerColorFilters.coffee new file mode 100644 index 0000000..9e84ad3 --- /dev/null +++ b/lib/loggerColorFilters.coffee @@ -0,0 +1,9 @@ +colors = require 'colors' + +module.exports = + # log : colors.black, + trace : colors.magenta, + debug : colors.blue, + info : colors.green, + warn : colors.yellow, + error : [ colors.red, colors.bold ] diff --git a/lib/loggerFormat.coffee b/lib/loggerFormat.coffee new file mode 100644 index 0000000..507d7a3 --- /dev/null +++ b/lib/loggerFormat.coffee @@ -0,0 +1,7 @@ +full = "[{{title}}] {{timestamp}} ({{file}}:{{line}}) {{message}}" +short = "[{{title}}] {{timestamp}} {{message}}" + +module.exports = [ + full, + info: short +] diff --git a/package.json b/package.json index 9580fb2..de5cbe8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "appspine", - "version": "0.0.3", + "version": "0.0.4", "description": "node.js application namespace base class", "keywords": [ "application", @@ -28,6 +28,8 @@ "coffee-script": "~1.7.1", "eventemitter2": "~0.4.13", "tracer": "~0.6.2", - "colors": "~0.6.2" + "colors": "~0.6.2", + "async": "~0.2.10", + "typeof": "~1.0.0" } }