@vlian/framework 1.2.25 → 1.2.38
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.
- package/dist/analytics.umd.js +208 -2395
- package/dist/analytics.umd.js.map +1 -1
- package/dist/core/Test.cjs +2 -2
- package/dist/core/Test.cjs.map +1 -1
- package/dist/core/Test.js +1 -1
- package/dist/core/Test.js.map +1 -1
- package/dist/core/config/ConfigLoader.cjs +7 -7
- package/dist/core/config/ConfigLoader.cjs.map +1 -1
- package/dist/core/config/ConfigLoader.js +1 -1
- package/dist/core/config/ConfigLoader.js.map +1 -1
- package/dist/core/error/ErrorBoundary.cjs +6 -6
- package/dist/core/error/ErrorBoundary.cjs.map +1 -1
- package/dist/core/error/ErrorBoundary.d.ts +1 -1
- package/dist/core/error/ErrorBoundary.js +2 -2
- package/dist/core/error/ErrorBoundary.js.map +1 -1
- package/dist/core/error/ErrorHandler.cjs +19 -19
- package/dist/core/error/ErrorHandler.cjs.map +1 -1
- package/dist/core/error/ErrorHandler.d.ts +2 -2
- package/dist/core/error/ErrorHandler.js +2 -2
- package/dist/core/error/ErrorHandler.js.map +1 -1
- package/dist/core/event/AppEventBus.cjs +5 -5
- package/dist/core/event/AppEventBus.cjs.map +1 -1
- package/dist/core/event/AppEventBus.js +1 -1
- package/dist/core/event/AppEventBus.js.map +1 -1
- package/dist/core/initialization/InitializationErrorThrower.cjs.map +1 -1
- package/dist/core/initialization/InitializationErrorThrower.js.map +1 -1
- package/dist/core/initialization/initialization.cjs +3 -3
- package/dist/core/initialization/initialization.cjs.map +1 -1
- package/dist/core/initialization/initialization.d.ts +1 -1
- package/dist/core/initialization/initialization.js +1 -1
- package/dist/core/initialization/initialization.js.map +1 -1
- package/dist/core/initialization/initializationErrorState.cjs +2 -2
- package/dist/core/initialization/initializationErrorState.cjs.map +1 -1
- package/dist/core/initialization/initializationErrorState.d.ts +1 -1
- package/dist/core/initialization/initializationErrorState.js +1 -1
- package/dist/core/initialization/initializationErrorState.js.map +1 -1
- package/dist/core/kernel/defaultAdapters.cjs +14 -13
- package/dist/core/kernel/defaultAdapters.cjs.map +1 -1
- package/dist/core/kernel/defaultAdapters.js +2 -1
- package/dist/core/kernel/defaultAdapters.js.map +1 -1
- package/dist/core/kernel/types.d.ts +1 -1
- package/dist/core/kernel/types.js.map +1 -1
- package/dist/core/router/RouterManager.cjs +9 -9
- package/dist/core/router/RouterManager.cjs.map +1 -1
- package/dist/core/router/RouterManager.js +1 -1
- package/dist/core/router/RouterManager.js.map +1 -1
- package/dist/core/router/adapter/AdapterManager.cjs +10 -10
- package/dist/core/router/adapter/AdapterManager.cjs.map +1 -1
- package/dist/core/router/adapter/AdapterManager.js +1 -1
- package/dist/core/router/adapter/AdapterManager.js.map +1 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs +4 -4
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs.map +1 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.js +1 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.js.map +1 -1
- package/dist/core/router/dynamic/DynamicRouteManager.cjs +8 -8
- package/dist/core/router/dynamic/DynamicRouteManager.cjs.map +1 -1
- package/dist/core/router/dynamic/DynamicRouteManager.js +1 -1
- package/dist/core/router/dynamic/DynamicRouteManager.js.map +1 -1
- package/dist/core/router/errors/RouterError.cjs +4 -4
- package/dist/core/router/errors/RouterError.cjs.map +1 -1
- package/dist/core/router/errors/RouterError.d.ts +1 -1
- package/dist/core/router/errors/RouterError.js +1 -1
- package/dist/core/router/errors/RouterError.js.map +1 -1
- package/dist/core/router/lifecycle/RouterLifecycleManager.cjs +8 -8
- package/dist/core/router/lifecycle/RouterLifecycleManager.cjs.map +1 -1
- package/dist/core/router/lifecycle/RouterLifecycleManager.js +1 -1
- package/dist/core/router/lifecycle/RouterLifecycleManager.js.map +1 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.cjs +11 -11
- package/dist/core/router/middleware/RouterMiddlewareManager.cjs.map +1 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.js +1 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.js.map +1 -1
- package/dist/core/router/middleware/auth.cjs +4 -4
- package/dist/core/router/middleware/auth.cjs.map +1 -1
- package/dist/core/router/middleware/auth.js +1 -1
- package/dist/core/router/middleware/auth.js.map +1 -1
- package/dist/core/router/monitoring/RouterMonitoring.cjs +2 -2
- package/dist/core/router/monitoring/RouterMonitoring.cjs.map +1 -1
- package/dist/core/router/monitoring/RouterMonitoring.js +2 -2
- package/dist/core/router/monitoring/RouterMonitoring.js.map +1 -1
- package/dist/core/router/navigation/RouterNavigation.cjs +7 -7
- package/dist/core/router/navigation/RouterNavigation.cjs.map +1 -1
- package/dist/core/router/navigation/RouterNavigation.js +1 -1
- package/dist/core/router/navigation/RouterNavigation.js.map +1 -1
- package/dist/core/router/performance/RouteCache.cjs +7 -7
- package/dist/core/router/performance/RouteCache.cjs.map +1 -1
- package/dist/core/router/performance/RouteCache.js +1 -1
- package/dist/core/router/performance/RouteCache.js.map +1 -1
- package/dist/core/router/performance/RoutePreloader.cjs +6 -6
- package/dist/core/router/performance/RoutePreloader.cjs.map +1 -1
- package/dist/core/router/performance/RoutePreloader.js +1 -1
- package/dist/core/router/performance/RoutePreloader.js.map +1 -1
- package/dist/core/router/plugin/RouterPluginManager.cjs +8 -8
- package/dist/core/router/plugin/RouterPluginManager.cjs.map +1 -1
- package/dist/core/router/plugin/RouterPluginManager.js +1 -1
- package/dist/core/router/plugin/RouterPluginManager.js.map +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.cjs +6 -2
- package/dist/core/router/utils/adapters/react-router/transform.cjs.map +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.js +5 -1
- package/dist/core/router/utils/adapters/react-router/transform.js.map +1 -1
- package/dist/core/router/utils/transform.cjs +13 -12
- package/dist/core/router/utils/transform.cjs.map +1 -1
- package/dist/core/router/utils/transform.js +2 -1
- package/dist/core/router/utils/transform.js.map +1 -1
- package/dist/core/router/validation/RouterConfigValidator.cjs +2 -2
- package/dist/core/router/validation/RouterConfigValidator.cjs.map +1 -1
- package/dist/core/router/validation/RouterConfigValidator.js +1 -1
- package/dist/core/router/validation/RouterConfigValidator.js.map +1 -1
- package/dist/core/router/version/RouteVersionManager.cjs +6 -6
- package/dist/core/router/version/RouteVersionManager.cjs.map +1 -1
- package/dist/core/router/version/RouteVersionManager.js +1 -1
- package/dist/core/router/version/RouteVersionManager.js.map +1 -1
- package/dist/core/splash/SplashScreen.cjs +4 -4
- package/dist/core/splash/SplashScreen.cjs.map +1 -1
- package/dist/core/splash/SplashScreen.js +1 -1
- package/dist/core/splash/SplashScreen.js.map +1 -1
- package/dist/core/startup/initializeServices.cjs +15 -15
- package/dist/core/startup/initializeServices.cjs.map +1 -1
- package/dist/core/startup/initializeServices.d.ts +2 -2
- package/dist/core/startup/initializeServices.js +3 -3
- package/dist/core/startup/initializeServices.js.map +1 -1
- package/dist/core/startup/performanceTracker.cjs.map +1 -1
- package/dist/core/startup/performanceTracker.d.ts +1 -1
- package/dist/core/startup/performanceTracker.js.map +1 -1
- package/dist/core/startup/renderApp.cjs +3 -3
- package/dist/core/startup/renderApp.cjs.map +1 -1
- package/dist/core/startup/renderApp.d.ts +1 -1
- package/dist/core/startup/renderApp.js +2 -2
- package/dist/core/startup/renderApp.js.map +1 -1
- package/dist/core/startup/startApp.cjs +24 -24
- package/dist/core/startup/startApp.cjs.map +1 -1
- package/dist/core/startup/startApp.js +5 -5
- package/dist/core/startup/startApp.js.map +1 -1
- package/dist/core/types.d.ts +3 -3
- package/dist/core/types.js.map +1 -1
- package/dist/index.cjs +15 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +2150 -23125
- package/dist/index.umd.js.map +1 -1
- package/dist/kernel/constants.cjs +67 -0
- package/dist/kernel/constants.cjs.map +1 -0
- package/dist/kernel/constants.d.ts +5 -0
- package/dist/kernel/constants.js +43 -0
- package/dist/kernel/constants.js.map +1 -0
- package/dist/kernel/index.cjs +40 -0
- package/dist/kernel/index.cjs.map +1 -0
- package/dist/kernel/index.d.ts +3 -0
- package/dist/kernel/index.js +4 -0
- package/dist/kernel/index.js.map +1 -0
- package/dist/kernel/kernel.cjs +296 -0
- package/dist/kernel/kernel.cjs.map +1 -0
- package/dist/kernel/kernel.d.ts +40 -0
- package/dist/kernel/kernel.js +272 -0
- package/dist/kernel/kernel.js.map +1 -0
- package/dist/kernel/manager/cacheManager.cjs +46 -0
- package/dist/kernel/manager/cacheManager.cjs.map +1 -0
- package/dist/kernel/manager/cacheManager.d.ts +6 -0
- package/dist/kernel/manager/cacheManager.js +36 -0
- package/dist/kernel/manager/cacheManager.js.map +1 -0
- package/dist/kernel/manager/i18nManager.cjs +68 -0
- package/dist/kernel/manager/i18nManager.cjs.map +1 -0
- package/dist/kernel/manager/i18nManager.d.ts +8 -0
- package/dist/kernel/manager/i18nManager.js +58 -0
- package/dist/kernel/manager/i18nManager.js.map +1 -0
- package/dist/kernel/manager/index.cjs +30 -0
- package/dist/kernel/manager/index.cjs.map +1 -0
- package/dist/kernel/manager/index.d.ts +4 -0
- package/dist/kernel/manager/index.js +6 -0
- package/dist/kernel/manager/index.js.map +1 -0
- package/dist/kernel/manager/loggerManager.cjs +70 -0
- package/dist/kernel/manager/loggerManager.cjs.map +1 -0
- package/dist/kernel/manager/loggerManager.d.ts +14 -0
- package/dist/kernel/manager/loggerManager.js +60 -0
- package/dist/kernel/manager/loggerManager.js.map +1 -0
- package/dist/kernel/manager/persistence.cjs +93 -0
- package/dist/kernel/manager/persistence.cjs.map +1 -0
- package/dist/kernel/manager/persistence.d.ts +3 -0
- package/dist/kernel/manager/persistence.js +75 -0
- package/dist/kernel/manager/persistence.js.map +1 -0
- package/dist/kernel/manager/themeManager.cjs +85 -0
- package/dist/kernel/manager/themeManager.cjs.map +1 -0
- package/dist/kernel/manager/themeManager.d.ts +9 -0
- package/dist/kernel/manager/themeManager.js +75 -0
- package/dist/kernel/manager/themeManager.js.map +1 -0
- package/dist/kernel/types.cjs +6 -0
- package/dist/kernel/types.cjs.map +1 -0
- package/dist/kernel/types.d.ts +72 -0
- package/dist/kernel/types.js +3 -0
- package/dist/kernel/types.js.map +1 -0
- package/dist/library/storage/encryption.cjs +12 -13
- package/dist/library/storage/encryption.cjs.map +1 -1
- package/dist/library/storage/encryption.js +1 -2
- package/dist/library/storage/encryption.js.map +1 -1
- package/dist/request/adapter.d.ts +1 -0
- package/dist/request/core.d.ts +1 -0
- package/dist/request/index.d.ts +1 -42
- package/dist/request/plugin/csrfPlugin.d.ts +2 -2
- package/dist/request/plugin/queue.d.ts +2 -2
- package/dist/request/plugin.d.ts +1 -0
- package/dist/request/runtime.d.ts +1 -0
- package/dist/request/types.d.ts +1 -394
- package/dist/request/utils.d.ts +1 -0
- package/dist/state.umd.js +1 -1
- package/dist/utils/csrf.cjs +13 -152
- package/dist/utils/csrf.cjs.map +1 -1
- package/dist/utils/csrf.d.ts +1 -72
- package/dist/utils/csrf.js +1 -142
- package/dist/utils/csrf.js.map +1 -1
- package/dist/utils/errors/ErrorCodes.cjs +6 -76
- package/dist/utils/errors/ErrorCodes.cjs.map +1 -1
- package/dist/utils/errors/ErrorCodes.d.ts +1 -45
- package/dist/utils/errors/ErrorCodes.js +1 -84
- package/dist/utils/errors/ErrorCodes.js.map +1 -1
- package/dist/utils/errors.cjs +53 -326
- package/dist/utils/errors.cjs.map +1 -1
- package/dist/utils/errors.d.ts +19 -172
- package/dist/utils/errors.js +16 -352
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/logger.cjs +5 -374
- package/dist/utils/logger.cjs.map +1 -1
- package/dist/utils/logger.d.ts +2 -189
- package/dist/utils/logger.js +1 -379
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/logger.types.cjs +3 -12
- package/dist/utils/logger.types.cjs.map +1 -1
- package/dist/utils/logger.types.d.ts +2 -57
- package/dist/utils/logger.types.js +1 -10
- package/dist/utils/logger.types.js.map +1 -1
- package/dist/utils/monitoring.cjs +11 -302
- package/dist/utils/monitoring.cjs.map +1 -1
- package/dist/utils/monitoring.d.ts +1 -163
- package/dist/utils/monitoring.js +1 -294
- package/dist/utils/monitoring.js.map +1 -1
- package/dist/utils/performance.cjs +5 -352
- package/dist/utils/performance.cjs.map +1 -1
- package/dist/utils/performance.d.ts +2 -246
- package/dist/utils/performance.js +1 -354
- package/dist/utils/performance.js.map +1 -1
- package/dist/utils/resourceLoader.cjs +5 -303
- package/dist/utils/resourceLoader.cjs.map +1 -1
- package/dist/utils/resourceLoader.d.ts +2 -130
- package/dist/utils/resourceLoader.js +1 -305
- package/dist/utils/resourceLoader.js.map +1 -1
- package/dist/utils/runtimeSecurity.cjs +2 -140
- package/dist/utils/runtimeSecurity.cjs.map +1 -1
- package/dist/utils/runtimeSecurity.d.ts +2 -104
- package/dist/utils/runtimeSecurity.js +1 -141
- package/dist/utils/runtimeSecurity.js.map +1 -1
- package/dist/utils/security.cjs +3 -314
- package/dist/utils/security.cjs.map +1 -1
- package/dist/utils/security.d.ts +2 -80
- package/dist/utils/security.js +1 -311
- package/dist/utils/security.js.map +1 -1
- package/dist/utils/traceId.cjs +10 -111
- package/dist/utils/traceId.cjs.map +1 -1
- package/dist/utils/traceId.d.ts +1 -63
- package/dist/utils/traceId.js +1 -116
- package/dist/utils/traceId.js.map +1 -1
- package/dist/utils/validation.cjs +3 -173
- package/dist/utils/validation.cjs.map +1 -1
- package/dist/utils/validation.d.ts +2 -110
- package/dist/utils/validation.js +1 -175
- package/dist/utils/validation.js.map +1 -1
- package/package.json +15 -24
- package/dist/lazy/index.cjs +0 -104
- package/dist/lazy/index.cjs.map +0 -1
- package/dist/lazy/index.d.ts +0 -19
- package/dist/lazy/index.js +0 -24
- package/dist/lazy/index.js.map +0 -1
- package/dist/request/adapter/RequestAdapter.cjs +0 -78
- package/dist/request/adapter/RequestAdapter.cjs.map +0 -1
- package/dist/request/adapter/axiosAdapter.cjs +0 -164
- package/dist/request/adapter/axiosAdapter.cjs.map +0 -1
- package/dist/request/adapter/fetchAdapter.cjs +0 -134
- package/dist/request/adapter/fetchAdapter.cjs.map +0 -1
- package/dist/request/adapter/index.cjs +0 -80
- package/dist/request/adapter/index.cjs.map +0 -1
- package/dist/request/adapter/kyAdapter.cjs +0 -191
- package/dist/request/adapter/kyAdapter.cjs.map +0 -1
- package/dist/request/adapter/undiciAdapter.cjs +0 -213
- package/dist/request/adapter/undiciAdapter.cjs.map +0 -1
- package/dist/request/core/RequestClient.cjs +0 -558
- package/dist/request/core/RequestClient.cjs.map +0 -1
- package/dist/request/core/index.cjs +0 -15
- package/dist/request/core/index.cjs.map +0 -1
- package/dist/request/index.cjs +0 -149
- package/dist/request/index.cjs.map +0 -1
- package/dist/request/plugin/RequestPlugin.cjs +0 -218
- package/dist/request/plugin/RequestPlugin.cjs.map +0 -1
- package/dist/request/plugin/cache.cjs +0 -269
- package/dist/request/plugin/cache.cjs.map +0 -1
- package/dist/request/plugin/csrfPlugin.cjs +0 -40
- package/dist/request/plugin/csrfPlugin.cjs.map +0 -1
- package/dist/request/plugin/index.cjs +0 -53
- package/dist/request/plugin/index.cjs.map +0 -1
- package/dist/request/plugin/monitoring.cjs +0 -216
- package/dist/request/plugin/monitoring.cjs.map +0 -1
- package/dist/request/plugin/queue.cjs +0 -140
- package/dist/request/plugin/queue.cjs.map +0 -1
- package/dist/request/plugin/retry.cjs +0 -98
- package/dist/request/plugin/retry.cjs.map +0 -1
- package/dist/request/plugin/validation.cjs +0 -121
- package/dist/request/plugin/validation.cjs.map +0 -1
- package/dist/request/runtime/RequestContext.cjs +0 -77
- package/dist/request/runtime/RequestContext.cjs.map +0 -1
- package/dist/request/runtime/index.cjs +0 -32
- package/dist/request/runtime/index.cjs.map +0 -1
- package/dist/request/types.cjs +0 -112
- package/dist/request/types.cjs.map +0 -1
- package/dist/request/utils/RequestQueueManager.cjs +0 -168
- package/dist/request/utils/RequestQueueManager.cjs.map +0 -1
- package/dist/request/utils/dependencyCheck.cjs +0 -237
- package/dist/request/utils/dependencyCheck.cjs.map +0 -1
- package/dist/request/utils/index.cjs +0 -30
- package/dist/request/utils/index.cjs.map +0 -1
- package/dist/request.umd.js +0 -5392
- package/dist/request.umd.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/request/plugin/retry.ts"],"sourcesContent":["/**\n * 重试插件\n * \n * 提供请求重试能力,支持指数退避、条件重试\n */\n\nimport type { RequestPlugin } from './RequestPlugin';\nimport type { RequestContext } from '../types';\nimport { RequestError, RequestErrorType } from '../types';\nimport { PluginPriority } from './RequestPlugin';\n\n/**\n * 重试插件配置\n */\nexport interface RetryPluginConfig {\n /**\n * 默认最大重试次数\n */\n defaultMaxAttempts?: number;\n\n /**\n * 默认重试延迟(毫秒)\n */\n defaultDelay?: number;\n\n /**\n * 是否默认启用指数退避\n */\n defaultExponentialBackoff?: boolean;\n\n /**\n * 是否启用重试\n */\n enabled?: boolean;\n}\n\n/**\n * 计算指数退避延迟\n */\nfunction calculateExponentialBackoffDelay(attempt: number, baseDelay: number): number {\n return baseDelay * Math.pow(2, attempt - 1);\n}\n\n/**\n * 默认重试条件\n */\nfunction defaultShouldRetry(error: unknown, attempt: number, maxAttempts: number): boolean {\n if (attempt >= maxAttempts) {\n return false;\n }\n\n // 如果是请求错误,检查错误类型\n if (error && typeof error === 'object' && 'type' in error) {\n const requestError = error as RequestError;\n\n // 网络错误、超时错误、服务器错误(5xx)可以重试\n if (\n requestError.type === RequestErrorType.NETWORK_ERROR ||\n requestError.type === RequestErrorType.TIMEOUT_ERROR ||\n (requestError.type === RequestErrorType.HTTP_ERROR && requestError.status && requestError.status >= 500)\n ) {\n return true;\n }\n\n // 客户端错误(4xx)不重试,除了 408(请求超时)和 429(请求过多)\n if (requestError.type === RequestErrorType.HTTP_ERROR && requestError.status) {\n return requestError.status === 408 || requestError.status === 429;\n }\n }\n\n // 其他错误不重试\n return false;\n}\n\n/**\n * 创建重试插件\n * \n * @param config - 重试插件配置\n * @returns 重试插件实例\n */\nexport function createRetryPlugin(config: RetryPluginConfig = {}): RequestPlugin {\n const {\n defaultMaxAttempts = 3,\n defaultDelay = 1000,\n defaultExponentialBackoff = true,\n enabled = true,\n } = config;\n\n return {\n name: 'retry',\n priority: PluginPriority.LOWEST, // 最低优先级,最后执行\n\n async onError(context: RequestContext): Promise<boolean | void> {\n if (!enabled || !context.error) {\n return;\n }\n\n const retryConfig = context.request.retry;\n if (!retryConfig) {\n // 如果没有配置重试,使用默认配置\n const maxAttempts = defaultMaxAttempts;\n const delay = defaultDelay;\n const exponentialBackoff = defaultExponentialBackoff;\n\n // 检查是否应该重试\n const shouldRetry = defaultShouldRetry(context.error, context.retryCount, maxAttempts);\n if (!shouldRetry) {\n return false; // 不处理错误,继续传播\n }\n\n // 计算延迟\n const retryDelay = exponentialBackoff\n ? calculateExponentialBackoffDelay(context.retryCount + 1, delay)\n : delay;\n\n // 等待后重试\n await new Promise((resolve) => setTimeout(resolve, retryDelay));\n\n // 增加重试计数\n context.retryCount += 1;\n\n // 返回 false,让错误继续传播,触发重新请求\n return false;\n }\n\n // 使用配置的重试逻辑\n const maxAttempts = retryConfig.maxAttempts || defaultMaxAttempts;\n const shouldRetry = retryConfig.shouldRetry\n ? retryConfig.shouldRetry(context.error, context.retryCount)\n : defaultShouldRetry(context.error, context.retryCount, maxAttempts);\n\n if (!shouldRetry) {\n return false; // 不处理错误,继续传播\n }\n\n // 计算延迟\n let retryDelay: number;\n if (retryConfig.calculateDelay) {\n retryDelay = retryConfig.calculateDelay(context.retryCount + 1);\n } else if (retryConfig.exponentialBackoff !== false) {\n const baseDelay = retryConfig.delay || defaultDelay;\n retryDelay = calculateExponentialBackoffDelay(context.retryCount + 1, baseDelay);\n } else {\n retryDelay = retryConfig.delay || defaultDelay;\n }\n\n // 等待后重试\n await new Promise((resolve) => setTimeout(resolve, retryDelay));\n\n // 增加重试计数\n context.retryCount += 1;\n\n // 返回 false,让错误继续传播,触发重新请求\n return false;\n },\n };\n}\n"],"names":["createRetryPlugin","calculateExponentialBackoffDelay","attempt","baseDelay","Math","pow","defaultShouldRetry","error","maxAttempts","requestError","type","RequestErrorType","NETWORK_ERROR","TIMEOUT_ERROR","HTTP_ERROR","status","config","defaultMaxAttempts","defaultDelay","defaultExponentialBackoff","enabled","name","priority","PluginPriority","LOWEST","onError","context","retryConfig","request","retry","delay","exponentialBackoff","shouldRetry","retryCount","retryDelay","Promise","resolve","setTimeout","calculateDelay"],"mappings":"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"}
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 验证插件
|
|
3
|
-
*
|
|
4
|
-
* 提供请求参数和响应数据验证能力(基于 Zod)
|
|
5
|
-
*/ "use strict";
|
|
6
|
-
Object.defineProperty(exports, "__esModule", {
|
|
7
|
-
value: true
|
|
8
|
-
});
|
|
9
|
-
Object.defineProperty(exports, "createValidationPlugin", {
|
|
10
|
-
enumerable: true,
|
|
11
|
-
get: function() {
|
|
12
|
-
return createValidationPlugin;
|
|
13
|
-
}
|
|
14
|
-
});
|
|
15
|
-
const _types = require("../types");
|
|
16
|
-
const _RequestPlugin = require("./RequestPlugin");
|
|
17
|
-
/**
|
|
18
|
-
* 检查是否为 Zod Schema
|
|
19
|
-
*/ function isZodSchema(schema) {
|
|
20
|
-
return schema !== null && typeof schema === 'object' && 'parse' in schema && 'safeParse' in schema && typeof schema.parse === 'function' && typeof schema.safeParse === 'function';
|
|
21
|
-
}
|
|
22
|
-
function createValidationPlugin(config = {}) {
|
|
23
|
-
const { enabled = true, onValidationError } = config;
|
|
24
|
-
return {
|
|
25
|
-
name: 'validation',
|
|
26
|
-
priority: _RequestPlugin.PluginPriority.HIGH,
|
|
27
|
-
async onBeforeRequest (context) {
|
|
28
|
-
if (!enabled) {
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
const validationConfig = context.request.validation;
|
|
32
|
-
if (!validationConfig) {
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
// 验证请求参数
|
|
36
|
-
const requestSchema = validationConfig.requestSchema;
|
|
37
|
-
if (requestSchema && isZodSchema(requestSchema)) {
|
|
38
|
-
try {
|
|
39
|
-
// 验证查询参数和请求体
|
|
40
|
-
const requestData = {
|
|
41
|
-
query: context.request.query,
|
|
42
|
-
body: context.request.body
|
|
43
|
-
};
|
|
44
|
-
const zodSchema = requestSchema;
|
|
45
|
-
const result = zodSchema.safeParse(requestData);
|
|
46
|
-
if (!result.success) {
|
|
47
|
-
const error = new _types.RequestError('请求参数验证失败', _types.RequestErrorType.VALIDATION_ERROR, _types.RequestErrorCode.REQUEST_VALIDATION_FAILED, {
|
|
48
|
-
request: context.request,
|
|
49
|
-
context: {
|
|
50
|
-
validationErrors: result.error.errors
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
if (validationConfig.onValidationError) {
|
|
54
|
-
validationConfig.onValidationError(error);
|
|
55
|
-
} else if (onValidationError) {
|
|
56
|
-
onValidationError(error);
|
|
57
|
-
}
|
|
58
|
-
throw error;
|
|
59
|
-
}
|
|
60
|
-
// 如果验证通过,可以使用验证后的数据更新请求
|
|
61
|
-
// 这里可以根据需要更新 context.request
|
|
62
|
-
} catch (error) {
|
|
63
|
-
// 如果不是验证错误,重新抛出
|
|
64
|
-
if (error instanceof _types.RequestError && error.type === _types.RequestErrorType.VALIDATION_ERROR) {
|
|
65
|
-
throw error;
|
|
66
|
-
}
|
|
67
|
-
// 其他错误继续抛出
|
|
68
|
-
throw error;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
},
|
|
72
|
-
async onAfterRequest (context) {
|
|
73
|
-
if (!enabled || !context.response) {
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
const validationConfig = context.request.validation;
|
|
77
|
-
if (!validationConfig) {
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
// 验证响应数据
|
|
81
|
-
const responseSchema = validationConfig.responseSchema;
|
|
82
|
-
if (responseSchema && isZodSchema(responseSchema)) {
|
|
83
|
-
try {
|
|
84
|
-
const zodSchema = responseSchema;
|
|
85
|
-
const result = zodSchema.safeParse(context.response.data);
|
|
86
|
-
if (!result.success) {
|
|
87
|
-
const error = new _types.RequestError('响应数据验证失败', _types.RequestErrorType.VALIDATION_ERROR, _types.RequestErrorCode.RESPONSE_VALIDATION_FAILED, {
|
|
88
|
-
request: context.request,
|
|
89
|
-
response: context.response,
|
|
90
|
-
context: {
|
|
91
|
-
validationErrors: result.error.errors
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
if (validationConfig.onValidationError) {
|
|
95
|
-
validationConfig.onValidationError(error);
|
|
96
|
-
} else if (onValidationError) {
|
|
97
|
-
onValidationError(error);
|
|
98
|
-
}
|
|
99
|
-
throw error;
|
|
100
|
-
}
|
|
101
|
-
// 如果验证通过,可以使用验证后的数据更新响应
|
|
102
|
-
if (result.success && result.data !== context.response.data) {
|
|
103
|
-
return {
|
|
104
|
-
...context.response,
|
|
105
|
-
data: result.data
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
} catch (error) {
|
|
109
|
-
// 如果不是验证错误,重新抛出
|
|
110
|
-
if (error instanceof _types.RequestError && error.type === _types.RequestErrorType.VALIDATION_ERROR) {
|
|
111
|
-
throw error;
|
|
112
|
-
}
|
|
113
|
-
// 其他错误继续抛出
|
|
114
|
-
throw error;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
//# sourceMappingURL=validation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/request/plugin/validation.ts"],"sourcesContent":["/**\n * 验证插件\n * \n * 提供请求参数和响应数据验证能力(基于 Zod)\n */\n\nimport type { RequestPlugin } from './RequestPlugin';\nimport type { RequestOptions, Response, RequestContext } from '../types';\nimport { RequestError, RequestErrorType, RequestErrorCode } from '../types';\nimport { PluginPriority } from './RequestPlugin';\n\n/**\n * 验证插件配置\n */\nexport interface ValidationPluginConfig {\n /**\n * 是否启用验证\n */\n enabled?: boolean;\n\n /**\n * 验证失败时的默认处理方式\n */\n onValidationError?: (error: unknown) => void;\n}\n\n/**\n * 检查是否为 Zod Schema\n */\nfunction isZodSchema(schema: unknown): boolean {\n return (\n schema !== null &&\n typeof schema === 'object' &&\n 'parse' in schema &&\n 'safeParse' in schema &&\n typeof (schema as any).parse === 'function' &&\n typeof (schema as any).safeParse === 'function'\n );\n}\n\n/**\n * 创建验证插件\n * \n * @param config - 验证插件配置\n * @returns 验证插件实例\n */\nexport function createValidationPlugin(config: ValidationPluginConfig = {}): RequestPlugin {\n const { enabled = true, onValidationError } = config;\n\n return {\n name: 'validation',\n priority: PluginPriority.HIGH, // 高优先级,在请求前验证\n\n async onBeforeRequest(context: RequestContext): Promise<RequestOptions | void> {\n if (!enabled) {\n return;\n }\n\n const validationConfig = context.request.validation;\n if (!validationConfig) {\n return;\n }\n\n // 验证请求参数\n const requestSchema = validationConfig.requestSchema;\n if (requestSchema && isZodSchema(requestSchema)) {\n try {\n // 验证查询参数和请求体\n const requestData = {\n query: context.request.query,\n body: context.request.body,\n };\n\n const zodSchema = requestSchema as any;\n const result = zodSchema.safeParse(requestData);\n\n if (!result.success) {\n const error = new RequestError(\n '请求参数验证失败',\n RequestErrorType.VALIDATION_ERROR,\n RequestErrorCode.REQUEST_VALIDATION_FAILED,\n {\n request: context.request,\n context: {\n validationErrors: result.error.errors,\n },\n }\n );\n\n if (validationConfig.onValidationError) {\n validationConfig.onValidationError(error);\n } else if (onValidationError) {\n onValidationError(error);\n }\n\n throw error;\n }\n\n // 如果验证通过,可以使用验证后的数据更新请求\n // 这里可以根据需要更新 context.request\n } catch (error) {\n // 如果不是验证错误,重新抛出\n if (error instanceof RequestError && error.type === RequestErrorType.VALIDATION_ERROR) {\n throw error;\n }\n // 其他错误继续抛出\n throw error;\n }\n }\n },\n\n async onAfterRequest(context: RequestContext): Promise<Response | void> {\n if (!enabled || !context.response) {\n return;\n }\n\n const validationConfig = context.request.validation;\n if (!validationConfig) {\n return;\n }\n\n // 验证响应数据\n const responseSchema = validationConfig.responseSchema;\n if (responseSchema && isZodSchema(responseSchema)) {\n try {\n const zodSchema = responseSchema as any;\n const result = zodSchema.safeParse(context.response.data);\n\n if (!result.success) {\n const error = new RequestError(\n '响应数据验证失败',\n RequestErrorType.VALIDATION_ERROR,\n RequestErrorCode.RESPONSE_VALIDATION_FAILED,\n {\n request: context.request,\n response: context.response,\n context: {\n validationErrors: result.error.errors,\n },\n }\n );\n\n if (validationConfig.onValidationError) {\n validationConfig.onValidationError(error);\n } else if (onValidationError) {\n onValidationError(error);\n }\n\n throw error;\n }\n\n // 如果验证通过,可以使用验证后的数据更新响应\n if (result.success && result.data !== context.response.data) {\n return {\n ...context.response,\n data: result.data,\n };\n }\n } catch (error) {\n // 如果不是验证错误,重新抛出\n if (error instanceof RequestError && error.type === RequestErrorType.VALIDATION_ERROR) {\n throw error;\n }\n // 其他错误继续抛出\n throw error;\n }\n }\n },\n };\n}\n"],"names":["createValidationPlugin","isZodSchema","schema","parse","safeParse","config","enabled","onValidationError","name","priority","PluginPriority","HIGH","onBeforeRequest","context","validationConfig","request","validation","requestSchema","requestData","query","body","zodSchema","result","success","error","RequestError","RequestErrorType","VALIDATION_ERROR","RequestErrorCode","REQUEST_VALIDATION_FAILED","validationErrors","errors","type","onAfterRequest","response","responseSchema","data","RESPONSE_VALIDATION_FAILED"],"mappings":"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"}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 请求上下文运行时工具
|
|
3
|
-
*/ "use strict";
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
function _export(target, all) {
|
|
8
|
-
for(var name in all)Object.defineProperty(target, name, {
|
|
9
|
-
enumerable: true,
|
|
10
|
-
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
11
|
-
});
|
|
12
|
-
}
|
|
13
|
-
_export(exports, {
|
|
14
|
-
get cancelRequestContext () {
|
|
15
|
-
return cancelRequestContext;
|
|
16
|
-
},
|
|
17
|
-
get completeRequestContext () {
|
|
18
|
-
return completeRequestContext;
|
|
19
|
-
},
|
|
20
|
-
get createRequestContext () {
|
|
21
|
-
return createRequestContext;
|
|
22
|
-
},
|
|
23
|
-
get failRequestContext () {
|
|
24
|
-
return failRequestContext;
|
|
25
|
-
},
|
|
26
|
-
get updateRequestContext () {
|
|
27
|
-
return updateRequestContext;
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
function createRequestContext(request, meta = {}) {
|
|
31
|
-
const startTime = Date.now();
|
|
32
|
-
const abortController = typeof AbortController !== 'undefined' ? new AbortController() : undefined;
|
|
33
|
-
return {
|
|
34
|
-
request,
|
|
35
|
-
meta: meta,
|
|
36
|
-
startTime,
|
|
37
|
-
retryCount: 0,
|
|
38
|
-
cancelled: false,
|
|
39
|
-
abortController
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
function updateRequestContext(context, updates) {
|
|
43
|
-
return {
|
|
44
|
-
...context,
|
|
45
|
-
...updates,
|
|
46
|
-
meta: {
|
|
47
|
-
...context.meta,
|
|
48
|
-
...updates.meta || {}
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
function completeRequestContext(context, response) {
|
|
53
|
-
const endTime = Date.now();
|
|
54
|
-
return updateRequestContext(context, {
|
|
55
|
-
response: response,
|
|
56
|
-
endTime,
|
|
57
|
-
duration: endTime - context.startTime
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
function failRequestContext(context, error) {
|
|
61
|
-
const endTime = Date.now();
|
|
62
|
-
return updateRequestContext(context, {
|
|
63
|
-
error: error,
|
|
64
|
-
endTime,
|
|
65
|
-
duration: endTime - context.startTime
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
function cancelRequestContext(context) {
|
|
69
|
-
if (context.abortController) {
|
|
70
|
-
context.abortController.abort();
|
|
71
|
-
}
|
|
72
|
-
return updateRequestContext(context, {
|
|
73
|
-
cancelled: true
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
//# sourceMappingURL=RequestContext.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/request/runtime/RequestContext.ts"],"sourcesContent":["/**\n * 请求上下文运行时工具\n */\n\nimport type { RequestOptions, Response, RequestContext as IRequestContext } from '../types';\n\n/**\n * 创建请求上下文\n * \n * @template TRequest - 请求配置类型\n * @template TResponse - 响应类型\n * @template TMeta - 元数据类型\n * @param request - 请求配置\n * @param meta - 初始元数据\n * @returns 请求上下文\n */\nexport function createRequestContext<\n TRequest extends RequestOptions = RequestOptions,\n TResponse extends Response = Response,\n TMeta extends Record<string, unknown> = Record<string, unknown>\n>(\n request: TRequest,\n meta: TMeta = {} as TMeta\n): IRequestContext<TRequest, TResponse, TMeta> {\n const startTime = Date.now();\n const abortController = typeof AbortController !== 'undefined' ? new AbortController() : undefined;\n\n return {\n request,\n meta: meta as TMeta,\n startTime,\n retryCount: 0,\n cancelled: false,\n abortController,\n };\n}\n\n/**\n * 更新请求上下文\n * \n * @template TContext - 请求上下文类型\n * @param context - 请求上下文\n * @param updates - 更新内容\n * @returns 更新后的上下文\n */\nexport function updateRequestContext<TContext extends IRequestContext>(\n context: TContext,\n updates: Partial<TContext>\n): TContext {\n return {\n ...context,\n ...updates,\n meta: {\n ...context.meta,\n ...(updates.meta || {}),\n },\n };\n}\n\n/**\n * 完成请求上下文(设置响应和结束时间)\n * \n * @template TContext - 请求上下文类型\n * @param context - 请求上下文\n * @param response - 响应对象\n * @returns 更新后的上下文\n */\nexport function completeRequestContext<TContext extends IRequestContext>(\n context: TContext,\n response: Response\n): TContext {\n const endTime = Date.now();\n return updateRequestContext(context, {\n response: response as any,\n endTime,\n duration: endTime - context.startTime,\n } as Partial<TContext>);\n}\n\n/**\n * 失败请求上下文(设置错误和结束时间)\n * \n * @template TContext - 请求上下文类型\n * @param context - 请求上下文\n * @param error - 请求错误\n * @returns 更新后的上下文\n */\nexport function failRequestContext<TContext extends IRequestContext>(\n context: TContext,\n error: Error\n): TContext {\n const endTime = Date.now();\n return updateRequestContext(context, {\n error: error as any,\n endTime,\n duration: endTime - context.startTime,\n } as Partial<TContext>);\n}\n\n/**\n * 取消请求上下文\n * \n * @template TContext - 请求上下文类型\n * @param context - 请求上下文\n * @returns 更新后的上下文\n */\nexport function cancelRequestContext<TContext extends IRequestContext>(\n context: TContext\n): TContext {\n if (context.abortController) {\n context.abortController.abort();\n }\n return updateRequestContext(context, {\n cancelled: true,\n } as Partial<TContext>);\n}\n"],"names":["cancelRequestContext","completeRequestContext","createRequestContext","failRequestContext","updateRequestContext","request","meta","startTime","Date","now","abortController","AbortController","undefined","retryCount","cancelled","context","updates","response","endTime","duration","error","abort"],"mappings":"AAAA;;CAEC;;;;;;;;;;;QAwGeA;eAAAA;;QAvCAC;eAAAA;;QAnDAC;eAAAA;;QAuEAC;eAAAA;;QA1CAC;eAAAA;;;AA7BT,SAASF,qBAKdG,OAAiB,EACjBC,OAAc,CAAC,CAAU;IAEzB,MAAMC,YAAYC,KAAKC,GAAG;IAC1B,MAAMC,kBAAkB,OAAOC,oBAAoB,cAAc,IAAIA,oBAAoBC;IAEzF,OAAO;QACLP;QACAC,MAAMA;QACNC;QACAM,YAAY;QACZC,WAAW;QACXJ;IACF;AACF;AAUO,SAASN,qBACdW,OAAiB,EACjBC,OAA0B;IAE1B,OAAO;QACL,GAAGD,OAAO;QACV,GAAGC,OAAO;QACVV,MAAM;YACJ,GAAGS,QAAQT,IAAI;YACf,GAAIU,QAAQV,IAAI,IAAI,CAAC,CAAC;QACxB;IACF;AACF;AAUO,SAASL,uBACdc,OAAiB,EACjBE,QAAkB;IAElB,MAAMC,UAAUV,KAAKC,GAAG;IACxB,OAAOL,qBAAqBW,SAAS;QACnCE,UAAUA;QACVC;QACAC,UAAUD,UAAUH,QAAQR,SAAS;IACvC;AACF;AAUO,SAASJ,mBACdY,OAAiB,EACjBK,KAAY;IAEZ,MAAMF,UAAUV,KAAKC,GAAG;IACxB,OAAOL,qBAAqBW,SAAS;QACnCK,OAAOA;QACPF;QACAC,UAAUD,UAAUH,QAAQR,SAAS;IACvC;AACF;AASO,SAASP,qBACde,OAAiB;IAEjB,IAAIA,QAAQL,eAAe,EAAE;QAC3BK,QAAQL,eAAe,CAACW,KAAK;IAC/B;IACA,OAAOjB,qBAAqBW,SAAS;QACnCD,WAAW;IACb;AACF"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 请求运行时模块导出
|
|
3
|
-
*/ "use strict";
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
function _export(target, all) {
|
|
8
|
-
for(var name in all)Object.defineProperty(target, name, {
|
|
9
|
-
enumerable: true,
|
|
10
|
-
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
11
|
-
});
|
|
12
|
-
}
|
|
13
|
-
_export(exports, {
|
|
14
|
-
get cancelRequestContext () {
|
|
15
|
-
return _RequestContext.cancelRequestContext;
|
|
16
|
-
},
|
|
17
|
-
get completeRequestContext () {
|
|
18
|
-
return _RequestContext.completeRequestContext;
|
|
19
|
-
},
|
|
20
|
-
get createRequestContext () {
|
|
21
|
-
return _RequestContext.createRequestContext;
|
|
22
|
-
},
|
|
23
|
-
get failRequestContext () {
|
|
24
|
-
return _RequestContext.failRequestContext;
|
|
25
|
-
},
|
|
26
|
-
get updateRequestContext () {
|
|
27
|
-
return _RequestContext.updateRequestContext;
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
const _RequestContext = require("./RequestContext");
|
|
31
|
-
|
|
32
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/request/runtime/index.ts"],"sourcesContent":["/**\n * 请求运行时模块导出\n */\n\nexport {\n createRequestContext,\n updateRequestContext,\n completeRequestContext,\n failRequestContext,\n cancelRequestContext,\n} from './RequestContext';\n"],"names":["cancelRequestContext","completeRequestContext","createRequestContext","failRequestContext","updateRequestContext"],"mappings":"AAAA;;CAEC;;;;;;;;;;;QAOCA;eAAAA,oCAAoB;;QAFpBC;eAAAA,sCAAsB;;QAFtBC;eAAAA,oCAAoB;;QAGpBC;eAAAA,kCAAkB;;QAFlBC;eAAAA,oCAAoB;;;gCAIf"}
|
package/dist/request/types.cjs
DELETED
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 请求库核心类型定义
|
|
3
|
-
*/ /**
|
|
4
|
-
* HTTP 请求方法
|
|
5
|
-
*/ "use strict";
|
|
6
|
-
Object.defineProperty(exports, "__esModule", {
|
|
7
|
-
value: true
|
|
8
|
-
});
|
|
9
|
-
function _export(target, all) {
|
|
10
|
-
for(var name in all)Object.defineProperty(target, name, {
|
|
11
|
-
enumerable: true,
|
|
12
|
-
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
13
|
-
});
|
|
14
|
-
}
|
|
15
|
-
_export(exports, {
|
|
16
|
-
get RequestError () {
|
|
17
|
-
return RequestError;
|
|
18
|
-
},
|
|
19
|
-
get RequestErrorCode () {
|
|
20
|
-
return RequestErrorCode;
|
|
21
|
-
},
|
|
22
|
-
get RequestErrorType () {
|
|
23
|
-
return RequestErrorType;
|
|
24
|
-
}
|
|
25
|
-
});
|
|
26
|
-
function _define_property(obj, key, value) {
|
|
27
|
-
if (key in obj) {
|
|
28
|
-
Object.defineProperty(obj, key, {
|
|
29
|
-
value: value,
|
|
30
|
-
enumerable: true,
|
|
31
|
-
configurable: true,
|
|
32
|
-
writable: true
|
|
33
|
-
});
|
|
34
|
-
} else {
|
|
35
|
-
obj[key] = value;
|
|
36
|
-
}
|
|
37
|
-
return obj;
|
|
38
|
-
}
|
|
39
|
-
var RequestErrorType = /*#__PURE__*/ function(RequestErrorType) {
|
|
40
|
-
/**
|
|
41
|
-
* 网络错误
|
|
42
|
-
*/ RequestErrorType["NETWORK_ERROR"] = "NETWORK_ERROR";
|
|
43
|
-
/**
|
|
44
|
-
* 超时错误
|
|
45
|
-
*/ RequestErrorType["TIMEOUT_ERROR"] = "TIMEOUT_ERROR";
|
|
46
|
-
/**
|
|
47
|
-
* HTTP 错误(4xx, 5xx)
|
|
48
|
-
*/ RequestErrorType["HTTP_ERROR"] = "HTTP_ERROR";
|
|
49
|
-
/**
|
|
50
|
-
* 取消错误
|
|
51
|
-
*/ RequestErrorType["ABORT_ERROR"] = "ABORT_ERROR";
|
|
52
|
-
/**
|
|
53
|
-
* 验证错误
|
|
54
|
-
*/ RequestErrorType["VALIDATION_ERROR"] = "VALIDATION_ERROR";
|
|
55
|
-
/**
|
|
56
|
-
* 未知错误
|
|
57
|
-
*/ RequestErrorType["UNKNOWN_ERROR"] = "UNKNOWN_ERROR";
|
|
58
|
-
return RequestErrorType;
|
|
59
|
-
}({});
|
|
60
|
-
var RequestErrorCode = /*#__PURE__*/ function(RequestErrorCode) {
|
|
61
|
-
/**
|
|
62
|
-
* 网络连接失败
|
|
63
|
-
*/ RequestErrorCode["NETWORK_CONNECTION_FAILED"] = "NETWORK_CONNECTION_FAILED";
|
|
64
|
-
/**
|
|
65
|
-
* 请求超时
|
|
66
|
-
*/ RequestErrorCode["REQUEST_TIMEOUT"] = "REQUEST_TIMEOUT";
|
|
67
|
-
/**
|
|
68
|
-
* 服务器错误(5xx)
|
|
69
|
-
*/ RequestErrorCode["SERVER_ERROR"] = "SERVER_ERROR";
|
|
70
|
-
/**
|
|
71
|
-
* 客户端错误(4xx)
|
|
72
|
-
*/ RequestErrorCode["CLIENT_ERROR"] = "CLIENT_ERROR";
|
|
73
|
-
/**
|
|
74
|
-
* 请求被取消
|
|
75
|
-
*/ RequestErrorCode["REQUEST_ABORTED"] = "REQUEST_ABORTED";
|
|
76
|
-
/**
|
|
77
|
-
* 响应验证失败
|
|
78
|
-
*/ RequestErrorCode["RESPONSE_VALIDATION_FAILED"] = "RESPONSE_VALIDATION_FAILED";
|
|
79
|
-
/**
|
|
80
|
-
* 请求参数验证失败
|
|
81
|
-
*/ RequestErrorCode["REQUEST_VALIDATION_FAILED"] = "REQUEST_VALIDATION_FAILED";
|
|
82
|
-
return RequestErrorCode;
|
|
83
|
-
}({});
|
|
84
|
-
let RequestError = class RequestError extends Error {
|
|
85
|
-
constructor(message, type, code, options){
|
|
86
|
-
super(message), /**
|
|
87
|
-
* 错误类型
|
|
88
|
-
*/ _define_property(this, "type", void 0), /**
|
|
89
|
-
* 错误代码
|
|
90
|
-
*/ _define_property(this, "code", void 0), /**
|
|
91
|
-
* HTTP 状态码(如果有)
|
|
92
|
-
*/ _define_property(this, "status", void 0), /**
|
|
93
|
-
* 原始错误
|
|
94
|
-
*/ _define_property(this, "cause", void 0), /**
|
|
95
|
-
* 请求配置
|
|
96
|
-
*/ _define_property(this, "request", void 0), /**
|
|
97
|
-
* 响应数据(如果有)
|
|
98
|
-
*/ _define_property(this, "response", void 0), /**
|
|
99
|
-
* 错误上下文
|
|
100
|
-
*/ _define_property(this, "context", void 0);
|
|
101
|
-
this.name = 'RequestError';
|
|
102
|
-
this.type = type;
|
|
103
|
-
this.code = code;
|
|
104
|
-
this.status = options?.status;
|
|
105
|
-
this.cause = options?.cause;
|
|
106
|
-
this.request = options?.request;
|
|
107
|
-
this.response = options?.response;
|
|
108
|
-
this.context = options?.context;
|
|
109
|
-
}
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
//# sourceMappingURL=types.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/request/types.ts"],"sourcesContent":["/**\n * 请求库核心类型定义\n */\n\n/**\n * HTTP 请求方法\n */\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS';\n\n/**\n * 请求头类型\n */\nexport type RequestHeaders = Record<string, string | number | boolean>;\n\n/**\n * 请求查询参数类型\n */\nexport type RequestQuery = Record<string, string | number | boolean | null | undefined>;\n\n/**\n * 请求体类型\n */\nexport type RequestBody = string | FormData | URLSearchParams | Blob | ArrayBuffer | Record<string, unknown> | null;\n\n/**\n * 请求配置选项\n * \n * @template TResponse - 响应数据类型(用于类型推导)\n */\nexport interface RequestOptions<TResponse = unknown> {\n /**\n * 响应类型占位符(用于类型推导,实际不使用)\n * @internal\n */\n _responseType?: TResponse;\n\n /**\n * 请求方法\n */\n method?: HttpMethod;\n\n /**\n * 请求 URL\n */\n url: string;\n\n /**\n * 请求头\n */\n headers?: RequestHeaders;\n\n /**\n * 查询参数\n */\n query?: RequestQuery;\n\n /**\n * 请求体\n */\n body?: RequestBody;\n\n /**\n * 请求超时时间(毫秒)\n */\n timeout?: number;\n\n /**\n * 是否允许跨域请求\n */\n credentials?: 'include' | 'same-origin' | 'omit';\n\n /**\n * 响应类型\n */\n responseType?: 'json' | 'text' | 'blob' | 'arrayBuffer' | 'formData';\n\n /**\n * 是否中止请求\n */\n signal?: AbortSignal;\n\n /**\n * 请求元数据(用于插件扩展)\n */\n meta?: Record<string, unknown>;\n\n /**\n * 请求标签(用于缓存、监控等)\n */\n tags?: string[];\n\n /**\n * 是否跳过默认插件\n */\n skipPlugins?: string[];\n\n /**\n * 请求重试配置\n */\n retry?: RetryConfig;\n\n /**\n * 请求缓存配置\n */\n cache?: CacheConfig;\n\n /**\n * 请求验证配置\n */\n validation?: ValidationConfig;\n}\n\n/**\n * 重试配置\n */\nexport interface RetryConfig {\n /**\n * 最大重试次数\n */\n maxAttempts?: number;\n\n /**\n * 重试延迟(毫秒)\n */\n delay?: number;\n\n /**\n * 重试延迟策略(指数退避)\n */\n exponentialBackoff?: boolean;\n\n /**\n * 重试条件函数\n */\n shouldRetry?: (error: unknown, attempt: number) => boolean;\n\n /**\n * 重试延迟计算函数\n */\n calculateDelay?: (attempt: number) => number;\n}\n\n/**\n * 缓存配置\n */\nexport interface CacheConfig {\n /**\n * 缓存键\n */\n key?: string;\n\n /**\n * 缓存时间(毫秒)\n */\n ttl?: number;\n\n /**\n * 是否强制刷新\n */\n forceRefresh?: boolean;\n\n /**\n * 缓存存储类型\n */\n storage?: 'memory' | 'localStorage' | 'sessionStorage';\n\n /**\n * 缓存条件函数\n */\n shouldCache?: (response: Response<unknown>) => boolean;\n}\n\n/**\n * 验证配置\n * \n * @template TResponse - 响应数据类型\n */\nexport interface ValidationConfig {\n /**\n * 请求参数验证 Schema(Zod)\n */\n requestSchema?: unknown;\n\n /**\n * 响应数据验证 Schema(Zod)\n */\n responseSchema?: unknown;\n\n /**\n * 验证失败时的处理方式\n */\n onValidationError?: (error: unknown) => void;\n}\n\n/**\n * 响应对象\n * \n * @template TData - 响应数据类型\n * @template TMeta - 响应元数据类型\n */\nexport interface Response<TData = unknown, TMeta = Record<string, unknown>> {\n /**\n * 响应数据\n */\n data: TData;\n\n /**\n * HTTP 状态码\n */\n status: number;\n\n /**\n * HTTP 状态文本\n */\n statusText: string;\n\n /**\n * 响应头\n */\n headers: RequestHeaders;\n\n /**\n * 响应元数据(由插件注入)\n */\n meta?: TMeta;\n\n /**\n * 原始响应对象(适配器提供)\n */\n raw?: unknown;\n}\n\n/**\n * 请求错误类型\n */\nexport enum RequestErrorType {\n /**\n * 网络错误\n */\n NETWORK_ERROR = 'NETWORK_ERROR',\n\n /**\n * 超时错误\n */\n TIMEOUT_ERROR = 'TIMEOUT_ERROR',\n\n /**\n * HTTP 错误(4xx, 5xx)\n */\n HTTP_ERROR = 'HTTP_ERROR',\n\n /**\n * 取消错误\n */\n ABORT_ERROR = 'ABORT_ERROR',\n\n /**\n * 验证错误\n */\n VALIDATION_ERROR = 'VALIDATION_ERROR',\n\n /**\n * 未知错误\n */\n UNKNOWN_ERROR = 'UNKNOWN_ERROR',\n}\n\n/**\n * 请求错误代码\n */\nexport enum RequestErrorCode {\n /**\n * 网络连接失败\n */\n NETWORK_CONNECTION_FAILED = 'NETWORK_CONNECTION_FAILED',\n\n /**\n * 请求超时\n */\n REQUEST_TIMEOUT = 'REQUEST_TIMEOUT',\n\n /**\n * 服务器错误(5xx)\n */\n SERVER_ERROR = 'SERVER_ERROR',\n\n /**\n * 客户端错误(4xx)\n */\n CLIENT_ERROR = 'CLIENT_ERROR',\n\n /**\n * 请求被取消\n */\n REQUEST_ABORTED = 'REQUEST_ABORTED',\n\n /**\n * 响应验证失败\n */\n RESPONSE_VALIDATION_FAILED = 'RESPONSE_VALIDATION_FAILED',\n\n /**\n * 请求参数验证失败\n */\n REQUEST_VALIDATION_FAILED = 'REQUEST_VALIDATION_FAILED',\n}\n\n/**\n * 请求错误类\n */\nexport class RequestError extends Error {\n /**\n * 错误类型\n */\n type: RequestErrorType;\n\n /**\n * 错误代码\n */\n code: RequestErrorCode;\n\n /**\n * HTTP 状态码(如果有)\n */\n status?: number;\n\n /**\n * 原始错误\n */\n cause?: unknown;\n\n /**\n * 请求配置\n */\n request?: RequestOptions;\n\n /**\n * 响应数据(如果有)\n */\n response?: Response;\n\n /**\n * 错误上下文\n */\n context?: Record<string, unknown>;\n\n constructor(\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 ) {\n super(message);\n this.name = 'RequestError';\n this.type = type;\n this.code = code;\n this.status = options?.status;\n this.cause = options?.cause;\n this.request = options?.request;\n this.response = options?.response;\n this.context = options?.context;\n }\n}\n\n/**\n * 请求上下文\n * \n * @template TRequest - 请求配置类型\n * @template TResponse - 响应类型\n * @template TMeta - 元数据类型\n */\nexport interface RequestContext<TRequest = RequestOptions, TResponse = Response, TMeta = Record<string, unknown>> {\n /**\n * 请求配置\n */\n request: TRequest;\n\n /**\n * 响应(如果已收到)\n */\n response?: TResponse;\n\n /**\n * 错误(如果发生)\n */\n error?: RequestError;\n\n /**\n * 上下文元数据(由插件注入)\n */\n meta: TMeta;\n\n /**\n * 请求开始时间\n */\n startTime: number;\n\n /**\n * 请求结束时间(如果已完成)\n */\n endTime?: number;\n\n /**\n * 请求耗时(毫秒)\n */\n duration?: number;\n\n /**\n * 重试次数\n */\n retryCount: number;\n\n /**\n * 是否已取消\n */\n cancelled: boolean;\n\n /**\n * 中止控制器\n */\n abortController?: AbortController;\n}\n\n/**\n * 适配器能力声明\n */\nexport interface AdapterCapabilities {\n /**\n * 是否支持取消请求\n */\n supportsAbort?: boolean;\n\n /**\n * 是否支持超时\n */\n supportsTimeout?: boolean;\n\n /**\n * 是否支持进度追踪\n */\n supportsProgress?: boolean;\n\n /**\n * 是否支持拦截器\n */\n supportsInterceptors?: boolean;\n}\n\n/**\n * 请求客户端配置\n */\nexport interface RequestClientConfig {\n /**\n * 基础 URL\n */\n baseURL?: string;\n\n /**\n * 默认请求头\n */\n defaultHeaders?: RequestHeaders;\n\n /**\n * 默认超时时间(毫秒)\n */\n defaultTimeout?: number;\n\n /**\n * 默认适配器(按需加载)\n * 可以是适配器名称字符串,或返回适配器的工厂函数\n */\n defaultAdapter?: string | (() => Promise<import('./adapter/RequestAdapter').RequestAdapter>);\n\n /**\n * 插件列表\n */\n plugins?: Array<import('./plugin/RequestPlugin').RequestPlugin>;\n\n /**\n * 是否启用开发模式\n */\n devMode?: boolean;\n}\n"],"names":["RequestError","RequestErrorCode","RequestErrorType","Error","message","type","code","options","status","cause","request","response","context","name"],"mappings":"AAAA;;CAEC,GAED;;CAEC;;;;;;;;;;;QAgTYA;eAAAA;;QAxCDC;eAAAA;;QAnCAC;eAAAA;;;;;;;;;;;;;;;;AAAL,IAAA,AAAKA,0CAAAA;IACV;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;WA5BSA;;AAmCL,IAAA,AAAKD,0CAAAA;IACV;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;WAjCSA;;AAwCL,IAAA,AAAMD,eAAN,MAAMA,qBAAqBG;IAoChC,YACEC,OAAe,EACfC,IAAsB,EACtBC,IAAsB,EACtBC,OAMC,CACD;QACA,KAAK,CAACH,UA/CR;;GAEC,GACDC,uBAAAA,QAAAA,KAAAA,IAEA;;GAEC,GACDC,uBAAAA,QAAAA,KAAAA,IAEA;;GAEC,GACDE,uBAAAA,UAAAA,KAAAA,IAEA;;GAEC,GACDC,uBAAAA,SAAAA,KAAAA,IAEA;;GAEC,GACDC,uBAAAA,WAAAA,KAAAA,IAEA;;GAEC,GACDC,uBAAAA,YAAAA,KAAAA,IAEA;;GAEC,GACDC,uBAAAA,WAAAA,KAAAA;QAeE,IAAI,CAACC,IAAI,GAAG;QACZ,IAAI,CAACR,IAAI,GAAGA;QACZ,IAAI,CAACC,IAAI,GAAGA;QACZ,IAAI,CAACE,MAAM,GAAGD,SAASC;QACvB,IAAI,CAACC,KAAK,GAAGF,SAASE;QACtB,IAAI,CAACC,OAAO,GAAGH,SAASG;QACxB,IAAI,CAACC,QAAQ,GAAGJ,SAASI;QACzB,IAAI,CAACC,OAAO,GAAGL,SAASK;IAC1B;AACF"}
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 请求队列管理器
|
|
3
|
-
*
|
|
4
|
-
* 用于管理待执行的请求队列,支持请求拦截、暂停、恢复等功能
|
|
5
|
-
*/ "use strict";
|
|
6
|
-
Object.defineProperty(exports, "__esModule", {
|
|
7
|
-
value: true
|
|
8
|
-
});
|
|
9
|
-
Object.defineProperty(exports, "getRequestQueueManager", {
|
|
10
|
-
enumerable: true,
|
|
11
|
-
get: function() {
|
|
12
|
-
return getRequestQueueManager;
|
|
13
|
-
}
|
|
14
|
-
});
|
|
15
|
-
function _define_property(obj, key, value) {
|
|
16
|
-
if (key in obj) {
|
|
17
|
-
Object.defineProperty(obj, key, {
|
|
18
|
-
value: value,
|
|
19
|
-
enumerable: true,
|
|
20
|
-
configurable: true,
|
|
21
|
-
writable: true
|
|
22
|
-
});
|
|
23
|
-
} else {
|
|
24
|
-
obj[key] = value;
|
|
25
|
-
}
|
|
26
|
-
return obj;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* 队列状态
|
|
30
|
-
*/ var QueueState = /*#__PURE__*/ function(QueueState) {
|
|
31
|
-
/**
|
|
32
|
-
* 正常状态,请求可以正常执行
|
|
33
|
-
*/ QueueState["IDLE"] = "idle";
|
|
34
|
-
/**
|
|
35
|
-
* 暂停状态,请求会被放入队列
|
|
36
|
-
*/ QueueState["PAUSED"] = "paused";
|
|
37
|
-
/**
|
|
38
|
-
* 处理中状态,正在执行回调
|
|
39
|
-
*/ QueueState["PROCESSING"] = "processing";
|
|
40
|
-
return QueueState;
|
|
41
|
-
}(QueueState || {});
|
|
42
|
-
/**
|
|
43
|
-
* 请求队列管理器
|
|
44
|
-
*/ let RequestQueueManager = class RequestQueueManager {
|
|
45
|
-
/**
|
|
46
|
-
* 获取单例实例
|
|
47
|
-
*/ static getInstance() {
|
|
48
|
-
if (!RequestQueueManager.instance) {
|
|
49
|
-
RequestQueueManager.instance = new RequestQueueManager();
|
|
50
|
-
}
|
|
51
|
-
return RequestQueueManager.instance;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* 检查队列是否处于暂停状态
|
|
55
|
-
*/ isPaused() {
|
|
56
|
-
return this.state === "paused" || this.state === "processing";
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* 暂停队列,后续请求会被放入队列
|
|
60
|
-
*/ pause() {
|
|
61
|
-
if (this.state === "idle") {
|
|
62
|
-
this.state = "paused";
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* 恢复队列,执行队列中的所有请求
|
|
67
|
-
*/ async resume() {
|
|
68
|
-
if (this.state === "idle") {
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
this.state = "idle";
|
|
72
|
-
// 执行队列中的所有请求
|
|
73
|
-
const requests = [
|
|
74
|
-
...this.queue
|
|
75
|
-
];
|
|
76
|
-
this.queue = [];
|
|
77
|
-
// 并行执行所有请求
|
|
78
|
-
await Promise.allSettled(requests.map((item)=>{
|
|
79
|
-
return item.execute().then(item.resolve).catch(item.reject);
|
|
80
|
-
}));
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* 执行回调并等待完成,然后恢复队列
|
|
84
|
-
*
|
|
85
|
-
* @param callback - 回调函数
|
|
86
|
-
*/ async processAndResume(callback) {
|
|
87
|
-
if (this.state === "processing") {
|
|
88
|
-
// 如果已经在处理中,等待当前处理完成
|
|
89
|
-
if (this.processingPromise) {
|
|
90
|
-
await this.processingPromise;
|
|
91
|
-
}
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
this.state = "processing";
|
|
95
|
-
try {
|
|
96
|
-
// 执行回调
|
|
97
|
-
this.processingPromise = Promise.resolve(callback());
|
|
98
|
-
await this.processingPromise;
|
|
99
|
-
} finally{
|
|
100
|
-
this.processingPromise = null;
|
|
101
|
-
// 恢复队列
|
|
102
|
-
await this.resume();
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* 将请求添加到队列
|
|
107
|
-
*
|
|
108
|
-
* @template TResponse - 响应数据类型
|
|
109
|
-
* @param options - 请求配置
|
|
110
|
-
* @param execute - 请求执行函数
|
|
111
|
-
* @returns Promise 解析为响应对象
|
|
112
|
-
*/ async enqueue(options, execute) {
|
|
113
|
-
return new Promise((resolve, reject)=>{
|
|
114
|
-
this.queue.push({
|
|
115
|
-
options: options,
|
|
116
|
-
execute: execute,
|
|
117
|
-
resolve: resolve,
|
|
118
|
-
reject,
|
|
119
|
-
timestamp: Date.now()
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* 获取队列长度
|
|
125
|
-
*/ getQueueLength() {
|
|
126
|
-
return this.queue.length;
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* 清空队列
|
|
130
|
-
*
|
|
131
|
-
* @param reason - 清空原因(用于错误信息)
|
|
132
|
-
*/ clear(reason) {
|
|
133
|
-
const requests = [
|
|
134
|
-
...this.queue
|
|
135
|
-
];
|
|
136
|
-
this.queue = [];
|
|
137
|
-
// 拒绝所有待执行的请求
|
|
138
|
-
const error = reason ? new Error(`请求队列已清空: ${reason}`) : new Error('请求队列已清空');
|
|
139
|
-
requests.forEach((item)=>{
|
|
140
|
-
item.reject(error);
|
|
141
|
-
});
|
|
142
|
-
this.state = "idle";
|
|
143
|
-
this.processingPromise = null;
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* 销毁管理器
|
|
147
|
-
*/ destroy() {
|
|
148
|
-
this.clear('管理器已销毁');
|
|
149
|
-
RequestQueueManager.instance = null;
|
|
150
|
-
}
|
|
151
|
-
constructor(){
|
|
152
|
-
/**
|
|
153
|
-
* 待执行的请求队列
|
|
154
|
-
*/ _define_property(this, "queue", []);
|
|
155
|
-
/**
|
|
156
|
-
* 队列状态
|
|
157
|
-
*/ _define_property(this, "state", "idle");
|
|
158
|
-
/**
|
|
159
|
-
* 当前正在执行的回调 Promise
|
|
160
|
-
*/ _define_property(this, "processingPromise", null);
|
|
161
|
-
}
|
|
162
|
-
};
|
|
163
|
-
_define_property(RequestQueueManager, "instance", null);
|
|
164
|
-
function getRequestQueueManager() {
|
|
165
|
-
return RequestQueueManager.getInstance();
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
//# sourceMappingURL=RequestQueueManager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/request/utils/RequestQueueManager.ts"],"sourcesContent":["/**\n * 请求队列管理器\n * \n * 用于管理待执行的请求队列,支持请求拦截、暂停、恢复等功能\n */\n\nimport type { RequestOptions, Response } from '../types';\n\n/**\n * 待执行的请求项\n */\ninterface QueuedRequest {\n /**\n * 请求配置\n */\n options: RequestOptions<unknown>;\n \n /**\n * 请求执行函数\n */\n execute: () => Promise<Response<unknown>>;\n \n /**\n * Promise resolve 函数\n */\n resolve: (response: Response<unknown>) => void;\n \n /**\n * Promise reject 函数\n */\n reject: (error: unknown) => void;\n \n /**\n * 请求时间戳\n */\n timestamp: number;\n}\n\n/**\n * 队列状态\n */\nenum QueueState {\n /**\n * 正常状态,请求可以正常执行\n */\n IDLE = 'idle',\n \n /**\n * 暂停状态,请求会被放入队列\n */\n PAUSED = 'paused',\n \n /**\n * 处理中状态,正在执行回调\n */\n PROCESSING = 'processing',\n}\n\n/**\n * 请求队列管理器\n */\nclass RequestQueueManager {\n private static instance: RequestQueueManager | null = null;\n \n /**\n * 待执行的请求队列\n */\n private queue: QueuedRequest[] = [];\n \n /**\n * 队列状态\n */\n private state: QueueState = QueueState.IDLE;\n \n /**\n * 当前正在执行的回调 Promise\n */\n private processingPromise: Promise<void> | null = null;\n \n /**\n * 获取单例实例\n */\n static getInstance(): RequestQueueManager {\n if (!RequestQueueManager.instance) {\n RequestQueueManager.instance = new RequestQueueManager();\n }\n return RequestQueueManager.instance;\n }\n \n /**\n * 检查队列是否处于暂停状态\n */\n isPaused(): boolean {\n return this.state === QueueState.PAUSED || this.state === QueueState.PROCESSING;\n }\n \n /**\n * 暂停队列,后续请求会被放入队列\n */\n pause(): void {\n if (this.state === QueueState.IDLE) {\n this.state = QueueState.PAUSED;\n }\n }\n \n /**\n * 恢复队列,执行队列中的所有请求\n */\n async resume(): Promise<void> {\n if (this.state === QueueState.IDLE) {\n return;\n }\n \n this.state = QueueState.IDLE;\n \n // 执行队列中的所有请求\n const requests = [...this.queue];\n this.queue = [];\n \n // 并行执行所有请求\n await Promise.allSettled(\n requests.map((item) => {\n return item\n .execute()\n .then(item.resolve)\n .catch(item.reject);\n })\n );\n }\n \n /**\n * 执行回调并等待完成,然后恢复队列\n * \n * @param callback - 回调函数\n */\n async processAndResume(callback: () => Promise<void> | void): Promise<void> {\n if (this.state === QueueState.PROCESSING) {\n // 如果已经在处理中,等待当前处理完成\n if (this.processingPromise) {\n await this.processingPromise;\n }\n return;\n }\n \n this.state = QueueState.PROCESSING;\n \n try {\n // 执行回调\n this.processingPromise = Promise.resolve(callback());\n await this.processingPromise;\n } finally {\n this.processingPromise = null;\n // 恢复队列\n await this.resume();\n }\n }\n \n /**\n * 将请求添加到队列\n * \n * @template TResponse - 响应数据类型\n * @param options - 请求配置\n * @param execute - 请求执行函数\n * @returns Promise 解析为响应对象\n */\n async enqueue<TResponse = unknown>(\n options: RequestOptions<TResponse>,\n execute: () => Promise<Response<TResponse>>\n ): Promise<Response<TResponse>> {\n return new Promise<Response<TResponse>>((resolve, reject) => {\n this.queue.push({\n options: options as RequestOptions<unknown>,\n execute: execute as () => Promise<Response<unknown>>,\n resolve: resolve as (response: Response<unknown>) => void,\n reject,\n timestamp: Date.now(),\n });\n });\n }\n \n /**\n * 获取队列长度\n */\n getQueueLength(): number {\n return this.queue.length;\n }\n \n /**\n * 清空队列\n * \n * @param reason - 清空原因(用于错误信息)\n */\n clear(reason?: string): void {\n const requests = [...this.queue];\n this.queue = [];\n \n // 拒绝所有待执行的请求\n const error = reason\n ? new Error(`请求队列已清空: ${reason}`)\n : new Error('请求队列已清空');\n \n requests.forEach((item) => {\n item.reject(error);\n });\n \n this.state = QueueState.IDLE;\n this.processingPromise = null;\n }\n \n /**\n * 销毁管理器\n */\n destroy(): void {\n this.clear('管理器已销毁');\n RequestQueueManager.instance = null;\n }\n}\n\n/**\n * 获取请求队列管理器实例\n */\nexport function getRequestQueueManager(): RequestQueueManager {\n return RequestQueueManager.getInstance();\n}\n"],"names":["getRequestQueueManager","QueueState","RequestQueueManager","getInstance","instance","isPaused","state","pause","resume","requests","queue","Promise","allSettled","map","item","execute","then","resolve","catch","reject","processAndResume","callback","processingPromise","enqueue","options","push","timestamp","Date","now","getQueueLength","length","clear","reason","error","Error","forEach","destroy"],"mappings":"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"}
|