palra/lightapi

View on GitHub
lib/lightapi.coffee

Summary

Maintainability
Test Coverage
EventEmitter =  require("events").EventEmitter

require "./exposeGlobals"
reqAll = require 'require-all'
fs = require "fs"

class LightApi extends EventEmitter
    constructor: () ->
        @config = require "./config"
        @utils = reqAll __dirname + "/utils"
        @components = {}

    register: (name, mod) ->
        @components[name] = mod unless mod == null or mod == undefined
        return

    run: (cb = () ->) ->
        self = this
        modules = {}

        loadDirMods = (dirname) ->
            files = null
            try
                files = fs.readdirSync dirname
                files.forEach (file) ->
                    filepath = dirname + "/" + file
                    if fs.statSync(filepath).isDirectory()
                        modules[file] = require filepath unless modules.hasOwnProperty(file)

            catch e
                throw e unless e.code == "ENOENT"                

        loadDirMods __dirname + "/components"
        loadDirMods __appdir + "/components"

        automap = _.transform modules, (res, val, key) ->
            wrap = ($) ->
                (cb) ->
                    $.component (err, mod) ->
                        self.components[key] = mod unless mod == null or mod == undefined
                        cb err, mod
                        return
                    return

            if _.isEmpty val.dependencies
                res[key] = wrap val
            else
                res[key] = (($) ->
                    result = $.dependencies.slice 0
                    result.push wrap $
                    result
                )(val)
            
        async.auto automap, (err, results) ->
            throw err if err
            self.emit "ready", self
            log.info "Light API loaded"
            cb(err);
            return

    close: (cb = () -> ) ->
        self = this
        arr = @listeners "close"
        async.each arr, ((item, cb) -> item cb
        ), (err) ->
            throw err if err
            self.components = {}
            log.info "LightAPI is closed."
            cb err


global.la = new LightApi()
module.exports = global.la