@vlian/framework 1.0.4 → 1.1.1

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 (43) hide show
  1. package/dist/index.umd.cjs +29 -0
  2. package/dist/index.umd.cjs.map +1 -0
  3. package/dist/index.umd.d.ts +8 -0
  4. package/dist/index.umd.d.ts.map +1 -0
  5. package/dist/index.umd.js +39454 -0
  6. package/dist/index.umd.js.map +1 -0
  7. package/dist/request/core/RequestClient.cjs +20 -1
  8. package/dist/request/core/RequestClient.cjs.map +1 -1
  9. package/dist/request/core/RequestClient.d.ts +8 -0
  10. package/dist/request/core/RequestClient.d.ts.map +1 -1
  11. package/dist/request/core/RequestClient.js +20 -1
  12. package/dist/request/core/RequestClient.js.map +1 -1
  13. package/dist/request/index.cjs +3 -0
  14. package/dist/request/index.cjs.map +1 -1
  15. package/dist/request/index.d.ts +2 -2
  16. package/dist/request/index.d.ts.map +1 -1
  17. package/dist/request/index.js +1 -1
  18. package/dist/request/index.js.map +1 -1
  19. package/dist/request/plugin/index.cjs +4 -0
  20. package/dist/request/plugin/index.cjs.map +1 -1
  21. package/dist/request/plugin/index.d.ts +1 -0
  22. package/dist/request/plugin/index.d.ts.map +1 -1
  23. package/dist/request/plugin/index.js +1 -0
  24. package/dist/request/plugin/index.js.map +1 -1
  25. package/dist/request/plugin/queue.cjs +140 -0
  26. package/dist/request/plugin/queue.cjs.map +1 -0
  27. package/dist/request/plugin/queue.d.ts +92 -0
  28. package/dist/request/plugin/queue.d.ts.map +1 -0
  29. package/dist/request/plugin/queue.js +156 -0
  30. package/dist/request/plugin/queue.js.map +1 -0
  31. package/dist/request/utils/RequestQueueManager.cjs +168 -0
  32. package/dist/request/utils/RequestQueueManager.cjs.map +1 -0
  33. package/dist/request/utils/RequestQueueManager.d.ts +75 -0
  34. package/dist/request/utils/RequestQueueManager.d.ts.map +1 -0
  35. package/dist/request/utils/RequestQueueManager.js +160 -0
  36. package/dist/request/utils/RequestQueueManager.js.map +1 -0
  37. package/dist/request/utils/index.cjs +4 -0
  38. package/dist/request/utils/index.cjs.map +1 -1
  39. package/dist/request/utils/index.d.ts +1 -0
  40. package/dist/request/utils/index.d.ts.map +1 -1
  41. package/dist/request/utils/index.js +1 -0
  42. package/dist/request/utils/index.js.map +1 -1
  43. package/package.json +13 -5
@@ -16,6 +16,7 @@ const _types = require("../types");
16
16
  const _RequestAdapter = require("../adapter/RequestAdapter");
17
17
  const _RequestPlugin = require("../plugin/RequestPlugin");
18
18
  const _RequestContext = require("../runtime/RequestContext");
19
+ const _RequestQueueManager = require("../utils/RequestQueueManager");
19
20
  function _define_property(obj, key, value) {
20
21
  if (key in obj) {
21
22
  Object.defineProperty(obj, key, {
@@ -312,8 +313,23 @@ let RequestClient = class RequestClient {
312
313
  }
313
314
  // 合并配置
314
315
  const mergedOptions = this.mergeOptions(options);
316
+ // 检查队列状态,如果队列已暂停,将请求放入队列
317
+ const queueManager = (0, _RequestQueueManager.getRequestQueueManager)();
318
+ if (queueManager.isPaused()) {
319
+ return queueManager.enqueue(mergedOptions, ()=>this.executeRequest(mergedOptions));
320
+ }
321
+ // 正常执行请求
322
+ return this.executeRequest(mergedOptions);
323
+ }
324
+ /**
325
+ * 执行实际的请求逻辑
326
+ *
327
+ * @template TResponse - 响应数据类型
328
+ * @param options - 请求配置选项
329
+ * @returns Promise 解析为响应对象
330
+ */ async executeRequest(options) {
315
331
  // 创建请求上下文
316
- const context = (0, _RequestContext.createRequestContext)(mergedOptions, {});
332
+ const context = (0, _RequestContext.createRequestContext)(options, {});
317
333
  try {
318
334
  // 执行请求前钩子
319
335
  const beforeResult = await this.pluginManager.executeHook(_RequestPlugin.PluginLifecycleStage.BEFORE_REQUEST, context);
@@ -334,6 +350,9 @@ let RequestClient = class RequestClient {
334
350
  // 执行请求
335
351
  let response;
336
352
  try {
353
+ if (!this.adapter) {
354
+ throw new Error('适配器未初始化');
355
+ }
337
356
  response = await this.adapter.request(context.request);
338
357
  } catch (error) {
339
358
  // 适配器错误转换为框架错误
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/request/core/RequestClient.ts"],"sourcesContent":["/**\n * 请求客户端核心实现\n * \n * 这是请求库的核心,负责协调适配器和插件系统\n */\n\nimport type {\n RequestOptions,\n Response,\n RequestClientConfig,\n} from '../types';\nimport {\n RequestError,\n RequestErrorType,\n RequestErrorCode,\n} from '../types';\nimport type { RequestAdapter } from '../adapter/RequestAdapter';\nimport { adapterRegistry } from '../adapter/RequestAdapter';\nimport { PluginManager, PluginLifecycleStage } from '../plugin/RequestPlugin';\nimport { createRequestContext, completeRequestContext, failRequestContext } from '../runtime/RequestContext';\n\n/**\n * 运行环境类型\n */\ntype RuntimeEnvironment = 'browser' | 'node' | 'unknown';\n\n/**\n * 适配器环境要求映射\n * \n * 注意:axios 可以在浏览器和 Node.js 环境中使用,因此不在此映射中限制\n */\nconst ADAPTER_ENVIRONMENT_MAP: Record<string, RuntimeEnvironment> = {\n fetch: 'browser',\n ky: 'browser',\n undici: 'node',\n};\n\n/**\n * 检测当前运行环境\n * \n * @returns 运行环境类型\n */\nfunction detectEnvironment(): RuntimeEnvironment {\n const isBrowser = typeof window !== 'undefined';\n const isNode = typeof process !== 'undefined' && process.versions?.node;\n\n if (isBrowser) {\n return 'browser';\n } else if (isNode) {\n return 'node';\n }\n return 'unknown';\n}\n\n/**\n * 获取适配器的推荐替代方案\n * \n * @param currentEnv - 当前环境\n * @returns 推荐的适配器列表\n */\nfunction getRecommendedAdapters(currentEnv: RuntimeEnvironment): string[] {\n if (currentEnv === 'browser') {\n return ['fetch', 'ky', 'axios'];\n } else if (currentEnv === 'node') {\n return ['axios', 'undici'];\n }\n return [];\n}\n\n/**\n * 创建环境不匹配错误消息\n * \n * @param adapterName - 适配器名称\n * @param adapterEnv - 适配器要求的环境\n * @param currentEnv - 当前环境\n * @returns 错误消息\n */\nfunction createEnvironmentMismatchError(\n adapterName: string,\n adapterEnv: RuntimeEnvironment,\n currentEnv: RuntimeEnvironment\n): string {\n const recommendedAdapters = getRecommendedAdapters(currentEnv);\n const recommendedList = recommendedAdapters.length > 0\n ? recommendedAdapters.map(name => `\"${name}\"`).join(' 或 ')\n : '其他适配器';\n\n const adapterEnvName = adapterEnv === 'browser' ? '浏览器' : 'Node.js';\n const currentEnvName = currentEnv === 'browser' ? '浏览器' : currentEnv === 'node' ? 'Node.js' : '未知';\n const firstRecommended = recommendedAdapters[0] || 'fetch';\n const firstRecommendedFactory = firstRecommended === 'fetch' ? 'fetchAdapter' : firstRecommended === 'ky' ? 'kyAdapter' : firstRecommended === 'axios' ? 'axiosAdapter' : 'undiciAdapter';\n\n let message = `\\n❌ 适配器环境不匹配\\n\\n`;\n message += `适配器 \"${adapterName}\" 要求运行在 ${adapterEnvName} 环境中,\\n`;\n message += `但当前运行在 ${currentEnvName} 环境中。\\n\\n`;\n message += `💡 建议:请使用适合当前环境的适配器,如 ${recommendedList}。\\n\\n`;\n message += `📝 使用示例:\\n\\n`;\n message += ` // 方式 1:使用适配器名称字符串\\n`;\n message += ` import { createRequestClient } from '@vlian/framework/request';\\n\\n`;\n message += ` const client = await createRequestClient({\\n`;\n message += ` defaultAdapter: '${firstRecommended}',\\n`;\n message += ` });\\n\\n`;\n message += ` // 方式 2:使用适配器工厂函数\\n`;\n message += ` import { createRequestClient, ${firstRecommendedFactory} } from '@vlian/framework/request';\\n\\n`;\n message += ` const client = await createRequestClient({\\n`;\n message += ` defaultAdapter: ${firstRecommendedFactory},\\n`;\n message += ` });\\n`;\n\n return message;\n}\n\n/**\n * 验证适配器环境是否匹配\n * \n * @param adapterName - 适配器名称\n * @throws 如果环境不匹配,抛出包含友好提示的错误\n */\nfunction validateAdapterEnvironment(adapterName: string): void {\n const adapterEnv = ADAPTER_ENVIRONMENT_MAP[adapterName];\n if (!adapterEnv) {\n // 未知适配器,不进行环境检查\n return;\n }\n\n const currentEnv = detectEnvironment();\n if (currentEnv === 'unknown') {\n // 无法检测环境,跳过检查\n return;\n }\n\n if (adapterEnv !== currentEnv) {\n const errorMessage = createEnvironmentMismatchError(adapterName, adapterEnv, currentEnv);\n throw new Error(errorMessage);\n }\n}\n\n/**\n * 请求客户端类\n */\nexport class RequestClient {\n private config: RequestClientConfig;\n private pluginManager: PluginManager;\n private adapter: RequestAdapter | null = null;\n private adapterName: string | null = null;\n\n /**\n * 获取当前适配器名称\n */\n getAdapterName(): string | null {\n return this.adapterName;\n }\n\n constructor(config: RequestClientConfig = {}) {\n this.config = config;\n this.pluginManager = new PluginManager();\n\n // 注册插件\n if (config.plugins) {\n for (const plugin of config.plugins) {\n this.pluginManager.register(plugin);\n }\n }\n }\n\n /**\n * 初始化客户端\n */\n async initialize(): Promise<void> {\n // 加载默认适配器\n await this.loadAdapter();\n\n // 执行插件初始化钩子\n const context = createRequestContext<RequestOptions, Response, Record<string, unknown>>(\n { url: '' },\n {}\n );\n await this.pluginManager.executeHook(PluginLifecycleStage.INIT, context);\n }\n\n /**\n * 加载适配器\n */\n private async loadAdapter(): Promise<void> {\n if (this.adapter) {\n return;\n }\n\n const adapterConfig = this.config.defaultAdapter;\n\n if (typeof adapterConfig === 'string') {\n // 检查适配器环境是否匹配\n validateAdapterEnvironment(adapterConfig);\n \n // 从注册表加载\n this.adapter = await adapterRegistry.get(adapterConfig);\n this.adapterName = adapterConfig;\n \n // 再次验证(适配器可能返回不同的名称)\n if (this.adapter.name !== adapterConfig) {\n validateAdapterEnvironment(this.adapter.name);\n }\n } else if (typeof adapterConfig === 'function') {\n // 使用工厂函数加载\n this.adapter = await adapterConfig();\n this.adapterName = this.adapter.name;\n \n // 验证适配器环境\n validateAdapterEnvironment(this.adapter.name);\n } else {\n // 自动检测环境(自动检测的适配器不需要验证,因为已经根据环境选择了)\n const detectedAdapter = await this.detectAdapter();\n this.adapter = detectedAdapter.adapter;\n this.adapterName = detectedAdapter.name;\n }\n }\n\n /**\n * 自动检测适配器\n */\n private async detectAdapter(): Promise<{ adapter: RequestAdapter; name: string }> {\n // 检测运行环境\n const isBrowser = typeof window !== 'undefined';\n const isNode = typeof process !== 'undefined' && process.versions?.node;\n\n if (isBrowser) {\n // 浏览器环境:尝试加载 ky 适配器\n try {\n const { kyAdapter } = await import('../adapter/kyAdapter');\n const adapter = await kyAdapter();\n return { adapter, name: 'ky' };\n } catch {\n // 如果 ky 不可用,使用 fetch 适配器\n const { fetchAdapter } = await import('../adapter/fetchAdapter');\n const adapter = await fetchAdapter();\n return { adapter, name: 'fetch' };\n }\n } else if (isNode) {\n // Node.js 环境:尝试加载 axios 适配器\n try {\n const { axiosAdapter } = await import('../adapter/axiosAdapter');\n const adapter = await axiosAdapter();\n return { adapter, name: 'axios' };\n } catch {\n // 如果 axios 不可用,使用 undici 适配器\n try {\n const { undiciAdapter } = await import('../adapter/undiciAdapter');\n const adapter = await undiciAdapter();\n return { adapter, name: 'undici' };\n } catch {\n throw new Error('无法找到可用的适配器,请手动指定适配器');\n }\n }\n }\n\n throw new Error('无法检测运行环境');\n }\n\n /**\n * 设置适配器\n * \n * @param adapter - 适配器实例或名称\n */\n async setAdapter(adapter: RequestAdapter | string): Promise<void> {\n if (typeof adapter === 'string') {\n // 检查适配器环境是否匹配\n validateAdapterEnvironment(adapter);\n \n this.adapter = await adapterRegistry.get(adapter);\n this.adapterName = adapter;\n \n // 再次验证(适配器可能返回不同的名称)\n if (this.adapter.name !== adapter) {\n validateAdapterEnvironment(this.adapter.name);\n }\n } else {\n // 验证适配器环境\n validateAdapterEnvironment(adapter.name);\n \n this.adapter = adapter;\n this.adapterName = adapter.name;\n }\n }\n\n /**\n * 注册插件\n * \n * @param plugin - 请求插件\n */\n use(plugin: import('../plugin/RequestPlugin').RequestPlugin): void {\n this.pluginManager.register(plugin);\n }\n\n /**\n * 注销插件\n * \n * @param name - 插件名称\n */\n unuse(name: string): void {\n this.pluginManager.unregister(name);\n }\n\n /**\n * 执行请求\n * \n * @template TResponse - 响应数据类型\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n async request<TResponse = unknown>(options: RequestOptions<TResponse>): Promise<Response<TResponse>> {\n // 确保适配器已加载\n if (!this.adapter) {\n await this.loadAdapter();\n }\n\n if (!this.adapter) {\n throw new Error('适配器未初始化');\n }\n\n // 合并配置\n const mergedOptions = this.mergeOptions(options);\n\n // 创建请求上下文\n const context = createRequestContext<RequestOptions<TResponse>, Response<TResponse>, Record<string, unknown>>(\n mergedOptions,\n {}\n );\n\n try {\n // 执行请求前钩子\n const beforeResult = await this.pluginManager.executeHook(\n PluginLifecycleStage.BEFORE_REQUEST,\n context\n );\n\n // 如果插件返回了修改后的请求配置,使用它\n if (beforeResult && typeof beforeResult === 'object' && 'url' in beforeResult) {\n context.request = beforeResult as RequestOptions<TResponse>;\n }\n\n // 检查是否已取消(可能是缓存命中)\n if (context.cancelled) {\n // 如果有缓存的响应,直接返回\n if (context.response) {\n return context.response;\n }\n throw this.createError(\n '请求已取消',\n RequestErrorType.ABORT_ERROR,\n RequestErrorCode.REQUEST_ABORTED,\n { request: context.request }\n );\n }\n\n // 执行请求\n let response: Response<TResponse>;\n try {\n response = await this.adapter.request<TResponse>(context.request);\n } catch (error) {\n // 适配器错误转换为框架错误\n throw this.normalizeError(error, context.request);\n }\n\n // 更新上下文\n completeRequestContext(context, response);\n\n // 执行请求后钩子\n const afterResult = await this.pluginManager.executeHook(\n PluginLifecycleStage.AFTER_REQUEST,\n context\n );\n\n // 如果插件返回了修改后的响应,使用它\n if (afterResult && typeof afterResult === 'object' && 'data' in afterResult) {\n response = afterResult as Response<TResponse>;\n }\n\n return response;\n } catch (error) {\n // 更新上下文\n const requestError = error instanceof RequestError ? error : this.normalizeError(error, context.request);\n failRequestContext(context, requestError);\n\n // 执行错误处理钩子\n const errorHandled = await this.pluginManager.executeHook(\n PluginLifecycleStage.ON_ERROR,\n context\n );\n\n // 如果错误未被处理,继续抛出\n if (errorHandled !== true) {\n throw requestError;\n }\n\n // 如果错误已被处理,返回一个默认响应(由插件决定)\n if (context.response) {\n return context.response as Response<TResponse>;\n }\n\n throw requestError;\n } finally {\n // 执行最终钩子\n await this.pluginManager.executeHook(PluginLifecycleStage.FINALLY, context);\n }\n }\n\n /**\n * GET 请求\n * \n * @template TResponse - 响应数据类型\n * @param url - 请求 URL\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n async get<TResponse = unknown>(\n url: string,\n options?: Omit<RequestOptions<TResponse>, 'url' | 'method'>\n ): Promise<Response<TResponse>> {\n return this.request<TResponse>({\n ...options,\n url,\n method: 'GET',\n });\n }\n\n /**\n * POST 请求\n * \n * @template TResponse - 响应数据类型\n * @param url - 请求 URL\n * @param body - 请求体\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n async post<TResponse = unknown>(\n url: string,\n body?: RequestOptions<TResponse>['body'],\n options?: Omit<RequestOptions<TResponse>, 'url' | 'method' | 'body'>\n ): Promise<Response<TResponse>> {\n return this.request<TResponse>({\n ...options,\n url,\n method: 'POST',\n body,\n });\n }\n\n /**\n * PUT 请求\n * \n * @template TResponse - 响应数据类型\n * @param url - 请求 URL\n * @param body - 请求体\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n async put<TResponse = unknown>(\n url: string,\n body?: RequestOptions<TResponse>['body'],\n options?: Omit<RequestOptions<TResponse>, 'url' | 'method' | 'body'>\n ): Promise<Response<TResponse>> {\n return this.request<TResponse>({\n ...options,\n url,\n method: 'PUT',\n body,\n });\n }\n\n /**\n * PATCH 请求\n * \n * @template TResponse - 响应数据类型\n * @param url - 请求 URL\n * @param body - 请求体\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n async patch<TResponse = unknown>(\n url: string,\n body?: RequestOptions<TResponse>['body'],\n options?: Omit<RequestOptions<TResponse>, 'url' | 'method' | 'body'>\n ): Promise<Response<TResponse>> {\n return this.request<TResponse>({\n ...options,\n url,\n method: 'PATCH',\n body,\n });\n }\n\n /**\n * DELETE 请求\n * \n * @template TResponse - 响应数据类型\n * @param url - 请求 URL\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n async delete<TResponse = unknown>(\n url: string,\n options?: Omit<RequestOptions<TResponse>, 'url' | 'method'>\n ): Promise<Response<TResponse>> {\n return this.request<TResponse>({\n ...options,\n url,\n method: 'DELETE',\n });\n }\n\n /**\n * 合并请求配置\n * \n * @param options - 请求配置选项\n * @returns 合并后的配置\n */\n private mergeOptions<TResponse>(options: RequestOptions<TResponse>): RequestOptions<TResponse> {\n const baseURL = this.config.baseURL || '';\n const url = baseURL ? `${baseURL}${options.url}` : options.url;\n\n return {\n ...options,\n url,\n headers: {\n ...this.config.defaultHeaders,\n ...options.headers,\n },\n timeout: options.timeout ?? this.config.defaultTimeout,\n };\n }\n\n /**\n * 创建请求错误\n */\n private createError(\n message: string,\n type: RequestErrorType,\n code: RequestErrorCode,\n options?: {\n status?: number;\n cause?: unknown;\n request?: RequestOptions;\n response?: Response;\n context?: Record<string, unknown>;\n }\n ): RequestError {\n return new RequestError(message, type, code, options);\n }\n\n /**\n * 标准化错误\n */\n private normalizeError(error: unknown, request?: RequestOptions): RequestError {\n if (error instanceof RequestError) {\n return error;\n }\n\n // 处理 AbortError\n if (error instanceof Error && error.name === 'AbortError') {\n return this.createError(\n '请求已取消',\n RequestErrorType.ABORT_ERROR,\n RequestErrorCode.REQUEST_ABORTED,\n { cause: error, request }\n );\n }\n\n // 处理超时错误\n if (error instanceof Error && (error.message.includes('timeout') || error.message.includes('Timeout'))) {\n return this.createError(\n '请求超时',\n RequestErrorType.TIMEOUT_ERROR,\n RequestErrorCode.REQUEST_TIMEOUT,\n { cause: error, request }\n );\n }\n\n // 处理网络错误\n if (error instanceof Error && (error.message.includes('network') || error.message.includes('Network'))) {\n return this.createError(\n '网络连接失败',\n RequestErrorType.NETWORK_ERROR,\n RequestErrorCode.NETWORK_CONNECTION_FAILED,\n { cause: error, request }\n );\n }\n\n // 处理 HTTP 错误(需要适配器提供)\n if (error && typeof error === 'object' && 'status' in error) {\n const status = (error as { status: number }).status;\n const isServerError = status >= 500;\n return this.createError(\n `HTTP ${status} 错误`,\n RequestErrorType.HTTP_ERROR,\n isServerError ? RequestErrorCode.SERVER_ERROR : RequestErrorCode.CLIENT_ERROR,\n { status, cause: error, request }\n );\n }\n\n // 未知错误\n return this.createError(\n error instanceof Error ? error.message : '未知错误',\n RequestErrorType.UNKNOWN_ERROR,\n RequestErrorCode.NETWORK_CONNECTION_FAILED,\n { cause: error, request }\n );\n }\n\n /**\n * 销毁客户端\n */\n async destroy(): Promise<void> {\n if (this.adapter?.destroy) {\n await this.adapter.destroy();\n }\n this.pluginManager.clear();\n this.adapter = null;\n this.adapterName = null;\n }\n}\n"],"names":["RequestClient","ADAPTER_ENVIRONMENT_MAP","fetch","ky","undici","detectEnvironment","isBrowser","window","isNode","process","versions","node","getRecommendedAdapters","currentEnv","createEnvironmentMismatchError","adapterName","adapterEnv","recommendedAdapters","recommendedList","length","map","name","join","adapterEnvName","currentEnvName","firstRecommended","firstRecommendedFactory","message","validateAdapterEnvironment","errorMessage","Error","getAdapterName","initialize","loadAdapter","context","createRequestContext","url","pluginManager","executeHook","PluginLifecycleStage","INIT","adapter","adapterConfig","config","defaultAdapter","adapterRegistry","get","detectedAdapter","detectAdapter","kyAdapter","fetchAdapter","axiosAdapter","undiciAdapter","setAdapter","use","plugin","register","unuse","unregister","request","options","mergedOptions","mergeOptions","beforeResult","BEFORE_REQUEST","cancelled","response","createError","RequestErrorType","ABORT_ERROR","RequestErrorCode","REQUEST_ABORTED","error","normalizeError","completeRequestContext","afterResult","AFTER_REQUEST","requestError","RequestError","failRequestContext","errorHandled","ON_ERROR","FINALLY","method","post","body","put","patch","delete","baseURL","headers","defaultHeaders","timeout","defaultTimeout","type","code","cause","includes","TIMEOUT_ERROR","REQUEST_TIMEOUT","NETWORK_ERROR","NETWORK_CONNECTION_FAILED","status","isServerError","HTTP_ERROR","SERVER_ERROR","CLIENT_ERROR","UNKNOWN_ERROR","destroy","clear","PluginManager","plugins"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/request/core/RequestClient.ts"],"sourcesContent":["/**\n * 请求客户端核心实现\n * \n * 这是请求库的核心,负责协调适配器和插件系统\n */\n\nimport type {\n RequestOptions,\n Response,\n RequestClientConfig,\n} from '../types';\nimport {\n RequestError,\n RequestErrorType,\n RequestErrorCode,\n} from '../types';\nimport type { RequestAdapter } from '../adapter/RequestAdapter';\nimport { adapterRegistry } from '../adapter/RequestAdapter';\nimport { PluginManager, PluginLifecycleStage } from '../plugin/RequestPlugin';\nimport { createRequestContext, completeRequestContext, failRequestContext } from '../runtime/RequestContext';\nimport { getRequestQueueManager } from '../utils/RequestQueueManager';\n\n/**\n * 运行环境类型\n */\ntype RuntimeEnvironment = 'browser' | 'node' | 'unknown';\n\n/**\n * 适配器环境要求映射\n * \n * 注意:axios 可以在浏览器和 Node.js 环境中使用,因此不在此映射中限制\n */\nconst ADAPTER_ENVIRONMENT_MAP: Record<string, RuntimeEnvironment> = {\n fetch: 'browser',\n ky: 'browser',\n undici: 'node',\n};\n\n/**\n * 检测当前运行环境\n * \n * @returns 运行环境类型\n */\nfunction detectEnvironment(): RuntimeEnvironment {\n const isBrowser = typeof window !== 'undefined';\n const isNode = typeof process !== 'undefined' && process.versions?.node;\n\n if (isBrowser) {\n return 'browser';\n } else if (isNode) {\n return 'node';\n }\n return 'unknown';\n}\n\n/**\n * 获取适配器的推荐替代方案\n * \n * @param currentEnv - 当前环境\n * @returns 推荐的适配器列表\n */\nfunction getRecommendedAdapters(currentEnv: RuntimeEnvironment): string[] {\n if (currentEnv === 'browser') {\n return ['fetch', 'ky', 'axios'];\n } else if (currentEnv === 'node') {\n return ['axios', 'undici'];\n }\n return [];\n}\n\n/**\n * 创建环境不匹配错误消息\n * \n * @param adapterName - 适配器名称\n * @param adapterEnv - 适配器要求的环境\n * @param currentEnv - 当前环境\n * @returns 错误消息\n */\nfunction createEnvironmentMismatchError(\n adapterName: string,\n adapterEnv: RuntimeEnvironment,\n currentEnv: RuntimeEnvironment\n): string {\n const recommendedAdapters = getRecommendedAdapters(currentEnv);\n const recommendedList = recommendedAdapters.length > 0\n ? recommendedAdapters.map(name => `\"${name}\"`).join(' 或 ')\n : '其他适配器';\n\n const adapterEnvName = adapterEnv === 'browser' ? '浏览器' : 'Node.js';\n const currentEnvName = currentEnv === 'browser' ? '浏览器' : currentEnv === 'node' ? 'Node.js' : '未知';\n const firstRecommended = recommendedAdapters[0] || 'fetch';\n const firstRecommendedFactory = firstRecommended === 'fetch' ? 'fetchAdapter' : firstRecommended === 'ky' ? 'kyAdapter' : firstRecommended === 'axios' ? 'axiosAdapter' : 'undiciAdapter';\n\n let message = `\\n❌ 适配器环境不匹配\\n\\n`;\n message += `适配器 \"${adapterName}\" 要求运行在 ${adapterEnvName} 环境中,\\n`;\n message += `但当前运行在 ${currentEnvName} 环境中。\\n\\n`;\n message += `💡 建议:请使用适合当前环境的适配器,如 ${recommendedList}。\\n\\n`;\n message += `📝 使用示例:\\n\\n`;\n message += ` // 方式 1:使用适配器名称字符串\\n`;\n message += ` import { createRequestClient } from '@vlian/framework/request';\\n\\n`;\n message += ` const client = await createRequestClient({\\n`;\n message += ` defaultAdapter: '${firstRecommended}',\\n`;\n message += ` });\\n\\n`;\n message += ` // 方式 2:使用适配器工厂函数\\n`;\n message += ` import { createRequestClient, ${firstRecommendedFactory} } from '@vlian/framework/request';\\n\\n`;\n message += ` const client = await createRequestClient({\\n`;\n message += ` defaultAdapter: ${firstRecommendedFactory},\\n`;\n message += ` });\\n`;\n\n return message;\n}\n\n/**\n * 验证适配器环境是否匹配\n * \n * @param adapterName - 适配器名称\n * @throws 如果环境不匹配,抛出包含友好提示的错误\n */\nfunction validateAdapterEnvironment(adapterName: string): void {\n const adapterEnv = ADAPTER_ENVIRONMENT_MAP[adapterName];\n if (!adapterEnv) {\n // 未知适配器,不进行环境检查\n return;\n }\n\n const currentEnv = detectEnvironment();\n if (currentEnv === 'unknown') {\n // 无法检测环境,跳过检查\n return;\n }\n\n if (adapterEnv !== currentEnv) {\n const errorMessage = createEnvironmentMismatchError(adapterName, adapterEnv, currentEnv);\n throw new Error(errorMessage);\n }\n}\n\n/**\n * 请求客户端类\n */\nexport class RequestClient {\n private config: RequestClientConfig;\n private pluginManager: PluginManager;\n private adapter: RequestAdapter | null = null;\n private adapterName: string | null = null;\n\n /**\n * 获取当前适配器名称\n */\n getAdapterName(): string | null {\n return this.adapterName;\n }\n\n constructor(config: RequestClientConfig = {}) {\n this.config = config;\n this.pluginManager = new PluginManager();\n\n // 注册插件\n if (config.plugins) {\n for (const plugin of config.plugins) {\n this.pluginManager.register(plugin);\n }\n }\n }\n\n /**\n * 初始化客户端\n */\n async initialize(): Promise<void> {\n // 加载默认适配器\n await this.loadAdapter();\n\n // 执行插件初始化钩子\n const context = createRequestContext<RequestOptions, Response, Record<string, unknown>>(\n { url: '' },\n {}\n );\n await this.pluginManager.executeHook(PluginLifecycleStage.INIT, context);\n }\n\n /**\n * 加载适配器\n */\n private async loadAdapter(): Promise<void> {\n if (this.adapter) {\n return;\n }\n\n const adapterConfig = this.config.defaultAdapter;\n\n if (typeof adapterConfig === 'string') {\n // 检查适配器环境是否匹配\n validateAdapterEnvironment(adapterConfig);\n \n // 从注册表加载\n this.adapter = await adapterRegistry.get(adapterConfig);\n this.adapterName = adapterConfig;\n \n // 再次验证(适配器可能返回不同的名称)\n if (this.adapter.name !== adapterConfig) {\n validateAdapterEnvironment(this.adapter.name);\n }\n } else if (typeof adapterConfig === 'function') {\n // 使用工厂函数加载\n this.adapter = await adapterConfig();\n this.adapterName = this.adapter.name;\n \n // 验证适配器环境\n validateAdapterEnvironment(this.adapter.name);\n } else {\n // 自动检测环境(自动检测的适配器不需要验证,因为已经根据环境选择了)\n const detectedAdapter = await this.detectAdapter();\n this.adapter = detectedAdapter.adapter;\n this.adapterName = detectedAdapter.name;\n }\n }\n\n /**\n * 自动检测适配器\n */\n private async detectAdapter(): Promise<{ adapter: RequestAdapter; name: string }> {\n // 检测运行环境\n const isBrowser = typeof window !== 'undefined';\n const isNode = typeof process !== 'undefined' && process.versions?.node;\n\n if (isBrowser) {\n // 浏览器环境:尝试加载 ky 适配器\n try {\n const { kyAdapter } = await import('../adapter/kyAdapter');\n const adapter = await kyAdapter();\n return { adapter, name: 'ky' };\n } catch {\n // 如果 ky 不可用,使用 fetch 适配器\n const { fetchAdapter } = await import('../adapter/fetchAdapter');\n const adapter = await fetchAdapter();\n return { adapter, name: 'fetch' };\n }\n } else if (isNode) {\n // Node.js 环境:尝试加载 axios 适配器\n try {\n const { axiosAdapter } = await import('../adapter/axiosAdapter');\n const adapter = await axiosAdapter();\n return { adapter, name: 'axios' };\n } catch {\n // 如果 axios 不可用,使用 undici 适配器\n try {\n const { undiciAdapter } = await import('../adapter/undiciAdapter');\n const adapter = await undiciAdapter();\n return { adapter, name: 'undici' };\n } catch {\n throw new Error('无法找到可用的适配器,请手动指定适配器');\n }\n }\n }\n\n throw new Error('无法检测运行环境');\n }\n\n /**\n * 设置适配器\n * \n * @param adapter - 适配器实例或名称\n */\n async setAdapter(adapter: RequestAdapter | string): Promise<void> {\n if (typeof adapter === 'string') {\n // 检查适配器环境是否匹配\n validateAdapterEnvironment(adapter);\n \n this.adapter = await adapterRegistry.get(adapter);\n this.adapterName = adapter;\n \n // 再次验证(适配器可能返回不同的名称)\n if (this.adapter.name !== adapter) {\n validateAdapterEnvironment(this.adapter.name);\n }\n } else {\n // 验证适配器环境\n validateAdapterEnvironment(adapter.name);\n \n this.adapter = adapter;\n this.adapterName = adapter.name;\n }\n }\n\n /**\n * 注册插件\n * \n * @param plugin - 请求插件\n */\n use(plugin: import('../plugin/RequestPlugin').RequestPlugin): void {\n this.pluginManager.register(plugin);\n }\n\n /**\n * 注销插件\n * \n * @param name - 插件名称\n */\n unuse(name: string): void {\n this.pluginManager.unregister(name);\n }\n\n /**\n * 执行请求\n * \n * @template TResponse - 响应数据类型\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n async request<TResponse = unknown>(options: RequestOptions<TResponse>): Promise<Response<TResponse>> {\n // 确保适配器已加载\n if (!this.adapter) {\n await this.loadAdapter();\n }\n\n if (!this.adapter) {\n throw new Error('适配器未初始化');\n }\n\n // 合并配置\n const mergedOptions = this.mergeOptions(options);\n\n // 检查队列状态,如果队列已暂停,将请求放入队列\n const queueManager = getRequestQueueManager();\n if (queueManager.isPaused()) {\n return queueManager.enqueue(mergedOptions, () => this.executeRequest(mergedOptions));\n }\n\n // 正常执行请求\n return this.executeRequest(mergedOptions);\n }\n\n /**\n * 执行实际的请求逻辑\n * \n * @template TResponse - 响应数据类型\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n private async executeRequest<TResponse = unknown>(options: RequestOptions<TResponse>): Promise<Response<TResponse>> {\n // 创建请求上下文\n const context = createRequestContext<RequestOptions<TResponse>, Response<TResponse>, Record<string, unknown>>(\n options,\n {}\n );\n\n try {\n // 执行请求前钩子\n const beforeResult = await this.pluginManager.executeHook(\n PluginLifecycleStage.BEFORE_REQUEST,\n context\n );\n\n // 如果插件返回了修改后的请求配置,使用它\n if (beforeResult && typeof beforeResult === 'object' && 'url' in beforeResult) {\n context.request = beforeResult as RequestOptions<TResponse>;\n }\n\n // 检查是否已取消(可能是缓存命中)\n if (context.cancelled) {\n // 如果有缓存的响应,直接返回\n if (context.response) {\n return context.response;\n }\n throw this.createError(\n '请求已取消',\n RequestErrorType.ABORT_ERROR,\n RequestErrorCode.REQUEST_ABORTED,\n { request: context.request }\n );\n }\n\n // 执行请求\n let response: Response<TResponse>;\n try {\n if (!this.adapter) {\n throw new Error('适配器未初始化');\n }\n response = await this.adapter.request<TResponse>(context.request);\n } catch (error) {\n // 适配器错误转换为框架错误\n throw this.normalizeError(error, context.request);\n }\n\n // 更新上下文\n completeRequestContext(context, response);\n\n // 执行请求后钩子\n const afterResult = await this.pluginManager.executeHook(\n PluginLifecycleStage.AFTER_REQUEST,\n context\n );\n\n // 如果插件返回了修改后的响应,使用它\n if (afterResult && typeof afterResult === 'object' && 'data' in afterResult) {\n response = afterResult as Response<TResponse>;\n }\n\n return response;\n } catch (error) {\n // 更新上下文\n const requestError = error instanceof RequestError ? error : this.normalizeError(error, context.request);\n failRequestContext(context, requestError);\n\n // 执行错误处理钩子\n const errorHandled = await this.pluginManager.executeHook(\n PluginLifecycleStage.ON_ERROR,\n context\n );\n\n // 如果错误未被处理,继续抛出\n if (errorHandled !== true) {\n throw requestError;\n }\n\n // 如果错误已被处理,返回一个默认响应(由插件决定)\n if (context.response) {\n return context.response as Response<TResponse>;\n }\n\n throw requestError;\n } finally {\n // 执行最终钩子\n await this.pluginManager.executeHook(PluginLifecycleStage.FINALLY, context);\n }\n }\n\n /**\n * GET 请求\n * \n * @template TResponse - 响应数据类型\n * @param url - 请求 URL\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n async get<TResponse = unknown>(\n url: string,\n options?: Omit<RequestOptions<TResponse>, 'url' | 'method'>\n ): Promise<Response<TResponse>> {\n return this.request<TResponse>({\n ...options,\n url,\n method: 'GET',\n });\n }\n\n /**\n * POST 请求\n * \n * @template TResponse - 响应数据类型\n * @param url - 请求 URL\n * @param body - 请求体\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n async post<TResponse = unknown>(\n url: string,\n body?: RequestOptions<TResponse>['body'],\n options?: Omit<RequestOptions<TResponse>, 'url' | 'method' | 'body'>\n ): Promise<Response<TResponse>> {\n return this.request<TResponse>({\n ...options,\n url,\n method: 'POST',\n body,\n });\n }\n\n /**\n * PUT 请求\n * \n * @template TResponse - 响应数据类型\n * @param url - 请求 URL\n * @param body - 请求体\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n async put<TResponse = unknown>(\n url: string,\n body?: RequestOptions<TResponse>['body'],\n options?: Omit<RequestOptions<TResponse>, 'url' | 'method' | 'body'>\n ): Promise<Response<TResponse>> {\n return this.request<TResponse>({\n ...options,\n url,\n method: 'PUT',\n body,\n });\n }\n\n /**\n * PATCH 请求\n * \n * @template TResponse - 响应数据类型\n * @param url - 请求 URL\n * @param body - 请求体\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n async patch<TResponse = unknown>(\n url: string,\n body?: RequestOptions<TResponse>['body'],\n options?: Omit<RequestOptions<TResponse>, 'url' | 'method' | 'body'>\n ): Promise<Response<TResponse>> {\n return this.request<TResponse>({\n ...options,\n url,\n method: 'PATCH',\n body,\n });\n }\n\n /**\n * DELETE 请求\n * \n * @template TResponse - 响应数据类型\n * @param url - 请求 URL\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n async delete<TResponse = unknown>(\n url: string,\n options?: Omit<RequestOptions<TResponse>, 'url' | 'method'>\n ): Promise<Response<TResponse>> {\n return this.request<TResponse>({\n ...options,\n url,\n method: 'DELETE',\n });\n }\n\n /**\n * 合并请求配置\n * \n * @param options - 请求配置选项\n * @returns 合并后的配置\n */\n private mergeOptions<TResponse>(options: RequestOptions<TResponse>): RequestOptions<TResponse> {\n const baseURL = this.config.baseURL || '';\n const url = baseURL ? `${baseURL}${options.url}` : options.url;\n\n return {\n ...options,\n url,\n headers: {\n ...this.config.defaultHeaders,\n ...options.headers,\n },\n timeout: options.timeout ?? this.config.defaultTimeout,\n };\n }\n\n /**\n * 创建请求错误\n */\n private createError(\n message: string,\n type: RequestErrorType,\n code: RequestErrorCode,\n options?: {\n status?: number;\n cause?: unknown;\n request?: RequestOptions;\n response?: Response;\n context?: Record<string, unknown>;\n }\n ): RequestError {\n return new RequestError(message, type, code, options);\n }\n\n /**\n * 标准化错误\n */\n private normalizeError(error: unknown, request?: RequestOptions): RequestError {\n if (error instanceof RequestError) {\n return error;\n }\n\n // 处理 AbortError\n if (error instanceof Error && error.name === 'AbortError') {\n return this.createError(\n '请求已取消',\n RequestErrorType.ABORT_ERROR,\n RequestErrorCode.REQUEST_ABORTED,\n { cause: error, request }\n );\n }\n\n // 处理超时错误\n if (error instanceof Error && (error.message.includes('timeout') || error.message.includes('Timeout'))) {\n return this.createError(\n '请求超时',\n RequestErrorType.TIMEOUT_ERROR,\n RequestErrorCode.REQUEST_TIMEOUT,\n { cause: error, request }\n );\n }\n\n // 处理网络错误\n if (error instanceof Error && (error.message.includes('network') || error.message.includes('Network'))) {\n return this.createError(\n '网络连接失败',\n RequestErrorType.NETWORK_ERROR,\n RequestErrorCode.NETWORK_CONNECTION_FAILED,\n { cause: error, request }\n );\n }\n\n // 处理 HTTP 错误(需要适配器提供)\n if (error && typeof error === 'object' && 'status' in error) {\n const status = (error as { status: number }).status;\n const isServerError = status >= 500;\n return this.createError(\n `HTTP ${status} 错误`,\n RequestErrorType.HTTP_ERROR,\n isServerError ? RequestErrorCode.SERVER_ERROR : RequestErrorCode.CLIENT_ERROR,\n { status, cause: error, request }\n );\n }\n\n // 未知错误\n return this.createError(\n error instanceof Error ? error.message : '未知错误',\n RequestErrorType.UNKNOWN_ERROR,\n RequestErrorCode.NETWORK_CONNECTION_FAILED,\n { cause: error, request }\n );\n }\n\n /**\n * 销毁客户端\n */\n async destroy(): Promise<void> {\n if (this.adapter?.destroy) {\n await this.adapter.destroy();\n }\n this.pluginManager.clear();\n this.adapter = null;\n this.adapterName = null;\n }\n}\n"],"names":["RequestClient","ADAPTER_ENVIRONMENT_MAP","fetch","ky","undici","detectEnvironment","isBrowser","window","isNode","process","versions","node","getRecommendedAdapters","currentEnv","createEnvironmentMismatchError","adapterName","adapterEnv","recommendedAdapters","recommendedList","length","map","name","join","adapterEnvName","currentEnvName","firstRecommended","firstRecommendedFactory","message","validateAdapterEnvironment","errorMessage","Error","getAdapterName","initialize","loadAdapter","context","createRequestContext","url","pluginManager","executeHook","PluginLifecycleStage","INIT","adapter","adapterConfig","config","defaultAdapter","adapterRegistry","get","detectedAdapter","detectAdapter","kyAdapter","fetchAdapter","axiosAdapter","undiciAdapter","setAdapter","use","plugin","register","unuse","unregister","request","options","mergedOptions","mergeOptions","queueManager","getRequestQueueManager","isPaused","enqueue","executeRequest","beforeResult","BEFORE_REQUEST","cancelled","response","createError","RequestErrorType","ABORT_ERROR","RequestErrorCode","REQUEST_ABORTED","error","normalizeError","completeRequestContext","afterResult","AFTER_REQUEST","requestError","RequestError","failRequestContext","errorHandled","ON_ERROR","FINALLY","method","post","body","put","patch","delete","baseURL","headers","defaultHeaders","timeout","defaultTimeout","type","code","cause","includes","TIMEOUT_ERROR","REQUEST_TIMEOUT","NETWORK_ERROR","NETWORK_CONNECTION_FAILED","status","isServerError","HTTP_ERROR","SERVER_ERROR","CLIENT_ERROR","UNKNOWN_ERROR","destroy","clear","PluginManager","plugins"],"mappings":"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"}
@@ -56,6 +56,14 @@ export declare class RequestClient {
56
56
  * @returns Promise 解析为响应对象
57
57
  */
58
58
  request<TResponse = unknown>(options: RequestOptions<TResponse>): Promise<Response<TResponse>>;
59
+ /**
60
+ * 执行实际的请求逻辑
61
+ *
62
+ * @template TResponse - 响应数据类型
63
+ * @param options - 请求配置选项
64
+ * @returns Promise 解析为响应对象
65
+ */
66
+ private executeRequest;
59
67
  /**
60
68
  * GET 请求
61
69
  *
@@ -1 +1 @@
1
- {"version":3,"file":"RequestClient.d.ts","sourceRoot":"","sources":["../../../src/request/core/RequestClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RequestClient.d.ts","sourceRoot":"","sources":["../../../src/request/core/RequestClient.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,7 @@ import { RequestError, RequestErrorType, RequestErrorCode } from "../types";
19
19
  import { adapterRegistry } from "../adapter/RequestAdapter";
20
20
  import { PluginManager, PluginLifecycleStage } from "../plugin/RequestPlugin";
21
21
  import { createRequestContext, completeRequestContext, failRequestContext } from "../runtime/RequestContext";
22
+ import { getRequestQueueManager } from "../utils/RequestQueueManager";
22
23
  /**
23
24
  * 适配器环境要求映射
24
25
  *
@@ -263,8 +264,23 @@ import { createRequestContext, completeRequestContext, failRequestContext } from
263
264
  }
264
265
  // 合并配置
265
266
  const mergedOptions = this.mergeOptions(options);
267
+ // 检查队列状态,如果队列已暂停,将请求放入队列
268
+ const queueManager = getRequestQueueManager();
269
+ if (queueManager.isPaused()) {
270
+ return queueManager.enqueue(mergedOptions, ()=>this.executeRequest(mergedOptions));
271
+ }
272
+ // 正常执行请求
273
+ return this.executeRequest(mergedOptions);
274
+ }
275
+ /**
276
+ * 执行实际的请求逻辑
277
+ *
278
+ * @template TResponse - 响应数据类型
279
+ * @param options - 请求配置选项
280
+ * @returns Promise 解析为响应对象
281
+ */ async executeRequest(options) {
266
282
  // 创建请求上下文
267
- const context = createRequestContext(mergedOptions, {});
283
+ const context = createRequestContext(options, {});
268
284
  try {
269
285
  // 执行请求前钩子
270
286
  const beforeResult = await this.pluginManager.executeHook(PluginLifecycleStage.BEFORE_REQUEST, context);
@@ -285,6 +301,9 @@ import { createRequestContext, completeRequestContext, failRequestContext } from
285
301
  // 执行请求
286
302
  let response;
287
303
  try {
304
+ if (!this.adapter) {
305
+ throw new Error('适配器未初始化');
306
+ }
288
307
  response = await this.adapter.request(context.request);
289
308
  } catch (error) {
290
309
  // 适配器错误转换为框架错误
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/request/core/RequestClient.ts"],"sourcesContent":["/**\n * 请求客户端核心实现\n * \n * 这是请求库的核心,负责协调适配器和插件系统\n */\n\nimport type {\n RequestOptions,\n Response,\n RequestClientConfig,\n} from '../types';\nimport {\n RequestError,\n RequestErrorType,\n RequestErrorCode,\n} from '../types';\nimport type { RequestAdapter } from '../adapter/RequestAdapter';\nimport { adapterRegistry } from '../adapter/RequestAdapter';\nimport { PluginManager, PluginLifecycleStage } from '../plugin/RequestPlugin';\nimport { createRequestContext, completeRequestContext, failRequestContext } from '../runtime/RequestContext';\n\n/**\n * 运行环境类型\n */\ntype RuntimeEnvironment = 'browser' | 'node' | 'unknown';\n\n/**\n * 适配器环境要求映射\n * \n * 注意:axios 可以在浏览器和 Node.js 环境中使用,因此不在此映射中限制\n */\nconst ADAPTER_ENVIRONMENT_MAP: Record<string, RuntimeEnvironment> = {\n fetch: 'browser',\n ky: 'browser',\n undici: 'node',\n};\n\n/**\n * 检测当前运行环境\n * \n * @returns 运行环境类型\n */\nfunction detectEnvironment(): RuntimeEnvironment {\n const isBrowser = typeof window !== 'undefined';\n const isNode = typeof process !== 'undefined' && process.versions?.node;\n\n if (isBrowser) {\n return 'browser';\n } else if (isNode) {\n return 'node';\n }\n return 'unknown';\n}\n\n/**\n * 获取适配器的推荐替代方案\n * \n * @param currentEnv - 当前环境\n * @returns 推荐的适配器列表\n */\nfunction getRecommendedAdapters(currentEnv: RuntimeEnvironment): string[] {\n if (currentEnv === 'browser') {\n return ['fetch', 'ky', 'axios'];\n } else if (currentEnv === 'node') {\n return ['axios', 'undici'];\n }\n return [];\n}\n\n/**\n * 创建环境不匹配错误消息\n * \n * @param adapterName - 适配器名称\n * @param adapterEnv - 适配器要求的环境\n * @param currentEnv - 当前环境\n * @returns 错误消息\n */\nfunction createEnvironmentMismatchError(\n adapterName: string,\n adapterEnv: RuntimeEnvironment,\n currentEnv: RuntimeEnvironment\n): string {\n const recommendedAdapters = getRecommendedAdapters(currentEnv);\n const recommendedList = recommendedAdapters.length > 0\n ? recommendedAdapters.map(name => `\"${name}\"`).join(' 或 ')\n : '其他适配器';\n\n const adapterEnvName = adapterEnv === 'browser' ? '浏览器' : 'Node.js';\n const currentEnvName = currentEnv === 'browser' ? '浏览器' : currentEnv === 'node' ? 'Node.js' : '未知';\n const firstRecommended = recommendedAdapters[0] || 'fetch';\n const firstRecommendedFactory = firstRecommended === 'fetch' ? 'fetchAdapter' : firstRecommended === 'ky' ? 'kyAdapter' : firstRecommended === 'axios' ? 'axiosAdapter' : 'undiciAdapter';\n\n let message = `\\n❌ 适配器环境不匹配\\n\\n`;\n message += `适配器 \"${adapterName}\" 要求运行在 ${adapterEnvName} 环境中,\\n`;\n message += `但当前运行在 ${currentEnvName} 环境中。\\n\\n`;\n message += `💡 建议:请使用适合当前环境的适配器,如 ${recommendedList}。\\n\\n`;\n message += `📝 使用示例:\\n\\n`;\n message += ` // 方式 1:使用适配器名称字符串\\n`;\n message += ` import { createRequestClient } from '@vlian/framework/request';\\n\\n`;\n message += ` const client = await createRequestClient({\\n`;\n message += ` defaultAdapter: '${firstRecommended}',\\n`;\n message += ` });\\n\\n`;\n message += ` // 方式 2:使用适配器工厂函数\\n`;\n message += ` import { createRequestClient, ${firstRecommendedFactory} } from '@vlian/framework/request';\\n\\n`;\n message += ` const client = await createRequestClient({\\n`;\n message += ` defaultAdapter: ${firstRecommendedFactory},\\n`;\n message += ` });\\n`;\n\n return message;\n}\n\n/**\n * 验证适配器环境是否匹配\n * \n * @param adapterName - 适配器名称\n * @throws 如果环境不匹配,抛出包含友好提示的错误\n */\nfunction validateAdapterEnvironment(adapterName: string): void {\n const adapterEnv = ADAPTER_ENVIRONMENT_MAP[adapterName];\n if (!adapterEnv) {\n // 未知适配器,不进行环境检查\n return;\n }\n\n const currentEnv = detectEnvironment();\n if (currentEnv === 'unknown') {\n // 无法检测环境,跳过检查\n return;\n }\n\n if (adapterEnv !== currentEnv) {\n const errorMessage = createEnvironmentMismatchError(adapterName, adapterEnv, currentEnv);\n throw new Error(errorMessage);\n }\n}\n\n/**\n * 请求客户端类\n */\nexport class RequestClient {\n private config: RequestClientConfig;\n private pluginManager: PluginManager;\n private adapter: RequestAdapter | null = null;\n private adapterName: string | null = null;\n\n /**\n * 获取当前适配器名称\n */\n getAdapterName(): string | null {\n return this.adapterName;\n }\n\n constructor(config: RequestClientConfig = {}) {\n this.config = config;\n this.pluginManager = new PluginManager();\n\n // 注册插件\n if (config.plugins) {\n for (const plugin of config.plugins) {\n this.pluginManager.register(plugin);\n }\n }\n }\n\n /**\n * 初始化客户端\n */\n async initialize(): Promise<void> {\n // 加载默认适配器\n await this.loadAdapter();\n\n // 执行插件初始化钩子\n const context = createRequestContext<RequestOptions, Response, Record<string, unknown>>(\n { url: '' },\n {}\n );\n await this.pluginManager.executeHook(PluginLifecycleStage.INIT, context);\n }\n\n /**\n * 加载适配器\n */\n private async loadAdapter(): Promise<void> {\n if (this.adapter) {\n return;\n }\n\n const adapterConfig = this.config.defaultAdapter;\n\n if (typeof adapterConfig === 'string') {\n // 检查适配器环境是否匹配\n validateAdapterEnvironment(adapterConfig);\n \n // 从注册表加载\n this.adapter = await adapterRegistry.get(adapterConfig);\n this.adapterName = adapterConfig;\n \n // 再次验证(适配器可能返回不同的名称)\n if (this.adapter.name !== adapterConfig) {\n validateAdapterEnvironment(this.adapter.name);\n }\n } else if (typeof adapterConfig === 'function') {\n // 使用工厂函数加载\n this.adapter = await adapterConfig();\n this.adapterName = this.adapter.name;\n \n // 验证适配器环境\n validateAdapterEnvironment(this.adapter.name);\n } else {\n // 自动检测环境(自动检测的适配器不需要验证,因为已经根据环境选择了)\n const detectedAdapter = await this.detectAdapter();\n this.adapter = detectedAdapter.adapter;\n this.adapterName = detectedAdapter.name;\n }\n }\n\n /**\n * 自动检测适配器\n */\n private async detectAdapter(): Promise<{ adapter: RequestAdapter; name: string }> {\n // 检测运行环境\n const isBrowser = typeof window !== 'undefined';\n const isNode = typeof process !== 'undefined' && process.versions?.node;\n\n if (isBrowser) {\n // 浏览器环境:尝试加载 ky 适配器\n try {\n const { kyAdapter } = await import('../adapter/kyAdapter');\n const adapter = await kyAdapter();\n return { adapter, name: 'ky' };\n } catch {\n // 如果 ky 不可用,使用 fetch 适配器\n const { fetchAdapter } = await import('../adapter/fetchAdapter');\n const adapter = await fetchAdapter();\n return { adapter, name: 'fetch' };\n }\n } else if (isNode) {\n // Node.js 环境:尝试加载 axios 适配器\n try {\n const { axiosAdapter } = await import('../adapter/axiosAdapter');\n const adapter = await axiosAdapter();\n return { adapter, name: 'axios' };\n } catch {\n // 如果 axios 不可用,使用 undici 适配器\n try {\n const { undiciAdapter } = await import('../adapter/undiciAdapter');\n const adapter = await undiciAdapter();\n return { adapter, name: 'undici' };\n } catch {\n throw new Error('无法找到可用的适配器,请手动指定适配器');\n }\n }\n }\n\n throw new Error('无法检测运行环境');\n }\n\n /**\n * 设置适配器\n * \n * @param adapter - 适配器实例或名称\n */\n async setAdapter(adapter: RequestAdapter | string): Promise<void> {\n if (typeof adapter === 'string') {\n // 检查适配器环境是否匹配\n validateAdapterEnvironment(adapter);\n \n this.adapter = await adapterRegistry.get(adapter);\n this.adapterName = adapter;\n \n // 再次验证(适配器可能返回不同的名称)\n if (this.adapter.name !== adapter) {\n validateAdapterEnvironment(this.adapter.name);\n }\n } else {\n // 验证适配器环境\n validateAdapterEnvironment(adapter.name);\n \n this.adapter = adapter;\n this.adapterName = adapter.name;\n }\n }\n\n /**\n * 注册插件\n * \n * @param plugin - 请求插件\n */\n use(plugin: import('../plugin/RequestPlugin').RequestPlugin): void {\n this.pluginManager.register(plugin);\n }\n\n /**\n * 注销插件\n * \n * @param name - 插件名称\n */\n unuse(name: string): void {\n this.pluginManager.unregister(name);\n }\n\n /**\n * 执行请求\n * \n * @template TResponse - 响应数据类型\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n async request<TResponse = unknown>(options: RequestOptions<TResponse>): Promise<Response<TResponse>> {\n // 确保适配器已加载\n if (!this.adapter) {\n await this.loadAdapter();\n }\n\n if (!this.adapter) {\n throw new Error('适配器未初始化');\n }\n\n // 合并配置\n const mergedOptions = this.mergeOptions(options);\n\n // 创建请求上下文\n const context = createRequestContext<RequestOptions<TResponse>, Response<TResponse>, Record<string, unknown>>(\n mergedOptions,\n {}\n );\n\n try {\n // 执行请求前钩子\n const beforeResult = await this.pluginManager.executeHook(\n PluginLifecycleStage.BEFORE_REQUEST,\n context\n );\n\n // 如果插件返回了修改后的请求配置,使用它\n if (beforeResult && typeof beforeResult === 'object' && 'url' in beforeResult) {\n context.request = beforeResult as RequestOptions<TResponse>;\n }\n\n // 检查是否已取消(可能是缓存命中)\n if (context.cancelled) {\n // 如果有缓存的响应,直接返回\n if (context.response) {\n return context.response;\n }\n throw this.createError(\n '请求已取消',\n RequestErrorType.ABORT_ERROR,\n RequestErrorCode.REQUEST_ABORTED,\n { request: context.request }\n );\n }\n\n // 执行请求\n let response: Response<TResponse>;\n try {\n response = await this.adapter.request<TResponse>(context.request);\n } catch (error) {\n // 适配器错误转换为框架错误\n throw this.normalizeError(error, context.request);\n }\n\n // 更新上下文\n completeRequestContext(context, response);\n\n // 执行请求后钩子\n const afterResult = await this.pluginManager.executeHook(\n PluginLifecycleStage.AFTER_REQUEST,\n context\n );\n\n // 如果插件返回了修改后的响应,使用它\n if (afterResult && typeof afterResult === 'object' && 'data' in afterResult) {\n response = afterResult as Response<TResponse>;\n }\n\n return response;\n } catch (error) {\n // 更新上下文\n const requestError = error instanceof RequestError ? error : this.normalizeError(error, context.request);\n failRequestContext(context, requestError);\n\n // 执行错误处理钩子\n const errorHandled = await this.pluginManager.executeHook(\n PluginLifecycleStage.ON_ERROR,\n context\n );\n\n // 如果错误未被处理,继续抛出\n if (errorHandled !== true) {\n throw requestError;\n }\n\n // 如果错误已被处理,返回一个默认响应(由插件决定)\n if (context.response) {\n return context.response as Response<TResponse>;\n }\n\n throw requestError;\n } finally {\n // 执行最终钩子\n await this.pluginManager.executeHook(PluginLifecycleStage.FINALLY, context);\n }\n }\n\n /**\n * GET 请求\n * \n * @template TResponse - 响应数据类型\n * @param url - 请求 URL\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n async get<TResponse = unknown>(\n url: string,\n options?: Omit<RequestOptions<TResponse>, 'url' | 'method'>\n ): Promise<Response<TResponse>> {\n return this.request<TResponse>({\n ...options,\n url,\n method: 'GET',\n });\n }\n\n /**\n * POST 请求\n * \n * @template TResponse - 响应数据类型\n * @param url - 请求 URL\n * @param body - 请求体\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n async post<TResponse = unknown>(\n url: string,\n body?: RequestOptions<TResponse>['body'],\n options?: Omit<RequestOptions<TResponse>, 'url' | 'method' | 'body'>\n ): Promise<Response<TResponse>> {\n return this.request<TResponse>({\n ...options,\n url,\n method: 'POST',\n body,\n });\n }\n\n /**\n * PUT 请求\n * \n * @template TResponse - 响应数据类型\n * @param url - 请求 URL\n * @param body - 请求体\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n async put<TResponse = unknown>(\n url: string,\n body?: RequestOptions<TResponse>['body'],\n options?: Omit<RequestOptions<TResponse>, 'url' | 'method' | 'body'>\n ): Promise<Response<TResponse>> {\n return this.request<TResponse>({\n ...options,\n url,\n method: 'PUT',\n body,\n });\n }\n\n /**\n * PATCH 请求\n * \n * @template TResponse - 响应数据类型\n * @param url - 请求 URL\n * @param body - 请求体\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n async patch<TResponse = unknown>(\n url: string,\n body?: RequestOptions<TResponse>['body'],\n options?: Omit<RequestOptions<TResponse>, 'url' | 'method' | 'body'>\n ): Promise<Response<TResponse>> {\n return this.request<TResponse>({\n ...options,\n url,\n method: 'PATCH',\n body,\n });\n }\n\n /**\n * DELETE 请求\n * \n * @template TResponse - 响应数据类型\n * @param url - 请求 URL\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n async delete<TResponse = unknown>(\n url: string,\n options?: Omit<RequestOptions<TResponse>, 'url' | 'method'>\n ): Promise<Response<TResponse>> {\n return this.request<TResponse>({\n ...options,\n url,\n method: 'DELETE',\n });\n }\n\n /**\n * 合并请求配置\n * \n * @param options - 请求配置选项\n * @returns 合并后的配置\n */\n private mergeOptions<TResponse>(options: RequestOptions<TResponse>): RequestOptions<TResponse> {\n const baseURL = this.config.baseURL || '';\n const url = baseURL ? `${baseURL}${options.url}` : options.url;\n\n return {\n ...options,\n url,\n headers: {\n ...this.config.defaultHeaders,\n ...options.headers,\n },\n timeout: options.timeout ?? this.config.defaultTimeout,\n };\n }\n\n /**\n * 创建请求错误\n */\n private createError(\n message: string,\n type: RequestErrorType,\n code: RequestErrorCode,\n options?: {\n status?: number;\n cause?: unknown;\n request?: RequestOptions;\n response?: Response;\n context?: Record<string, unknown>;\n }\n ): RequestError {\n return new RequestError(message, type, code, options);\n }\n\n /**\n * 标准化错误\n */\n private normalizeError(error: unknown, request?: RequestOptions): RequestError {\n if (error instanceof RequestError) {\n return error;\n }\n\n // 处理 AbortError\n if (error instanceof Error && error.name === 'AbortError') {\n return this.createError(\n '请求已取消',\n RequestErrorType.ABORT_ERROR,\n RequestErrorCode.REQUEST_ABORTED,\n { cause: error, request }\n );\n }\n\n // 处理超时错误\n if (error instanceof Error && (error.message.includes('timeout') || error.message.includes('Timeout'))) {\n return this.createError(\n '请求超时',\n RequestErrorType.TIMEOUT_ERROR,\n RequestErrorCode.REQUEST_TIMEOUT,\n { cause: error, request }\n );\n }\n\n // 处理网络错误\n if (error instanceof Error && (error.message.includes('network') || error.message.includes('Network'))) {\n return this.createError(\n '网络连接失败',\n RequestErrorType.NETWORK_ERROR,\n RequestErrorCode.NETWORK_CONNECTION_FAILED,\n { cause: error, request }\n );\n }\n\n // 处理 HTTP 错误(需要适配器提供)\n if (error && typeof error === 'object' && 'status' in error) {\n const status = (error as { status: number }).status;\n const isServerError = status >= 500;\n return this.createError(\n `HTTP ${status} 错误`,\n RequestErrorType.HTTP_ERROR,\n isServerError ? RequestErrorCode.SERVER_ERROR : RequestErrorCode.CLIENT_ERROR,\n { status, cause: error, request }\n );\n }\n\n // 未知错误\n return this.createError(\n error instanceof Error ? error.message : '未知错误',\n RequestErrorType.UNKNOWN_ERROR,\n RequestErrorCode.NETWORK_CONNECTION_FAILED,\n { cause: error, request }\n );\n }\n\n /**\n * 销毁客户端\n */\n async destroy(): Promise<void> {\n if (this.adapter?.destroy) {\n await this.adapter.destroy();\n }\n this.pluginManager.clear();\n this.adapter = null;\n this.adapterName = null;\n }\n}\n"],"names":["RequestError","RequestErrorType","RequestErrorCode","adapterRegistry","PluginManager","PluginLifecycleStage","createRequestContext","completeRequestContext","failRequestContext","ADAPTER_ENVIRONMENT_MAP","fetch","ky","undici","detectEnvironment","isBrowser","window","isNode","process","versions","node","getRecommendedAdapters","currentEnv","createEnvironmentMismatchError","adapterName","adapterEnv","recommendedAdapters","recommendedList","length","map","name","join","adapterEnvName","currentEnvName","firstRecommended","firstRecommendedFactory","message","validateAdapterEnvironment","errorMessage","Error","RequestClient","getAdapterName","initialize","loadAdapter","context","url","pluginManager","executeHook","INIT","adapter","adapterConfig","config","defaultAdapter","get","detectedAdapter","detectAdapter","kyAdapter","fetchAdapter","axiosAdapter","undiciAdapter","setAdapter","use","plugin","register","unuse","unregister","request","options","mergedOptions","mergeOptions","beforeResult","BEFORE_REQUEST","cancelled","response","createError","ABORT_ERROR","REQUEST_ABORTED","error","normalizeError","afterResult","AFTER_REQUEST","requestError","errorHandled","ON_ERROR","FINALLY","method","post","body","put","patch","delete","baseURL","headers","defaultHeaders","timeout","defaultTimeout","type","code","cause","includes","TIMEOUT_ERROR","REQUEST_TIMEOUT","NETWORK_ERROR","NETWORK_CONNECTION_FAILED","status","isServerError","HTTP_ERROR","SERVER_ERROR","CLIENT_ERROR","UNKNOWN_ERROR","destroy","clear","plugins"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/request/core/RequestClient.ts"],"sourcesContent":["/**\n * 请求客户端核心实现\n * \n * 这是请求库的核心,负责协调适配器和插件系统\n */\n\nimport type {\n RequestOptions,\n Response,\n RequestClientConfig,\n} from '../types';\nimport {\n RequestError,\n RequestErrorType,\n RequestErrorCode,\n} from '../types';\nimport type { RequestAdapter } from '../adapter/RequestAdapter';\nimport { adapterRegistry } from '../adapter/RequestAdapter';\nimport { PluginManager, PluginLifecycleStage } from '../plugin/RequestPlugin';\nimport { createRequestContext, completeRequestContext, failRequestContext } from '../runtime/RequestContext';\nimport { getRequestQueueManager } from '../utils/RequestQueueManager';\n\n/**\n * 运行环境类型\n */\ntype RuntimeEnvironment = 'browser' | 'node' | 'unknown';\n\n/**\n * 适配器环境要求映射\n * \n * 注意:axios 可以在浏览器和 Node.js 环境中使用,因此不在此映射中限制\n */\nconst ADAPTER_ENVIRONMENT_MAP: Record<string, RuntimeEnvironment> = {\n fetch: 'browser',\n ky: 'browser',\n undici: 'node',\n};\n\n/**\n * 检测当前运行环境\n * \n * @returns 运行环境类型\n */\nfunction detectEnvironment(): RuntimeEnvironment {\n const isBrowser = typeof window !== 'undefined';\n const isNode = typeof process !== 'undefined' && process.versions?.node;\n\n if (isBrowser) {\n return 'browser';\n } else if (isNode) {\n return 'node';\n }\n return 'unknown';\n}\n\n/**\n * 获取适配器的推荐替代方案\n * \n * @param currentEnv - 当前环境\n * @returns 推荐的适配器列表\n */\nfunction getRecommendedAdapters(currentEnv: RuntimeEnvironment): string[] {\n if (currentEnv === 'browser') {\n return ['fetch', 'ky', 'axios'];\n } else if (currentEnv === 'node') {\n return ['axios', 'undici'];\n }\n return [];\n}\n\n/**\n * 创建环境不匹配错误消息\n * \n * @param adapterName - 适配器名称\n * @param adapterEnv - 适配器要求的环境\n * @param currentEnv - 当前环境\n * @returns 错误消息\n */\nfunction createEnvironmentMismatchError(\n adapterName: string,\n adapterEnv: RuntimeEnvironment,\n currentEnv: RuntimeEnvironment\n): string {\n const recommendedAdapters = getRecommendedAdapters(currentEnv);\n const recommendedList = recommendedAdapters.length > 0\n ? recommendedAdapters.map(name => `\"${name}\"`).join(' 或 ')\n : '其他适配器';\n\n const adapterEnvName = adapterEnv === 'browser' ? '浏览器' : 'Node.js';\n const currentEnvName = currentEnv === 'browser' ? '浏览器' : currentEnv === 'node' ? 'Node.js' : '未知';\n const firstRecommended = recommendedAdapters[0] || 'fetch';\n const firstRecommendedFactory = firstRecommended === 'fetch' ? 'fetchAdapter' : firstRecommended === 'ky' ? 'kyAdapter' : firstRecommended === 'axios' ? 'axiosAdapter' : 'undiciAdapter';\n\n let message = `\\n❌ 适配器环境不匹配\\n\\n`;\n message += `适配器 \"${adapterName}\" 要求运行在 ${adapterEnvName} 环境中,\\n`;\n message += `但当前运行在 ${currentEnvName} 环境中。\\n\\n`;\n message += `💡 建议:请使用适合当前环境的适配器,如 ${recommendedList}。\\n\\n`;\n message += `📝 使用示例:\\n\\n`;\n message += ` // 方式 1:使用适配器名称字符串\\n`;\n message += ` import { createRequestClient } from '@vlian/framework/request';\\n\\n`;\n message += ` const client = await createRequestClient({\\n`;\n message += ` defaultAdapter: '${firstRecommended}',\\n`;\n message += ` });\\n\\n`;\n message += ` // 方式 2:使用适配器工厂函数\\n`;\n message += ` import { createRequestClient, ${firstRecommendedFactory} } from '@vlian/framework/request';\\n\\n`;\n message += ` const client = await createRequestClient({\\n`;\n message += ` defaultAdapter: ${firstRecommendedFactory},\\n`;\n message += ` });\\n`;\n\n return message;\n}\n\n/**\n * 验证适配器环境是否匹配\n * \n * @param adapterName - 适配器名称\n * @throws 如果环境不匹配,抛出包含友好提示的错误\n */\nfunction validateAdapterEnvironment(adapterName: string): void {\n const adapterEnv = ADAPTER_ENVIRONMENT_MAP[adapterName];\n if (!adapterEnv) {\n // 未知适配器,不进行环境检查\n return;\n }\n\n const currentEnv = detectEnvironment();\n if (currentEnv === 'unknown') {\n // 无法检测环境,跳过检查\n return;\n }\n\n if (adapterEnv !== currentEnv) {\n const errorMessage = createEnvironmentMismatchError(adapterName, adapterEnv, currentEnv);\n throw new Error(errorMessage);\n }\n}\n\n/**\n * 请求客户端类\n */\nexport class RequestClient {\n private config: RequestClientConfig;\n private pluginManager: PluginManager;\n private adapter: RequestAdapter | null = null;\n private adapterName: string | null = null;\n\n /**\n * 获取当前适配器名称\n */\n getAdapterName(): string | null {\n return this.adapterName;\n }\n\n constructor(config: RequestClientConfig = {}) {\n this.config = config;\n this.pluginManager = new PluginManager();\n\n // 注册插件\n if (config.plugins) {\n for (const plugin of config.plugins) {\n this.pluginManager.register(plugin);\n }\n }\n }\n\n /**\n * 初始化客户端\n */\n async initialize(): Promise<void> {\n // 加载默认适配器\n await this.loadAdapter();\n\n // 执行插件初始化钩子\n const context = createRequestContext<RequestOptions, Response, Record<string, unknown>>(\n { url: '' },\n {}\n );\n await this.pluginManager.executeHook(PluginLifecycleStage.INIT, context);\n }\n\n /**\n * 加载适配器\n */\n private async loadAdapter(): Promise<void> {\n if (this.adapter) {\n return;\n }\n\n const adapterConfig = this.config.defaultAdapter;\n\n if (typeof adapterConfig === 'string') {\n // 检查适配器环境是否匹配\n validateAdapterEnvironment(adapterConfig);\n \n // 从注册表加载\n this.adapter = await adapterRegistry.get(adapterConfig);\n this.adapterName = adapterConfig;\n \n // 再次验证(适配器可能返回不同的名称)\n if (this.adapter.name !== adapterConfig) {\n validateAdapterEnvironment(this.adapter.name);\n }\n } else if (typeof adapterConfig === 'function') {\n // 使用工厂函数加载\n this.adapter = await adapterConfig();\n this.adapterName = this.adapter.name;\n \n // 验证适配器环境\n validateAdapterEnvironment(this.adapter.name);\n } else {\n // 自动检测环境(自动检测的适配器不需要验证,因为已经根据环境选择了)\n const detectedAdapter = await this.detectAdapter();\n this.adapter = detectedAdapter.adapter;\n this.adapterName = detectedAdapter.name;\n }\n }\n\n /**\n * 自动检测适配器\n */\n private async detectAdapter(): Promise<{ adapter: RequestAdapter; name: string }> {\n // 检测运行环境\n const isBrowser = typeof window !== 'undefined';\n const isNode = typeof process !== 'undefined' && process.versions?.node;\n\n if (isBrowser) {\n // 浏览器环境:尝试加载 ky 适配器\n try {\n const { kyAdapter } = await import('../adapter/kyAdapter');\n const adapter = await kyAdapter();\n return { adapter, name: 'ky' };\n } catch {\n // 如果 ky 不可用,使用 fetch 适配器\n const { fetchAdapter } = await import('../adapter/fetchAdapter');\n const adapter = await fetchAdapter();\n return { adapter, name: 'fetch' };\n }\n } else if (isNode) {\n // Node.js 环境:尝试加载 axios 适配器\n try {\n const { axiosAdapter } = await import('../adapter/axiosAdapter');\n const adapter = await axiosAdapter();\n return { adapter, name: 'axios' };\n } catch {\n // 如果 axios 不可用,使用 undici 适配器\n try {\n const { undiciAdapter } = await import('../adapter/undiciAdapter');\n const adapter = await undiciAdapter();\n return { adapter, name: 'undici' };\n } catch {\n throw new Error('无法找到可用的适配器,请手动指定适配器');\n }\n }\n }\n\n throw new Error('无法检测运行环境');\n }\n\n /**\n * 设置适配器\n * \n * @param adapter - 适配器实例或名称\n */\n async setAdapter(adapter: RequestAdapter | string): Promise<void> {\n if (typeof adapter === 'string') {\n // 检查适配器环境是否匹配\n validateAdapterEnvironment(adapter);\n \n this.adapter = await adapterRegistry.get(adapter);\n this.adapterName = adapter;\n \n // 再次验证(适配器可能返回不同的名称)\n if (this.adapter.name !== adapter) {\n validateAdapterEnvironment(this.adapter.name);\n }\n } else {\n // 验证适配器环境\n validateAdapterEnvironment(adapter.name);\n \n this.adapter = adapter;\n this.adapterName = adapter.name;\n }\n }\n\n /**\n * 注册插件\n * \n * @param plugin - 请求插件\n */\n use(plugin: import('../plugin/RequestPlugin').RequestPlugin): void {\n this.pluginManager.register(plugin);\n }\n\n /**\n * 注销插件\n * \n * @param name - 插件名称\n */\n unuse(name: string): void {\n this.pluginManager.unregister(name);\n }\n\n /**\n * 执行请求\n * \n * @template TResponse - 响应数据类型\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n async request<TResponse = unknown>(options: RequestOptions<TResponse>): Promise<Response<TResponse>> {\n // 确保适配器已加载\n if (!this.adapter) {\n await this.loadAdapter();\n }\n\n if (!this.adapter) {\n throw new Error('适配器未初始化');\n }\n\n // 合并配置\n const mergedOptions = this.mergeOptions(options);\n\n // 检查队列状态,如果队列已暂停,将请求放入队列\n const queueManager = getRequestQueueManager();\n if (queueManager.isPaused()) {\n return queueManager.enqueue(mergedOptions, () => this.executeRequest(mergedOptions));\n }\n\n // 正常执行请求\n return this.executeRequest(mergedOptions);\n }\n\n /**\n * 执行实际的请求逻辑\n * \n * @template TResponse - 响应数据类型\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n private async executeRequest<TResponse = unknown>(options: RequestOptions<TResponse>): Promise<Response<TResponse>> {\n // 创建请求上下文\n const context = createRequestContext<RequestOptions<TResponse>, Response<TResponse>, Record<string, unknown>>(\n options,\n {}\n );\n\n try {\n // 执行请求前钩子\n const beforeResult = await this.pluginManager.executeHook(\n PluginLifecycleStage.BEFORE_REQUEST,\n context\n );\n\n // 如果插件返回了修改后的请求配置,使用它\n if (beforeResult && typeof beforeResult === 'object' && 'url' in beforeResult) {\n context.request = beforeResult as RequestOptions<TResponse>;\n }\n\n // 检查是否已取消(可能是缓存命中)\n if (context.cancelled) {\n // 如果有缓存的响应,直接返回\n if (context.response) {\n return context.response;\n }\n throw this.createError(\n '请求已取消',\n RequestErrorType.ABORT_ERROR,\n RequestErrorCode.REQUEST_ABORTED,\n { request: context.request }\n );\n }\n\n // 执行请求\n let response: Response<TResponse>;\n try {\n if (!this.adapter) {\n throw new Error('适配器未初始化');\n }\n response = await this.adapter.request<TResponse>(context.request);\n } catch (error) {\n // 适配器错误转换为框架错误\n throw this.normalizeError(error, context.request);\n }\n\n // 更新上下文\n completeRequestContext(context, response);\n\n // 执行请求后钩子\n const afterResult = await this.pluginManager.executeHook(\n PluginLifecycleStage.AFTER_REQUEST,\n context\n );\n\n // 如果插件返回了修改后的响应,使用它\n if (afterResult && typeof afterResult === 'object' && 'data' in afterResult) {\n response = afterResult as Response<TResponse>;\n }\n\n return response;\n } catch (error) {\n // 更新上下文\n const requestError = error instanceof RequestError ? error : this.normalizeError(error, context.request);\n failRequestContext(context, requestError);\n\n // 执行错误处理钩子\n const errorHandled = await this.pluginManager.executeHook(\n PluginLifecycleStage.ON_ERROR,\n context\n );\n\n // 如果错误未被处理,继续抛出\n if (errorHandled !== true) {\n throw requestError;\n }\n\n // 如果错误已被处理,返回一个默认响应(由插件决定)\n if (context.response) {\n return context.response as Response<TResponse>;\n }\n\n throw requestError;\n } finally {\n // 执行最终钩子\n await this.pluginManager.executeHook(PluginLifecycleStage.FINALLY, context);\n }\n }\n\n /**\n * GET 请求\n * \n * @template TResponse - 响应数据类型\n * @param url - 请求 URL\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n async get<TResponse = unknown>(\n url: string,\n options?: Omit<RequestOptions<TResponse>, 'url' | 'method'>\n ): Promise<Response<TResponse>> {\n return this.request<TResponse>({\n ...options,\n url,\n method: 'GET',\n });\n }\n\n /**\n * POST 请求\n * \n * @template TResponse - 响应数据类型\n * @param url - 请求 URL\n * @param body - 请求体\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n async post<TResponse = unknown>(\n url: string,\n body?: RequestOptions<TResponse>['body'],\n options?: Omit<RequestOptions<TResponse>, 'url' | 'method' | 'body'>\n ): Promise<Response<TResponse>> {\n return this.request<TResponse>({\n ...options,\n url,\n method: 'POST',\n body,\n });\n }\n\n /**\n * PUT 请求\n * \n * @template TResponse - 响应数据类型\n * @param url - 请求 URL\n * @param body - 请求体\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n async put<TResponse = unknown>(\n url: string,\n body?: RequestOptions<TResponse>['body'],\n options?: Omit<RequestOptions<TResponse>, 'url' | 'method' | 'body'>\n ): Promise<Response<TResponse>> {\n return this.request<TResponse>({\n ...options,\n url,\n method: 'PUT',\n body,\n });\n }\n\n /**\n * PATCH 请求\n * \n * @template TResponse - 响应数据类型\n * @param url - 请求 URL\n * @param body - 请求体\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n async patch<TResponse = unknown>(\n url: string,\n body?: RequestOptions<TResponse>['body'],\n options?: Omit<RequestOptions<TResponse>, 'url' | 'method' | 'body'>\n ): Promise<Response<TResponse>> {\n return this.request<TResponse>({\n ...options,\n url,\n method: 'PATCH',\n body,\n });\n }\n\n /**\n * DELETE 请求\n * \n * @template TResponse - 响应数据类型\n * @param url - 请求 URL\n * @param options - 请求配置选项\n * @returns Promise 解析为响应对象\n */\n async delete<TResponse = unknown>(\n url: string,\n options?: Omit<RequestOptions<TResponse>, 'url' | 'method'>\n ): Promise<Response<TResponse>> {\n return this.request<TResponse>({\n ...options,\n url,\n method: 'DELETE',\n });\n }\n\n /**\n * 合并请求配置\n * \n * @param options - 请求配置选项\n * @returns 合并后的配置\n */\n private mergeOptions<TResponse>(options: RequestOptions<TResponse>): RequestOptions<TResponse> {\n const baseURL = this.config.baseURL || '';\n const url = baseURL ? `${baseURL}${options.url}` : options.url;\n\n return {\n ...options,\n url,\n headers: {\n ...this.config.defaultHeaders,\n ...options.headers,\n },\n timeout: options.timeout ?? this.config.defaultTimeout,\n };\n }\n\n /**\n * 创建请求错误\n */\n private createError(\n message: string,\n type: RequestErrorType,\n code: RequestErrorCode,\n options?: {\n status?: number;\n cause?: unknown;\n request?: RequestOptions;\n response?: Response;\n context?: Record<string, unknown>;\n }\n ): RequestError {\n return new RequestError(message, type, code, options);\n }\n\n /**\n * 标准化错误\n */\n private normalizeError(error: unknown, request?: RequestOptions): RequestError {\n if (error instanceof RequestError) {\n return error;\n }\n\n // 处理 AbortError\n if (error instanceof Error && error.name === 'AbortError') {\n return this.createError(\n '请求已取消',\n RequestErrorType.ABORT_ERROR,\n RequestErrorCode.REQUEST_ABORTED,\n { cause: error, request }\n );\n }\n\n // 处理超时错误\n if (error instanceof Error && (error.message.includes('timeout') || error.message.includes('Timeout'))) {\n return this.createError(\n '请求超时',\n RequestErrorType.TIMEOUT_ERROR,\n RequestErrorCode.REQUEST_TIMEOUT,\n { cause: error, request }\n );\n }\n\n // 处理网络错误\n if (error instanceof Error && (error.message.includes('network') || error.message.includes('Network'))) {\n return this.createError(\n '网络连接失败',\n RequestErrorType.NETWORK_ERROR,\n RequestErrorCode.NETWORK_CONNECTION_FAILED,\n { cause: error, request }\n );\n }\n\n // 处理 HTTP 错误(需要适配器提供)\n if (error && typeof error === 'object' && 'status' in error) {\n const status = (error as { status: number }).status;\n const isServerError = status >= 500;\n return this.createError(\n `HTTP ${status} 错误`,\n RequestErrorType.HTTP_ERROR,\n isServerError ? RequestErrorCode.SERVER_ERROR : RequestErrorCode.CLIENT_ERROR,\n { status, cause: error, request }\n );\n }\n\n // 未知错误\n return this.createError(\n error instanceof Error ? error.message : '未知错误',\n RequestErrorType.UNKNOWN_ERROR,\n RequestErrorCode.NETWORK_CONNECTION_FAILED,\n { cause: error, request }\n );\n }\n\n /**\n * 销毁客户端\n */\n async destroy(): Promise<void> {\n if (this.adapter?.destroy) {\n await this.adapter.destroy();\n }\n this.pluginManager.clear();\n this.adapter = null;\n this.adapterName = null;\n }\n}\n"],"names":["RequestError","RequestErrorType","RequestErrorCode","adapterRegistry","PluginManager","PluginLifecycleStage","createRequestContext","completeRequestContext","failRequestContext","getRequestQueueManager","ADAPTER_ENVIRONMENT_MAP","fetch","ky","undici","detectEnvironment","isBrowser","window","isNode","process","versions","node","getRecommendedAdapters","currentEnv","createEnvironmentMismatchError","adapterName","adapterEnv","recommendedAdapters","recommendedList","length","map","name","join","adapterEnvName","currentEnvName","firstRecommended","firstRecommendedFactory","message","validateAdapterEnvironment","errorMessage","Error","RequestClient","getAdapterName","initialize","loadAdapter","context","url","pluginManager","executeHook","INIT","adapter","adapterConfig","config","defaultAdapter","get","detectedAdapter","detectAdapter","kyAdapter","fetchAdapter","axiosAdapter","undiciAdapter","setAdapter","use","plugin","register","unuse","unregister","request","options","mergedOptions","mergeOptions","queueManager","isPaused","enqueue","executeRequest","beforeResult","BEFORE_REQUEST","cancelled","response","createError","ABORT_ERROR","REQUEST_ABORTED","error","normalizeError","afterResult","AFTER_REQUEST","requestError","errorHandled","ON_ERROR","FINALLY","method","post","body","put","patch","delete","baseURL","headers","defaultHeaders","timeout","defaultTimeout","type","code","cause","includes","TIMEOUT_ERROR","REQUEST_TIMEOUT","NETWORK_ERROR","NETWORK_CONNECTION_FAILED","status","isServerError","HTTP_ERROR","SERVER_ERROR","CLIENT_ERROR","UNKNOWN_ERROR","destroy","clear","plugins"],"mappings":"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"}
@@ -56,6 +56,9 @@ _export(exports, {
56
56
  get createMonitoringPlugin () {
57
57
  return _plugin.createMonitoringPlugin;
58
58
  },
59
+ get createQueuePlugin () {
60
+ return _plugin.createQueuePlugin;
61
+ },
59
62
  get createRequestClient () {
60
63
  return createRequestClient;
61
64
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/request/index.ts"],"sourcesContent":["/**\n * 请求库主入口\n * \n * 提供企业级、可扩展、类型安全的 HTTP 请求能力\n */\n\n// 导出核心类型\nexport type {\n RequestOptions,\n Response,\n RequestContext,\n RequestHeaders,\n RequestQuery,\n RequestBody,\n HttpMethod,\n RetryConfig,\n CacheConfig,\n ValidationConfig,\n AdapterCapabilities,\n} from './types';\n\nexport {\n RequestError,\n RequestErrorType,\n RequestErrorCode,\n} from './types';\n\n// 导出请求客户端\nexport { RequestClient } from './core/RequestClient';\nexport type { RequestClientConfig } from './types';\n\n// 导出适配器\nexport type { RequestAdapter, AdapterFactory } from './adapter/RequestAdapter';\nexport { adapterRegistry } from './adapter/RequestAdapter';\nexport { fetchAdapter, kyAdapter, axiosAdapter } from './adapter';\n\n// undiciAdapter 使用懒加载,避免在未使用时触发依赖检查\nexport async function undiciAdapter() {\n const { undiciAdapter: adapter } = await import('./adapter');\n return adapter();\n}\n\n// 导出插件系统\nexport type { RequestPlugin } from './plugin/RequestPlugin';\nexport { PluginManager, PluginLifecycleStage, PluginPriority } from './plugin/RequestPlugin';\n\n// 导出企业级插件\nexport {\n createCachePlugin,\n createRetryPlugin,\n createValidationPlugin,\n createMonitoringPlugin,\n} from './plugin';\n\nexport type {\n CachePluginConfig,\n RetryPluginConfig,\n ValidationPluginConfig,\n MonitoringPluginConfig,\n MonitoringEvent,\n MonitoringReporter,\n} from './plugin';\n\nexport { MonitoringEventType } from './plugin';\n\n// 导出运行时工具\nexport {\n createRequestContext,\n updateRequestContext,\n completeRequestContext,\n failRequestContext,\n cancelRequestContext,\n} from './runtime/RequestContext';\n\n/**\n * 创建请求客户端实例\n * \n * @param config - 请求客户端配置\n * @returns 请求客户端实例\n * \n * @example\n * ```typescript\n * import { createRequestClient } from '@vlian/framework/request';\n * \n * const client = createRequestClient({\n * baseURL: 'https://api.example.com',\n * defaultTimeout: 5000,\n * plugins: [\n * createCachePlugin(),\n * createRetryPlugin(),\n * ],\n * });\n * \n * const response = await client.get<User>('/user/1');\n * ```\n */\nexport async function createRequestClient(config?: import('./types').RequestClientConfig) {\n const { RequestClient } = await import('./core/RequestClient');\n const client = new RequestClient(config);\n await client.initialize();\n return client;\n}\n"],"names":["MonitoringEventType","PluginLifecycleStage","PluginManager","PluginPriority","RequestClient","RequestError","RequestErrorCode","RequestErrorType","adapterRegistry","axiosAdapter","cancelRequestContext","completeRequestContext","createCachePlugin","createMonitoringPlugin","createRequestClient","createRequestContext","createRetryPlugin","createValidationPlugin","failRequestContext","fetchAdapter","kyAdapter","undiciAdapter","updateRequestContext","adapter","config","client","initialize"],"mappings":"AAAA;;;;CAIC,GAED,SAAS;;;;;;;;;;;;QAyDAA;eAAAA,2BAAmB;;QAnBJC;eAAAA,mCAAoB;;QAAnCC;eAAAA,4BAAa;;QAAwBC;eAAAA,6BAAc;;QAhBnDC;eAAAA,4BAAa;;QANpBC;eAAAA,mBAAY;;QAEZC;eAAAA,uBAAgB;;QADhBC;eAAAA,uBAAgB;;QAUTC;eAAAA,+BAAe;;QACUC;eAAAA,qBAAY;;QAqC5CC;eAAAA,oCAAoB;;QAFpBC;eAAAA,sCAAsB;;QArBtBC;eAAAA,yBAAiB;;QAGjBC;eAAAA,8BAAsB;;QA6CFC;eAAAA;;QA7BpBC;eAAAA,oCAAoB;;QAlBpBC;eAAAA,yBAAiB;;QACjBC;eAAAA,8BAAsB;;QAoBtBC;eAAAA,kCAAkB;;QApCXC;eAAAA,qBAAY;;QAAEC;eAAAA,kBAAS;;QAGVC;eAAAA;;QA+BpBC;eAAAA,oCAAoB;;;uBA3Cf;+BAGuB;gCAKE;yBACsB;+BAUc;wBAQ7D;gCAoBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAnCA,eAAeD;IACpB,MAAM,EAAEA,eAAeE,OAAO,EAAE,GAAG,MAAM,mEAAA,QAAO;IAChD,OAAOA;AACT;AAwDO,eAAeT,oBAAoBU,MAA8C;IACtF,MAAM,EAAEpB,aAAa,EAAE,GAAG,MAAM,mEAAA,QAAO;IACvC,MAAMqB,SAAS,IAAIrB,cAAcoB;IACjC,MAAMC,OAAOC,UAAU;IACvB,OAAOD;AACT"}
1
+ {"version":3,"sources":["../../src/request/index.ts"],"sourcesContent":["/**\n * 请求库主入口\n * \n * 提供企业级、可扩展、类型安全的 HTTP 请求能力\n */\n\n// 导出核心类型\nexport type {\n RequestOptions,\n Response,\n RequestContext,\n RequestHeaders,\n RequestQuery,\n RequestBody,\n HttpMethod,\n RetryConfig,\n CacheConfig,\n ValidationConfig,\n AdapterCapabilities,\n} from './types';\n\nexport {\n RequestError,\n RequestErrorType,\n RequestErrorCode,\n} from './types';\n\n// 导出请求客户端\nexport { RequestClient } from './core/RequestClient';\nexport type { RequestClientConfig } from './types';\n\n// 导出适配器\nexport type { RequestAdapter, AdapterFactory } from './adapter/RequestAdapter';\nexport { adapterRegistry } from './adapter/RequestAdapter';\nexport { fetchAdapter, kyAdapter, axiosAdapter } from './adapter';\n\n// undiciAdapter 使用懒加载,避免在未使用时触发依赖检查\nexport async function undiciAdapter() {\n const { undiciAdapter: adapter } = await import('./adapter');\n return adapter();\n}\n\n// 导出插件系统\nexport type { RequestPlugin } from './plugin/RequestPlugin';\nexport { PluginManager, PluginLifecycleStage, PluginPriority } from './plugin/RequestPlugin';\n\n// 导出企业级插件\nexport {\n createCachePlugin,\n createRetryPlugin,\n createValidationPlugin,\n createMonitoringPlugin,\n createQueuePlugin,\n} from './plugin';\n\nexport type {\n CachePluginConfig,\n RetryPluginConfig,\n ValidationPluginConfig,\n MonitoringPluginConfig,\n MonitoringEvent,\n MonitoringReporter,\n QueuePluginConfig,\n QueueTriggerCondition,\n} from './plugin';\n\nexport { MonitoringEventType } from './plugin';\n\n// 导出运行时工具\nexport {\n createRequestContext,\n updateRequestContext,\n completeRequestContext,\n failRequestContext,\n cancelRequestContext,\n} from './runtime/RequestContext';\n\n/**\n * 创建请求客户端实例\n * \n * @param config - 请求客户端配置\n * @returns 请求客户端实例\n * \n * @example\n * ```typescript\n * import { createRequestClient } from '@vlian/framework/request';\n * \n * const client = createRequestClient({\n * baseURL: 'https://api.example.com',\n * defaultTimeout: 5000,\n * plugins: [\n * createCachePlugin(),\n * createRetryPlugin(),\n * ],\n * });\n * \n * const response = await client.get<User>('/user/1');\n * ```\n */\nexport async function createRequestClient(config?: import('./types').RequestClientConfig) {\n const { RequestClient } = await import('./core/RequestClient');\n const client = new RequestClient(config);\n await client.initialize();\n return client;\n}\n"],"names":["MonitoringEventType","PluginLifecycleStage","PluginManager","PluginPriority","RequestClient","RequestError","RequestErrorCode","RequestErrorType","adapterRegistry","axiosAdapter","cancelRequestContext","completeRequestContext","createCachePlugin","createMonitoringPlugin","createQueuePlugin","createRequestClient","createRequestContext","createRetryPlugin","createValidationPlugin","failRequestContext","fetchAdapter","kyAdapter","undiciAdapter","updateRequestContext","adapter","config","client","initialize"],"mappings":"AAAA;;;;CAIC,GAED,SAAS;;;;;;;;;;;;QA4DAA;eAAAA,2BAAmB;;QAtBJC;eAAAA,mCAAoB;;QAAnCC;eAAAA,4BAAa;;QAAwBC;eAAAA,6BAAc;;QAhBnDC;eAAAA,4BAAa;;QANpBC;eAAAA,mBAAY;;QAEZC;eAAAA,uBAAgB;;QADhBC;eAAAA,uBAAgB;;QAUTC;eAAAA,+BAAe;;QACUC;eAAAA,qBAAY;;QAwC5CC;eAAAA,oCAAoB;;QAFpBC;eAAAA,sCAAsB;;QAxBtBC;eAAAA,yBAAiB;;QAGjBC;eAAAA,8BAAsB;;QACtBC;eAAAA,yBAAiB;;QA+CGC;eAAAA;;QA7BpBC;eAAAA,oCAAoB;;QArBpBC;eAAAA,yBAAiB;;QACjBC;eAAAA,8BAAsB;;QAuBtBC;eAAAA,kCAAkB;;QAvCXC;eAAAA,qBAAY;;QAAEC;eAAAA,kBAAS;;QAGVC;eAAAA;;QAkCpBC;eAAAA,oCAAoB;;;uBA9Cf;+BAGuB;gCAKE;yBACsB;+BAUc;wBAS7D;gCAsBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAtCA,eAAeD;IACpB,MAAM,EAAEA,eAAeE,OAAO,EAAE,GAAG,MAAM,mEAAA,QAAO;IAChD,OAAOA;AACT;AA2DO,eAAeT,oBAAoBU,MAA8C;IACtF,MAAM,EAAErB,aAAa,EAAE,GAAG,MAAM,mEAAA,QAAO;IACvC,MAAMsB,SAAS,IAAItB,cAAcqB;IACjC,MAAMC,OAAOC,UAAU;IACvB,OAAOD;AACT"}
@@ -13,8 +13,8 @@ export { fetchAdapter, kyAdapter, axiosAdapter } from './adapter';
13
13
  export declare function undiciAdapter(): Promise<import("./adapter").RequestAdapter>;
14
14
  export type { RequestPlugin } from './plugin/RequestPlugin';
15
15
  export { PluginManager, PluginLifecycleStage, PluginPriority } from './plugin/RequestPlugin';
16
- export { createCachePlugin, createRetryPlugin, createValidationPlugin, createMonitoringPlugin, } from './plugin';
17
- export type { CachePluginConfig, RetryPluginConfig, ValidationPluginConfig, MonitoringPluginConfig, MonitoringEvent, MonitoringReporter, } from './plugin';
16
+ export { createCachePlugin, createRetryPlugin, createValidationPlugin, createMonitoringPlugin, createQueuePlugin, } from './plugin';
17
+ export type { CachePluginConfig, RetryPluginConfig, ValidationPluginConfig, MonitoringPluginConfig, MonitoringEvent, MonitoringReporter, QueuePluginConfig, QueueTriggerCondition, } from './plugin';
18
18
  export { MonitoringEventType } from './plugin';
19
19
  export { createRequestContext, updateRequestContext, completeRequestContext, failRequestContext, cancelRequestContext, } from './runtime/RequestContext';
20
20
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/request/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,cAAc,EACd,QAAQ,EACR,cAAc,EACd,cAAc,EACd,YAAY,EACZ,WAAW,EACX,UAAU,EACV,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAGnD,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGlE,wBAAsB,aAAa,gDAGlC;AAGD,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG7F,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,UAAU,CAAC;AAElB,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,EACf,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAG/C,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAElC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,CAAC,EAAE,OAAO,SAAS,EAAE,mBAAmB,sCAKvF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/request/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,cAAc,EACd,QAAQ,EACR,cAAc,EACd,cAAc,EACd,YAAY,EACZ,WAAW,EACX,UAAU,EACV,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAGnD,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGlE,wBAAsB,aAAa,gDAGlC;AAGD,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG7F,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAElB,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAG/C,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAElC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,CAAC,EAAE,OAAO,SAAS,EAAE,mBAAmB,sCAKvF"}
@@ -15,7 +15,7 @@ export async function undiciAdapter() {
15
15
  }
16
16
  export { PluginManager, PluginLifecycleStage, PluginPriority } from "./plugin/RequestPlugin";
17
17
  // 导出企业级插件
18
- export { createCachePlugin, createRetryPlugin, createValidationPlugin, createMonitoringPlugin } from "./plugin";
18
+ export { createCachePlugin, createRetryPlugin, createValidationPlugin, createMonitoringPlugin, createQueuePlugin } from "./plugin";
19
19
  export { MonitoringEventType } from "./plugin";
20
20
  // 导出运行时工具
21
21
  export { createRequestContext, updateRequestContext, completeRequestContext, failRequestContext, cancelRequestContext } from "./runtime/RequestContext";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/request/index.ts"],"sourcesContent":["/**\n * 请求库主入口\n * \n * 提供企业级、可扩展、类型安全的 HTTP 请求能力\n */\n\n// 导出核心类型\nexport type {\n RequestOptions,\n Response,\n RequestContext,\n RequestHeaders,\n RequestQuery,\n RequestBody,\n HttpMethod,\n RetryConfig,\n CacheConfig,\n ValidationConfig,\n AdapterCapabilities,\n} from './types';\n\nexport {\n RequestError,\n RequestErrorType,\n RequestErrorCode,\n} from './types';\n\n// 导出请求客户端\nexport { RequestClient } from './core/RequestClient';\nexport type { RequestClientConfig } from './types';\n\n// 导出适配器\nexport type { RequestAdapter, AdapterFactory } from './adapter/RequestAdapter';\nexport { adapterRegistry } from './adapter/RequestAdapter';\nexport { fetchAdapter, kyAdapter, axiosAdapter } from './adapter';\n\n// undiciAdapter 使用懒加载,避免在未使用时触发依赖检查\nexport async function undiciAdapter() {\n const { undiciAdapter: adapter } = await import('./adapter');\n return adapter();\n}\n\n// 导出插件系统\nexport type { RequestPlugin } from './plugin/RequestPlugin';\nexport { PluginManager, PluginLifecycleStage, PluginPriority } from './plugin/RequestPlugin';\n\n// 导出企业级插件\nexport {\n createCachePlugin,\n createRetryPlugin,\n createValidationPlugin,\n createMonitoringPlugin,\n} from './plugin';\n\nexport type {\n CachePluginConfig,\n RetryPluginConfig,\n ValidationPluginConfig,\n MonitoringPluginConfig,\n MonitoringEvent,\n MonitoringReporter,\n} from './plugin';\n\nexport { MonitoringEventType } from './plugin';\n\n// 导出运行时工具\nexport {\n createRequestContext,\n updateRequestContext,\n completeRequestContext,\n failRequestContext,\n cancelRequestContext,\n} from './runtime/RequestContext';\n\n/**\n * 创建请求客户端实例\n * \n * @param config - 请求客户端配置\n * @returns 请求客户端实例\n * \n * @example\n * ```typescript\n * import { createRequestClient } from '@vlian/framework/request';\n * \n * const client = createRequestClient({\n * baseURL: 'https://api.example.com',\n * defaultTimeout: 5000,\n * plugins: [\n * createCachePlugin(),\n * createRetryPlugin(),\n * ],\n * });\n * \n * const response = await client.get<User>('/user/1');\n * ```\n */\nexport async function createRequestClient(config?: import('./types').RequestClientConfig) {\n const { RequestClient } = await import('./core/RequestClient');\n const client = new RequestClient(config);\n await client.initialize();\n return client;\n}\n"],"names":["RequestError","RequestErrorType","RequestErrorCode","RequestClient","adapterRegistry","fetchAdapter","kyAdapter","axiosAdapter","undiciAdapter","adapter","PluginManager","PluginLifecycleStage","PluginPriority","createCachePlugin","createRetryPlugin","createValidationPlugin","createMonitoringPlugin","MonitoringEventType","createRequestContext","updateRequestContext","completeRequestContext","failRequestContext","cancelRequestContext","createRequestClient","config","client","initialize"],"mappings":"AAAA;;;;CAIC,GAED,SAAS;AAeT,SACEA,YAAY,EACZC,gBAAgB,EAChBC,gBAAgB,QACX,UAAU;AAEjB,UAAU;AACV,SAASC,aAAa,QAAQ,uBAAuB;AAKrD,SAASC,eAAe,QAAQ,2BAA2B;AAC3D,SAASC,YAAY,EAAEC,SAAS,EAAEC,YAAY,QAAQ,YAAY;AAElE,oCAAoC;AACpC,OAAO,eAAeC;IACpB,MAAM,EAAEA,eAAeC,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC;IAChD,OAAOA;AACT;AAIA,SAASC,aAAa,EAAEC,oBAAoB,EAAEC,cAAc,QAAQ,yBAAyB;AAE7F,UAAU;AACV,SACEC,iBAAiB,EACjBC,iBAAiB,EACjBC,sBAAsB,EACtBC,sBAAsB,QACjB,WAAW;AAWlB,SAASC,mBAAmB,QAAQ,WAAW;AAE/C,UAAU;AACV,SACEC,oBAAoB,EACpBC,oBAAoB,EACpBC,sBAAsB,EACtBC,kBAAkB,EAClBC,oBAAoB,QACf,2BAA2B;AAElC;;;;;;;;;;;;;;;;;;;;;CAqBC,GACD,OAAO,eAAeC,oBAAoBC,MAA8C;IACtF,MAAM,EAAErB,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC;IACvC,MAAMsB,SAAS,IAAItB,cAAcqB;IACjC,MAAMC,OAAOC,UAAU;IACvB,OAAOD;AACT"}
1
+ {"version":3,"sources":["../../src/request/index.ts"],"sourcesContent":["/**\n * 请求库主入口\n * \n * 提供企业级、可扩展、类型安全的 HTTP 请求能力\n */\n\n// 导出核心类型\nexport type {\n RequestOptions,\n Response,\n RequestContext,\n RequestHeaders,\n RequestQuery,\n RequestBody,\n HttpMethod,\n RetryConfig,\n CacheConfig,\n ValidationConfig,\n AdapterCapabilities,\n} from './types';\n\nexport {\n RequestError,\n RequestErrorType,\n RequestErrorCode,\n} from './types';\n\n// 导出请求客户端\nexport { RequestClient } from './core/RequestClient';\nexport type { RequestClientConfig } from './types';\n\n// 导出适配器\nexport type { RequestAdapter, AdapterFactory } from './adapter/RequestAdapter';\nexport { adapterRegistry } from './adapter/RequestAdapter';\nexport { fetchAdapter, kyAdapter, axiosAdapter } from './adapter';\n\n// undiciAdapter 使用懒加载,避免在未使用时触发依赖检查\nexport async function undiciAdapter() {\n const { undiciAdapter: adapter } = await import('./adapter');\n return adapter();\n}\n\n// 导出插件系统\nexport type { RequestPlugin } from './plugin/RequestPlugin';\nexport { PluginManager, PluginLifecycleStage, PluginPriority } from './plugin/RequestPlugin';\n\n// 导出企业级插件\nexport {\n createCachePlugin,\n createRetryPlugin,\n createValidationPlugin,\n createMonitoringPlugin,\n createQueuePlugin,\n} from './plugin';\n\nexport type {\n CachePluginConfig,\n RetryPluginConfig,\n ValidationPluginConfig,\n MonitoringPluginConfig,\n MonitoringEvent,\n MonitoringReporter,\n QueuePluginConfig,\n QueueTriggerCondition,\n} from './plugin';\n\nexport { MonitoringEventType } from './plugin';\n\n// 导出运行时工具\nexport {\n createRequestContext,\n updateRequestContext,\n completeRequestContext,\n failRequestContext,\n cancelRequestContext,\n} from './runtime/RequestContext';\n\n/**\n * 创建请求客户端实例\n * \n * @param config - 请求客户端配置\n * @returns 请求客户端实例\n * \n * @example\n * ```typescript\n * import { createRequestClient } from '@vlian/framework/request';\n * \n * const client = createRequestClient({\n * baseURL: 'https://api.example.com',\n * defaultTimeout: 5000,\n * plugins: [\n * createCachePlugin(),\n * createRetryPlugin(),\n * ],\n * });\n * \n * const response = await client.get<User>('/user/1');\n * ```\n */\nexport async function createRequestClient(config?: import('./types').RequestClientConfig) {\n const { RequestClient } = await import('./core/RequestClient');\n const client = new RequestClient(config);\n await client.initialize();\n return client;\n}\n"],"names":["RequestError","RequestErrorType","RequestErrorCode","RequestClient","adapterRegistry","fetchAdapter","kyAdapter","axiosAdapter","undiciAdapter","adapter","PluginManager","PluginLifecycleStage","PluginPriority","createCachePlugin","createRetryPlugin","createValidationPlugin","createMonitoringPlugin","createQueuePlugin","MonitoringEventType","createRequestContext","updateRequestContext","completeRequestContext","failRequestContext","cancelRequestContext","createRequestClient","config","client","initialize"],"mappings":"AAAA;;;;CAIC,GAED,SAAS;AAeT,SACEA,YAAY,EACZC,gBAAgB,EAChBC,gBAAgB,QACX,UAAU;AAEjB,UAAU;AACV,SAASC,aAAa,QAAQ,uBAAuB;AAKrD,SAASC,eAAe,QAAQ,2BAA2B;AAC3D,SAASC,YAAY,EAAEC,SAAS,EAAEC,YAAY,QAAQ,YAAY;AAElE,oCAAoC;AACpC,OAAO,eAAeC;IACpB,MAAM,EAAEA,eAAeC,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC;IAChD,OAAOA;AACT;AAIA,SAASC,aAAa,EAAEC,oBAAoB,EAAEC,cAAc,QAAQ,yBAAyB;AAE7F,UAAU;AACV,SACEC,iBAAiB,EACjBC,iBAAiB,EACjBC,sBAAsB,EACtBC,sBAAsB,EACtBC,iBAAiB,QACZ,WAAW;AAalB,SAASC,mBAAmB,QAAQ,WAAW;AAE/C,UAAU;AACV,SACEC,oBAAoB,EACpBC,oBAAoB,EACpBC,sBAAsB,EACtBC,kBAAkB,EAClBC,oBAAoB,QACf,2BAA2B;AAElC;;;;;;;;;;;;;;;;;;;;;CAqBC,GACD,OAAO,eAAeC,oBAAoBC,MAA8C;IACtF,MAAM,EAAEtB,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC;IACvC,MAAMuB,SAAS,IAAIvB,cAAcsB;IACjC,MAAMC,OAAOC,UAAU;IACvB,OAAOD;AACT"}
@@ -32,6 +32,9 @@ _export(exports, {
32
32
  get createMonitoringPlugin () {
33
33
  return _monitoring.createMonitoringPlugin;
34
34
  },
35
+ get createQueuePlugin () {
36
+ return _queue.createQueuePlugin;
37
+ },
35
38
  get createRetryPlugin () {
36
39
  return _retry.createRetryPlugin;
37
40
  },
@@ -45,5 +48,6 @@ const _retry = require("./retry");
45
48
  const _validation = require("./validation");
46
49
  const _monitoring = require("./monitoring");
47
50
  const _csrfPlugin = require("./csrfPlugin");
51
+ const _queue = require("./queue");
48
52
 
49
53
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/request/plugin/index.ts"],"sourcesContent":["/**\n * 插件模块导出\n */\n\nexport type { RequestPlugin } from './RequestPlugin';\nexport { PluginManager, PluginLifecycleStage, PluginPriority } from './RequestPlugin';\n\n// 导出企业级插件\nexport { createCachePlugin, type CachePluginConfig } from './cache';\nexport { createRetryPlugin, type RetryPluginConfig } from './retry';\nexport { createValidationPlugin, type ValidationPluginConfig } from './validation';\nexport {\n createMonitoringPlugin,\n type MonitoringPluginConfig,\n type MonitoringEvent,\n type MonitoringReporter,\n MonitoringEventType,\n} from './monitoring';\nexport { createCSRFPlugin } from './csrfPlugin';"],"names":["MonitoringEventType","PluginLifecycleStage","PluginManager","PluginPriority","createCSRFPlugin","createCachePlugin","createMonitoringPlugin","createRetryPlugin","createValidationPlugin"],"mappings":"AAAA;;CAEC;;;;;;;;;;;QAcCA;eAAAA,+BAAmB;;QAXGC;eAAAA,mCAAoB;;QAAnCC;eAAAA,4BAAa;;QAAwBC;eAAAA,6BAAc;;QAanDC;eAAAA,4BAAgB;;QAVhBC;eAAAA,wBAAiB;;QAIxBC;eAAAA,kCAAsB;;QAHfC;eAAAA,wBAAiB;;QACjBC;eAAAA,kCAAsB;;;+BALqC;uBAGV;uBACA;4BACU;4BAO7D;4BAC0B"}
1
+ {"version":3,"sources":["../../../src/request/plugin/index.ts"],"sourcesContent":["/**\n * 插件模块导出\n */\n\nexport type { RequestPlugin } from './RequestPlugin';\nexport { PluginManager, PluginLifecycleStage, PluginPriority } from './RequestPlugin';\n\n// 导出企业级插件\nexport { createCachePlugin, type CachePluginConfig } from './cache';\nexport { createRetryPlugin, type RetryPluginConfig } from './retry';\nexport { createValidationPlugin, type ValidationPluginConfig } from './validation';\nexport {\n createMonitoringPlugin,\n type MonitoringPluginConfig,\n type MonitoringEvent,\n type MonitoringReporter,\n MonitoringEventType,\n} from './monitoring';\nexport { createCSRFPlugin } from './csrfPlugin';\nexport {\n createQueuePlugin,\n type QueuePluginConfig,\n type QueueTriggerCondition,\n} from './queue';"],"names":["MonitoringEventType","PluginLifecycleStage","PluginManager","PluginPriority","createCSRFPlugin","createCachePlugin","createMonitoringPlugin","createQueuePlugin","createRetryPlugin","createValidationPlugin"],"mappings":"AAAA;;CAEC;;;;;;;;;;;QAcCA;eAAAA,+BAAmB;;QAXGC;eAAAA,mCAAoB;;QAAnCC;eAAAA,4BAAa;;QAAwBC;eAAAA,6BAAc;;QAanDC;eAAAA,4BAAgB;;QAVhBC;eAAAA,wBAAiB;;QAIxBC;eAAAA,kCAAsB;;QAQtBC;eAAAA,wBAAiB;;QAXVC;eAAAA,wBAAiB;;QACjBC;eAAAA,kCAAsB;;;+BALqC;uBAGV;uBACA;4BACU;4BAO7D;4BAC0B;uBAK1B"}
@@ -8,4 +8,5 @@ export { createRetryPlugin, type RetryPluginConfig } from './retry';
8
8
  export { createValidationPlugin, type ValidationPluginConfig } from './validation';
9
9
  export { createMonitoringPlugin, type MonitoringPluginConfig, type MonitoringEvent, type MonitoringReporter, MonitoringEventType, } from './monitoring';
10
10
  export { createCSRFPlugin } from './csrfPlugin';
11
+ export { createQueuePlugin, type QueuePluginConfig, type QueueTriggerCondition, } from './queue';
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/request/plugin/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtF,OAAO,EAAE,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,KAAK,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,EACL,sBAAsB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/request/plugin/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtF,OAAO,EAAE,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,KAAK,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,EACL,sBAAsB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,iBAAiB,EACjB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,GAC3B,MAAM,SAAS,CAAC"}
@@ -7,5 +7,6 @@ export { createRetryPlugin } from "./retry";
7
7
  export { createValidationPlugin } from "./validation";
8
8
  export { createMonitoringPlugin, MonitoringEventType } from "./monitoring";
9
9
  export { createCSRFPlugin } from "./csrfPlugin";
10
+ export { createQueuePlugin } from "./queue";
10
11
 
11
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/request/plugin/index.ts"],"sourcesContent":["/**\n * 插件模块导出\n */\n\nexport type { RequestPlugin } from './RequestPlugin';\nexport { PluginManager, PluginLifecycleStage, PluginPriority } from './RequestPlugin';\n\n// 导出企业级插件\nexport { createCachePlugin, type CachePluginConfig } from './cache';\nexport { createRetryPlugin, type RetryPluginConfig } from './retry';\nexport { createValidationPlugin, type ValidationPluginConfig } from './validation';\nexport {\n createMonitoringPlugin,\n type MonitoringPluginConfig,\n type MonitoringEvent,\n type MonitoringReporter,\n MonitoringEventType,\n} from './monitoring';\nexport { createCSRFPlugin } from './csrfPlugin';"],"names":["PluginManager","PluginLifecycleStage","PluginPriority","createCachePlugin","createRetryPlugin","createValidationPlugin","createMonitoringPlugin","MonitoringEventType","createCSRFPlugin"],"mappings":"AAAA;;CAEC,GAGD,SAASA,aAAa,EAAEC,oBAAoB,EAAEC,cAAc,QAAQ,kBAAkB;AAEtF,UAAU;AACV,SAASC,iBAAiB,QAAgC,UAAU;AACpE,SAASC,iBAAiB,QAAgC,UAAU;AACpE,SAASC,sBAAsB,QAAqC,eAAe;AACnF,SACEC,sBAAsB,EAItBC,mBAAmB,QACd,eAAe;AACtB,SAASC,gBAAgB,QAAQ,eAAe"}
1
+ {"version":3,"sources":["../../../src/request/plugin/index.ts"],"sourcesContent":["/**\n * 插件模块导出\n */\n\nexport type { RequestPlugin } from './RequestPlugin';\nexport { PluginManager, PluginLifecycleStage, PluginPriority } from './RequestPlugin';\n\n// 导出企业级插件\nexport { createCachePlugin, type CachePluginConfig } from './cache';\nexport { createRetryPlugin, type RetryPluginConfig } from './retry';\nexport { createValidationPlugin, type ValidationPluginConfig } from './validation';\nexport {\n createMonitoringPlugin,\n type MonitoringPluginConfig,\n type MonitoringEvent,\n type MonitoringReporter,\n MonitoringEventType,\n} from './monitoring';\nexport { createCSRFPlugin } from './csrfPlugin';\nexport {\n createQueuePlugin,\n type QueuePluginConfig,\n type QueueTriggerCondition,\n} from './queue';"],"names":["PluginManager","PluginLifecycleStage","PluginPriority","createCachePlugin","createRetryPlugin","createValidationPlugin","createMonitoringPlugin","MonitoringEventType","createCSRFPlugin","createQueuePlugin"],"mappings":"AAAA;;CAEC,GAGD,SAASA,aAAa,EAAEC,oBAAoB,EAAEC,cAAc,QAAQ,kBAAkB;AAEtF,UAAU;AACV,SAASC,iBAAiB,QAAgC,UAAU;AACpE,SAASC,iBAAiB,QAAgC,UAAU;AACpE,SAASC,sBAAsB,QAAqC,eAAe;AACnF,SACEC,sBAAsB,EAItBC,mBAAmB,QACd,eAAe;AACtB,SAASC,gBAAgB,QAAQ,eAAe;AAChD,SACEC,iBAAiB,QAGZ,UAAU"}