@amirmarmul/waba-common
Version:

114 lines (113 loc) • 3.93 kB
JavaScript
;
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;