jsev
Version:
Environment for building Web API's.
59 lines • 2.04 kB
JavaScript
;
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const shortId = __importStar(require("shortid"));
const errors_1 = require("../errors");
const utilities_1 = require("../utilities");
function handleError(log, response, error) {
// Validation errors
if (error instanceof errors_1.ValidationError) {
log.warn(error);
response.status = 400;
response.body = error.message;
return;
}
// Unauthorized errors
if (error instanceof errors_1.UnauthorizedError) {
log.warn(error);
response.status = 401;
response.body = error.message;
return;
}
// Default error case
log.error(error);
if (response.status !== 500) {
response.status = 500;
response.body = error.message;
}
}
async function handler(ctx, next) {
const reqId = utilities_1.getPropertyByNameIgnoreCase(ctx.request.headers, "X-Request-Id") ||
shortId.generate();
ctx.set("X-Request-Id", reqId);
// Using snake_case for req_id as per Koa's recommendation
const log = ctx.env.log.child({ req_id: reqId }, true);
ctx.log = log;
const { request, response } = ctx;
log.info(`Request for ${ctx.URL.href}`);
log.debug(request.header, "Request headers");
try {
await next();
}
catch (err) {
handleError(log, response, err);
}
const responseTime = utilities_1.getPropertyByNameIgnoreCase(ctx.response.headers, "X-Response-Time");
const responseTimeStr = responseTime ? ` in ${responseTime}` : "";
log.info({ res: ctx.res }, `Request for ${ctx.URL.href} completed${responseTimeStr}`);
}
exports.default = () => ({
func: handler,
rank: 1,
});
//# sourceMappingURL=requestLogger.js.map