midware
Version:
Module for creating connect-style middlewares. Dependency-free. Runs in the browser and node.js
90 lines (75 loc) • 1.86 kB
JavaScript
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
define(['exports'], factory)
} else if (typeof exports === 'object') {
factory(exports)
if (typeof module === 'object' && module !== null) {
module.exports = exports = exports.midware
}
} else {
factory(root)
}
}(this, function (exports) {
'use strict'
function midware(ctx) {
var calls = use.stack = []
ctx = ctx || null
function use() {
toArray(arguments)
.filter(function (fn) {
return typeof fn === 'function'
})
.forEach(function (fn) {
calls.push(fn)
})
return ctx
}
use.run = function run() {
var done, args = toArray(arguments)
if (typeof args[args.length - 1] === 'function') {
done = args.pop()
}
if (!calls.length) {
if (done) done.call(ctx)
return
}
var stack = calls.slice()
args.push(next)
function runNext() {
var fn = stack.shift()
fn.apply(ctx, args)
}
function next(err, end) {
if (err || end || !stack.length) {
stack = null
if (done) done.call(ctx, err, end)
} else {
runNext()
}
}
runNext()
}
use.remove = function (name) {
for (var i = 0, l = calls.length; i < l; i += 1) {
var fn = calls[i]
if (fn === name || fn.name === name) {
calls.splice(i, 1)
break
}
}
}
use.flush = function () {
calls.splice(0)
}
return use
}
function toArray(nargs) {
var args = new Array(nargs.length)
for (var i = 0, l = args.length; i < l; i += 1) {
args[i] = nargs[i]
}
return args
}
midware.VERSION = '0.1.7'
exports.midware = midware
}))