@robot-admin/request-core 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/CHANGELOG.md +102 -0
  2. package/LICENSE +21 -0
  3. package/README.md +248 -357
  4. package/SECURITY.md +14 -0
  5. package/dist/axios.cjs +134 -809
  6. package/dist/axios.cjs.map +1 -1
  7. package/dist/axios.d.cts +55 -220
  8. package/dist/axios.d.ts +55 -220
  9. package/dist/axios.js +2 -790
  10. package/dist/axios.js.map +1 -1
  11. package/dist/chunk-2JXH7SIL.js +711 -0
  12. package/dist/chunk-2JXH7SIL.js.map +1 -0
  13. package/dist/chunk-56QOEWUS.js +8 -0
  14. package/dist/chunk-56QOEWUS.js.map +1 -0
  15. package/dist/chunk-DUP3Y4DN.js +320 -0
  16. package/dist/chunk-DUP3Y4DN.js.map +1 -0
  17. package/dist/chunk-JGFRUAZT.cjs +1007 -0
  18. package/dist/chunk-JGFRUAZT.cjs.map +1 -0
  19. package/dist/chunk-KHI6XQRN.cjs +717 -0
  20. package/dist/chunk-KHI6XQRN.cjs.map +1 -0
  21. package/dist/chunk-OAZ5BUBU.js +969 -0
  22. package/dist/chunk-OAZ5BUBU.js.map +1 -0
  23. package/dist/chunk-QSDNDTOZ.js +28 -0
  24. package/dist/chunk-QSDNDTOZ.js.map +1 -0
  25. package/dist/chunk-UHXBAFY6.cjs +323 -0
  26. package/dist/chunk-UHXBAFY6.cjs.map +1 -0
  27. package/dist/chunk-WUZ43MLM.cjs +30 -0
  28. package/dist/chunk-WUZ43MLM.cjs.map +1 -0
  29. package/dist/chunk-WXHQXPS4.cjs +10 -0
  30. package/dist/chunk-WXHQXPS4.cjs.map +1 -0
  31. package/dist/crud.cjs +12 -484
  32. package/dist/crud.cjs.map +1 -1
  33. package/dist/crud.d.cts +8 -269
  34. package/dist/crud.d.ts +8 -269
  35. package/dist/crud.js +4 -487
  36. package/dist/crud.js.map +1 -1
  37. package/dist/index.cjs +136 -1302
  38. package/dist/index.cjs.map +1 -1
  39. package/dist/index.d.cts +7 -165
  40. package/dist/index.d.ts +7 -165
  41. package/dist/index.js +5 -1283
  42. package/dist/index.js.map +1 -1
  43. package/dist/naive.cjs +14 -0
  44. package/dist/naive.cjs.map +1 -0
  45. package/dist/naive.d.cts +9 -0
  46. package/dist/naive.d.ts +9 -0
  47. package/dist/naive.js +5 -0
  48. package/dist/naive.js.map +1 -0
  49. package/dist/types-BRDRqYFs.d.cts +197 -0
  50. package/dist/types-BVJhlSuh.d.cts +310 -0
  51. package/dist/types-BVJhlSuh.d.ts +310 -0
  52. package/dist/types-CUyibJZX.d.ts +197 -0
  53. package/dist/vue.cjs +93 -0
  54. package/dist/vue.cjs.map +1 -0
  55. package/dist/vue.d.cts +38 -0
  56. package/dist/vue.d.ts +38 -0
  57. package/dist/vue.js +71 -0
  58. package/dist/vue.js.map +1 -0
  59. package/package.json +60 -16
package/dist/axios.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/axios/plugins/request.ts","../src/axios/utils/abort.ts","../src/axios/utils/helpers.ts","../src/axios/plugins/dedupe.ts","../src/axios/plugins/cache.ts","../src/axios/plugins/retry.ts","../src/axios/plugins/response.ts","../src/axios/plugins/cancel.ts","../src/axios/plugins/index.ts","../src/axios/service.ts","../src/axios/request.ts"],"names":["onRequest","onResponse","onResponseError","CLEANUP_INTERVAL","REQUEST_TIMEOUT","cleanupTimer","cleanupExpiredRequests","stopCleanupTimerIfIdle","startCleanupTimer"],"mappings":"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","file":"axios.js","sourcesContent":["/*\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2026-02-07 10:00:00\n * @LastEditors: ChenYu ycyplus@gmail.com\n * @LastEditTime: 2026-02-07 10:00:00\n * @FilePath: \\robot-admin-request-core\\src\\axios\\plugins\\request.ts\n * @Description: 请求侧通用逻辑插件(预留 reLogin 管理)\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n */\n\nimport type { AxiosInstance } from \"axios\";\n\n/**\n * 处理 token 过期的共享 Promise\n */\nlet reLoginPromise: Promise<void> | null = null;\nlet reLoginResolve: (() => void) | null = null;\nlet reLoginReject: ((reason?: unknown) => void) | null = null;\n\n/**\n * 创建重新登录 Promise\n */\nexport function waitForReLogin(): Promise<void> {\n if (!reLoginPromise) {\n reLoginPromise = new Promise<void>((resolve, reject) => {\n reLoginResolve = resolve;\n reLoginReject = reject;\n }).finally(() => {\n reLoginPromise = null;\n reLoginResolve = null;\n reLoginReject = null;\n });\n }\n return reLoginPromise;\n}\n\n/**\n * 获取重新登录 Promise\n */\nexport function getReLoginPromise(): Promise<void> | null {\n return reLoginPromise;\n}\n\n/**\n * 重新登录成功\n */\nexport function resolveReLogin(): void {\n if (reLoginResolve) {\n reLoginResolve();\n }\n}\n\n/**\n * 重新登录失败或取消\n */\nexport function rejectReLogin(reason?: unknown): void {\n if (reLoginReject) {\n reLoginReject(reason);\n }\n}\n\n/**\n * 设置请求插件(预留,具体逻辑由用户通过 interceptors 配置)\n */\nexport function setupRequestPlugin(instance: AxiosInstance): void {\n // 不做任何处理,由用户通过 createRequestCore 的 interceptors 配置\n // 例如:token 注入、请求头设置等\n}\n","/*\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2026-08-09\n * @FilePath: \\robot-admin-request-core\\src\\axios\\utils\\abort.ts\n * @Description: Axios 插件共享取消上下文管理\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n */\n\nimport type { EnhancedAbortController, EnhancedAxiosRequestConfig } from \"../types\";\n\n/**\n * 创建或复用请求级共享 AbortController。\n *\n * 调用方 signal 不直接作为 Axios 最终 signal 使用,而是单向桥接到共享\n * controller。这样调用方取消、重复请求取消和路由批量取消都会落到同一信号,\n * 同时避免 dedupe/cancel 插件互相覆盖 config.signal。\n */\nexport function ensureSharedAbortController(\n config: EnhancedAxiosRequestConfig,\n): EnhancedAbortController | null {\n if (typeof AbortController === \"undefined\") return null;\n\n const existing = config.__abortController;\n if (existing) {\n existing._startTime ??= Date.now();\n config.signal = existing.signal;\n return existing;\n }\n\n const externalSignal = config.signal;\n const controller = new AbortController() as EnhancedAbortController;\n controller._startTime = Date.now();\n\n if (externalSignal && externalSignal !== controller.signal) {\n config.__externalSignal = externalSignal;\n\n const forwardAbort = () => {\n if (!controller.signal.aborted) {\n controller.abort((externalSignal as AbortSignal).reason);\n }\n };\n\n if (externalSignal.aborted) {\n forwardAbort();\n } else {\n externalSignal.addEventListener?.(\"abort\", forwardAbort, { once: true });\n config.__abortCleanup = () => {\n externalSignal.removeEventListener?.(\"abort\", forwardAbort);\n };\n }\n }\n\n config.__abortController = controller;\n config.signal = controller.signal;\n return controller;\n}\n\n/**\n * 清理请求级取消桥接,并恢复调用方原始 signal。\n *\n * 必须在内置 retry 插件之后执行,确保自动重试期间桥接持续有效;恢复后的\n * config 也可被 Robot_Admin 等消费方在 401 业务拦截器中安全地再次发送。\n */\nexport function cleanupAbortContext(\n config: EnhancedAxiosRequestConfig | undefined,\n): void {\n if (!config) return;\n\n config.__abortCleanup?.();\n\n if (config.__externalSignal) {\n config.signal = config.__externalSignal;\n } else if (config.signal === config.__abortController?.signal) {\n delete config.signal;\n }\n\n delete config.__abortCleanup;\n delete config.__externalSignal;\n delete config.__abortController;\n}\n","/*\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2026-02-07 10:00:00\n * @LastEditors: ChenYu ycyplus@gmail.com\n * @LastEditTime: 2026-02-07 10:00:00\n * @FilePath: \\robot-admin-request-core\\src\\axios\\utils\\helpers.ts\n * @Description: axios 插件 - 工具函数\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n */\n\nimport type { AxiosRequestConfig, GenericAbortSignal } from \"axios\";\nimport type { CacheItem } from \"../types\";\n\n/**\n * 对象键排序后序列化(确保相同对象生成相同的 key)\n * 增强版:处理数组排序和循环引用\n */\nconst binaryObjectIds = new WeakMap<object, number>();\nlet nextBinaryObjectId = 0;\n\nfunction getBinaryObjectId(value: object): number {\n let id = binaryObjectIds.get(value);\n if (id === undefined) {\n id = ++nextBinaryObjectId;\n binaryObjectIds.set(value, id);\n }\n return id;\n}\n\nfunction sortedStringify(obj: any, seen = new WeakSet<object>()): string {\n if (obj === null || obj === undefined) {\n return \"\";\n }\n\n if (typeof obj === \"bigint\") return `bigint:${obj.toString()}`;\n if (typeof obj !== \"object\") {\n return `${typeof obj}:${String(obj)}`;\n }\n\n // 处理循环引用 - 抛出错误而不是静默处理\n if (seen.has(obj)) {\n throw new Error(\"检测到循环引用,无法生成稳定的缓存键\");\n }\n seen.add(obj);\n\n try {\n if (Array.isArray(obj)) {\n return `[${obj.map((item) => sortedStringify(item, seen)).join(\",\")}]`;\n }\n\n if (obj instanceof Date) return `date:${obj.toISOString()}`;\n\n if (typeof URLSearchParams !== \"undefined\" && obj instanceof URLSearchParams) {\n return `url-search:${JSON.stringify(Array.from(obj.entries()).sort())}`;\n }\n\n if (typeof FormData !== \"undefined\" && obj instanceof FormData) {\n const entries = Array.from(obj.entries()).map(([key, value]) => [\n key,\n typeof value === \"string\"\n ? `string:${value}`\n : `binary:${getBinaryObjectId(value)}:${value.name}:${value.size}:${value.type}`,\n ]);\n return `form-data:${JSON.stringify(entries)}`;\n }\n\n if (\n (typeof Blob !== \"undefined\" && obj instanceof Blob) ||\n obj instanceof ArrayBuffer ||\n ArrayBuffer.isView(obj)\n ) {\n return `binary:${getBinaryObjectId(obj)}`;\n }\n\n const source =\n typeof obj.toJSON === \"function\" && obj.constructor?.name === \"AxiosHeaders\"\n ? obj.toJSON()\n : obj;\n const sortedKeys = Object.keys(source).sort();\n return `{${sortedKeys\n .map((key) => `${JSON.stringify(key)}:${sortedStringify(source[key], seen)}`)\n .join(\",\")}}`;\n } finally {\n seen.delete(obj);\n }\n}\n\n/**\n * 生成请求唯一标识 key\n *\n * 注意:默认会纳入鉴权相关请求头(Authorization / X-Tenant-Id),\n * 避免多租户/多用户场景下不同身份命中同一缓存或被去重合并造成数据串台。\n */\nexport function generateRequestKey(config: AxiosRequestConfig): string {\n const { method = \"get\", url = \"\", params, data, headers } = config;\n\n const parts: string[] = [method.toUpperCase(), url];\n\n // 添加 params(GET 请求参数)- 使用排序后的序列化\n if (params != null) {\n parts.push(sortedStringify(params));\n }\n\n // 添加 data(POST 请求体)- 使用排序后的序列化\n if (data != null) {\n parts.push(sortedStringify(data));\n }\n\n // 纳入鉴权/租户上下文相关头,防止跨用户缓存命中与去重合并\n if (headers) {\n const authHeaders: Record<string, string> = {};\n const authKeys = [\"authorization\", \"x-tenant-id\", \"x-user-id\"];\n const lowerHeaders: Record<string, any> = {};\n const headerSource =\n typeof (headers as any).toJSON === \"function\"\n ? (headers as any).toJSON()\n : headers;\n for (const [k, v] of Object.entries(headerSource)) {\n lowerHeaders[String(k).toLowerCase()] = v;\n }\n for (const key of authKeys) {\n if (lowerHeaders[key] != null) {\n authHeaders[key] = String(lowerHeaders[key]);\n }\n }\n if (Object.keys(authHeaders).length > 0) {\n parts.push(sortedStringify(authHeaders));\n }\n }\n\n return parts.join(\"|\");\n}\n\n/**\n * 内存缓存管理器(增强版:支持大小限制和 LRU)\n */\nexport class MemoryCache {\n private cache = new Map<string, CacheItem>();\n private maxSize = 1000; // 最大缓存数量\n private accessOrder = new Set<string>(); // 记录访问顺序\n\n /**\n * 获取缓存\n */\n get<T = any>(key: string): T | null {\n const item = this.cache.get(key);\n\n if (!item) return null;\n\n // 检查是否过期\n if (Date.now() > item.expireAt) {\n this.cache.delete(key);\n this.accessOrder.delete(key);\n return null;\n }\n\n // 更新访问顺序(LRU)\n this.accessOrder.delete(key);\n this.accessOrder.add(key);\n\n return item.data as T;\n }\n\n /**\n * 设置缓存\n */\n set<T = any>(key: string, data: T, ttl: number): void {\n if (!Number.isFinite(ttl) || ttl < 0) {\n throw new RangeError(\"缓存 TTL 必须是大于或等于 0 的有限数值\");\n }\n\n if (this.maxSize === 0) return;\n\n // 如果超过最大大小,清理最旧的缓存\n if (this.cache.size >= this.maxSize && !this.cache.has(key)) {\n this.evictOldest();\n }\n\n const expireAt = Date.now() + ttl;\n\n this.cache.set(key, {\n data,\n expireAt,\n });\n\n // 更新访问顺序\n this.accessOrder.delete(key);\n this.accessOrder.add(key);\n }\n\n /**\n * 删除缓存\n */\n delete(key: string): boolean {\n this.accessOrder.delete(key);\n return this.cache.delete(key);\n }\n\n /**\n * 清空所有缓存\n */\n clear(): void {\n this.cache.clear();\n this.accessOrder.clear();\n }\n\n /**\n * 清理过期缓存\n */\n cleanup(): void {\n const now = Date.now();\n const entries = Array.from(this.cache.entries());\n\n for (const [key, item] of entries) {\n if (now > item.expireAt) {\n this.cache.delete(key);\n this.accessOrder.delete(key);\n }\n }\n }\n\n /**\n * 获取缓存大小\n */\n get size(): number {\n return this.cache.size;\n }\n\n /**\n * 设置最大缓存大小\n */\n setMaxSize(size: number): void {\n if (!Number.isInteger(size) || size < 0) {\n throw new RangeError(\"缓存最大容量必须是大于或等于 0 的整数\");\n }\n\n this.maxSize = size;\n\n // 如果当前缓存超过新的大小限制,清理最旧的\n while (this.cache.size > this.maxSize) {\n this.evictOldest();\n }\n }\n\n /**\n * 清理最旧的缓存(LRU)\n */\n private evictOldest(): void {\n const oldestKey = this.accessOrder.values().next().value;\n if (oldestKey) {\n this.cache.delete(oldestKey);\n this.accessOrder.delete(oldestKey);\n }\n }\n}\n\n/**\n * 全局缓存实例\n */\nexport const globalCache = new MemoryCache();\n\n/**\n * 延迟函数\n */\nexport function delay(ms: number, signal?: GenericAbortSignal): Promise<void> {\n if (signal?.aborted) {\n return Promise.reject(createAbortError((signal as AbortSignal).reason));\n }\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n signal?.removeEventListener?.(\"abort\", onAbort);\n resolve();\n }, Math.max(0, Number.isFinite(ms) ? ms : 0));\n\n const onAbort = () => {\n clearTimeout(timer);\n signal?.removeEventListener?.(\"abort\", onAbort);\n reject(createAbortError((signal as AbortSignal | undefined)?.reason));\n };\n\n signal?.addEventListener?.(\"abort\", onAbort, { once: true });\n });\n}\n\nfunction createAbortError(reason?: unknown): Error {\n if (reason instanceof Error) return reason;\n return Object.assign(new Error(\"canceled\"), {\n name: \"AbortError\",\n code: \"ERR_CANCELED\",\n reason,\n });\n}\n\n/**\n * 判断是否为网络错误\n */\nexport function isNetworkError(error: any): boolean {\n return (\n !error.response &&\n Boolean(error.code) &&\n error.code !== \"ECONNABORTED\" &&\n error.code !== \"ERR_CANCELED\" &&\n error.message !== \"canceled\" &&\n error.message !== \"Request aborted\" &&\n error.message !== \"Request cancelled\"\n );\n}\n\n/**\n * 判断是否为超时错误(基于 axios 的 error.code,避免依赖易变的消息字符串)\n */\nexport function isTimeoutError(error: any): boolean {\n return error?.code === \"ECONNABORTED\" || error?.code === \"ETIMEDOUT\";\n}\n\n/**\n * 判断是否为可重试的状态码\n */\nexport function isRetryableStatus(\n status: number,\n retryableStatusCodes: number[],\n): boolean {\n return retryableStatusCodes.includes(status);\n}\n\n/**\n * 规范化配置(将 boolean 转换为对象)\n */\nexport function normalizeConfig<T extends Record<string, any>>(\n config: boolean | T | undefined,\n defaults: T,\n): T {\n if (config === true) {\n return { ...defaults, enabled: true };\n }\n\n if (config === false) {\n return { ...defaults, enabled: false };\n }\n\n if (config && typeof config === \"object\") {\n const definedEntries = Object.entries(config).filter(\n ([, value]) => value !== undefined,\n );\n return { ...defaults, ...Object.fromEntries(definedEntries) };\n }\n\n return defaults;\n}\n","/*\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2026-02-07 10:00:00\n * @LastEditors: ChenYu ycyplus@gmail.com\n * @LastEditTime: 2026-02-07 10:00:00\n * @FilePath: \\robot-admin-request-core\\src\\axios\\plugins\\dedupe.ts\n * @Description: 请求去重插件(AbortController)\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n */\n\nimport type { AxiosInstance, InternalAxiosRequestConfig } from \"axios\";\nimport type {\n EnhancedAxiosRequestConfig,\n DedupeConfig,\n EnhancedAbortController,\n} from \"../types\";\nimport { ensureSharedAbortController } from \"../utils/abort\";\nimport { generateRequestKey, normalizeConfig } from \"../utils/helpers\";\n\n/**\n * 默认去重配置\n * - enabled: 是否启用去重,默认开启\n * - keyGenerator: 请求键生成器,默认使用 generateRequestKey\n */\nconst DEFAULT_DEDUPE_CONFIG: Required<DedupeConfig> = {\n enabled: true,\n keyGenerator: generateRequestKey,\n};\n\n/**\n * 正在进行的请求 Map\n * key: 请求唯一标识符(基于 URL、参数、方法等生成)\n * value: 增强的 AbortController(包含创建时间)\n *\n * 去重原理:\n * - 相同的请求(相同 key)只能有一个在进行\n * - 新请求会取消旧请求,确保只有一个活跃请求\n * - 避免重复请求造成的资源浪费\n */\nconst pendingRequests = new Map<string, EnhancedAbortController>();\nconst CLEANUP_INTERVAL = 30000;\nconst REQUEST_TIMEOUT = 5 * 60 * 1000;\nlet cleanupTimer: ReturnType<typeof setInterval> | null = null;\n\n/**\n * 清理超时的请求\n *\n * 功能:\n * 1. 清理超过 5 分钟的请求\n * 2. 防止长时间挂起的请求占用内存\n * 3. 自动取消超时请求释放资源\n *\n * 清理策略:\n * - 每 30 秒执行一次清理\n * - 基于请求创建时间判断超时\n * - 安全地取消和清理请求\n */\nfunction cleanupExpiredRequests(): void {\n const now = Date.now();\n Array.from(pendingRequests.entries()).forEach(([key, controller]) => {\n const startTime = controller._startTime || now;\n if (now - startTime > REQUEST_TIMEOUT) {\n try {\n controller.abort();\n } catch (error) {\n console.warn(\"Abort error:\", error);\n }\n pendingRequests.delete(key);\n }\n });\n\n stopCleanupTimerIfIdle();\n}\n\nfunction startCleanupTimer(): void {\n if (cleanupTimer) return;\n cleanupTimer = setInterval(cleanupExpiredRequests, CLEANUP_INTERVAL);\n (cleanupTimer as any).unref?.();\n}\n\nfunction stopCleanupTimerIfIdle(): void {\n if (pendingRequests.size === 0 && cleanupTimer) {\n clearInterval(cleanupTimer);\n cleanupTimer = null;\n }\n}\n\nfunction removePendingRequest(config: EnhancedAxiosRequestConfig): void {\n const requestKey = config.__requestKey;\n const controller = config.__abortController;\n if (\n requestKey &&\n controller &&\n pendingRequests.get(requestKey) === controller\n ) {\n pendingRequests.delete(requestKey);\n }\n stopCleanupTimerIfIdle();\n}\n\n/**\n * 请求拦截器:处理请求去重\n *\n * @param config 请求配置\n * @returns 增强的请求配置\n *\n * 去重逻辑:\n * 1. 检查去重配置是否启用\n * 2. 跳过缓存响应(不需要去重)\n * 3. 生成请求唯一标识符\n * 4. 检查是否有相同请求正在进行\n * 5. 如果有,取消旧请求并创建新请求\n * 6. 如果已有 signal(来自 cancel 插件),不重复创建\n *\n * 与 cancel 插件的协作:\n * - cancel 插件负责路由切换时的批量取消\n * - dedupe 插件负责相同请求的去重\n * - 两者可以同时工作,互不冲突\n */\nfunction onRequest(\n config: InternalAxiosRequestConfig,\n): InternalAxiosRequestConfig {\n const enhancedConfig = config as EnhancedAxiosRequestConfig;\n const dedupeConfig = normalizeConfig(\n enhancedConfig.dedupe,\n DEFAULT_DEDUPE_CONFIG,\n );\n\n if (!dedupeConfig.enabled) {\n return config;\n }\n\n // ✅ 如果来自缓存,不创建 AbortController\n // 缓存响应不需要网络请求,因此不需要去重机制\n if ((config as any).__fromCache) {\n return config;\n }\n\n const keyGenerator =\n dedupeConfig.keyGenerator || DEFAULT_DEDUPE_CONFIG.keyGenerator;\n const requestKey = keyGenerator(config);\n\n // 如果有相同的请求正在进行,取消旧的\n const existing = pendingRequests.get(requestKey);\n if (existing) {\n try {\n existing.abort();\n } catch (error) {\n console.warn(\"Abort existing request error:\", error);\n }\n pendingRequests.delete(requestKey);\n }\n\n const controller = ensureSharedAbortController(enhancedConfig);\n if (!controller) return config;\n\n enhancedConfig.__requestKey = requestKey;\n pendingRequests.set(requestKey, controller);\n startCleanupTimer();\n\n return config;\n}\n\n/**\n * 响应拦截器:清理已完成的请求\n *\n * @param response 响应对象\n * @returns 原始响应\n *\n * 清理机制:\n * - 请求成功完成后,从 Map 中移除对应的控制器\n * - 释放内存,避免无效的取消操作\n * - 确保后续相同请求可以正常发起\n */\nfunction onResponse(response: any): any {\n const config = response.config as EnhancedAxiosRequestConfig;\n removePendingRequest(config);\n\n return response;\n}\n\n/**\n * 响应错误处理:清理失败的请求\n *\n * @param error 错误对象\n * @returns rejected Promise\n *\n * 清理机制:\n * - 请求失败时,同样需要清理控制器\n * - 确保无论成功还是失败都正确清理资源\n * - 避免失败的请求影响后续相同请求的去重\n */\nfunction onResponseError(error: any): Promise<never> {\n const config = error.config as EnhancedAxiosRequestConfig;\n\n if (config) {\n removePendingRequest(config);\n }\n\n return Promise.reject(error);\n}\n\n/**\n * 设置请求去重插件\n *\n * @param instance Axios 实例\n *\n * 注册拦截器:\n * - 请求拦截器:处理去重逻辑\n * - 响应拦截器:清理完成的请求\n * - 响应错误拦截器:清理失败的请求\n */\nexport function setupDedupePlugin(instance: AxiosInstance): void {\n instance.interceptors.request.use(onRequest);\n instance.interceptors.response.use(onResponse, onResponseError);\n}\n\n/**\n * 取消所有待处理的请求\n *\n * 使用场景:\n * - 用户登出时清理所有请求\n * - 网络异常时重置请求状态\n * - 调试和测试场景\n *\n * 安全机制:\n * - 捕获每个取消操作的异常\n * - 确保一个请求的失败不影响其他请求的取消\n * - 完全清理 Map 中的所有引用\n */\nexport function cancelAllPendingRequests(): void {\n pendingRequests.forEach((controller) => {\n try {\n controller.abort();\n } catch (error) {\n console.warn(\"Error aborting pending request:\", error);\n }\n });\n pendingRequests.clear();\n stopCleanupTimerIfIdle();\n}\n\n/**\n * 获取待处理请求数量\n *\n * @returns 当前待处理的请求数量\n *\n * 监控用途:\n * - 性能监控和分析\n * - 调试请求状态\n * - 检测潜在的请求泄漏\n * - 评估去重效果\n */\nexport function getPendingRequestCount(): number {\n return pendingRequests.size;\n}\n","/*\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2026-02-07 10:00:00\n * @LastEditors: ChenYu ycyplus@gmail.com\n * @LastEditTime: 2026-02-07 10:00:00\n * @FilePath: \\robot-admin-request-core\\src\\axios\\plugins\\cache.ts\n * @Description: 请求缓存插件(内存缓存)\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n */\n\nimport type {\n AxiosInstance,\n AxiosResponse,\n InternalAxiosRequestConfig,\n} from \"axios\";\nimport type {\n EnhancedAxiosRequestConfig,\n CacheConfig,\n CachedResponseData,\n} from \"../types\";\nimport {\n generateRequestKey,\n globalCache,\n normalizeConfig,\n} from \"../utils/helpers\";\n\n/**\n * 默认缓存配置\n * - enabled: 是否启用缓存,默认关闭\n * - ttl: 缓存生存时间,默认5分钟\n * - forceUpdate: 是否强制更新缓存,默认false\n */\nconst DEFAULT_CACHE_CONFIG: Required<CacheConfig> = {\n enabled: false,\n ttl: 5 * 60 * 1000, // 5 分钟\n forceUpdate: false,\n};\n\n/**\n * 判断是否应该使用缓存\n *\n * @param config 请求配置\n * @param cacheConfig 缓存配置\n * @returns 是否使用缓存\n *\n * 缓存策略:\n * 1. 只缓存 GET 请求\n * 2. 必须显式启用缓存\n * 3. 非强制刷新模式\n */\nfunction shouldUseCache(\n config: InternalAxiosRequestConfig,\n cacheConfig: CacheConfig,\n): boolean {\n // 只缓存 GET 请求\n if (config.method?.toUpperCase() !== \"GET\") {\n return false;\n }\n\n // 检查是否启用缓存\n if (!cacheConfig.enabled) {\n return false;\n }\n\n // 检查是否强制刷新\n if (cacheConfig.forceUpdate) {\n return false;\n }\n\n return true;\n}\n\n/**\n * 创建缓存响应对象\n *\n * @param cachedData 缓存的数据\n * @param config 请求配置\n * @returns 格式化的 Axios 响应对象\n *\n * 注意:在 statusText 中添加 \"(from cache)\" 标识,便于调试\n */\nfunction createCacheResponse(\n cachedData: CachedResponseData,\n config: InternalAxiosRequestConfig,\n): AxiosResponse {\n return {\n data: cachedData.data,\n status: cachedData.status,\n statusText: `${cachedData.statusText} (from cache)`,\n headers: cachedData.headers,\n config,\n } as AxiosResponse;\n}\n\n/**\n * 尝试从缓存获取响应\n *\n * @param config 请求配置\n * @param cacheConfig 缓存配置\n * @returns 缓存的响应或 null\n *\n * 流程:\n * 1. 检查是否应该使用缓存\n * 2. 生成请求键\n * 3. 从全局缓存中获取数据\n * 4. 如果命中,创建并返回缓存响应\n */\nfunction tryGetFromCache(\n config: InternalAxiosRequestConfig,\n cacheConfig: Required<CacheConfig>,\n): AxiosResponse | null {\n if (!shouldUseCache(config, cacheConfig)) {\n return null;\n }\n\n const requestKey = generateRequestKey(config);\n const cachedData = globalCache.get<CachedResponseData>(requestKey);\n\n if (cachedData) {\n return createCacheResponse(cachedData, config);\n }\n\n return null;\n}\n\n/**\n * 保存响应到缓存\n *\n * @param response Axios 响应对象\n * @param config 请求配置\n * @param cacheConfig 缓存配置\n *\n * 缓存条件:\n * 1. 必须是 GET 请求\n * 2. 缓存功能已启用\n * 3. 响应状态码为 200\n *\n * 保存内容:\n * - 响应数据\n * - 状态码和状态文本\n * - 完整的响应头\n */\nfunction saveToCache(\n response: AxiosResponse,\n config: InternalAxiosRequestConfig,\n cacheConfig: Required<CacheConfig>,\n): void {\n if (\n config.method?.toUpperCase() === \"GET\" &&\n cacheConfig.enabled &&\n response.status === 200\n ) {\n const requestKey = generateRequestKey(config);\n const ttl = cacheConfig.ttl ?? DEFAULT_CACHE_CONFIG.ttl;\n\n // 保存完整的响应信息,包括 headers\n const cachedResponse: CachedResponseData = {\n data: response.data,\n status: response.status,\n statusText: response.statusText,\n headers: { ...response.headers },\n };\n\n globalCache.set(requestKey, cachedResponse, ttl);\n }\n}\n\n/**\n * 请求拦截器:检查缓存\n *\n * @param config 请求配置\n * @returns 请求配置或 rejected Promise\n *\n * 核心机制:\n * 1. 检查缓存是否命中\n * 2. 如果命中,返回 rejected Promise 携带缓存响应\n * 3. 标记 __fromCache 让其他插件知道这是缓存响应\n *\n * 为什么用 rejected Promise:\n * - 避免发送真实网络请求\n * - 在响应拦截器中通过 onResponseError 处理\n * - 确保其他插件的请求拦截器正常执行\n */\nfunction onRequest(\n config: InternalAxiosRequestConfig,\n): InternalAxiosRequestConfig | Promise<never> {\n const enhancedConfig = config as EnhancedAxiosRequestConfig;\n const cacheConfig = normalizeConfig(\n enhancedConfig.cache,\n DEFAULT_CACHE_CONFIG,\n ) as Required<CacheConfig>;\n\n // 尝试从缓存获取\n const cachedResponse = tryGetFromCache(config, cacheConfig);\n if (cachedResponse) {\n // 标记来自缓存,让其他插件知道\n (config as any).__fromCache = true;\n\n // ✅ 直接返回一个 rejected Promise,携带缓存响应\n // 这样可以避免发送真实网络请求,同时在响应拦截器中处理\n return Promise.reject({\n __fromCache: true,\n __cachedResponse: cachedResponse,\n config,\n });\n }\n\n return config;\n}\n\n/**\n * 响应拦截器:处理缓存或保存缓存\n *\n * @param response Axios 响应对象\n * @returns 处理后的响应\n *\n * 处理逻辑:\n * 1. 如果是缓存响应,直接返回缓存数据\n * 2. 如果是真实响应,保存到缓存\n */\nfunction onResponse(response: AxiosResponse): AxiosResponse {\n const config = response.config as EnhancedAxiosRequestConfig;\n\n // 如果来自缓存,直接返回缓存数据\n if ((config as any).__fromCache) {\n return (config as any).__cachedResponse;\n }\n\n // 保存到缓存\n const cacheConfig = normalizeConfig(\n config.cache,\n DEFAULT_CACHE_CONFIG,\n ) as Required<CacheConfig>;\n saveToCache(response, response.config, cacheConfig);\n\n return response;\n}\n\n/**\n * 响应错误处理:处理缓存响应\n *\n * @param error 错误对象\n * @returns Promise<AxiosResponse | never>\n *\n * 关键作用:\n * - 处理缓存命中时的 rejected Promise\n * - 将缓存响应转换为正常的 Promise.resolve\n * - 确保缓存响应被正确处理,不被误判为错误\n *\n * 返回类型统一为 Promise,确保类型一致性\n */\nfunction onResponseError(error: any): Promise<AxiosResponse | never> {\n // 如果是缓存响应,直接返回缓存数据\n if (error.__fromCache) {\n return Promise.resolve(error.__cachedResponse);\n }\n\n return Promise.reject(error);\n}\n\n/**\n * 设置请求缓存插件\n *\n * @param instance Axios 实例\n *\n * 注册拦截器:\n * - 请求拦截器:检查缓存\n * - 响应拦截器:处理缓存响应或保存缓存\n * - 响应错误拦截器:处理缓存响应\n */\nexport function setupCachePlugin(instance: AxiosInstance): void {\n instance.interceptors.request.use(onRequest);\n instance.interceptors.response.use(onResponse, onResponseError);\n}\n\n/**\n * 清空所有缓存\n *\n * 用于:\n * - 用户登出时清理敏感数据\n * - 开发调试时重置缓存状态\n */\nexport function clearAllCache(): void {\n globalCache.clear();\n}\n\n/**\n * 删除指定缓存\n *\n * @param config 请求配置\n * @returns 是否删除成功\n *\n * 用于:\n * - 数据更新时清理特定缓存\n * - 缓存失效时的精确清理\n */\nexport function clearCache(config: InternalAxiosRequestConfig): boolean {\n const requestKey = generateRequestKey(config);\n return globalCache.delete(requestKey);\n}\n\n/**\n * 清理过期缓存\n *\n * 自动清理机制:\n * - 由 globalCache 内部实现\n * - 基于 TTL 过期时间\n * - 定期清理防止内存泄漏\n */\nexport function cleanupExpiredCache(): void {\n globalCache.cleanup();\n}\n\n/**\n * 获取缓存大小\n *\n * @returns 当前缓存条目数量\n *\n * 用于:\n * - 监控缓存使用情况\n * - 性能分析和调试\n */\nexport function getCacheSize(): number {\n return globalCache.size;\n}\n","/*\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2026-02-07 10:00:00\n * @LastEditors: ChenYu ycyplus@gmail.com\n * @LastEditTime: 2026-02-07 10:00:00\n * @FilePath: \\robot-admin-request-core\\src\\axios\\plugins\\retry.ts\n * @Description: 请求重试插件\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n */\n\nimport type { AxiosInstance, AxiosError } from \"axios\";\nimport type { EnhancedAxiosRequestConfig, RetryConfig } from \"../types\";\nimport {\n delay,\n isNetworkError,\n isTimeoutError,\n isRetryableStatus,\n normalizeConfig,\n} from \"../utils/helpers\";\n\n/**\n * 默认重试配置\n * - enabled: 是否启用重试,默认关闭\n * - count: 最大重试次数,默认3次\n * - delay: 重试延迟时间,默认1000ms\n * - exponentialBackoff: 是否启用指数退避,默认开启\n * - retryableStatusCodes: 可重试的状态码列表\n */\nconst DEFAULT_RETRY_CONFIG: Required<RetryConfig> = {\n enabled: false,\n count: 3,\n delay: 1000,\n exponentialBackoff: true,\n jitter: true,\n retryableStatusCodes: [408, 429, 500, 502, 503, 504],\n // 默认仅重试幂等方法,避免对 POST 等非幂等请求重复执行造成副作用(重复扣款/重复创建)\n retryableMethods: [\"GET\", \"HEAD\", \"OPTIONS\", \"PUT\", \"DELETE\"],\n};\n\n/**\n * 判断是否为取消错误\n *\n * @param error 错误对象\n * @returns 是否为取消错误\n *\n * 取消错误类型:\n * - Axios 的 CanceledError\n * - DOM 的 AbortError\n * - Node.js 的 ERR_CANCELED\n * - 包含 'canceled' 或 'abort' 的错误消息\n *\n * 重试策略:\n * - 用户主动取消的请求不应该重试\n * - 避免无限重试循环\n */\nfunction isCancelError(error: any): boolean {\n return (\n error?.name === \"CanceledError\" ||\n error?.name === \"AbortError\" ||\n error?.code === \"ERR_CANCELED\"\n );\n}\n\n/**\n * 判断是否应该重试\n *\n * @param error Axios 错误对象\n * @param retryConfig 重试配置\n * @returns 是否应该重试\n *\n * 重试条件判断:\n * 1. 重试功能必须启用\n * 2. 未达到最大重试次数\n * 3. 非用户主动取消的请求\n * 4. 网络错误或超时错误可重试\n * 5. 特定状态码可重试\n *\n * 重试策略:\n * - 网络问题:可重试(网络不稳定)\n * - 超时问题:可重试(临时拥堵)\n * - 服务器错误:部分可重试(5xx 错误)\n * - 客户端错误:一般不重试(4xx 错误)\n */\nfunction shouldRetry(\n error: AxiosError,\n retryConfig: Required<RetryConfig>,\n): boolean {\n if (!retryConfig.enabled) {\n return false;\n }\n\n const config = error.config as EnhancedAxiosRequestConfig;\n const currentRetryCount = config.__retryCount ?? 0;\n\n // 检查重试次数\n if (currentRetryCount >= retryConfig.count) {\n return false;\n }\n\n // 用户主动取消的请求不重试\n if (isCancelError(error)) {\n return false;\n }\n\n // 仅对幂等方法重试,避免非幂等请求(如 POST 下单)被重复执行\n const method = (config.method || \"get\").toUpperCase();\n if (\n !retryConfig.retryableMethods.some(\n (retryableMethod) => retryableMethod.toUpperCase() === method,\n )\n ) {\n return false;\n }\n\n // 网络错误可重试\n if (isNetworkError(error)) {\n return true;\n }\n\n // 超时错误可重试\n if (isTimeoutError(error)) {\n return true;\n }\n\n // 检查状态码是否可重试\n if (error.response?.status) {\n return isRetryableStatus(\n error.response.status,\n retryConfig.retryableStatusCodes,\n );\n }\n\n return false;\n}\n\n/**\n * 计算重试延迟时间\n *\n * @param retryCount 当前重试次数\n * @param retryConfig 重试配置\n * @returns 延迟时间(毫秒)\n *\n * 延迟策略:\n * - 固定延迟:使用配置的基础延迟时间\n * - 指数退避:delay * 2^retryCount,最大30秒\n *\n * 指数退避优势:\n * - 避免短时间内频繁重试\n * - 给服务器恢复时间\n * - 减少网络拥堵\n */\nfunction getRetryDelay(\n retryCount: number,\n retryConfig: Required<RetryConfig>,\n): number {\n let calculated: number;\n if (!retryConfig.exponentialBackoff) {\n calculated = retryConfig.delay;\n } else {\n // 指数退避:delay * 2^(retryCount-1),最大 30 秒\n calculated = retryConfig.delay * Math.pow(2, retryCount - 1);\n }\n\n // 随机抖动(±25%),避免大量客户端同时重试形成“惊群效应”\n if (retryConfig.jitter) {\n const factor = 0.75 + Math.random() * 0.5; // [0.75, 1.25)\n calculated = Math.round(calculated * factor);\n }\n\n return Math.min(Math.max(0, calculated), 30000);\n}\n\n/**\n * 设置请求重试插件\n *\n * @param instance Axios 实例\n *\n * 核心功能:\n * 1. 自动重试失败的请求\n * 2. 智能延迟策略(固定或指数退避)\n * 3. 保留取消信号的能力\n * 4. 清理其他插件的内部状态\n *\n * 重试机制:\n * - 仅在响应错误拦截器中处理\n * - 增加重试计数器\n * - 延迟后重新发起请求\n * - 创建新的 AbortController 但关联原取消逻辑\n */\nexport function setupRetryPlugin(instance: AxiosInstance): void {\n /**\n * 响应错误处理:自动重试\n *\n * @param error Axios 错误对象\n * @returns 重试结果或 rejected Promise\n *\n * 重试流程:\n * 1. 检查配置和重试条件\n * 2. 增加重试计数\n * 3. 计算延迟时间\n * 4. 等待延迟\n * 5. 创建新的请求配置\n * 6. 处理取消信号的传递\n * 7. 清理其他插件状态\n * 8. 重新发起请求\n */\n const onResponseError = async (error: AxiosError): Promise<any> => {\n const config = error.config as EnhancedAxiosRequestConfig;\n\n if (!config) {\n return Promise.reject(error);\n }\n\n const retryConfig = normalizeConfig(\n config.retry,\n DEFAULT_RETRY_CONFIG,\n ) as Required<RetryConfig>;\n\n if (!shouldRetry(error, retryConfig)) {\n return Promise.reject(error);\n }\n\n // 增加重试计数\n config.__retryCount = (config.__retryCount ?? 0) + 1;\n\n // 计算延迟时间\n const retryDelay = getRetryDelay(config.__retryCount, retryConfig);\n\n // 延迟后重试;等待期间仍可被调用方、路由取消或 dedupe 取消\n try {\n await delay(retryDelay, config.signal);\n } catch (abortError) {\n const error_ = Object.assign(new Error(\"canceled\"), {\n name: \"CanceledError\",\n code: \"ERR_CANCELED\",\n config,\n cause: abortError,\n });\n return Promise.reject(error_);\n }\n\n // 创建重试配置;共享 controller/signal 在整个重试链中保持不变\n const retryConfig_: EnhancedAxiosRequestConfig = { ...config };\n\n // 仅清除“单次尝试”状态;业务侧 401 标记等必须保留\n delete retryConfig_.__cancelId;\n delete retryConfig_.__requestKey;\n\n // 使用闭包中的 instance 重新发起请求\n return instance.request(retryConfig_);\n };\n\n instance.interceptors.response.use(undefined, onResponseError);\n}\n","/*\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2026-02-07 10:00:00\n * @LastEditors: ChenYu ycyplus@gmail.com\n * @LastEditTime: 2026-02-07 10:00:00\n * @FilePath: \\robot-admin-request-core\\src\\axios\\plugins\\response.ts\n * @Description: 响应处理插件(预留,用户通过 interceptors 配置)\n * Copyright (c) 2026 by CHENY, All Rights Reserved ���.\n */\n\nimport type { AxiosInstance, AxiosResponse } from \"axios\";\nimport type { EnhancedAxiosRequestConfig } from \"../types\";\nimport { cleanupAbortContext } from \"../utils/abort\";\n\n/**\n * 设置响应插件(预留,具体逻辑由用户通过 interceptors 配置)\n */\nexport function setupResponsePlugin(instance: AxiosInstance): void {\n instance.interceptors.response.use(\n (response: AxiosResponse) => {\n cleanupAbortContext(response.config as EnhancedAxiosRequestConfig);\n return response;\n },\n (error: any) => {\n cleanupAbortContext(error?.config as EnhancedAxiosRequestConfig);\n return Promise.reject(error);\n },\n );\n}\n","/*\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2026-02-07 10:00:00\n * @LastEditors: ChenYu ycyplus@gmail.com\n * @LastEditTime: 2026-02-07 10:00:00\n * @FilePath: \\robot-admin-request-core\\src\\axios\\plugins\\cancel.ts\n * @Description: 路由切换时自动取消请求插件\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n */\n\nimport type { AxiosInstance, InternalAxiosRequestConfig } from \"axios\";\nimport type {\n EnhancedAxiosRequestConfig,\n CancelConfig,\n EnhancedAbortController,\n} from \"../types\";\nimport { ensureSharedAbortController } from \"../utils/abort\";\nimport { normalizeConfig } from \"../utils/helpers\";\n\n/**\n * 默认取消配置\n * - enabled: 是否启用自动取消,默认开启\n * - whitelist: 白名单,匹配的请求不会被取消\n */\nconst DEFAULT_CANCEL_CONFIG: Required<CancelConfig> = {\n enabled: true,\n whitelist: [],\n};\n\n/**\n * 待取消的请求 Map\n * key: 请求唯一标识符\n * value: 增强的 AbortController(包含创建时间)\n *\n * 设计说明:\n * - 使用 Map 而非 Object,提供更好的性能和 API\n * - 存储增强的 AbortController,支持超时管理\n */\nconst cancelableRequests = new Map<string, EnhancedAbortController>();\n\n/**\n * 请求计数器(用于生成唯一 ID)\n *\n * 确保每个请求都有唯一的标识符,避免冲突\n */\nlet requestId = 0;\n\n/**\n * 清理超时请求的定时器配置\n * - CLEANUP_INTERVAL: 清理间隔,30秒\n * - REQUEST_TIMEOUT: 请求超时时间,5分钟\n */\nconst CLEANUP_INTERVAL = 30000; // 30 秒\nconst REQUEST_TIMEOUT = 300000; // 5 分钟\n\nlet cleanupTimer: ReturnType<typeof setInterval> | null = null;\n\n/**\n * 清理超时的请求\n *\n * 功能:\n * 1. 遍历所有待取消的请求\n * 2. 检查请求是否超时(基于创建时间)\n * 3. 取消超时请求并从 Map 中移除\n * 4. 错误处理避免清理过程异常\n *\n * 防止内存泄漏:\n * - 长时间运行的请求可能永远不会完成\n * - 定期清理避免内存积累\n */\nfunction cleanupExpiredRequests(): void {\n const now = Date.now();\n const expiredKeys: string[] = [];\n\n for (const [key, controller] of cancelableRequests.entries()) {\n // 检查请求是否超时(基于创建时间)\n const requestStartTime = controller._startTime || now;\n if (now - requestStartTime > REQUEST_TIMEOUT) {\n expiredKeys.push(key);\n try {\n controller.abort();\n } catch (error) {\n console.warn(\"Error aborting expired request:\", error);\n }\n }\n }\n\n // 移除超时的请求\n expiredKeys.forEach((key) => cancelableRequests.delete(key));\n stopCleanupTimerIfIdle();\n}\n\n/**\n * 启动清理定时器\n *\n * 生命周期管理:\n * - 清理之前的定时器(避免重复)\n * - 设置新的定时器进行定期清理\n */\nfunction startCleanupTimer(): void {\n if (cleanupTimer) return;\n\n cleanupTimer = setInterval(cleanupExpiredRequests, CLEANUP_INTERVAL);\n (cleanupTimer as any).unref?.();\n}\n\n/**\n * 停止清理定时器\n *\n * 资源清理:\n * - 清理定时器避免内存泄漏\n * - 页面卸载时调用\n */\nfunction stopCleanupTimer(): void {\n if (cleanupTimer) {\n clearInterval(cleanupTimer);\n cleanupTimer = null;\n }\n}\n\nfunction stopCleanupTimerIfIdle(): void {\n if (cancelableRequests.size === 0) stopCleanupTimer();\n}\n\n/**\n * 判断请求是否在白名单中\n *\n * @param url 请求 URL\n * @param whitelist 白名单正则表达式数组\n * @returns 是否在白名单中\n *\n * 白名单机制:\n * - 匹配白名单的请求不会被自动取消\n * - 支持正则表达式灵活匹配\n * - 适用于重要的系统请求(如心跳检测)\n */\nfunction isInWhitelist(url: string, whitelist: RegExp[]): boolean {\n return whitelist.some((pattern) => pattern.test(url));\n}\n\n/**\n * 请求拦截器:添加取消控制器\n *\n * @param config 请求配置\n * @returns 增强的请求配置\n *\n * 核心功能:\n * 1. 检查 AbortController 兼容性\n * 2. 验证取消配置和白名单\n * 3. 创建 AbortController 并关联到请求\n * 4. 记录请求开始时间用于超时管理\n * 5. 将控制器存储到全局 Map 中\n *\n * 特殊处理:\n * - 缓存响应不创建 AbortController\n * - 白名单请求不创建 AbortController\n */\nfunction onRequest(\n config: InternalAxiosRequestConfig,\n): InternalAxiosRequestConfig {\n const enhancedConfig = config as EnhancedAxiosRequestConfig;\n const cancelConfig = normalizeConfig(\n enhancedConfig.cancel,\n DEFAULT_CANCEL_CONFIG,\n ) as Required<CancelConfig>;\n\n if (!cancelConfig.enabled) {\n return config;\n }\n\n // ✅ 如果来自缓存,不创建 AbortController\n // 缓存响应不需要网络请求,因此不需要取消机制\n if ((config as any).__fromCache) {\n return config;\n }\n\n const url = config.url || \"\";\n\n // 检查是否在白名单中\n if (isInWhitelist(url, cancelConfig.whitelist)) {\n return config;\n }\n\n const activeController = ensureSharedAbortController(enhancedConfig);\n if (!activeController) return config;\n\n const id = `request_${++requestId}`;\n enhancedConfig.__cancelId = id;\n\n cancelableRequests.set(id, activeController);\n startCleanupTimer();\n\n return config;\n}\n\n/**\n * 响应拦截器:清理已完成的请求\n *\n * @param response 响应对象\n * @returns 原始响应\n *\n * 清理机制:\n * - 请求成功完成后,从 Map 中移除对应的控制器\n * - 避免内存泄漏和无效的取消操作\n */\nfunction onResponse(response: any): any {\n const config = response.config as any;\n const cancelId = config.__cancelId;\n\n if (cancelId) {\n cancelableRequests.delete(cancelId);\n stopCleanupTimerIfIdle();\n }\n\n return response;\n}\n\n/**\n * 响应错误处理:清理失败的请求\n *\n * @param error 错误对象\n * @returns rejected Promise\n *\n * 清理机制:\n * - 请求失败时,同样需要清理控制器\n * - 确保无论成功还是失败都正确清理资源\n */\nfunction onResponseError(error: any): Promise<never> {\n const config = error.config as any;\n const cancelId = config?.__cancelId;\n\n if (cancelId) {\n cancelableRequests.delete(cancelId);\n stopCleanupTimerIfIdle();\n }\n\n return Promise.reject(error);\n}\n\n/**\n * 设置路由取消插件\n *\n * @param instance Axios 实例\n *\n * 注册拦截器:\n * - 请求拦截器:添加取消控制器\n * - 响应拦截器:清理完成的请求\n * - 响应错误拦截器:清理失败的请求\n */\nexport function setupCancelPlugin(instance: AxiosInstance): void {\n instance.interceptors.request.use(onRequest);\n instance.interceptors.response.use(onResponse, onResponseError);\n}\n\n/**\n * 取消所有待处理的请求\n *\n * 使用场景:\n * - 路由切换时取消当前页面的所有请求\n * - 用户登出时清理所有请求\n * - 网络异常时重置请求状态\n *\n * 安全机制:\n * - 捕获每个取消操作的异常\n * - 确保一个请求的失败不影响其他请求的取消\n */\nexport function cancelAllRequests(): void {\n cancelableRequests.forEach((controller) => {\n try {\n controller.abort();\n } catch (error) {\n console.warn(\"Error aborting request:\", error);\n }\n });\n cancelableRequests.clear();\n stopCleanupTimer();\n}\n\n/**\n * 获取待取消请求数量\n *\n * @returns 当前待取消的请求数量\n *\n * 监控用途:\n * - 性能监控和分析\n * - 调试请求状态\n * - 检测潜在的请求泄漏\n */\nexport function getCancelableRequestCount(): number {\n return cancelableRequests.size;\n}\n","/*\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2026-02-07 10:00:00\n * @LastEditors: ChenYu ycyplus@gmail.com\n * @LastEditTime: 2026-02-07 10:00:00\n * @FilePath: \\robot-admin-request-core\\src\\axios\\plugins\\index.ts\n * @Description: axios 插件体系\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n */\n\nimport type { AxiosInstance } from \"axios\";\nimport { setupRequestPlugin } from \"./request\";\nimport { setupDedupePlugin } from \"./dedupe\";\nimport { setupCachePlugin } from \"./cache\";\nimport { setupRetryPlugin } from \"./retry\";\nimport { setupResponsePlugin } from \"./response\";\nimport { setupCancelPlugin } from \"./cancel\";\n\n/**\n * 设置所有插件\n *\n * 拦截器执行规则(axios):\n * - 请求拦截器按注册的【逆序】执行(LIFO)\n * - 响应拦截器按注册【顺序】执行(FIFO)\n *\n * 注册顺序:request -> cache -> cancel -> dedupe -> retry -> response\n *\n * 关键说明:\n * - dedupe 与 cancel 通过共享的 `config.__abortController` 复用同一个\n * AbortController,避免各自创建导致 signal 互相覆盖、取消失效。\n * - cache 在请求拦截器中若命中缓存,以 rejected Promise 携带 `__fromCache`\n * 短路,并在自身响应错误拦截器中 resolve,避免发出真实网络请求。\n */\nexport function setupPlugins(instance: AxiosInstance): void {\n // 1. 请求通用处理(token、headers)\n setupRequestPlugin(instance);\n\n // 2. 请求缓存(GET 请求缓存)\n setupCachePlugin(instance);\n\n // 3. 路由取消\n setupCancelPlugin(instance);\n\n // 4. 请求去重(与 cancel 共享 AbortController)\n setupDedupePlugin(instance);\n\n // 5. 请求重试(网络错误自动重试)\n setupRetryPlugin(instance);\n\n // 6. 响应统一处理(业务错误、401 处理)\n setupResponsePlugin(instance);\n}\n\n// 导出所有插件的工具函数\nexport {\n waitForReLogin,\n resolveReLogin,\n rejectReLogin,\n getReLoginPromise,\n} from \"./request\";\nexport { cancelAllPendingRequests, getPendingRequestCount } from \"./dedupe\";\nexport {\n clearAllCache,\n clearCache,\n cleanupExpiredCache,\n getCacheSize,\n} from \"./cache\";\nexport { cancelAllRequests, getCancelableRequestCount } from \"./cancel\";\n","import type { AxiosInstance } from \"axios\";\nimport type { EnhancedAxiosRequestConfig } from \"./types\";\n\nlet globalService: AxiosInstance | null = null;\n\nexport function setGlobalAxiosInstance(instance: AxiosInstance): void {\n globalService = instance;\n}\n\nexport function getGlobalAxiosInstance(): AxiosInstance {\n if (!globalService) {\n throw new Error(\n \"Axios instance not initialized. Please call createRequestCore() or setGlobalAxiosInstance() first.\",\n );\n }\n return globalService;\n}\n\nconst service = new Proxy({} as AxiosInstance, {\n get(_target, prop) {\n return getGlobalAxiosInstance()[prop as keyof AxiosInstance];\n },\n});\n\nexport default service;\n\nexport async function getData<T = any>(\n url: string,\n config?: EnhancedAxiosRequestConfig,\n): Promise<T> {\n const response = await getGlobalAxiosInstance().get(url, config);\n return response.data;\n}\n\nexport async function postData<T = any>(\n url: string,\n data?: any,\n config?: EnhancedAxiosRequestConfig,\n): Promise<T> {\n const response = await getGlobalAxiosInstance().post(url, data, config);\n return response.data;\n}\n\nexport async function putData<T = any>(\n url: string,\n data?: any,\n config?: EnhancedAxiosRequestConfig,\n): Promise<T> {\n const response = await getGlobalAxiosInstance().put(url, data, config);\n return response.data;\n}\n\nexport async function deleteData<T = any>(\n url: string,\n config?: EnhancedAxiosRequestConfig,\n): Promise<T> {\n const response = await getGlobalAxiosInstance().delete(url, config);\n return response.data;\n}\n","/*\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2026-02-07 10:00:00\n * @LastEditors: ChenYu ycyplus@gmail.com\n * @LastEditTime: 2026-02-07 10:00:00\n * @FilePath: \\robot-admin-request-core\\src\\axios\\request.ts\n * @Description: axios 二次封装 + 插件体系\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n */\n\nimport axios, { type AxiosInstance, type AxiosRequestConfig } from \"axios\";\nimport { setupPlugins, resolveReLogin, rejectReLogin } from \"./plugins\";\nexport {\n setGlobalAxiosInstance,\n getGlobalAxiosInstance,\n getData,\n postData,\n putData,\n deleteData,\n} from \"./service\";\nexport { default } from \"./service\";\n\n/**\n * 创建 axios 实例\n * @param config axios 配置\n */\nexport function createAxiosInstance(\n config: AxiosRequestConfig = {},\n): AxiosInstance {\n const instance = axios.create({\n timeout: 5000,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n ...config,\n });\n\n /**\n * 挂载所有插件\n * 优化后的插件顺序:request -> cache -> cancel -> dedupe -> retry -> response\n *\n * 顺序说明:\n * - cache 在最前:确保缓存检查优先级最高\n * - cancel 在 dedupe 之前:确保 cancel 的 signal 不被覆盖\n * - dedupe 在 cancel 之后:复用 cancel 的 signal(如果存在)\n */\n setupPlugins(instance);\n\n return instance;\n}\n\n// ================= 导出插件工具函数 =================\nexport {\n waitForReLogin,\n getReLoginPromise,\n cancelAllPendingRequests,\n getPendingRequestCount,\n clearAllCache,\n clearCache,\n cleanupExpiredCache,\n getCacheSize,\n cancelAllRequests,\n getCancelableRequestCount,\n} from \"./plugins\";\n\n// ================= 重新登录回调 =================\n\n/**\n * 重新登录成功后的回调\n * 调用此函数会 resolve 所有等待中的请求\n */\nexport const onReLoginSuccess = () => {\n resolveReLogin();\n};\n\n/**\n * 重新登录取消后的回调\n * 调用此函数会 reject 所有等待中的请求\n */\nexport const onReLoginCancel = () => {\n rejectReLogin(new Error(\"重新登录已取消\"));\n};\n\n// ================= 使用示例 =================\n\n// 1. 简单 GET 请求\n// getData('/users')\n\n// 2. 带参数的 GET 请求(推荐方式 - axios 会自动处理参数)\n// getData('/users', { params: { page: 1, pageSize: 10 } })\n\n// 3. 带请求头的 GET 请求\n// getData('/users', {\n// params: { page: 1 },\n// headers: { 'X-Custom-Header': 'value' }\n// })\n\n// 4. POST 请求\n// postData('/users', { name: '张三' })\n\n// 5. POST 请求带额外配置\n// postData('/users', { name: '张三' }, {\n// headers: { 'X-Custom-Header': 'value' }\n// })\n"]}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"axios.js"}