UNPKG

@appsemble/node-utils

Version:

NodeJS utilities used by Appsemble internally.

64 lines 2.73 kB
import chalk from 'chalk'; import { logger } from '../logger.js'; import { createRequestContext, requestStore } from '../requestContext.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); const context = createRequestContext(ctx.method, ctx.path); const reqIdPrefix = `[${context.requestId.slice(0, 8)}] `; logger.info(`${reqIdPrefix}${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, `${reqIdPrefix}${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(`${reqIdPrefix}${method} ${href} ${chalk.grey('Cancelled')} ${formatDuration(`${duration}ms`)}`); } res.once('finish', logResponse); res.once('close', logCancel); return requestStore.run(context, next); }; } //# sourceMappingURL=loggerMiddleware.js.map