UNPKG

@ogma/nestjs-module

Version:

A NestJS module for the Ogma logger

65 lines (64 loc) 2.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Parser = exports.LogAll = exports.Log = exports.OgmaLoggerRequestScoped = exports.OgmaLogger = void 0; const common_1 = require("@nestjs/common"); const decorate_all_1 = require("decorate-all"); const rxjs_1 = require("rxjs"); const ogma_constants_1 = require("../ogma.constants"); const ogma_provider_1 = require("../ogma.provider"); const OgmaLogger = (topic) => (0, common_1.Inject)((0, ogma_provider_1.createProviderToken)(typeof topic === 'function' ? topic.name : topic)); exports.OgmaLogger = OgmaLogger; const OgmaLoggerRequestScoped = (topic) => (0, common_1.Inject)((0, ogma_provider_1.createRequestScopedProviderToken)(typeof topic === 'function' ? topic.name : topic)); exports.OgmaLoggerRequestScoped = OgmaLoggerRequestScoped; const isPromise = (obj) => { return typeof obj === 'object' && obj !== null && 'then' in obj && typeof obj.then === 'function'; }; const logEnd = ({ context, method }, logger, startTime) => { const timing = Date.now() - startTime; logger.trace(`End ${method} - ${timing}ms`, { context }); }; const Log = (loggerProperty = 'logger') => (target, propertyKey, descriptor) => { const impl = descriptor.value; descriptor.value = function (...args) { const start = Date.now(); const method = propertyKey.toString(); const logger = this[loggerProperty]; const context = `${target.constructor.name}#${method}`; logger.trace(`Start ${method}`, { context }); let result; try { result = impl.apply(this, args); } finally { if (!(typeof result === 'object' || typeof result === 'function')) { logEnd({ context, method }, logger, start); } } if (isPromise(result)) { return result.finally(() => { logEnd({ context, method }, logger, start); }); } else if ((0, rxjs_1.isObservable)(result)) { /** * By using `result.pipe` here we are changing the reference to `result` and as such * we need to re-assign the `result` back to itself so that the new pipe will be ran * with the original observable */ return result.pipe((0, rxjs_1.tap)({ error: () => logEnd({ context, method }, logger, start), complete: () => logEnd({ context, method }, logger, start), })); } return result; }; return descriptor; }; exports.Log = Log; const LogAll = (loggerProperty = 'logger') => (0, decorate_all_1.DecorateAll)((0, exports.Log)(loggerProperty)); exports.LogAll = LogAll; const Parser = (type) => (target) => { Reflect.defineMetadata(ogma_constants_1.OGMA_CONTEXT_PARSER, type, target); return target; }; exports.Parser = Parser;