as-app/src/network/axios.js

65 lines
2 KiB
JavaScript

import axios from "axios";
import axiosRetry from "axios-retry";
import defaultsDeep from "lodash.defaultsdeep";
import { getAuthState } from "~/stores";
import { setBearerHeader } from "./headers";
import { createLogger } from "~/lib/logger";
import { NETWORK_SCOPES } from "~/lib/logger/scopes";
const axiosLogger = createLogger({
module: NETWORK_SCOPES.HTTP,
feature: "axios-client",
});
export default function createAxios(baseOptions = {}) {
const instance = axios.create(baseOptions);
instance.interceptors.request.use(
function (config) {
if (!config.headers) {
config.headers = {};
}
const defaultConfig = {
headers: {
"Content-Type": "application/json",
},
};
setBearerHeader(defaultConfig.headers, getAuthState().userToken);
defaultsDeep(config, defaultConfig);
return config;
},
function (error) {
// axiosLogger.error("Request interceptor error", {
// error: error.message,
// stack: error.stack
// });
return Promise.reject(error);
},
);
instance.interceptors.response.use(
function (response) {
// Any status code that lie within the range of 2xx cause this function to trigger
// Do something with response data
return response;
},
function (error) {
// Any status codes that falls outside the range of 2xx cause this function to trigger
// Do something with response error
if (error.response) {
// axiosLogger.debug("Response headers", { headers: error.response.headers });
axiosLogger.error("HTTP response error", {
status: error.response.status,
data: JSON.stringify(error.response.data),
});
} else {
axiosLogger.error("HTTP request failed", {
error: error.message,
stack: error.stack,
});
}
return Promise.reject(error);
},
);
axiosRetry(instance, { retries: 3, retryDelay: axiosRetry.exponentialDelay });
return instance;
}