UNPKG

@amirmarmul/waba-common

Version:

![GitHub release](https://img.shields.io/github/v/release/amirmarmul/waba-common?style=flat-square)

114 lines (113 loc) 3.93 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.useMongoLogger = void 0; const mongoose_1 = __importDefault(require("mongoose")); const querystring_1 = __importDefault(require("querystring")); const lodash_1 = __importDefault(require("lodash")); const NAMESPACE = 'axios-logger-mongo'; const logRequest = (logModel) => (axiosConfig) => { axiosConfig[NAMESPACE] = Object.assign({ requestTimestamp: Date.now() }, axiosConfig); return axiosConfig; }; function createRequestObject({ axiosConfig, axiosRequest }) { const url = new URL(axiosConfig.url); const requestHeaders = { host: url.host, ...lodash_1.default.mapKeys(axiosConfig.headers, (val, key) => key.toLowerCase()), }; let requestBody; if (requestHeaders['content-type'] && requestHeaders['content-type'].startsWith('application/json')) { try { requestBody = JSON.parse(axiosConfig.data); } catch (err) { requestBody = requestBody || null; } } else { requestBody = axiosConfig.data || null; } return { method: axiosRequest.method || axiosConfig.method.toUpperCase(), path: axiosRequest.path || url.pathname, headers: requestHeaders, query: { ...querystring_1.default.parse(url.search.replace('?', '')), ...axiosConfig.params, }, body: requestBody, }; } function createResponseObject({ axiosResponse }) { let body = axiosResponse.data || null; return { status: axiosResponse.status, statusText: axiosResponse.statusText, headers: axiosResponse.headers, body, }; } const logResponse = (logModel) => (axiosResponse) => { const axiosConfig = axiosResponse.config; const axiosRequest = axiosResponse.request; const { requestTimestamp } = axiosConfig[NAMESPACE]; const responseTimestamp = Date.now(); const request = createRequestObject({ axiosConfig, axiosRequest }); const response = createResponseObject({ axiosResponse }); logModel.create({ request, response, error: null, requestTimestamp, responseTimestamp, duration: responseTimestamp - requestTimestamp }); return axiosResponse; }; const logError = (logModel) => (axiosError) => { const axiosConfig = axiosError.config; const axiosRequest = axiosError.request; const { requestTimestamp } = axiosConfig[NAMESPACE]; const responseTimestamp = Date.now(); const request = createRequestObject({ axiosConfig, axiosRequest, }); const response = null; const error = axiosError.message; logModel.create({ request, response, error, requestTimestamp, responseTimestamp, duration: responseTimestamp - requestTimestamp, }); return Promise.reject(axiosError); }; function useMongoLogger(axios, { mongoURL, collectionName }) { mongoose_1.default.connect(mongoURL); const logSchema = new mongoose_1.default.Schema({ request: mongoose_1.default.Schema.Types.Mixed, response: mongoose_1.default.Schema.Types.Mixed, error: mongoose_1.default.Schema.Types.Mixed, requestTimestamp: mongoose_1.default.Schema.Types.Mixed, responseTimestamp: mongoose_1.default.Schema.Types.Mixed, duration: mongoose_1.default.Schema.Types.Mixed, }, { timestamps: true }); const logModel = mongoose_1.default.model('AxiosLog', logSchema, collectionName); axios.interceptors.request.use(logRequest(logModel)); axios.interceptors.response.use(logResponse(logModel), logError(logModel)); } exports.useMongoLogger = useMongoLogger;