midnight
Version:
Web framework for building modern web applications
70 lines (69 loc) • 1.83 kB
JavaScript
;
/**
* @typedef {import('http').IncomingMessage} Request
* @typedef {import('http').ServerResponse} Response
* @typedef {() => void} Next
* @typedef {(req: Request, res: Response, next: Next) => void} Middleware
*/
/**
* @param {{ log: any, stack: Middleware[] }} app
* @param {Middleware} fn
*/
exports.use = function (app, fn) {
app.log.debug("Use middleware ".concat(fn.name || "unknown"));
app.stack.push(fn);
return app;
};
/**
* @param {{ stack: Middleware[], log: any }} app
* @param {{ stack: Middleware[] }} route
* @param {Request} req
* @param {Response} res
* @param {(err?: Error) => void} callback
*/
exports.handle = function (app, route, req, res, callback) {
var stack = app.stack.slice(0);
// Include route specific middleware
if (route) {
for (var _i = 0, _a = route.stack; _i < _a.length; _i++) {
var layer = _a[_i];
stack.push(layer);
}
}
var index = 0;
/**
* @param {Error} [err]
*/
var next = function (err) {
// Next layer
var layer = stack[index++];
// Stack done
if (!layer || res.headerSent) {
if (callback) {
return callback(err);
}
return;
}
try {
app.log.trace("Process middleware ".concat(layer.name || "unknown"));
if (err) {
if (layer.length === 4) {
layer(err, req, res, next);
}
else {
next(err);
}
}
else if (layer.length < 4) {
layer(req, res, next);
}
else {
next();
}
}
catch (e) {
next(e);
}
};
next();
};