@appsemble/node-utils
Version:
NodeJS utilities used by Appsemble internally.
61 lines • 2.45 kB
JavaScript
import chalk from 'chalk';
import { logger } from '../logger.js';
function rangeFormat(value, map) {
// @ts-expect-error 2532 Object is possibly 'undefined'.
return Object.entries(map).find(([v]) => v === 'default' || value < Number(v))[1];
}
/**
* Koa middleware for logging requests using the Appsemble logger.
*
* @returns Koa middleware for logging requests using the Appsemble logger.
*/
export function loggerMiddleware() {
return (ctx, next) => {
const { href, res } = ctx;
const start = Date.now();
const method = chalk.bold(ctx.method);
logger.info(`${method} ${href} — ${chalk.white(ctx.ip)}`);
function logResponse() {
res.removeListener('finish', logResponse);
// eslint-disable-next-line @typescript-eslint/no-use-before-define
res.removeListener('close', logCancel);
const { message, response: { header: { location }, }, status, } = ctx;
const s = `${status} ${message}`;
const duration = Date.now() - start;
const formatDuration = rangeFormat(duration, {
100: chalk.green,
1000: chalk.yellow,
default: chalk.red,
});
const formatStatus = rangeFormat(status, {
200: chalk.red,
300: chalk.green,
400: chalk.cyan,
500: chalk.yellow,
default: chalk.red,
});
const level = rangeFormat(status, {
200: 'error',
400: 'info',
500: 'warn',
default: 'error',
});
logger.log(level, `${method} ${href} ${formatStatus(location ? `${s} → ${location}` : s)} ${formatDuration(`${duration}ms`)}`);
}
function logCancel() {
res.removeListener('finish', logResponse);
res.removeListener('close', logCancel);
const duration = Date.now() - start;
const formatDuration = rangeFormat(duration, {
100: chalk.green,
1000: chalk.yellow,
default: chalk.red,
});
logger.warn(`${method} ${href} ${chalk.grey('Cancelled')} ${formatDuration(`${duration}ms`)}`);
}
res.once('finish', logResponse);
res.once('close', logCancel);
return next();
};
}
//# sourceMappingURL=loggerMiddleware.js.map