@appello/services
Version:
Services package with api / graphql
57 lines (56 loc) • 2.92 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createApiService = void 0;
const common_1 = require("@appello/common");
const axios_1 = __importDefault(require("axios"));
const consts_1 = require("./consts");
const utils_1 = require("./utils");
const createApiService = (config) => {
const { url: baseURL, axiosConfig } = config;
const axiosInstance = axios_1.default.create(Object.assign({ baseURL, headers: Object.assign({ Accept: 'application/json', 'Content-Type': 'application/json' }, axiosConfig === null || axiosConfig === void 0 ? void 0 : axiosConfig.headers) }, axiosConfig));
axiosInstance.interceptors.request.use(async (requestConfig) => {
var _a;
const accessToken = await ((_a = config.getAccessToken) === null || _a === void 0 ? void 0 : _a.call(config));
if (!accessToken) {
return requestConfig;
}
requestConfig.headers = (0, utils_1.setAuthorizationHeader)(accessToken, requestConfig.headers);
return requestConfig;
});
axiosInstance.interceptors.response.use(response => response, (error) => {
var _a, _b;
const originalRequest = error.config;
if (!originalRequest || !axios_1.default.isAxiosError(error)) {
return Promise.reject(error);
}
const isRefreshing = ((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) === consts_1.ApiErrorStatusEnum.UNAUTHORIZED &&
!originalRequest.refreshRetry &&
((_b = error === null || error === void 0 ? void 0 : error.config) === null || _b === void 0 ? void 0 : _b.url) !== config.refreshTokenUrl;
if (isRefreshing) {
return (0, utils_1.refreshTokens)(axiosInstance, error, config);
}
return Promise.reject(error);
});
return {
axios: axiosInstance,
get: (url, query, config) => axiosInstance.get(url, Object.assign({ params: query }, config)),
delete: (url, query, config) => axiosInstance.delete(url, Object.assign({ params: query }, config)),
post: (url, data, config) => axiosInstance.post(url, data, config),
put: (url, data, config) => axiosInstance.put(url, data, config),
patch: (url, data, config) => axiosInstance.patch(url, data, config),
request: config => axiosInstance.request(config),
setBaseUrl: url => {
axiosInstance.defaults.baseURL = url;
},
setAxiosConfig: config => {
(0, common_1.deepMergeObjects)(axiosInstance.defaults, config);
},
clone: (newConfig) => {
return (0, exports.createApiService)((0, common_1.deepMergeObjects)(config, newConfig));
},
};
};
exports.createApiService = createApiService;