diff --git a/packages/axios/src/index.ts b/packages/axios/src/index.ts index 08846c24..0415bc3b 100644 --- a/packages/axios/src/index.ts +++ b/packages/axios/src/index.ts @@ -1,5 +1,5 @@ import axios, { AxiosError } from 'axios'; -import type { AxiosResponse, CancelTokenSource, CreateAxiosDefaults, InternalAxiosRequestConfig } from 'axios'; +import type { AxiosResponse, CreateAxiosDefaults, InternalAxiosRequestConfig } from 'axios'; import axiosRetry from 'axios-retry'; import { nanoid } from '@sa/utils'; import { createAxiosConfig, createDefaultOptions, createRetryOptions } from './options'; @@ -22,7 +22,7 @@ function createCommonRequest( const axiosConf = createAxiosConfig(axiosConfig); const instance = axios.create(axiosConf); - const cancelTokenSourceMap = new Map(); + const abortControllerMap = new Map(); // config axios retry const retryOptions = createRetryOptions(axiosConf); @@ -35,10 +35,12 @@ function createCommonRequest( const requestId = nanoid(); config.headers.set(REQUEST_ID_KEY, requestId); - // config cancel token - const cancelTokenSource = axios.CancelToken.source(); - config.cancelToken = cancelTokenSource.token; - cancelTokenSourceMap.set(requestId, cancelTokenSource); + // config abort controller + if (!config.signal) { + const abortController = new AbortController(); + config.signal = abortController.signal; + abortControllerMap.set(requestId, abortController); + } // handle config by hook const handledConfig = opts.onRequest?.(config) || config; @@ -79,18 +81,18 @@ function createCommonRequest( ); function cancelRequest(requestId: string) { - const cancelTokenSource = cancelTokenSourceMap.get(requestId); - if (cancelTokenSource) { - cancelTokenSource.cancel(); - cancelTokenSourceMap.delete(requestId); + const abortController = abortControllerMap.get(requestId); + if (abortController) { + abortController.abort(); + abortControllerMap.delete(requestId); } } function cancelAllRequest() { - cancelTokenSourceMap.forEach(cancelTokenSource => { - cancelTokenSource.cancel(); + abortControllerMap.forEach(abortController => { + abortController.abort(); }); - cancelTokenSourceMap.clear(); + abortControllerMap.clear(); } return { diff --git a/packages/axios/src/type.ts b/packages/axios/src/type.ts index 0ecbacbb..e65e9849 100644 --- a/packages/axios/src/type.ts +++ b/packages/axios/src/type.ts @@ -69,7 +69,19 @@ export type CustomAxiosRequestConfig = Omit { + /** + * cancel the request by request id + * + * if the request provide abort controller sign from config, it will not collect in the abort controller map + * + * @param requestId + */ cancelRequest: (requestId: string) => void; + /** + * cancel all request + * + * if the request provide abort controller sign from config, it will not collect in the abort controller map + */ cancelAllRequest: () => void; /** you can set custom state in the request instance */ state: T; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7827ce9e..bc77bd38 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -191,7 +191,7 @@ importers: specifier: workspace:* version: link:../axios '@sa/utils': - specifier: workspace:^ + specifier: workspace:* version: link:../utils packages/materials: