@vlian/framework 1.2.57 → 1.2.60
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/README.md +15 -3
- package/dist/analytics/index.cjs +1 -24
- package/dist/analytics/index.js +1 -3
- package/dist/analytics.umd.js +8 -208
- package/dist/components/LocaleSwitch.cjs +1 -118
- package/dist/components/LocaleSwitch.js +1 -103
- package/dist/components/ThemeSwitch.cjs +1 -117
- package/dist/components/ThemeSwitch.js +1 -102
- package/dist/components/index.cjs +1 -22
- package/dist/components/index.js +1 -4
- package/dist/components/persistence.cjs +1 -60
- package/dist/components/persistence.js +1 -39
- package/dist/core/Test.cjs +1 -66
- package/dist/core/Test.js +1 -15
- package/dist/core/app/AppContext.cjs +1 -350
- package/dist/core/app/AppContext.js +1 -339
- package/dist/core/app/AppContext.types.cjs +1 -6
- package/dist/core/app/AppContext.types.js +1 -5
- package/dist/core/app/BasicLayout.cjs +1 -124
- package/dist/core/app/BasicLayout.js +1 -74
- package/dist/core/app/DefaultApp.cjs +1 -152
- package/dist/core/app/DefaultApp.js +1 -143
- package/dist/core/app/index.cjs +1 -43
- package/dist/core/app/index.js +1 -7
- package/dist/core/config/AppConfig.cjs +1 -141
- package/dist/core/config/AppConfig.js +1 -133
- package/dist/core/config/ConfigLoader.cjs +1 -325
- package/dist/core/config/ConfigLoader.js +1 -311
- package/dist/core/config/ConfigValidator.cjs +2 -135
- package/dist/core/config/ConfigValidator.js +2 -121
- package/dist/core/config/index.cjs +1 -30
- package/dist/core/config/index.js +1 -7
- package/dist/core/dev/DevTools.cjs +1 -228
- package/dist/core/dev/DevTools.js +1 -210
- package/dist/core/error/ErrorBoundary.cjs +1 -403
- package/dist/core/error/ErrorBoundary.js +1 -399
- package/dist/core/error/ErrorHandler.cjs +1 -277
- package/dist/core/error/ErrorHandler.js +1 -261
- package/dist/core/error/index.cjs +1 -36
- package/dist/core/error/index.js +1 -6
- package/dist/core/event/AppEventBus.cjs +1 -446
- package/dist/core/event/AppEventBus.js +1 -438
- package/dist/core/event/frameworkEvents.cjs +1 -143
- package/dist/core/event/frameworkEvents.js +1 -135
- package/dist/core/event/hooks.cjs +1 -71
- package/dist/core/event/hooks.js +1 -95
- package/dist/core/event/index.cjs +1 -43
- package/dist/core/event/index.js +1 -10
- package/dist/core/event/types.cjs +1 -64
- package/dist/core/event/types.js +1 -56
- package/dist/core/event/useEventBus.cjs +1 -27
- package/dist/core/event/useEventBus.js +1 -39
- package/dist/core/index.cjs +1 -142
- package/dist/core/index.js +1 -69
- package/dist/core/initialization/InitializationErrorThrower.cjs +1 -77
- package/dist/core/initialization/InitializationErrorThrower.js +1 -30
- package/dist/core/initialization/index.cjs +1 -28
- package/dist/core/initialization/index.js +1 -7
- package/dist/core/initialization/initialization.cjs +1 -66
- package/dist/core/initialization/initialization.js +1 -78
- package/dist/core/initialization/initializationErrorState.cjs +1 -68
- package/dist/core/initialization/initializationErrorState.js +1 -60
- package/dist/core/kernel/defaultAdapters.cjs +1 -186
- package/dist/core/kernel/defaultAdapters.js +1 -176
- package/dist/core/kernel/errors.cjs +1 -71
- package/dist/core/kernel/errors.js +1 -53
- package/dist/core/kernel/index.cjs +1 -22
- package/dist/core/kernel/index.js +1 -4
- package/dist/core/kernel/startKernel.cjs +1 -202
- package/dist/core/kernel/startKernel.js +1 -192
- package/dist/core/kernel/types.cjs +1 -6
- package/dist/core/kernel/types.js +1 -3
- package/dist/core/middleware.cjs +1 -75
- package/dist/core/middleware.js +1 -61
- package/dist/core/plugin/PluginEventBus.cjs +1 -300
- package/dist/core/plugin/PluginEventBus.js +1 -286
- package/dist/core/plugin/PluginSandbox.cjs +1 -139
- package/dist/core/plugin/PluginSandbox.js +1 -125
- package/dist/core/plugin.cjs +1 -496
- package/dist/core/plugin.js +1 -438
- package/dist/core/router/RouterManager.cjs +1 -288
- package/dist/core/router/RouterManager.js +1 -272
- package/dist/core/router/adapter/AdapterManager.cjs +1 -237
- package/dist/core/router/adapter/AdapterManager.js +1 -221
- package/dist/core/router/adapter/index.cjs +1 -24
- package/dist/core/router/adapter/index.js +1 -7
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs +1 -130
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.js +1 -116
- package/dist/core/router/adapter/react-router/index.cjs +1 -22
- package/dist/core/router/adapter/react-router/index.js +1 -5
- package/dist/core/router/adapter/types.cjs +1 -8
- package/dist/core/router/adapter/types.js +1 -7
- package/dist/core/router/dev/RouterDevTools.cjs +1 -262
- package/dist/core/router/dev/RouterDevTools.js +1 -211
- package/dist/core/router/dev/index.cjs +1 -22
- package/dist/core/router/dev/index.js +1 -5
- package/dist/core/router/dynamic/DynamicRouteManager.cjs +1 -195
- package/dist/core/router/dynamic/DynamicRouteManager.js +1 -179
- package/dist/core/router/dynamic/index.cjs +1 -22
- package/dist/core/router/dynamic/index.js +1 -5
- package/dist/core/router/errors/RouterError.cjs +1 -63
- package/dist/core/router/errors/RouterError.js +1 -48
- package/dist/core/router/errors/index.cjs +1 -22
- package/dist/core/router/errors/index.js +1 -5
- package/dist/core/router/index.cjs +1 -38
- package/dist/core/router/index.js +1 -32
- package/dist/core/router/lifecycle/RouterLifecycleManager.cjs +1 -146
- package/dist/core/router/lifecycle/RouterLifecycleManager.js +1 -130
- package/dist/core/router/lifecycle/index.cjs +1 -22
- package/dist/core/router/lifecycle/index.js +1 -5
- package/dist/core/router/middleware/RouterMiddlewareManager.cjs +1 -195
- package/dist/core/router/middleware/RouterMiddlewareManager.js +1 -179
- package/dist/core/router/middleware/auth.cjs +1 -68
- package/dist/core/router/middleware/auth.js +1 -63
- package/dist/core/router/middleware/index.cjs +1 -24
- package/dist/core/router/middleware/index.js +1 -7
- package/dist/core/router/middleware/types.cjs +1 -8
- package/dist/core/router/middleware/types.js +1 -7
- package/dist/core/router/monitoring/RouterMonitoring.cjs +1 -229
- package/dist/core/router/monitoring/RouterMonitoring.js +1 -213
- package/dist/core/router/monitoring/index.cjs +1 -22
- package/dist/core/router/monitoring/index.js +1 -5
- package/dist/core/router/navigation/RouterNavigation.cjs +1 -241
- package/dist/core/router/navigation/RouterNavigation.js +1 -192
- package/dist/core/router/navigation/index.cjs +1 -22
- package/dist/core/router/navigation/index.js +1 -5
- package/dist/core/router/performance/RouteCache.cjs +1 -307
- package/dist/core/router/performance/RouteCache.js +1 -291
- package/dist/core/router/performance/RoutePreloader.cjs +1 -294
- package/dist/core/router/performance/RoutePreloader.js +1 -277
- package/dist/core/router/performance/index.cjs +1 -23
- package/dist/core/router/performance/index.js +1 -6
- package/dist/core/router/plugin/RouterPluginManager.cjs +1 -264
- package/dist/core/router/plugin/RouterPluginManager.js +1 -248
- package/dist/core/router/plugin/index.cjs +1 -23
- package/dist/core/router/plugin/index.js +1 -6
- package/dist/core/router/plugin/types.cjs +1 -41
- package/dist/core/router/plugin/types.js +1 -33
- package/dist/core/router/types.cjs +1 -6
- package/dist/core/router/types.js +1 -5
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.cjs +1 -131
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.js +1 -121
- package/dist/core/router/utils/adapters/react-router/transform.cjs +1 -252
- package/dist/core/router/utils/adapters/react-router/transform.js +1 -242
- package/dist/core/router/utils/transform.cjs +1 -782
- package/dist/core/router/utils/transform.js +1 -791
- package/dist/core/router/validation/RouterConfigValidator.cjs +2 -85
- package/dist/core/router/validation/RouterConfigValidator.js +2 -77
- package/dist/core/router/validation/index.cjs +1 -23
- package/dist/core/router/validation/index.js +1 -6
- package/dist/core/router/validation/schema.cjs +1 -161
- package/dist/core/router/validation/schema.js +1 -151
- package/dist/core/router/version/RouteVersionManager.cjs +1 -207
- package/dist/core/router/version/RouteVersionManager.js +1 -191
- package/dist/core/router/version/index.cjs +1 -22
- package/dist/core/router/version/index.js +1 -5
- package/dist/core/splash/SplashScreen.cjs +1 -343
- package/dist/core/splash/SplashScreen.js +1 -293
- package/dist/core/splash/index.cjs +1 -24
- package/dist/core/splash/index.js +1 -6
- package/dist/core/splash/splashScreenUtils.cjs +1 -40
- package/dist/core/splash/splashScreenUtils.js +1 -30
- package/dist/core/startup/AppInstance.cjs +1 -241
- package/dist/core/startup/AppInstance.js +1 -226
- package/dist/core/startup/environment.cjs +1 -171
- package/dist/core/startup/environment.js +1 -154
- package/dist/core/startup/index.cjs +1 -25
- package/dist/core/startup/index.js +1 -8
- package/dist/core/startup/initializeServices.cjs +1 -228
- package/dist/core/startup/initializeServices.js +1 -188
- package/dist/core/startup/performanceTracker.cjs +1 -181
- package/dist/core/startup/performanceTracker.js +1 -167
- package/dist/core/startup/renderApp.cjs +1 -316
- package/dist/core/startup/renderApp.js +1 -267
- package/dist/core/startup/startApp.cjs +1 -319
- package/dist/core/startup/startApp.js +1 -315
- package/dist/core/types.cjs +1 -6
- package/dist/core/types.js +1 -5
- package/dist/index.cjs +1 -54
- package/dist/index.js +1 -11
- package/dist/index.umd.cjs +1 -29
- package/dist/index.umd.js +362 -13233
- package/dist/kernel/constants.cjs +1 -67
- package/dist/kernel/constants.js +1 -43
- package/dist/kernel/index.cjs +1 -40
- package/dist/kernel/index.js +1 -4
- package/dist/kernel/kernel.cjs +1 -297
- package/dist/kernel/kernel.js +1 -273
- package/dist/kernel/manager/cacheManager.cjs +1 -48
- package/dist/kernel/manager/cacheManager.js +1 -38
- package/dist/kernel/manager/i18n/I18nManager.cjs +1 -93
- package/dist/kernel/manager/i18n/I18nManager.js +1 -83
- package/dist/kernel/manager/i18n/i18n.persistence.cjs +1 -62
- package/dist/kernel/manager/i18n/i18n.persistence.js +1 -41
- package/dist/kernel/manager/i18n/i18n.schema.cjs +1 -88
- package/dist/kernel/manager/i18n/i18n.schema.js +1 -64
- package/dist/kernel/manager/i18n/index.cjs +1 -13
- package/dist/kernel/manager/i18n/index.js +1 -3
- package/dist/kernel/manager/i18nManager.cjs +1 -13
- package/dist/kernel/manager/i18nManager.js +1 -3
- package/dist/kernel/manager/index.cjs +1 -30
- package/dist/kernel/manager/index.js +1 -6
- package/dist/kernel/manager/logger/LoggerManager.cjs +1 -109
- package/dist/kernel/manager/logger/LoggerManager.js +1 -99
- package/dist/kernel/manager/logger/index.cjs +1 -13
- package/dist/kernel/manager/logger/index.js +1 -3
- package/dist/kernel/manager/logger/logger.persistence.cjs +1 -64
- package/dist/kernel/manager/logger/logger.persistence.js +1 -43
- package/dist/kernel/manager/logger/logger.schema.cjs +1 -76
- package/dist/kernel/manager/logger/logger.schema.js +1 -55
- package/dist/kernel/manager/loggerManager.cjs +1 -13
- package/dist/kernel/manager/loggerManager.js +1 -3
- package/dist/kernel/manager/theme/ThemeManager.cjs +1 -86
- package/dist/kernel/manager/theme/ThemeManager.js +1 -76
- package/dist/kernel/manager/theme/index.cjs +1 -13
- package/dist/kernel/manager/theme/index.js +1 -3
- package/dist/kernel/manager/theme/theme.dom.cjs +1 -63
- package/dist/kernel/manager/theme/theme.dom.js +1 -45
- package/dist/kernel/manager/theme/theme.persistence.cjs +1 -59
- package/dist/kernel/manager/theme/theme.persistence.js +1 -38
- package/dist/kernel/manager/theme/theme.schema.cjs +1 -124
- package/dist/kernel/manager/theme/theme.schema.js +1 -97
- package/dist/kernel/manager/themeManager.cjs +1 -13
- package/dist/kernel/manager/themeManager.js +1 -3
- package/dist/kernel/types.cjs +1 -6
- package/dist/kernel/types.js +1 -3
- package/dist/library/index.cjs +1 -21
- package/dist/library/index.js +1 -4
- package/dist/library/locale/index.cjs +1 -41
- package/dist/library/locale/index.js +1 -12
- package/dist/library/locale/langs/en-us/index.cjs +1 -34
- package/dist/library/locale/langs/en-us/index.js +1 -24
- package/dist/library/locale/langs/zh-cn/index.cjs +1 -34
- package/dist/library/locale/langs/zh-cn/index.js +1 -24
- package/dist/library/locale/types.cjs +1 -6
- package/dist/library/locale/types.js +1 -3
- package/dist/library/storage/cache.cjs +1 -245
- package/dist/library/storage/cache.js +1 -237
- package/dist/library/storage/encryption.cjs +1 -149
- package/dist/library/storage/encryption.js +1 -141
- package/dist/library/storage/index.cjs +1 -126
- package/dist/library/storage/index.js +1 -106
- package/dist/state/StateManager.cjs +1 -168
- package/dist/state/StateManager.js +1 -160
- package/dist/state/adapters/AdapterFactory.cjs +1 -91
- package/dist/state/adapters/AdapterFactory.js +1 -85
- package/dist/state/adapters/DefaultAdapter.cjs +1 -77
- package/dist/state/adapters/DefaultAdapter.js +1 -71
- package/dist/state/adapters/ReduxAdapter.cjs +1 -445
- package/dist/state/adapters/ReduxAdapter.js +1 -439
- package/dist/state/adapters/ZustandAdapter.cjs +1 -71
- package/dist/state/adapters/ZustandAdapter.js +1 -70
- package/dist/state/adapters/index.cjs +1 -46
- package/dist/state/adapters/index.js +1 -9
- package/dist/state/adapters/types.cjs +1 -22
- package/dist/state/adapters/types.js +1 -5
- package/dist/state/core/DerivedStateInstance.cjs +1 -176
- package/dist/state/core/DerivedStateInstance.js +1 -173
- package/dist/state/core/StateInstance.cjs +1 -172
- package/dist/state/core/StateInstance.js +1 -168
- package/dist/state/core/StateRegistry.cjs +1 -112
- package/dist/state/core/StateRegistry.js +1 -106
- package/dist/state/core/StateScope.cjs +1 -139
- package/dist/state/core/StateScope.js +1 -133
- package/dist/state/core/index.cjs +1 -32
- package/dist/state/core/index.js +1 -8
- package/dist/state/index.cjs +1 -32
- package/dist/state/index.js +1 -12
- package/dist/state/types.cjs +1 -14
- package/dist/state/types.js +1 -13
- package/dist/state.umd.js +22 -1395
- package/dist/types.cjs +1 -6
- package/dist/types.js +1 -3
- package/dist/utils/analytics.cjs +1 -219
- package/dist/utils/analytics.js +1 -204
- package/dist/utils/configSecurity.cjs +3 -184
- package/dist/utils/configSecurity.js +3 -176
- package/dist/utils/csrf.cjs +1 -20
- package/dist/utils/csrf.js +1 -3
- package/dist/utils/errors/ErrorCodes.cjs +1 -27
- package/dist/utils/errors/ErrorCodes.js +1 -3
- package/dist/utils/errors.cjs +1 -113
- package/dist/utils/errors.js +1 -18
- package/dist/utils/index.cjs +1 -137
- package/dist/utils/index.js +1 -48
- package/dist/utils/logger.cjs +1 -27
- package/dist/utils/logger.js +1 -3
- package/dist/utils/logger.types.cjs +1 -13
- package/dist/utils/logger.types.js +1 -3
- package/dist/utils/monitoring.cjs +1 -20
- package/dist/utils/monitoring.js +1 -3
- package/dist/utils/performance.cjs +1 -24
- package/dist/utils/performance.js +1 -3
- package/dist/utils/resourceLoader.cjs +1 -24
- package/dist/utils/resourceLoader.js +1 -3
- package/dist/utils/runtimeSecurity.cjs +1 -13
- package/dist/utils/runtimeSecurity.js +1 -3
- package/dist/utils/security.cjs +1 -21
- package/dist/utils/security.js +1 -3
- package/dist/utils/traceId.cjs +1 -39
- package/dist/utils/traceId.js +1 -3
- package/dist/utils/validation.cjs +1 -21
- package/dist/utils/validation.js +1 -3
- package/package.json +9 -6
- package/dist/analytics/index.cjs.map +0 -1
- package/dist/analytics/index.js.map +0 -1
- package/dist/analytics.umd.js.map +0 -1
- package/dist/components/LocaleSwitch.cjs.map +0 -1
- package/dist/components/LocaleSwitch.js.map +0 -1
- package/dist/components/ThemeSwitch.cjs.map +0 -1
- package/dist/components/ThemeSwitch.js.map +0 -1
- package/dist/components/index.cjs.map +0 -1
- package/dist/components/index.js.map +0 -1
- package/dist/components/persistence.cjs.map +0 -1
- package/dist/components/persistence.js.map +0 -1
- package/dist/core/Test.cjs.map +0 -1
- package/dist/core/Test.js.map +0 -1
- package/dist/core/app/AppContext.cjs.map +0 -1
- package/dist/core/app/AppContext.js.map +0 -1
- package/dist/core/app/AppContext.types.cjs.map +0 -1
- package/dist/core/app/AppContext.types.js.map +0 -1
- package/dist/core/app/BasicLayout.cjs.map +0 -1
- package/dist/core/app/BasicLayout.js.map +0 -1
- package/dist/core/app/DefaultApp.cjs.map +0 -1
- package/dist/core/app/DefaultApp.js.map +0 -1
- package/dist/core/app/index.cjs.map +0 -1
- package/dist/core/app/index.js.map +0 -1
- package/dist/core/config/AppConfig.cjs.map +0 -1
- package/dist/core/config/AppConfig.js.map +0 -1
- package/dist/core/config/ConfigLoader.cjs.map +0 -1
- package/dist/core/config/ConfigLoader.js.map +0 -1
- package/dist/core/config/ConfigValidator.cjs.map +0 -1
- package/dist/core/config/ConfigValidator.js.map +0 -1
- package/dist/core/config/index.cjs.map +0 -1
- package/dist/core/config/index.js.map +0 -1
- package/dist/core/dev/DevTools.cjs.map +0 -1
- package/dist/core/dev/DevTools.js.map +0 -1
- package/dist/core/error/ErrorBoundary.cjs.map +0 -1
- package/dist/core/error/ErrorBoundary.js.map +0 -1
- package/dist/core/error/ErrorHandler.cjs.map +0 -1
- package/dist/core/error/ErrorHandler.js.map +0 -1
- package/dist/core/error/index.cjs.map +0 -1
- package/dist/core/error/index.js.map +0 -1
- package/dist/core/event/AppEventBus.cjs.map +0 -1
- package/dist/core/event/AppEventBus.js.map +0 -1
- package/dist/core/event/frameworkEvents.cjs.map +0 -1
- package/dist/core/event/frameworkEvents.js.map +0 -1
- package/dist/core/event/hooks.cjs.map +0 -1
- package/dist/core/event/hooks.js.map +0 -1
- package/dist/core/event/index.cjs.map +0 -1
- package/dist/core/event/index.js.map +0 -1
- package/dist/core/event/types.cjs.map +0 -1
- package/dist/core/event/types.js.map +0 -1
- package/dist/core/event/useEventBus.cjs.map +0 -1
- package/dist/core/event/useEventBus.js.map +0 -1
- package/dist/core/index.cjs.map +0 -1
- package/dist/core/index.js.map +0 -1
- package/dist/core/initialization/InitializationErrorThrower.cjs.map +0 -1
- package/dist/core/initialization/InitializationErrorThrower.js.map +0 -1
- package/dist/core/initialization/index.cjs.map +0 -1
- package/dist/core/initialization/index.js.map +0 -1
- package/dist/core/initialization/initialization.cjs.map +0 -1
- package/dist/core/initialization/initialization.js.map +0 -1
- package/dist/core/initialization/initializationErrorState.cjs.map +0 -1
- package/dist/core/initialization/initializationErrorState.js.map +0 -1
- package/dist/core/kernel/defaultAdapters.cjs.map +0 -1
- package/dist/core/kernel/defaultAdapters.js.map +0 -1
- package/dist/core/kernel/errors.cjs.map +0 -1
- package/dist/core/kernel/errors.js.map +0 -1
- package/dist/core/kernel/index.cjs.map +0 -1
- package/dist/core/kernel/index.js.map +0 -1
- package/dist/core/kernel/startKernel.cjs.map +0 -1
- package/dist/core/kernel/startKernel.js.map +0 -1
- package/dist/core/kernel/types.cjs.map +0 -1
- package/dist/core/kernel/types.js.map +0 -1
- package/dist/core/middleware.cjs.map +0 -1
- package/dist/core/middleware.js.map +0 -1
- package/dist/core/plugin/PluginEventBus.cjs.map +0 -1
- package/dist/core/plugin/PluginEventBus.js.map +0 -1
- package/dist/core/plugin/PluginSandbox.cjs.map +0 -1
- package/dist/core/plugin/PluginSandbox.js.map +0 -1
- package/dist/core/plugin.cjs.map +0 -1
- package/dist/core/plugin.js.map +0 -1
- package/dist/core/router/RouterManager.cjs.map +0 -1
- package/dist/core/router/RouterManager.js.map +0 -1
- package/dist/core/router/adapter/AdapterManager.cjs.map +0 -1
- package/dist/core/router/adapter/AdapterManager.js.map +0 -1
- package/dist/core/router/adapter/index.cjs.map +0 -1
- package/dist/core/router/adapter/index.js.map +0 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs.map +0 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.js.map +0 -1
- package/dist/core/router/adapter/react-router/index.cjs.map +0 -1
- package/dist/core/router/adapter/react-router/index.js.map +0 -1
- package/dist/core/router/adapter/types.cjs.map +0 -1
- package/dist/core/router/adapter/types.js.map +0 -1
- package/dist/core/router/dev/RouterDevTools.cjs.map +0 -1
- package/dist/core/router/dev/RouterDevTools.js.map +0 -1
- package/dist/core/router/dev/index.cjs.map +0 -1
- package/dist/core/router/dev/index.js.map +0 -1
- package/dist/core/router/dynamic/DynamicRouteManager.cjs.map +0 -1
- package/dist/core/router/dynamic/DynamicRouteManager.js.map +0 -1
- package/dist/core/router/dynamic/index.cjs.map +0 -1
- package/dist/core/router/dynamic/index.js.map +0 -1
- package/dist/core/router/errors/RouterError.cjs.map +0 -1
- package/dist/core/router/errors/RouterError.js.map +0 -1
- package/dist/core/router/errors/index.cjs.map +0 -1
- package/dist/core/router/errors/index.js.map +0 -1
- package/dist/core/router/index.cjs.map +0 -1
- package/dist/core/router/index.js.map +0 -1
- package/dist/core/router/lifecycle/RouterLifecycleManager.cjs.map +0 -1
- package/dist/core/router/lifecycle/RouterLifecycleManager.js.map +0 -1
- package/dist/core/router/lifecycle/index.cjs.map +0 -1
- package/dist/core/router/lifecycle/index.js.map +0 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.cjs.map +0 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.js.map +0 -1
- package/dist/core/router/middleware/auth.cjs.map +0 -1
- package/dist/core/router/middleware/auth.js.map +0 -1
- package/dist/core/router/middleware/index.cjs.map +0 -1
- package/dist/core/router/middleware/index.js.map +0 -1
- package/dist/core/router/middleware/types.cjs.map +0 -1
- package/dist/core/router/middleware/types.js.map +0 -1
- package/dist/core/router/monitoring/RouterMonitoring.cjs.map +0 -1
- package/dist/core/router/monitoring/RouterMonitoring.js.map +0 -1
- package/dist/core/router/monitoring/index.cjs.map +0 -1
- package/dist/core/router/monitoring/index.js.map +0 -1
- package/dist/core/router/navigation/RouterNavigation.cjs.map +0 -1
- package/dist/core/router/navigation/RouterNavigation.js.map +0 -1
- package/dist/core/router/navigation/index.cjs.map +0 -1
- package/dist/core/router/navigation/index.js.map +0 -1
- package/dist/core/router/performance/RouteCache.cjs.map +0 -1
- package/dist/core/router/performance/RouteCache.js.map +0 -1
- package/dist/core/router/performance/RoutePreloader.cjs.map +0 -1
- package/dist/core/router/performance/RoutePreloader.js.map +0 -1
- package/dist/core/router/performance/index.cjs.map +0 -1
- package/dist/core/router/performance/index.js.map +0 -1
- package/dist/core/router/plugin/RouterPluginManager.cjs.map +0 -1
- package/dist/core/router/plugin/RouterPluginManager.js.map +0 -1
- package/dist/core/router/plugin/index.cjs.map +0 -1
- package/dist/core/router/plugin/index.js.map +0 -1
- package/dist/core/router/plugin/types.cjs.map +0 -1
- package/dist/core/router/plugin/types.js.map +0 -1
- package/dist/core/router/types.cjs.map +0 -1
- package/dist/core/router/types.js.map +0 -1
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.cjs.map +0 -1
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.js.map +0 -1
- package/dist/core/router/utils/adapters/react-router/transform.cjs.map +0 -1
- package/dist/core/router/utils/adapters/react-router/transform.js.map +0 -1
- package/dist/core/router/utils/transform.cjs.map +0 -1
- package/dist/core/router/utils/transform.js.map +0 -1
- package/dist/core/router/validation/RouterConfigValidator.cjs.map +0 -1
- package/dist/core/router/validation/RouterConfigValidator.js.map +0 -1
- package/dist/core/router/validation/index.cjs.map +0 -1
- package/dist/core/router/validation/index.js.map +0 -1
- package/dist/core/router/validation/schema.cjs.map +0 -1
- package/dist/core/router/validation/schema.js.map +0 -1
- package/dist/core/router/version/RouteVersionManager.cjs.map +0 -1
- package/dist/core/router/version/RouteVersionManager.js.map +0 -1
- package/dist/core/router/version/index.cjs.map +0 -1
- package/dist/core/router/version/index.js.map +0 -1
- package/dist/core/splash/SplashScreen.cjs.map +0 -1
- package/dist/core/splash/SplashScreen.js.map +0 -1
- package/dist/core/splash/index.cjs.map +0 -1
- package/dist/core/splash/index.js.map +0 -1
- package/dist/core/splash/splashScreenUtils.cjs.map +0 -1
- package/dist/core/splash/splashScreenUtils.js.map +0 -1
- package/dist/core/startup/AppInstance.cjs.map +0 -1
- package/dist/core/startup/AppInstance.js.map +0 -1
- package/dist/core/startup/environment.cjs.map +0 -1
- package/dist/core/startup/environment.js.map +0 -1
- package/dist/core/startup/index.cjs.map +0 -1
- package/dist/core/startup/index.js.map +0 -1
- package/dist/core/startup/initializeServices.cjs.map +0 -1
- package/dist/core/startup/initializeServices.js.map +0 -1
- package/dist/core/startup/performanceTracker.cjs.map +0 -1
- package/dist/core/startup/performanceTracker.js.map +0 -1
- package/dist/core/startup/renderApp.cjs.map +0 -1
- package/dist/core/startup/renderApp.js.map +0 -1
- package/dist/core/startup/startApp.cjs.map +0 -1
- package/dist/core/startup/startApp.js.map +0 -1
- package/dist/core/types.cjs.map +0 -1
- package/dist/core/types.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.umd.cjs.map +0 -1
- package/dist/index.umd.js.map +0 -1
- package/dist/kernel/constants.cjs.map +0 -1
- package/dist/kernel/constants.js.map +0 -1
- package/dist/kernel/index.cjs.map +0 -1
- package/dist/kernel/index.js.map +0 -1
- package/dist/kernel/kernel.cjs.map +0 -1
- package/dist/kernel/kernel.js.map +0 -1
- package/dist/kernel/manager/cacheManager.cjs.map +0 -1
- package/dist/kernel/manager/cacheManager.js.map +0 -1
- package/dist/kernel/manager/i18n/I18nManager.cjs.map +0 -1
- package/dist/kernel/manager/i18n/I18nManager.js.map +0 -1
- package/dist/kernel/manager/i18n/i18n.persistence.cjs.map +0 -1
- package/dist/kernel/manager/i18n/i18n.persistence.js.map +0 -1
- package/dist/kernel/manager/i18n/i18n.schema.cjs.map +0 -1
- package/dist/kernel/manager/i18n/i18n.schema.js.map +0 -1
- package/dist/kernel/manager/i18n/index.cjs.map +0 -1
- package/dist/kernel/manager/i18n/index.js.map +0 -1
- package/dist/kernel/manager/i18nManager.cjs.map +0 -1
- package/dist/kernel/manager/i18nManager.js.map +0 -1
- package/dist/kernel/manager/index.cjs.map +0 -1
- package/dist/kernel/manager/index.js.map +0 -1
- package/dist/kernel/manager/logger/LoggerManager.cjs.map +0 -1
- package/dist/kernel/manager/logger/LoggerManager.js.map +0 -1
- package/dist/kernel/manager/logger/index.cjs.map +0 -1
- package/dist/kernel/manager/logger/index.js.map +0 -1
- package/dist/kernel/manager/logger/logger.persistence.cjs.map +0 -1
- package/dist/kernel/manager/logger/logger.persistence.js.map +0 -1
- package/dist/kernel/manager/logger/logger.schema.cjs.map +0 -1
- package/dist/kernel/manager/logger/logger.schema.js.map +0 -1
- package/dist/kernel/manager/loggerManager.cjs.map +0 -1
- package/dist/kernel/manager/loggerManager.js.map +0 -1
- package/dist/kernel/manager/persistence.cjs +0 -78
- package/dist/kernel/manager/persistence.cjs.map +0 -1
- package/dist/kernel/manager/persistence.d.ts +0 -3
- package/dist/kernel/manager/persistence.js +0 -60
- package/dist/kernel/manager/persistence.js.map +0 -1
- package/dist/kernel/manager/theme/ThemeManager.cjs.map +0 -1
- package/dist/kernel/manager/theme/ThemeManager.js.map +0 -1
- package/dist/kernel/manager/theme/index.cjs.map +0 -1
- package/dist/kernel/manager/theme/index.js.map +0 -1
- package/dist/kernel/manager/theme/theme.dom.cjs.map +0 -1
- package/dist/kernel/manager/theme/theme.dom.js.map +0 -1
- package/dist/kernel/manager/theme/theme.persistence.cjs.map +0 -1
- package/dist/kernel/manager/theme/theme.persistence.js.map +0 -1
- package/dist/kernel/manager/theme/theme.schema.cjs.map +0 -1
- package/dist/kernel/manager/theme/theme.schema.js.map +0 -1
- package/dist/kernel/manager/themeManager.cjs.map +0 -1
- package/dist/kernel/manager/themeManager.js.map +0 -1
- package/dist/kernel/types.cjs.map +0 -1
- package/dist/kernel/types.js.map +0 -1
- package/dist/library/index.cjs.map +0 -1
- package/dist/library/index.js.map +0 -1
- package/dist/library/locale/index.cjs.map +0 -1
- package/dist/library/locale/index.js.map +0 -1
- package/dist/library/locale/langs/en-us/index.cjs.map +0 -1
- package/dist/library/locale/langs/en-us/index.js.map +0 -1
- package/dist/library/locale/langs/zh-cn/index.cjs.map +0 -1
- package/dist/library/locale/langs/zh-cn/index.js.map +0 -1
- package/dist/library/locale/types.cjs.map +0 -1
- package/dist/library/locale/types.js.map +0 -1
- package/dist/library/storage/cache.cjs.map +0 -1
- package/dist/library/storage/cache.js.map +0 -1
- package/dist/library/storage/encryption.cjs.map +0 -1
- package/dist/library/storage/encryption.js.map +0 -1
- package/dist/library/storage/index.cjs.map +0 -1
- package/dist/library/storage/index.js.map +0 -1
- package/dist/request/adapter/RequestAdapter.d.ts +0 -85
- package/dist/request/adapter/RequestAdapter.js +0 -70
- package/dist/request/adapter/RequestAdapter.js.map +0 -1
- package/dist/request/adapter/axiosAdapter.d.ts +0 -10
- package/dist/request/adapter/axiosAdapter.js +0 -115
- package/dist/request/adapter/axiosAdapter.js.map +0 -1
- package/dist/request/adapter/fetchAdapter.d.ts +0 -10
- package/dist/request/adapter/fetchAdapter.js +0 -126
- package/dist/request/adapter/fetchAdapter.js.map +0 -1
- package/dist/request/adapter/index.d.ts +0 -9
- package/dist/request/adapter/index.js +0 -14
- package/dist/request/adapter/index.js.map +0 -1
- package/dist/request/adapter/kyAdapter.d.ts +0 -10
- package/dist/request/adapter/kyAdapter.js +0 -142
- package/dist/request/adapter/kyAdapter.js.map +0 -1
- package/dist/request/adapter/undiciAdapter.d.ts +0 -10
- package/dist/request/adapter/undiciAdapter.js +0 -164
- package/dist/request/adapter/undiciAdapter.js.map +0 -1
- package/dist/request/adapter.d.ts +0 -1
- package/dist/request/core/RequestClient.d.ts +0 -134
- package/dist/request/core/RequestClient.js +0 -509
- package/dist/request/core/RequestClient.js.map +0 -1
- package/dist/request/core/index.d.ts +0 -5
- package/dist/request/core/index.js +0 -5
- package/dist/request/core/index.js.map +0 -1
- package/dist/request/core.d.ts +0 -1
- package/dist/request/index.d.ts +0 -1
- package/dist/request/index.js +0 -50
- package/dist/request/index.js.map +0 -1
- package/dist/request/plugin/RequestPlugin.d.ts +0 -170
- package/dist/request/plugin/RequestPlugin.js +0 -203
- package/dist/request/plugin/RequestPlugin.js.map +0 -1
- package/dist/request/plugin/cache.d.ts +0 -33
- package/dist/request/plugin/cache.js +0 -264
- package/dist/request/plugin/cache.js.map +0 -1
- package/dist/request/plugin/csrfPlugin.d.ts +0 -21
- package/dist/request/plugin/csrfPlugin.js +0 -44
- package/dist/request/plugin/csrfPlugin.js.map +0 -1
- package/dist/request/plugin/index.d.ts +0 -11
- package/dist/request/plugin/index.js +0 -12
- package/dist/request/plugin/index.js.map +0 -1
- package/dist/request/plugin/monitoring.d.ts +0 -112
- package/dist/request/plugin/monitoring.js +0 -205
- package/dist/request/plugin/monitoring.js.map +0 -1
- package/dist/request/plugin/queue.d.ts +0 -91
- package/dist/request/plugin/queue.js +0 -156
- package/dist/request/plugin/queue.js.map +0 -1
- package/dist/request/plugin/retry.d.ts +0 -34
- package/dist/request/plugin/retry.js +0 -93
- package/dist/request/plugin/retry.js.map +0 -1
- package/dist/request/plugin/validation.d.ts +0 -26
- package/dist/request/plugin/validation.js +0 -116
- package/dist/request/plugin/validation.js.map +0 -1
- package/dist/request/plugin.d.ts +0 -1
- package/dist/request/runtime/RequestContext.d.ts +0 -50
- package/dist/request/runtime/RequestContext.js +0 -86
- package/dist/request/runtime/RequestContext.js.map +0 -1
- package/dist/request/runtime/index.d.ts +0 -4
- package/dist/request/runtime/index.js +0 -5
- package/dist/request/runtime/index.js.map +0 -1
- package/dist/request/runtime.d.ts +0 -1
- package/dist/request/types.d.ts +0 -1
- package/dist/request/types.js +0 -97
- package/dist/request/types.js.map +0 -1
- package/dist/request/utils/RequestQueueManager.d.ts +0 -74
- package/dist/request/utils/RequestQueueManager.js +0 -160
- package/dist/request/utils/RequestQueueManager.js.map +0 -1
- package/dist/request/utils/dependencyCheck.d.ts +0 -63
- package/dist/request/utils/dependencyCheck.js +0 -192
- package/dist/request/utils/dependencyCheck.js.map +0 -1
- package/dist/request/utils/index.d.ts +0 -5
- package/dist/request/utils/index.js +0 -6
- package/dist/request/utils/index.js.map +0 -1
- package/dist/request/utils.d.ts +0 -1
- package/dist/state/StateManager.cjs.map +0 -1
- package/dist/state/StateManager.js.map +0 -1
- package/dist/state/adapters/AdapterFactory.cjs.map +0 -1
- package/dist/state/adapters/AdapterFactory.js.map +0 -1
- package/dist/state/adapters/DefaultAdapter.cjs.map +0 -1
- package/dist/state/adapters/DefaultAdapter.js.map +0 -1
- package/dist/state/adapters/ReduxAdapter.cjs.map +0 -1
- package/dist/state/adapters/ReduxAdapter.js.map +0 -1
- package/dist/state/adapters/ZustandAdapter.cjs.map +0 -1
- package/dist/state/adapters/ZustandAdapter.js.map +0 -1
- package/dist/state/adapters/index.cjs.map +0 -1
- package/dist/state/adapters/index.js.map +0 -1
- package/dist/state/adapters/types.cjs.map +0 -1
- package/dist/state/adapters/types.js.map +0 -1
- package/dist/state/core/DerivedStateInstance.cjs.map +0 -1
- package/dist/state/core/DerivedStateInstance.js.map +0 -1
- package/dist/state/core/StateInstance.cjs.map +0 -1
- package/dist/state/core/StateInstance.js.map +0 -1
- package/dist/state/core/StateRegistry.cjs.map +0 -1
- package/dist/state/core/StateRegistry.js.map +0 -1
- package/dist/state/core/StateScope.cjs.map +0 -1
- package/dist/state/core/StateScope.js.map +0 -1
- package/dist/state/core/index.cjs.map +0 -1
- package/dist/state/core/index.js.map +0 -1
- package/dist/state/index.cjs.map +0 -1
- package/dist/state/index.js.map +0 -1
- package/dist/state/types.cjs.map +0 -1
- package/dist/state/types.js.map +0 -1
- package/dist/state.umd.js.map +0 -1
- package/dist/types.cjs.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/utils/analytics.cjs.map +0 -1
- package/dist/utils/analytics.js.map +0 -1
- package/dist/utils/configSecurity.cjs.map +0 -1
- package/dist/utils/configSecurity.js.map +0 -1
- package/dist/utils/csrf.cjs.map +0 -1
- package/dist/utils/csrf.js.map +0 -1
- package/dist/utils/errors/ErrorCodes.cjs.map +0 -1
- package/dist/utils/errors/ErrorCodes.js.map +0 -1
- package/dist/utils/errors.cjs.map +0 -1
- package/dist/utils/errors.js.map +0 -1
- package/dist/utils/index.cjs.map +0 -1
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/logger.cjs.map +0 -1
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/logger.types.cjs.map +0 -1
- package/dist/utils/logger.types.js.map +0 -1
- package/dist/utils/monitoring.cjs.map +0 -1
- package/dist/utils/monitoring.js.map +0 -1
- package/dist/utils/performance.cjs.map +0 -1
- package/dist/utils/performance.js.map +0 -1
- package/dist/utils/resourceLoader.cjs.map +0 -1
- package/dist/utils/resourceLoader.js.map +0 -1
- package/dist/utils/runtimeSecurity.cjs.map +0 -1
- package/dist/utils/runtimeSecurity.js.map +0 -1
- package/dist/utils/security.cjs.map +0 -1
- package/dist/utils/security.js.map +0 -1
- package/dist/utils/traceId.cjs.map +0 -1
- package/dist/utils/traceId.js.map +0 -1
- package/dist/utils/validation.cjs.map +0 -1
- package/dist/utils/validation.js.map +0 -1
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 监控插件
|
|
3
|
-
*
|
|
4
|
-
* 提供请求监控能力,包括耗时、错误率、上报等
|
|
5
|
-
*/ import { PluginPriority } from "./RequestPlugin";
|
|
6
|
-
import { logger } from "../../utils/logger";
|
|
7
|
-
import { getMonitoring } from "../../utils/monitoring";
|
|
8
|
-
import { errorUtils } from "../../utils/errors";
|
|
9
|
-
/**
|
|
10
|
-
* 监控事件类型
|
|
11
|
-
*/ export var MonitoringEventType = /*#__PURE__*/ function(MonitoringEventType) {
|
|
12
|
-
/**
|
|
13
|
-
* 请求开始
|
|
14
|
-
*/ MonitoringEventType["REQUEST_START"] = "request_start";
|
|
15
|
-
/**
|
|
16
|
-
* 请求成功
|
|
17
|
-
*/ MonitoringEventType["REQUEST_SUCCESS"] = "request_success";
|
|
18
|
-
/**
|
|
19
|
-
* 请求失败
|
|
20
|
-
*/ MonitoringEventType["REQUEST_ERROR"] = "request_error";
|
|
21
|
-
/**
|
|
22
|
-
* 请求完成(无论成功或失败)
|
|
23
|
-
*/ MonitoringEventType["REQUEST_COMPLETE"] = "request_complete";
|
|
24
|
-
return MonitoringEventType;
|
|
25
|
-
}({});
|
|
26
|
-
/**
|
|
27
|
-
* 创建监控插件
|
|
28
|
-
*
|
|
29
|
-
* @param config - 监控插件配置
|
|
30
|
-
* @returns 监控插件实例
|
|
31
|
-
*/ export function createMonitoringPlugin(config = {}) {
|
|
32
|
-
const { enabled = true, reporter, recordStart = true, recordSuccess = true, recordError = true, recordComplete = true, slowRequestThreshold = 3000 } = config;
|
|
33
|
-
// 如果没有提供上报函数,使用默认的 logger 输出
|
|
34
|
-
const defaultReporter = (event)=>{
|
|
35
|
-
logger.debug('[Request Monitoring]', event);
|
|
36
|
-
};
|
|
37
|
-
const report = reporter || defaultReporter;
|
|
38
|
-
return {
|
|
39
|
-
name: 'monitoring',
|
|
40
|
-
priority: PluginPriority.LOW,
|
|
41
|
-
async onBeforeRequest (context) {
|
|
42
|
-
if (!enabled) {
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
if (recordStart) {
|
|
46
|
-
const event = {
|
|
47
|
-
type: "request_start",
|
|
48
|
-
url: context.request.url,
|
|
49
|
-
method: context.request.method || 'GET',
|
|
50
|
-
tags: context.request.tags,
|
|
51
|
-
timestamp: Date.now()
|
|
52
|
-
};
|
|
53
|
-
try {
|
|
54
|
-
await report(event);
|
|
55
|
-
} catch (error) {
|
|
56
|
-
logger.error('监控上报失败:', error);
|
|
57
|
-
// 上报错误到监控服务
|
|
58
|
-
const monitoring = getMonitoring();
|
|
59
|
-
monitoring.captureError(error, {
|
|
60
|
-
type: 'monitoring_report_failed',
|
|
61
|
-
event: 'request_start'
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
},
|
|
66
|
-
async onAfterRequest (context) {
|
|
67
|
-
if (!enabled || !context.response) {
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
const duration = context.duration || 0;
|
|
71
|
-
const isSlow = duration > slowRequestThreshold;
|
|
72
|
-
if (recordSuccess) {
|
|
73
|
-
const event = {
|
|
74
|
-
type: "request_success",
|
|
75
|
-
url: context.request.url,
|
|
76
|
-
method: context.request.method || 'GET',
|
|
77
|
-
duration,
|
|
78
|
-
status: context.response.status,
|
|
79
|
-
tags: context.request.tags,
|
|
80
|
-
timestamp: Date.now()
|
|
81
|
-
};
|
|
82
|
-
try {
|
|
83
|
-
await report(event);
|
|
84
|
-
} catch (error) {
|
|
85
|
-
logger.error('监控上报失败:', error);
|
|
86
|
-
// 上报错误到监控服务
|
|
87
|
-
const monitoring = getMonitoring();
|
|
88
|
-
monitoring.captureError(error, {
|
|
89
|
-
type: 'monitoring_report_failed',
|
|
90
|
-
event: 'request_start'
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
if (recordComplete) {
|
|
95
|
-
const event = {
|
|
96
|
-
type: "request_complete",
|
|
97
|
-
url: context.request.url,
|
|
98
|
-
method: context.request.method || 'GET',
|
|
99
|
-
duration,
|
|
100
|
-
status: context.response.status,
|
|
101
|
-
tags: context.request.tags,
|
|
102
|
-
timestamp: Date.now()
|
|
103
|
-
};
|
|
104
|
-
try {
|
|
105
|
-
await report(event);
|
|
106
|
-
} catch (error) {
|
|
107
|
-
logger.error('监控上报失败:', error);
|
|
108
|
-
// 上报错误到监控服务
|
|
109
|
-
const monitoring = getMonitoring();
|
|
110
|
-
monitoring.captureError(error, {
|
|
111
|
-
type: 'monitoring_report_failed',
|
|
112
|
-
event: 'request_start'
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
// 如果是慢请求,额外记录
|
|
117
|
-
if (isSlow) {
|
|
118
|
-
logger.warn(`[Slow Request] ${context.request.method || 'GET'} ${context.request.url} took ${duration}ms`);
|
|
119
|
-
// 上报慢请求到监控服务
|
|
120
|
-
const monitoring = getMonitoring();
|
|
121
|
-
monitoring.captureError(new Error(`慢请求: ${context.request.method || 'GET'} ${context.request.url} 耗时 ${duration}ms`), {
|
|
122
|
-
type: 'slow_request',
|
|
123
|
-
duration,
|
|
124
|
-
method: context.request.method || 'GET',
|
|
125
|
-
url: context.request.url
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
},
|
|
129
|
-
async onError (context) {
|
|
130
|
-
if (!enabled || !context.error) {
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
const duration = context.duration || 0;
|
|
134
|
-
if (recordError) {
|
|
135
|
-
const error = context.error;
|
|
136
|
-
const event = {
|
|
137
|
-
type: "request_error",
|
|
138
|
-
url: context.request.url,
|
|
139
|
-
method: context.request.method || 'GET',
|
|
140
|
-
duration,
|
|
141
|
-
status: error.status,
|
|
142
|
-
error: {
|
|
143
|
-
type: error.type,
|
|
144
|
-
code: error.code,
|
|
145
|
-
message: error.message
|
|
146
|
-
},
|
|
147
|
-
tags: context.request.tags,
|
|
148
|
-
timestamp: Date.now()
|
|
149
|
-
};
|
|
150
|
-
// 上报错误到监控服务
|
|
151
|
-
const monitoring = getMonitoring();
|
|
152
|
-
const normalizedError = errorUtils.normalizeError(error);
|
|
153
|
-
monitoring.captureError(normalizedError, {
|
|
154
|
-
type: 'request_error',
|
|
155
|
-
url: context.request.url,
|
|
156
|
-
method: context.request.method || 'GET',
|
|
157
|
-
duration,
|
|
158
|
-
status: error.status,
|
|
159
|
-
errorType: error.type,
|
|
160
|
-
errorCode: error.code
|
|
161
|
-
});
|
|
162
|
-
try {
|
|
163
|
-
await report(event);
|
|
164
|
-
} catch (reportError) {
|
|
165
|
-
logger.error('监控上报失败:', reportError);
|
|
166
|
-
// 上报上报失败错误到监控服务
|
|
167
|
-
monitoring.captureError(reportError, {
|
|
168
|
-
type: 'monitoring_report_failed',
|
|
169
|
-
event: 'request_error'
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
if (recordComplete) {
|
|
174
|
-
const error = context.error;
|
|
175
|
-
const event = {
|
|
176
|
-
type: "request_complete",
|
|
177
|
-
url: context.request.url,
|
|
178
|
-
method: context.request.method || 'GET',
|
|
179
|
-
duration,
|
|
180
|
-
status: error.status,
|
|
181
|
-
error: {
|
|
182
|
-
type: error.type,
|
|
183
|
-
code: error.code,
|
|
184
|
-
message: error.message
|
|
185
|
-
},
|
|
186
|
-
tags: context.request.tags,
|
|
187
|
-
timestamp: Date.now()
|
|
188
|
-
};
|
|
189
|
-
try {
|
|
190
|
-
await report(event);
|
|
191
|
-
} catch (reportError) {
|
|
192
|
-
logger.error('监控上报失败:', reportError);
|
|
193
|
-
// 上报错误到监控服务
|
|
194
|
-
const monitoring = getMonitoring();
|
|
195
|
-
monitoring.captureError(reportError, {
|
|
196
|
-
type: 'monitoring_report_failed',
|
|
197
|
-
event: context.error ? 'request_error' : 'request_complete'
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
//# sourceMappingURL=monitoring.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/request/plugin/monitoring.ts"],"sourcesContent":["/**\n * 监控插件\n * \n * 提供请求监控能力,包括耗时、错误率、上报等\n */\n\nimport type { RequestPlugin } from './RequestPlugin';\nimport type { RequestContext } from '../types';\nimport type { RequestError } from '../types';\nimport { PluginPriority } from './RequestPlugin';\nimport { logger } from '../../utils/logger';\nimport { getMonitoring } from '../../utils/monitoring';\nimport { errorUtils } from '../../utils/errors';\n\n/**\n * 监控事件类型\n */\nexport enum MonitoringEventType {\n /**\n * 请求开始\n */\n REQUEST_START = 'request_start',\n\n /**\n * 请求成功\n */\n REQUEST_SUCCESS = 'request_success',\n\n /**\n * 请求失败\n */\n REQUEST_ERROR = 'request_error',\n\n /**\n * 请求完成(无论成功或失败)\n */\n REQUEST_COMPLETE = 'request_complete',\n}\n\n/**\n * 监控事件数据\n */\nexport interface MonitoringEvent {\n /**\n * 事件类型\n */\n type: MonitoringEventType;\n\n /**\n * 请求 URL\n */\n url: string;\n\n /**\n * 请求方法\n */\n method: string;\n\n /**\n * 请求耗时(毫秒)\n */\n duration?: number;\n\n /**\n * HTTP 状态码\n */\n status?: number;\n\n /**\n * 错误信息(如果有)\n */\n error?: {\n type: string;\n code: string;\n message: string;\n };\n\n /**\n * 请求标签\n */\n tags?: string[];\n\n /**\n * 时间戳\n */\n timestamp: number;\n}\n\n/**\n * 监控上报函数类型\n */\nexport type MonitoringReporter = (event: MonitoringEvent) => void | Promise<void>;\n\n/**\n * 监控插件配置\n */\nexport interface MonitoringPluginConfig {\n /**\n * 是否启用监控\n */\n enabled?: boolean;\n\n /**\n * 监控上报函数\n */\n reporter?: MonitoringReporter;\n\n /**\n * 是否记录请求开始事件\n */\n recordStart?: boolean;\n\n /**\n * 是否记录请求成功事件\n */\n recordSuccess?: boolean;\n\n /**\n * 是否记录请求错误事件\n */\n recordError?: boolean;\n\n /**\n * 是否记录请求完成事件\n */\n recordComplete?: boolean;\n\n /**\n * 慢请求阈值(毫秒),超过此阈值的请求会被标记为慢请求\n */\n slowRequestThreshold?: number;\n}\n\n/**\n * 创建监控插件\n * \n * @param config - 监控插件配置\n * @returns 监控插件实例\n */\nexport function createMonitoringPlugin(config: MonitoringPluginConfig = {}): RequestPlugin {\n const {\n enabled = true,\n reporter,\n recordStart = true,\n recordSuccess = true,\n recordError = true,\n recordComplete = true,\n slowRequestThreshold = 3000,\n } = config;\n\n // 如果没有提供上报函数,使用默认的 logger 输出\n const defaultReporter: MonitoringReporter = (event) => {\n logger.debug('[Request Monitoring]', event);\n };\n\n const report: MonitoringReporter = reporter || defaultReporter;\n\n return {\n name: 'monitoring',\n priority: PluginPriority.LOW, // 低优先级,用于日志和监控\n\n async onBeforeRequest(context: RequestContext): Promise<void> {\n if (!enabled) {\n return;\n }\n\n if (recordStart) {\n const event: MonitoringEvent = {\n type: MonitoringEventType.REQUEST_START,\n url: context.request.url,\n method: context.request.method || 'GET',\n tags: context.request.tags,\n timestamp: Date.now(),\n };\n\n try {\n await report(event);\n } catch (error) {\n logger.error('监控上报失败:', error);\n // 上报错误到监控服务\n const monitoring = getMonitoring();\n monitoring.captureError(error, {\n type: 'monitoring_report_failed',\n event: 'request_start',\n });\n }\n }\n },\n\n async onAfterRequest(context: RequestContext): Promise<void> {\n if (!enabled || !context.response) {\n return;\n }\n\n const duration = context.duration || 0;\n const isSlow = duration > slowRequestThreshold;\n\n if (recordSuccess) {\n const event: MonitoringEvent = {\n type: MonitoringEventType.REQUEST_SUCCESS,\n url: context.request.url,\n method: context.request.method || 'GET',\n duration,\n status: context.response.status,\n tags: context.request.tags,\n timestamp: Date.now(),\n };\n\n try {\n await report(event);\n } catch (error) {\n logger.error('监控上报失败:', error);\n // 上报错误到监控服务\n const monitoring = getMonitoring();\n monitoring.captureError(error, {\n type: 'monitoring_report_failed',\n event: 'request_start',\n });\n }\n }\n\n if (recordComplete) {\n const event: MonitoringEvent = {\n type: MonitoringEventType.REQUEST_COMPLETE,\n url: context.request.url,\n method: context.request.method || 'GET',\n duration,\n status: context.response.status,\n tags: context.request.tags,\n timestamp: Date.now(),\n };\n\n try {\n await report(event);\n } catch (error) {\n logger.error('监控上报失败:', error);\n // 上报错误到监控服务\n const monitoring = getMonitoring();\n monitoring.captureError(error, {\n type: 'monitoring_report_failed',\n event: 'request_start',\n });\n }\n }\n\n // 如果是慢请求,额外记录\n if (isSlow) {\n logger.warn(`[Slow Request] ${context.request.method || 'GET'} ${context.request.url} took ${duration}ms`);\n // 上报慢请求到监控服务\n const monitoring = getMonitoring();\n monitoring.captureError(\n new Error(`慢请求: ${context.request.method || 'GET'} ${context.request.url} 耗时 ${duration}ms`),\n {\n type: 'slow_request',\n duration,\n method: context.request.method || 'GET',\n url: context.request.url,\n }\n );\n }\n },\n\n async onError(context: RequestContext): Promise<void> {\n if (!enabled || !context.error) {\n return;\n }\n\n const duration = context.duration || 0;\n\n if (recordError) {\n const error = context.error as RequestError;\n const event: MonitoringEvent = {\n type: MonitoringEventType.REQUEST_ERROR,\n url: context.request.url,\n method: context.request.method || 'GET',\n duration,\n status: error.status,\n error: {\n type: error.type,\n code: error.code,\n message: error.message,\n },\n tags: context.request.tags,\n timestamp: Date.now(),\n };\n\n // 上报错误到监控服务\n const monitoring = getMonitoring();\n const normalizedError = errorUtils.normalizeError(error);\n monitoring.captureError(normalizedError, {\n type: 'request_error',\n url: context.request.url,\n method: context.request.method || 'GET',\n duration,\n status: error.status,\n errorType: error.type,\n errorCode: error.code,\n });\n\n try {\n await report(event);\n } catch (reportError) {\n logger.error('监控上报失败:', reportError);\n // 上报上报失败错误到监控服务\n monitoring.captureError(reportError, {\n type: 'monitoring_report_failed',\n event: 'request_error',\n });\n }\n }\n\n if (recordComplete) {\n const error = context.error as RequestError;\n const event: MonitoringEvent = {\n type: MonitoringEventType.REQUEST_COMPLETE,\n url: context.request.url,\n method: context.request.method || 'GET',\n duration,\n status: error.status,\n error: {\n type: error.type,\n code: error.code,\n message: error.message,\n },\n tags: context.request.tags,\n timestamp: Date.now(),\n };\n\n try {\n await report(event);\n } catch (reportError) {\n logger.error('监控上报失败:', reportError);\n // 上报错误到监控服务\n const monitoring = getMonitoring();\n monitoring.captureError(reportError, {\n type: 'monitoring_report_failed',\n event: context.error ? 'request_error' : 'request_complete',\n });\n }\n }\n },\n };\n}\n"],"names":["PluginPriority","logger","getMonitoring","errorUtils","MonitoringEventType","createMonitoringPlugin","config","enabled","reporter","recordStart","recordSuccess","recordError","recordComplete","slowRequestThreshold","defaultReporter","event","debug","report","name","priority","LOW","onBeforeRequest","context","type","url","request","method","tags","timestamp","Date","now","error","monitoring","captureError","onAfterRequest","response","duration","isSlow","status","warn","Error","onError","code","message","normalizedError","normalizeError","errorType","errorCode","reportError"],"mappings":"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"}
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 请求队列插件
|
|
3
|
-
*
|
|
4
|
-
* 当检测到特定的响应 code 或 status 时,暂停后续请求并放入队列,
|
|
5
|
-
* 执行回调方法,等待回调完成后继续执行队列中的请求
|
|
6
|
-
*/
|
|
7
|
-
import type { RequestPlugin } from './RequestPlugin';
|
|
8
|
-
import type { RequestContext, Response } from '../types';
|
|
9
|
-
/**
|
|
10
|
-
* 触发条件配置
|
|
11
|
-
*/
|
|
12
|
-
export interface QueueTriggerCondition {
|
|
13
|
-
/**
|
|
14
|
-
* 响应数据中的 code 字段值(业务状态码)
|
|
15
|
-
* 如果响应数据是对象且包含 code 字段,且值匹配则触发
|
|
16
|
-
*/
|
|
17
|
-
code?: number | string | ((code: unknown) => boolean);
|
|
18
|
-
/**
|
|
19
|
-
* HTTP 状态码
|
|
20
|
-
* 如果 HTTP status 匹配则触发
|
|
21
|
-
*/
|
|
22
|
-
status?: number | number[] | ((status: number) => boolean);
|
|
23
|
-
/**
|
|
24
|
-
* 自定义检查函数
|
|
25
|
-
* 返回 true 表示应该触发队列暂停
|
|
26
|
-
*/
|
|
27
|
-
check?: (response: Response, context: RequestContext) => boolean;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* 队列插件配置
|
|
31
|
-
*/
|
|
32
|
-
export interface QueuePluginConfig {
|
|
33
|
-
/**
|
|
34
|
-
* 触发条件列表
|
|
35
|
-
* 当响应匹配任一条件时,会暂停队列并执行回调
|
|
36
|
-
*/
|
|
37
|
-
triggers?: QueueTriggerCondition[];
|
|
38
|
-
/**
|
|
39
|
-
* 回调函数
|
|
40
|
-
* 当检测到触发条件时执行,返回 Promise 表示异步操作
|
|
41
|
-
*
|
|
42
|
-
* @param response - 触发条件的响应
|
|
43
|
-
* @param context - 请求上下文
|
|
44
|
-
* @returns Promise 或 void
|
|
45
|
-
*/
|
|
46
|
-
onTrigger?: (response: Response, context: RequestContext) => Promise<void> | void;
|
|
47
|
-
/**
|
|
48
|
-
* 是否启用队列功能
|
|
49
|
-
* @default true
|
|
50
|
-
*/
|
|
51
|
-
enabled?: boolean;
|
|
52
|
-
/**
|
|
53
|
-
* 是否在错误时也检查触发条件
|
|
54
|
-
* @default true
|
|
55
|
-
*/
|
|
56
|
-
checkOnError?: boolean;
|
|
57
|
-
/**
|
|
58
|
-
* 队列超时时间(毫秒)
|
|
59
|
-
* 如果队列暂停超过此时间,会自动恢复并拒绝队列中的请求
|
|
60
|
-
* @default 30000 (30秒)
|
|
61
|
-
*/
|
|
62
|
-
queueTimeout?: number;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* 创建请求队列插件
|
|
66
|
-
*
|
|
67
|
-
* @param config - 队列插件配置
|
|
68
|
-
* @returns 队列插件实例
|
|
69
|
-
*
|
|
70
|
-
* @example
|
|
71
|
-
* ```typescript
|
|
72
|
-
* import { createRequestClient } from '@vlian/request';
|
|
73
|
-
* import { createQueuePlugin } from '@vlian/request/plugin';
|
|
74
|
-
*
|
|
75
|
-
* const client = await createRequestClient({
|
|
76
|
-
* plugins: [
|
|
77
|
-
* createQueuePlugin({
|
|
78
|
-
* triggers: [
|
|
79
|
-
* { code: 401 }, // 业务 code 401 表示未授权
|
|
80
|
-
* { status: 401 }, // HTTP 401 未授权
|
|
81
|
-
* ],
|
|
82
|
-
* onTrigger: async (response, context) => {
|
|
83
|
-
* // 刷新 token 或跳转登录
|
|
84
|
-
* await refreshToken();
|
|
85
|
-
* },
|
|
86
|
-
* }),
|
|
87
|
-
* ],
|
|
88
|
-
* });
|
|
89
|
-
* ```
|
|
90
|
-
*/
|
|
91
|
-
export declare function createQueuePlugin(config?: QueuePluginConfig): RequestPlugin;
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 请求队列插件
|
|
3
|
-
*
|
|
4
|
-
* 当检测到特定的响应 code 或 status 时,暂停后续请求并放入队列,
|
|
5
|
-
* 执行回调方法,等待回调完成后继续执行队列中的请求
|
|
6
|
-
*/ import { PluginPriority } from "./RequestPlugin";
|
|
7
|
-
import { getRequestQueueManager } from "../utils/RequestQueueManager";
|
|
8
|
-
/**
|
|
9
|
-
* 检查响应是否匹配触发条件
|
|
10
|
-
*/ function matchesTrigger(response, context, trigger) {
|
|
11
|
-
// 检查自定义检查函数
|
|
12
|
-
if (trigger.check) {
|
|
13
|
-
return trigger.check(response, context);
|
|
14
|
-
}
|
|
15
|
-
// 检查响应数据中的 code 字段
|
|
16
|
-
if (trigger.code !== undefined) {
|
|
17
|
-
const responseData = response.data;
|
|
18
|
-
if (responseData && typeof responseData === 'object' && 'code' in responseData) {
|
|
19
|
-
const code = responseData.code;
|
|
20
|
-
if (typeof trigger.code === 'function') {
|
|
21
|
-
if (trigger.code(code)) {
|
|
22
|
-
return true;
|
|
23
|
-
}
|
|
24
|
-
} else if (code === trigger.code) {
|
|
25
|
-
return true;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
// 检查 HTTP 状态码
|
|
30
|
-
if (trigger.status !== undefined) {
|
|
31
|
-
const status = response.status;
|
|
32
|
-
if (typeof trigger.status === 'function') {
|
|
33
|
-
if (trigger.status(status)) {
|
|
34
|
-
return true;
|
|
35
|
-
}
|
|
36
|
-
} else if (Array.isArray(trigger.status)) {
|
|
37
|
-
if (trigger.status.includes(status)) {
|
|
38
|
-
return true;
|
|
39
|
-
}
|
|
40
|
-
} else if (status === trigger.status) {
|
|
41
|
-
return true;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return false;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* 检查响应是否匹配任一触发条件
|
|
48
|
-
*/ function matchesAnyTrigger(response, context, triggers) {
|
|
49
|
-
return triggers.some((trigger)=>matchesTrigger(response, context, trigger));
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* 创建请求队列插件
|
|
53
|
-
*
|
|
54
|
-
* @param config - 队列插件配置
|
|
55
|
-
* @returns 队列插件实例
|
|
56
|
-
*
|
|
57
|
-
* @example
|
|
58
|
-
* ```typescript
|
|
59
|
-
* import { createRequestClient } from '@vlian/framework/request';
|
|
60
|
-
* import { createQueuePlugin } from '@vlian/framework/request/plugin';
|
|
61
|
-
*
|
|
62
|
-
* const client = await createRequestClient({
|
|
63
|
-
* plugins: [
|
|
64
|
-
* createQueuePlugin({
|
|
65
|
-
* triggers: [
|
|
66
|
-
* { code: 401 }, // 业务 code 401 表示未授权
|
|
67
|
-
* { status: 401 }, // HTTP 401 未授权
|
|
68
|
-
* ],
|
|
69
|
-
* onTrigger: async (response, context) => {
|
|
70
|
-
* // 刷新 token 或跳转登录
|
|
71
|
-
* await refreshToken();
|
|
72
|
-
* },
|
|
73
|
-
* }),
|
|
74
|
-
* ],
|
|
75
|
-
* });
|
|
76
|
-
* ```
|
|
77
|
-
*/ export function createQueuePlugin(config = {}) {
|
|
78
|
-
const { triggers = [], onTrigger, enabled = true, checkOnError = true, queueTimeout = 30000 } = config;
|
|
79
|
-
if (triggers.length === 0) {
|
|
80
|
-
// 如果没有配置触发条件,返回一个空插件
|
|
81
|
-
return {
|
|
82
|
-
name: 'queue',
|
|
83
|
-
priority: PluginPriority.HIGH,
|
|
84
|
-
onBeforeRequest: undefined,
|
|
85
|
-
onAfterRequest: undefined,
|
|
86
|
-
onError: undefined
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
const queueManager = getRequestQueueManager();
|
|
90
|
-
return {
|
|
91
|
-
name: 'queue',
|
|
92
|
-
priority: PluginPriority.HIGH,
|
|
93
|
-
async onAfterRequest (context) {
|
|
94
|
-
if (!enabled || !context.response) {
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
// 检查是否匹配触发条件
|
|
98
|
-
const matched = matchesAnyTrigger(context.response, context, triggers);
|
|
99
|
-
if (matched && onTrigger) {
|
|
100
|
-
// 暂停队列(后续请求会被 RequestClient 自动放入队列)
|
|
101
|
-
queueManager.pause();
|
|
102
|
-
// 设置队列超时
|
|
103
|
-
const timeoutId = setTimeout(()=>{
|
|
104
|
-
queueManager.clear('队列超时');
|
|
105
|
-
}, queueTimeout);
|
|
106
|
-
try {
|
|
107
|
-
// 执行回调并等待完成,然后恢复队列
|
|
108
|
-
await queueManager.processAndResume(async ()=>{
|
|
109
|
-
await onTrigger(context.response, context);
|
|
110
|
-
});
|
|
111
|
-
} catch (error) {
|
|
112
|
-
// 回调执行失败,清空队列
|
|
113
|
-
queueManager.clear(`回调执行失败: ${error instanceof Error ? error.message : String(error)}`);
|
|
114
|
-
// 不抛出错误,让请求正常返回(但队列已被清空)
|
|
115
|
-
} finally{
|
|
116
|
-
clearTimeout(timeoutId);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
},
|
|
120
|
-
async onError (context) {
|
|
121
|
-
if (!enabled || !checkOnError || !context.error) {
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
// 如果有响应,检查是否匹配触发条件
|
|
125
|
-
if (context.response) {
|
|
126
|
-
const matched = matchesAnyTrigger(context.response, context, triggers);
|
|
127
|
-
if (matched && onTrigger) {
|
|
128
|
-
// 暂停队列(后续请求会被 RequestClient 自动放入队列)
|
|
129
|
-
queueManager.pause();
|
|
130
|
-
// 设置队列超时
|
|
131
|
-
const timeoutId = setTimeout(()=>{
|
|
132
|
-
queueManager.clear('队列超时');
|
|
133
|
-
}, queueTimeout);
|
|
134
|
-
try {
|
|
135
|
-
// 执行回调并等待完成,然后恢复队列
|
|
136
|
-
await queueManager.processAndResume(async ()=>{
|
|
137
|
-
await onTrigger(context.response, context);
|
|
138
|
-
});
|
|
139
|
-
// 错误已被处理,返回 true 阻止错误传播
|
|
140
|
-
return true;
|
|
141
|
-
} catch (error) {
|
|
142
|
-
// 回调执行失败,清空队列
|
|
143
|
-
queueManager.clear(`回调执行失败: ${error instanceof Error ? error.message : String(error)}`);
|
|
144
|
-
// 不处理错误,继续传播
|
|
145
|
-
return false;
|
|
146
|
-
} finally{
|
|
147
|
-
clearTimeout(timeoutId);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
return false;
|
|
152
|
-
}
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
//# sourceMappingURL=queue.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/request/plugin/queue.ts"],"sourcesContent":["/**\n * 请求队列插件\n * \n * 当检测到特定的响应 code 或 status 时,暂停后续请求并放入队列,\n * 执行回调方法,等待回调完成后继续执行队列中的请求\n */\n\nimport type { RequestPlugin } from './RequestPlugin';\nimport type { RequestContext, Response } from '../types';\nimport { PluginPriority } from './RequestPlugin';\nimport { getRequestQueueManager } from '../utils/RequestQueueManager';\n\n/**\n * 触发条件配置\n */\nexport interface QueueTriggerCondition {\n /**\n * 响应数据中的 code 字段值(业务状态码)\n * 如果响应数据是对象且包含 code 字段,且值匹配则触发\n */\n code?: number | string | ((code: unknown) => boolean);\n \n /**\n * HTTP 状态码\n * 如果 HTTP status 匹配则触发\n */\n status?: number | number[] | ((status: number) => boolean);\n \n /**\n * 自定义检查函数\n * 返回 true 表示应该触发队列暂停\n */\n check?: (response: Response, context: RequestContext) => boolean;\n}\n\n/**\n * 队列插件配置\n */\nexport interface QueuePluginConfig {\n /**\n * 触发条件列表\n * 当响应匹配任一条件时,会暂停队列并执行回调\n */\n triggers?: QueueTriggerCondition[];\n \n /**\n * 回调函数\n * 当检测到触发条件时执行,返回 Promise 表示异步操作\n * \n * @param response - 触发条件的响应\n * @param context - 请求上下文\n * @returns Promise 或 void\n */\n onTrigger?: (response: Response, context: RequestContext) => Promise<void> | void;\n \n /**\n * 是否启用队列功能\n * @default true\n */\n enabled?: boolean;\n \n /**\n * 是否在错误时也检查触发条件\n * @default true\n */\n checkOnError?: boolean;\n \n /**\n * 队列超时时间(毫秒)\n * 如果队列暂停超过此时间,会自动恢复并拒绝队列中的请求\n * @default 30000 (30秒)\n */\n queueTimeout?: number;\n}\n\n/**\n * 检查响应是否匹配触发条件\n */\nfunction matchesTrigger(\n response: Response,\n context: RequestContext,\n trigger: QueueTriggerCondition\n): boolean {\n // 检查自定义检查函数\n if (trigger.check) {\n return trigger.check(response, context);\n }\n \n // 检查响应数据中的 code 字段\n if (trigger.code !== undefined) {\n const responseData = response.data;\n if (responseData && typeof responseData === 'object' && 'code' in responseData) {\n const code = (responseData as { code: unknown }).code;\n \n if (typeof trigger.code === 'function') {\n if (trigger.code(code)) {\n return true;\n }\n } else if (code === trigger.code) {\n return true;\n }\n }\n }\n \n // 检查 HTTP 状态码\n if (trigger.status !== undefined) {\n const status = response.status;\n \n if (typeof trigger.status === 'function') {\n if (trigger.status(status)) {\n return true;\n }\n } else if (Array.isArray(trigger.status)) {\n if (trigger.status.includes(status)) {\n return true;\n }\n } else if (status === trigger.status) {\n return true;\n }\n }\n \n return false;\n}\n\n/**\n * 检查响应是否匹配任一触发条件\n */\nfunction matchesAnyTrigger(\n response: Response,\n context: RequestContext,\n triggers: QueueTriggerCondition[]\n): boolean {\n return triggers.some((trigger) => matchesTrigger(response, context, trigger));\n}\n\n/**\n * 创建请求队列插件\n * \n * @param config - 队列插件配置\n * @returns 队列插件实例\n * \n * @example\n * ```typescript\n * import { createRequestClient } from '@vlian/framework/request';\n * import { createQueuePlugin } from '@vlian/framework/request/plugin';\n * \n * const client = await createRequestClient({\n * plugins: [\n * createQueuePlugin({\n * triggers: [\n * { code: 401 }, // 业务 code 401 表示未授权\n * { status: 401 }, // HTTP 401 未授权\n * ],\n * onTrigger: async (response, context) => {\n * // 刷新 token 或跳转登录\n * await refreshToken();\n * },\n * }),\n * ],\n * });\n * ```\n */\nexport function createQueuePlugin(config: QueuePluginConfig = {}): RequestPlugin {\n const {\n triggers = [],\n onTrigger,\n enabled = true,\n checkOnError = true,\n queueTimeout = 30000,\n } = config;\n \n if (triggers.length === 0) {\n // 如果没有配置触发条件,返回一个空插件\n return {\n name: 'queue',\n priority: PluginPriority.HIGH,\n onBeforeRequest: undefined,\n onAfterRequest: undefined,\n onError: undefined,\n };\n }\n \n const queueManager = getRequestQueueManager();\n \n return {\n name: 'queue',\n priority: PluginPriority.HIGH, // 高优先级,确保在其他插件之前执行\n \n async onAfterRequest(context: RequestContext): Promise<Response | void> {\n if (!enabled || !context.response) {\n return;\n }\n \n // 检查是否匹配触发条件\n const matched = matchesAnyTrigger(context.response, context, triggers);\n \n if (matched && onTrigger) {\n // 暂停队列(后续请求会被 RequestClient 自动放入队列)\n queueManager.pause();\n \n // 设置队列超时\n const timeoutId = setTimeout(() => {\n queueManager.clear('队列超时');\n }, queueTimeout);\n \n try {\n // 执行回调并等待完成,然后恢复队列\n await queueManager.processAndResume(async () => {\n await onTrigger(context.response!, context);\n });\n } catch (error) {\n // 回调执行失败,清空队列\n queueManager.clear(`回调执行失败: ${error instanceof Error ? error.message : String(error)}`);\n // 不抛出错误,让请求正常返回(但队列已被清空)\n } finally {\n clearTimeout(timeoutId);\n }\n }\n },\n \n async onError(context: RequestContext): Promise<boolean | void> {\n if (!enabled || !checkOnError || !context.error) {\n return;\n }\n \n // 如果有响应,检查是否匹配触发条件\n if (context.response) {\n const matched = matchesAnyTrigger(context.response, context, triggers);\n \n if (matched && onTrigger) {\n // 暂停队列(后续请求会被 RequestClient 自动放入队列)\n queueManager.pause();\n \n // 设置队列超时\n const timeoutId = setTimeout(() => {\n queueManager.clear('队列超时');\n }, queueTimeout);\n \n try {\n // 执行回调并等待完成,然后恢复队列\n await queueManager.processAndResume(async () => {\n await onTrigger(context.response!, context);\n });\n \n // 错误已被处理,返回 true 阻止错误传播\n return true;\n } catch (error) {\n // 回调执行失败,清空队列\n queueManager.clear(`回调执行失败: ${error instanceof Error ? error.message : String(error)}`);\n // 不处理错误,继续传播\n return false;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n }\n \n return false;\n },\n };\n}\n"],"names":["PluginPriority","getRequestQueueManager","matchesTrigger","response","context","trigger","check","code","undefined","responseData","data","status","Array","isArray","includes","matchesAnyTrigger","triggers","some","createQueuePlugin","config","onTrigger","enabled","checkOnError","queueTimeout","length","name","priority","HIGH","onBeforeRequest","onAfterRequest","onError","queueManager","matched","pause","timeoutId","setTimeout","clear","processAndResume","error","Error","message","String","clearTimeout"],"mappings":"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"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 重试插件
|
|
3
|
-
*
|
|
4
|
-
* 提供请求重试能力,支持指数退避、条件重试
|
|
5
|
-
*/
|
|
6
|
-
import type { RequestPlugin } from './RequestPlugin';
|
|
7
|
-
/**
|
|
8
|
-
* 重试插件配置
|
|
9
|
-
*/
|
|
10
|
-
export interface RetryPluginConfig {
|
|
11
|
-
/**
|
|
12
|
-
* 默认最大重试次数
|
|
13
|
-
*/
|
|
14
|
-
defaultMaxAttempts?: number;
|
|
15
|
-
/**
|
|
16
|
-
* 默认重试延迟(毫秒)
|
|
17
|
-
*/
|
|
18
|
-
defaultDelay?: number;
|
|
19
|
-
/**
|
|
20
|
-
* 是否默认启用指数退避
|
|
21
|
-
*/
|
|
22
|
-
defaultExponentialBackoff?: boolean;
|
|
23
|
-
/**
|
|
24
|
-
* 是否启用重试
|
|
25
|
-
*/
|
|
26
|
-
enabled?: boolean;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* 创建重试插件
|
|
30
|
-
*
|
|
31
|
-
* @param config - 重试插件配置
|
|
32
|
-
* @returns 重试插件实例
|
|
33
|
-
*/
|
|
34
|
-
export declare function createRetryPlugin(config?: RetryPluginConfig): RequestPlugin;
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 重试插件
|
|
3
|
-
*
|
|
4
|
-
* 提供请求重试能力,支持指数退避、条件重试
|
|
5
|
-
*/ import { RequestErrorType } from "../types";
|
|
6
|
-
import { PluginPriority } from "./RequestPlugin";
|
|
7
|
-
/**
|
|
8
|
-
* 计算指数退避延迟
|
|
9
|
-
*/ function calculateExponentialBackoffDelay(attempt, baseDelay) {
|
|
10
|
-
return baseDelay * Math.pow(2, attempt - 1);
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* 默认重试条件
|
|
14
|
-
*/ function defaultShouldRetry(error, attempt, maxAttempts) {
|
|
15
|
-
if (attempt >= maxAttempts) {
|
|
16
|
-
return false;
|
|
17
|
-
}
|
|
18
|
-
// 如果是请求错误,检查错误类型
|
|
19
|
-
if (error && typeof error === 'object' && 'type' in error) {
|
|
20
|
-
const requestError = error;
|
|
21
|
-
// 网络错误、超时错误、服务器错误(5xx)可以重试
|
|
22
|
-
if (requestError.type === RequestErrorType.NETWORK_ERROR || requestError.type === RequestErrorType.TIMEOUT_ERROR || requestError.type === RequestErrorType.HTTP_ERROR && requestError.status && requestError.status >= 500) {
|
|
23
|
-
return true;
|
|
24
|
-
}
|
|
25
|
-
// 客户端错误(4xx)不重试,除了 408(请求超时)和 429(请求过多)
|
|
26
|
-
if (requestError.type === RequestErrorType.HTTP_ERROR && requestError.status) {
|
|
27
|
-
return requestError.status === 408 || requestError.status === 429;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
// 其他错误不重试
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* 创建重试插件
|
|
35
|
-
*
|
|
36
|
-
* @param config - 重试插件配置
|
|
37
|
-
* @returns 重试插件实例
|
|
38
|
-
*/ export function createRetryPlugin(config = {}) {
|
|
39
|
-
const { defaultMaxAttempts = 3, defaultDelay = 1000, defaultExponentialBackoff = true, enabled = true } = config;
|
|
40
|
-
return {
|
|
41
|
-
name: 'retry',
|
|
42
|
-
priority: PluginPriority.LOWEST,
|
|
43
|
-
async onError (context) {
|
|
44
|
-
if (!enabled || !context.error) {
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
const retryConfig = context.request.retry;
|
|
48
|
-
if (!retryConfig) {
|
|
49
|
-
// 如果没有配置重试,使用默认配置
|
|
50
|
-
const maxAttempts = defaultMaxAttempts;
|
|
51
|
-
const delay = defaultDelay;
|
|
52
|
-
const exponentialBackoff = defaultExponentialBackoff;
|
|
53
|
-
// 检查是否应该重试
|
|
54
|
-
const shouldRetry = defaultShouldRetry(context.error, context.retryCount, maxAttempts);
|
|
55
|
-
if (!shouldRetry) {
|
|
56
|
-
return false; // 不处理错误,继续传播
|
|
57
|
-
}
|
|
58
|
-
// 计算延迟
|
|
59
|
-
const retryDelay = exponentialBackoff ? calculateExponentialBackoffDelay(context.retryCount + 1, delay) : delay;
|
|
60
|
-
// 等待后重试
|
|
61
|
-
await new Promise((resolve)=>setTimeout(resolve, retryDelay));
|
|
62
|
-
// 增加重试计数
|
|
63
|
-
context.retryCount += 1;
|
|
64
|
-
// 返回 false,让错误继续传播,触发重新请求
|
|
65
|
-
return false;
|
|
66
|
-
}
|
|
67
|
-
// 使用配置的重试逻辑
|
|
68
|
-
const maxAttempts = retryConfig.maxAttempts || defaultMaxAttempts;
|
|
69
|
-
const shouldRetry = retryConfig.shouldRetry ? retryConfig.shouldRetry(context.error, context.retryCount) : defaultShouldRetry(context.error, context.retryCount, maxAttempts);
|
|
70
|
-
if (!shouldRetry) {
|
|
71
|
-
return false; // 不处理错误,继续传播
|
|
72
|
-
}
|
|
73
|
-
// 计算延迟
|
|
74
|
-
let retryDelay;
|
|
75
|
-
if (retryConfig.calculateDelay) {
|
|
76
|
-
retryDelay = retryConfig.calculateDelay(context.retryCount + 1);
|
|
77
|
-
} else if (retryConfig.exponentialBackoff !== false) {
|
|
78
|
-
const baseDelay = retryConfig.delay || defaultDelay;
|
|
79
|
-
retryDelay = calculateExponentialBackoffDelay(context.retryCount + 1, baseDelay);
|
|
80
|
-
} else {
|
|
81
|
-
retryDelay = retryConfig.delay || defaultDelay;
|
|
82
|
-
}
|
|
83
|
-
// 等待后重试
|
|
84
|
-
await new Promise((resolve)=>setTimeout(resolve, retryDelay));
|
|
85
|
-
// 增加重试计数
|
|
86
|
-
context.retryCount += 1;
|
|
87
|
-
// 返回 false,让错误继续传播,触发重新请求
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
//# sourceMappingURL=retry.js.map
|
|
@@ -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":["RequestErrorType","PluginPriority","calculateExponentialBackoffDelay","attempt","baseDelay","Math","pow","defaultShouldRetry","error","maxAttempts","requestError","type","NETWORK_ERROR","TIMEOUT_ERROR","HTTP_ERROR","status","createRetryPlugin","config","defaultMaxAttempts","defaultDelay","defaultExponentialBackoff","enabled","name","priority","LOWEST","onError","context","retryConfig","request","retry","delay","exponentialBackoff","shouldRetry","retryCount","retryDelay","Promise","resolve","setTimeout","calculateDelay"],"mappings":"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"}
|