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
JavaScript
"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