import axios from 'axios' import config, { defaultRequestInterceptors, defaultResponseInterceptors } from './config' import { AxiosInstance, InternalAxiosRequestConfig, RequestConfig, AxiosResponse } from './type' const { interceptors, baseUrl } = config export const PATH_URL = baseUrl[import.meta.env.VITE_API_BASEPATH] const { requestInterceptors, responseInterceptors } = interceptors const abortControllerMap: Map = new Map() const axiosInstance: AxiosInstance = axios.create({ ...config, baseURL: PATH_URL }) axiosInstance.interceptors.request.use((res: InternalAxiosRequestConfig) => { const controller = new AbortController() const url = res.url || '' res.signal = controller.signal abortControllerMap.set(url, controller) return res }) axiosInstance.interceptors.response.use( (res: AxiosResponse) => { const url = res.config.url || '' abortControllerMap.delete(url) return res.data }, (err: any) => err ) axiosInstance.interceptors.request.use(requestInterceptors || defaultRequestInterceptors) axiosInstance.interceptors.response.use(responseInterceptors || defaultResponseInterceptors) const service = { request: (config: RequestConfig) => { return new Promise((resolve, reject) => { if (config.interceptors?.requestInterceptors) { config = config.interceptors.requestInterceptors(config as any) } axiosInstance .request(config) .then((res) => { resolve(res) }) .catch((err: any) => { reject(err) }) }) }, cancelRequest: (url: string | string[]) => { const urlList = Array.isArray(url) ? url : [url] for (const _url of urlList) { abortControllerMap.get(_url)?.abort() abortControllerMap.delete(_url) } }, cancelAllRequest() { for (const [_, controller] of abortControllerMap) { controller.abort() } abortControllerMap.clear() } } export default service