Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | 28x 28x 28x 28x 2076x 98x 34x 64x 64x 28x 243x 243x 245x 2219x 2219x 2098x 22x 22x 22x 22x 21x 21x 2076x 2054x 2052x 110x 23x | const load = require('loadware');
const assert = require('assert');
const reply = require('../../reply');
// Recursively resolve possible function returns
const processReturn = (ctx, ret) => {
if (!ret) return;
// Use the returned reply instance
if (ret.constructor.name === 'Reply') {
return ret.exec(ctx);
}
// TODO: make a check for only accepting the right types of return values
// Create a whole new reply thing
const fn = typeof ret === 'number' ? 'status' : 'send';
return reply[fn](ret).exec(ctx);
};
// Pass an array of modern middleware and return a single modern middleware
module.exports = (...middles) => {
// Flattify all of the middleware
const middle = load(middles);
// Go through each of them
return async ctx => {
for (const mid of middle) {
try {
if (ctx.req.solved) return;
// DO NOT MERGE; the else is relevant only for ctx.error
if (ctx.error) {
// See if this middleware can fix it
Eif (mid.error) {
assert(mid.error instanceof Function, 'Error handler should be a function');
const ret = await mid.error(ctx);
await processReturn(ctx, ret);
Eif (ctx.res.headersSent) {
ctx.req.solved = true;
}
}
}
// No error, call next middleware. Skips middleware if there's an error
else {
const ret = await mid(ctx);
await processReturn(ctx, ret);
if (ctx.res.headersSent) {
ctx.req.solved = true;
}
}
} catch (err) {
ctx.error = err;
}
}
};
};
|