UNPKG

@httpc/kit

Version:

httpc toolbox for building function-based API with minimal code and end-to-end type safety

64 lines (63 loc) 2.36 kB
import { performance } from "perf_hooks"; import { useContext } from "@httpc/server"; import { useLogger } from "./context"; const PRESET = { defaults: { logBegin: true, logParameters: false, logRequestId: false, logResult: false, }, development: { logBegin: true, logParameters: true, logRequestId: false, logResult: false, }, production: { logBegin: false, logParameters: false, logRequestId: false, logResult: false, } }; export function RequestLoggerMiddleware(options) { const preset = PRESET[process.env.NODE_ENV || ""] || PRESET.defaults; const { logBegin, logParameters, logRequestId, logResult, } = { ...preset, ...options }; function writeBegin(logger, requestId, call) { requestId = logRequestId ? `(${requestId})` : ""; logger.verbose("Request%s:begin > /%s", requestId, call.path); if (logParameters) { logger.debug("Request%s:params > /%s %o", requestId, call.path, call.params); } } function writeEnd(logger, requestId, call, begin, result) { requestId = logRequestId ? `(${requestId})` : ""; const duration = (performance.now() - begin).toFixed(0); const level = result && result instanceof Error ? "error" : "info"; if (level === "info") { logger.info("Request%s:end > /%s(%dms)", requestId, call.path, duration); if (logResult) { logger.debug(level, "Request%s:result > /%s(%dms) %o", requestId, call.path, duration, result); } } else if (level === "error") { logger.error("Request%s:end > /%s(%dms) %o", requestId, call.path, duration, result); } } return async (call, next) => { const { requestId } = useContext(); const logger = useLogger(); const timestamp = performance.now(); if (logBegin) { writeBegin(logger, requestId, call); } return await next(call).then(result => { writeEnd(logger, requestId, call, timestamp, result); return result; }, error => { writeEnd(logger, requestId, call, timestamp, error); throw error; }); }; }