UNPKG

axios-master

Version:

Axios wrapper for advanced response time logging, retries, and token refresh.

124 lines (123 loc) 5.97 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.axiosMasterLogger = exports.axiosMasterMain = void 0; const axios_1 = require("axios"); const https = require("https"); const axiosMasterMain = (default_config, masterConfig) => __awaiter(void 0, void 0, void 0, function* () { var _a, _b; const httpsAgent = new https.Agent({ rejectUnauthorized: false, }); const config = Object.assign({ timeout: masterConfig.timeout || 20000, httpsAgent: httpsAgent }, default_config); const startTime = Date.now(); const log = (level, message, data) => { if (masterConfig.logger) { masterConfig.logger({ log_levels: level, message: message, json: data, }); } }; const makeRequest = () => __awaiter(void 0, void 0, void 0, function* () { var _a; try { const response = yield (0, axios_1.default)(config); const elapsedTime = parseFloat(((Date.now() - startTime) / 1000).toFixed(5)); console.log("\x1b[32m", ": resolve"); console.log("\x1b[33m", `${masterConfig.name || config.url} => ${elapsedTime} s :`); if (masterConfig.log) { console.log(response); } console.log("\x1b[32m", ": resolve"); return response; } catch (error) { const elapsedTime = parseFloat(((Date.now() - startTime) / 1000).toFixed(5)); if (masterConfig.log) { console.log(error); } const isTimeout = axios_1.default.isAxiosError(error) && (error.code === "ECONNABORTED" || error.code === "ETIMEDOUT"); if (isTimeout) { console.log("\x1b[31m", "⚠️ Request timed out."); } console.log("\x1b[35m", ": reject"); console.log("\x1b[33m", `${masterConfig.name || config.url} => ${elapsedTime} s :`); if (error instanceof axios_1.AxiosError && error.response) { console.log((_a = error.response) === null || _a === void 0 ? void 0 : _a.data); } console.log("\x1b[35m", ": reject"); throw error; } }); try { const response = yield makeRequest(); log("INFO", `API -> ${masterConfig.name || config.url}`, { time: parseFloat(((Date.now() - startTime) / 1000).toFixed(5)), request: default_config, response: response.data, responseBody: response.data, statusCode: response.status, }); return response.data; } catch (error) { const isTimeout = axios_1.default.isAxiosError(error) && (error.code === "ECONNABORTED" || error.code === "ETIMEDOUT"); if (error instanceof axios_1.AxiosError && ((_a = masterConfig.shouldRetryStatus) === null || _a === void 0 ? void 0 : _a.includes((_b = error.response) === null || _b === void 0 ? void 0 : _b.status)) && masterConfig.shouldRetry) { try { if (masterConfig.retryFunction) { const token = yield masterConfig.retryFunction(); config.headers.Authorization = `Bearer ${token}`; } const retryResponse = yield makeRequest(); log("INFO", `API -> ${masterConfig.name || config.url}`, { time: parseFloat(((Date.now() - startTime) / 1000).toFixed(5)), request: default_config, response: retryResponse.data || null, responseBody: isTimeout ? error.code : retryResponse.data, statusCode: retryResponse.status || null, }); return retryResponse.data; } catch (retryError) { const isTimeout = axios_1.default.isAxiosError(retryError) && (retryError.code === "ECONNABORTED" || retryError.code === "ETIMEDOUT"); log("WARN", `Retry API -> ${masterConfig.name || config.url} failed`, { time: parseFloat(((Date.now() - startTime) / 1000).toFixed(5)), request: default_config, response: retryError.response || null, responseBody: isTimeout ? retryError.code : retryError.response.data, statusCode: retryError.status || null, }); return Promise.reject(isTimeout ? retryError : retryError.response); } } else { log("WARN", `API -> ${masterConfig.name || config.url} failed`, { time: parseFloat(((Date.now() - startTime) / 1000).toFixed(5)), request: default_config, response: error.response || null, responseBody: isTimeout ? error.code : error.response.data, statusCode: error.status || null, }); return Promise.reject(isTimeout ? error : error.response); } } }); exports.axiosMasterMain = axiosMasterMain; exports.axiosMasterLogger = exports.axiosMasterMain; exports.default = exports.axiosMasterMain;