UNPKG

custom-api-handler

Version:

The package uses axios library to request APIs and uses local-storage for tokens (auth & refresh).

280 lines 14.4 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()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.apiHandler = void 0; const axios_1 = __importDefault(require("axios")); const customMsgs_1 = require("./customMsgs"); const customValidations_1 = require("./customValidations"); /** * API-Handler class for custom API requesting methods with axios */ class APIHandler { constructor() { this.tokenBearerLabel = ""; this.refreshTokenLabelName = Buffer.from(customMsgs_1.refreshToken).toString("base64"); this.accessTokenLabelName = Buffer.from(customMsgs_1.authToken).toString("base64"); /** * Method to set token label * @param tokenBearerLabel | Provide Bearer name to be included for tokens added in header for API request (if any) */ this.setTokenBearerLabel = (tokenBearerLabel) => { this.tokenBearerLabel = tokenBearerLabel; }; /** * Method to set refresh-token label name * @param refreshTokenLabelName | Provide refresh-token label name that is sent from backend-server. */ this.setRefreshTokenLabelName = (refreshTokenLabelName) => { this.refreshTokenLabelName = Buffer.from(refreshTokenLabelName).toString("base64"); localStorage.setItem(this.refreshTokenLabelName, ""); }; /** * Method to get current used refresh-token label name * @returns | Refresh-Token Label Name */ this.getRefreshTokenLabelName = () => Buffer.from(this.refreshTokenLabelName, "base64").toString(); /** * Method to set access-token label name * @param accessTokenLabelName | Provide access-token label name that is sent from backend-server. */ this.setAccessTokenLabelName = (accessTokenLabelName) => { this.accessTokenLabelName = Buffer.from(accessTokenLabelName).toString("base64"); localStorage.setItem(this.accessTokenLabelName, ""); }; /** * Method to get current used access-token label name * @returns | Access-Token Label Name */ this.getAccessTokenLabelName = () => Buffer.from(this.accessTokenLabelName, "base64").toString(); /** * Method to validate params * @param obj | Provide params in object for validation * @returns | custom msg (if error) or false */ this.validateParams = (obj) => { for (let objProp in obj) { if ((obj[objProp] === null || obj[objProp] === undefined) && objProp !== "params" && objProp !== "data") { return `${customMsgs_1.commonErrorMsg} ${objProp}!`; } } return false; }; /** * Method for requesting API with options for including auth & refresh tokens in API request header * @param {String} url | Provide API URL to be requested * @param {Method} method | Provide request type * @param {any} data | Provide request-body(if any) * @param {any} params | Provide request-params(if any) * @param {String} baseURL | Provide API Base-URL for the request * @param {Boolean} isAuthTokenRequiredInHeader | Provide true/false for adding auth-token from local-storage in header * @param {Boolean} isRefTokenRequiredInHeader | Provide true/false for adding refresh-token from local-storage in header * @returns | Requested API response promise */ this.requestApi = (url = "", method = "get", data = null, params = null, baseURL = "", isAuthTokenRequiredInHeader = true, isRefTokenRequiredInHeader = true) => __awaiter(this, void 0, void 0, function* () { try { let paramsValidation = this.validateParams({ url, method, data, params, baseURL, isAuthTokenRequiredInHeader, isRefTokenRequiredInHeader, }); if (paramsValidation) { throw new Error(paramsValidation); } else { let authTokenValue = ""; let refreshTokenValue = ""; let header = {}; if (isAuthTokenRequiredInHeader && isRefTokenRequiredInHeader) { authTokenValue = `${this.tokenBearerLabel} ${localStorage.getItem(this.accessTokenLabelName)}`; refreshTokenValue = `${this.tokenBearerLabel} ${localStorage.getItem(this.refreshTokenLabelName)}`; header = { [this.getAccessTokenLabelName()]: authTokenValue, [this.getRefreshTokenLabelName()]: refreshTokenValue, }; } else if (isAuthTokenRequiredInHeader) { authTokenValue = `${this.tokenBearerLabel} ${localStorage.getItem(this.accessTokenLabelName)}`; header = { [this.getAccessTokenLabelName()]: authTokenValue, }; } else if (isRefTokenRequiredInHeader) { refreshTokenValue = `${this.tokenBearerLabel} ${localStorage.getItem(this.refreshTokenLabelName)}`; header = { [this.getRefreshTokenLabelName()]: refreshTokenValue, }; } return yield axios_1.default({ baseURL, url, method, data, headers: header, params, }) .then((response) => response) .catch((error) => { throw error; }); } } catch (error) { throw error; } }); /** * Method for requesting API with refresh-token wrapper for requesting new auth & refresh tokens before each API request * @param {String} url | Provide API URL to be requested * @param {String} rftURL | Provide refresh-token API URL * @param {Method} method | Provide request type * @param {any} data | Provide request-body(if any) * @param {any} params | Provide request-params(if any) * @param {String} baseURL | Provide API Base-URL for the request * @param {String} rftBaseURL | Provide refresh-token API Base-URL for the request * @returns | Requested API response promise */ this.rftWrapper = (url = "", rftURL = "", method = "get", data = null, params = null, baseURL = "", rftBaseURL = "") => __awaiter(this, void 0, void 0, function* () { try { let paramsValidation = this.validateParams({ url, rftURL, method, data, params, baseURL, rftBaseURL, }); if (paramsValidation) { throw new Error(paramsValidation); } else { let refreshTokenHeaders = { [this.getAccessTokenLabelName()]: `${this.tokenBearerLabel} ${localStorage.getItem(this.accessTokenLabelName)}`, [this.getRefreshTokenLabelName()]: `${this.tokenBearerLabel} ${localStorage.getItem(this.refreshTokenLabelName)}`, }; return yield axios_1.default({ baseURL: rftBaseURL, url: rftURL, data: "", headers: refreshTokenHeaders, method: "GET", }) .then((response) => __awaiter(this, void 0, void 0, function* () { var _a, _b, _c, _d; if (((_b = (_a = response.data) === null || _a === void 0 ? void 0 : _a.response_type) === null || _b === void 0 ? void 0 : _b.toUpperCase()) === customMsgs_1.responseSuccess) { let responseData = (_c = response.data) === null || _c === void 0 ? void 0 : _c.response_data; let authTokenValue = responseData[this.getAccessTokenLabelName()]; let refreshTokenValue = responseData[this.getRefreshTokenLabelName()]; if (authTokenValue) { localStorage.setItem(this.accessTokenLabelName, authTokenValue); } if (refreshTokenValue) { localStorage.setItem(this.refreshTokenLabelName, refreshTokenValue); } return yield this.requestApi(url, method, data, params, baseURL); } else { if (((_d = response.data) === null || _d === void 0 ? void 0 : _d.error_description) === customMsgs_1.refreshTokenNotFound) { return yield this.requestApi(url, method, data, params, baseURL); } } })) .catch((error) => { setTimeout(() => { this.removeLocalStorage(); window.location.reload(); }, 2000); return Promise.reject(new Error(customMsgs_1.unknownError)); }); } } catch (error) { throw error; } }); /** * Method for requesting API with auth & refresh tokens expiry check and requesting new tokens before each API request (if expired) * @param {String} url | Provide API URL to be requested * @param {String} rftURL | Provide refresh-token API URL * @param {Method} method | Provide request type * @param {any} data | Provide request-body(if any) * @param {any} params | Provide request-params(if any) * @param {Boolean} isRFTandATValidationRequired | Provide true/false for including auth-token & refresh-token expiry check * @param {String} baseURL | Provide API Base-URL for the request * @param {String} rftBaseURL | Provide refresh-token API Base-URL for the request * @returns | Requested API response promise */ this.reqAPIwithRFTWrapper = (url = "", rftURL = "", method = "get", data = null, params = null, isRFTandATValidationRequired = true, baseURL = "", rftBaseURL = "") => __awaiter(this, void 0, void 0, function* () { try { let paramsValidation = this.validateParams({ url, rftURL, method, data, params, isRFTandATValidationRequired, baseURL, rftBaseURL, }); if (paramsValidation) { throw new Error(paramsValidation); } else { if (isRFTandATValidationRequired) { if (customValidations_1.isAccessTokenExpired() && !customValidations_1.isRefreshTokenExpired()) { return yield this.rftWrapper(url, rftURL, method, data, params, baseURL, rftBaseURL); } else if (customValidations_1.isRefreshTokenExpired()) { setTimeout(() => { this.removeLocalStorage(); window.location.reload(); }, 2000); return Promise.reject(new Error(customMsgs_1.sessionExpired)); } else { return yield this.requestApi(url, method, data, params, baseURL); } } else { return yield this.rftWrapper(url, rftURL, method, data, params, baseURL, rftBaseURL); } } } catch (error) { throw error; } }); /** * Method to remove auth-token & refresh-token from local-storage */ this.removeLocalStorage = () => { const localStorageArray = [ this.accessTokenLabelName, this.refreshTokenLabelName, ]; for (let localStorageItem of localStorageArray) { localStorage.removeItem(localStorageItem); } }; } } exports.apiHandler = new APIHandler(); //# sourceMappingURL=index.js.map