palra/lightapi

View on GitHub
lib/components/express/index.coffee

Summary

Maintainability
Test Coverage
exports.component = (cb) ->
    express = require("express")
    app = express()
    app.configure ->
        unless la.config.local.secret
            log.warn "No secret defined for the session, using a random secret."
            la.config.local.secret = require("random-token")(32)

        app.engine "ejs", require "ejs-locals"

        app.set "views", __appdir + la.config.paths.views
        app.set "view engine", "ejs"

        app.use express.static(__appdir + la.config.paths.assets)

        app.use express.bodyParser()
        app.use express.cookieParser(la.config.local.secret)
        app.use express.session(
            secret: la.config.local.secret or Math.random().toString(36)
            key: "lightapi.sid"
        )
        
        if la.config.security.csrf
            log.silly "CSRF security enabled"
            app.use express.csrf()
            app.use (req, res, next) ->
                res.locals.csrfToken = req.csrfToken()
                res.cookie "csrfToken", req.csrfToken()
                next()
                return
        else
            log.warn "CSRF protection is disabled !"
            app.use (req, res, next) ->
                res.locals.csrfToken = undefined
                next()
                return

        return

    addLocal = (obj) ->
        _.forIn obj, fn = (val, key) ->
            if typeof val == "object"
                _.forIn val, fn
            else if typeof val == "function"
                params = la.utils.function.getParamNames(val).slice(0,2)
                if params[0] == "req" and params[1] == "res"
                    app.use (req, res, next) ->
                        res.locals[key] = () ->
                            args = Array.prototype.slice.call arguments, 0
                            args.unshift req, res
                            val.apply this, args
                        next()
                        return
                else
                    app.locals[key] = val

    addLocal la.config.locals or {}

    app.addLocal = addLocal
    
    server = app.listen la.config.server.port
    log.info "Express started and listening to port #{la.config.server.port} ..."

    la.on "close", (cb) ->
        server.close(cb)

    cb null, app