@tiwarivikram/meanio
Version:
Extracted functionality for MEAN.io
87 lines (73 loc) • 2.22 kB
JavaScript
var Q = require('q')
var path = require('path')
var ServerEngine = require('./engine')
/* 'hidden methods' of Meanio.prototype */
function serveReady (engine, callback) {
engine.endBootstrap(callback.bind(null, this))
}
function serveWithDb (Meanio, callback, database) {
var engine = ServerEngine.produceEngine(this.options.serverengine || this.getConfig().serverengine)
engine.beginBootstrap(this, database)
Q.all(this.instanceWaitersQ).done(serveReady.bind(this, engine, callback))
}
function genericServe (Meanio, options, callback) {
if (this.active) {
callback(this)
return
}
Meanio.prototype.options = options
Meanio.prototype.active = true
this.resolve('database', serveWithDb.bind(this, Meanio, callback))
}
/* end of 'hidden methods' of Meanio.prototype */
function onInstance (Meanio, meanioinstance, defer) {
Meanio.prototype.serve = genericServe.bind(meanioinstance, Meanio)
var middleware = {
before: [],
after: []
}
// so tangled up, much spaghetti...
Meanio.prototype.chainware = {
add: function (event, weight, func) {
middleware[event].splice(weight, 0, {
weight: weight,
func: func
})
middleware[event].join()
middleware[event].sort(function (a, b) {
if (a.weight < b.weight) {
a.next = b.func
} else {
b.next = a.func
}
return (a.weight - b.weight)
})
},
before: function (req, res, next) {
if (!middleware.before.length) return next()
this.chain('before', 0, req, res, next)
},
after: function (req, res, next) {
if (!middleware.after.length) return next()
this.chain('after', 0, req, res, next)
},
chain: function (operator, index, req, res, next) {
var args = [req, res,
function () {
if (middleware[operator][index + 1]) {
this.chain('before', index + 1, req, res, next)
} else {
next()
}
}
]
middleware[operator][index].func.apply(this, args)
}
}
defer.resolve()
}
function supportServer (Meanio) {
Meanio.onInstance(onInstance.bind(null, Meanio))
}
module.exports = supportServer