@vlian/framework 1.2.37 → 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 +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 +1 -1
- 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 +1 -1
- package/dist/core/router/monitoring/RouterMonitoring.cjs.map +1 -1
- package/dist/core/router/monitoring/RouterMonitoring.js +1 -1
- 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 +2 -2
- package/dist/core/router/utils/adapters/react-router/transform.cjs.map +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.js +1 -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 +14 -14
- package/dist/core/startup/initializeServices.cjs.map +1 -1
- package/dist/core/startup/initializeServices.d.ts +1 -1
- package/dist/core/startup/initializeServices.js +2 -2
- package/dist/core/startup/initializeServices.js.map +1 -1
- package/dist/core/startup/renderApp.cjs +2 -2
- package/dist/core/startup/renderApp.cjs.map +1 -1
- package/dist/core/startup/renderApp.js +1 -1
- package/dist/core/startup/renderApp.js.map +1 -1
- package/dist/core/startup/startApp.cjs +22 -22
- package/dist/core/startup/startApp.cjs.map +1 -1
- package/dist/core/startup/startApp.js +2 -2
- package/dist/core/startup/startApp.js.map +1 -1
- package/dist/core/types.d.ts +2 -2
- package/dist/core/types.js.map +1 -1
- package/dist/index.umd.js +1394 -1401
- package/dist/index.umd.js.map +1 -1
- package/dist/kernel/constants.cjs +2 -2
- package/dist/kernel/constants.cjs.map +1 -1
- package/dist/kernel/constants.js +1 -1
- package/dist/kernel/constants.js.map +1 -1
- package/dist/kernel/manager/loggerManager.cjs +10 -10
- package/dist/kernel/manager/loggerManager.cjs.map +1 -1
- package/dist/kernel/manager/loggerManager.d.ts +1 -1
- package/dist/kernel/manager/loggerManager.js +1 -1
- package/dist/kernel/manager/loggerManager.js.map +1 -1
- package/dist/kernel/types.d.ts +1 -1
- package/dist/kernel/types.js.map +1 -1
- 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/state.umd.js +1 -1
- package/dist/utils/errors.cjs +71 -15
- package/dist/utils/errors.cjs.map +1 -1
- package/dist/utils/errors.d.ts +30 -1
- package/dist/utils/errors.js +16 -1
- package/dist/utils/errors.js.map +1 -1
- package/package.json +1 -1
package/dist/index.umd.js
CHANGED
|
@@ -1,14 +1,33 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @vlian/framework v1.2.
|
|
2
|
+
* @vlian/framework v1.2.37
|
|
3
3
|
* Secra Framework - 一个现代化的低代码框架
|
|
4
4
|
* (c) 2026 Secra Framework Contributors
|
|
5
5
|
* Licensed under Apache-2.0
|
|
6
6
|
*/
|
|
7
7
|
(function (global, factory) {
|
|
8
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@vlian/utils'), require('@vlian/
|
|
9
|
-
typeof define === 'function' && define.amd ? define(['exports', '@vlian/utils', '@vlian/
|
|
10
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.vlianFramework = {}, global.
|
|
11
|
-
})(this, (function (exports,
|
|
8
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@vlian/utils'), require('@vlian/logger'), require('@vlian/monitoring'), require('react/jsx-runtime'), require('react-dom/client'), require('react'), require('react-router-dom'), require('zod'), require('i18next'), require('react-i18next'), require('@vlian/request'), require('@vlian/csrf')) :
|
|
9
|
+
typeof define === 'function' && define.amd ? define(['exports', '@vlian/utils', '@vlian/logger', '@vlian/monitoring', 'react/jsx-runtime', 'react-dom/client', 'react', 'react-router-dom', 'zod', 'i18next', 'react-i18next', '@vlian/request', '@vlian/csrf'], factory) :
|
|
10
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.vlianFramework = {}, global.vlianUtils, global.logger, global.monitoring, global.jsxRuntime, global.ReactDOMClient, global.React, global.ReactRouterDOM, global.z, global.i18next, global.ReactI18next, global.request, global.csrf));
|
|
11
|
+
})(this, (function (exports, vlianUtils, logger, monitoring, jsxRuntime, client, React, reactRouterDom, zod, i18n, reactI18next, request, csrf) { 'use strict';
|
|
12
|
+
|
|
13
|
+
function _interopNamespaceDefault(e) {
|
|
14
|
+
var n = Object.create(null);
|
|
15
|
+
if (e) {
|
|
16
|
+
Object.keys(e).forEach(function (k) {
|
|
17
|
+
if (k !== 'default') {
|
|
18
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
19
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
get: function () { return e[k]; }
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
n.default = e;
|
|
27
|
+
return Object.freeze(n);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
var vlianUtils__namespace = /*#__PURE__*/_interopNamespaceDefault(vlianUtils);
|
|
12
31
|
|
|
13
32
|
const local$1 = {
|
|
14
33
|
notfound: {
|
|
@@ -359,17 +378,17 @@
|
|
|
359
378
|
return Storage.instance;
|
|
360
379
|
}
|
|
361
380
|
initialize(options) {
|
|
362
|
-
const local =
|
|
381
|
+
const local = vlianUtils.createStorage({
|
|
363
382
|
type: 'local',
|
|
364
383
|
prefix: options?.prefix || 'vlian',
|
|
365
384
|
defaultExpire: options?.defaultExpire || 24 * 60 * 60 * 1000
|
|
366
385
|
});
|
|
367
|
-
const session =
|
|
386
|
+
const session = vlianUtils.createStorage({
|
|
368
387
|
type: 'session',
|
|
369
388
|
prefix: options?.prefix || 'vlian',
|
|
370
389
|
defaultExpire: options?.defaultExpire || 24 * 60 * 60 * 1000
|
|
371
390
|
});
|
|
372
|
-
const indexedDB =
|
|
391
|
+
const indexedDB = vlianUtils.createStorage({
|
|
373
392
|
type: 'indexedDB',
|
|
374
393
|
prefix: options?.prefix || 'vlian',
|
|
375
394
|
defaultExpire: options?.defaultExpire || 24 * 60 * 60 * 1000,
|
|
@@ -417,183 +436,115 @@
|
|
|
417
436
|
const storage = Storage.getInstance();
|
|
418
437
|
|
|
419
438
|
/**
|
|
420
|
-
*
|
|
421
|
-
|
|
439
|
+
* 插件沙箱
|
|
440
|
+
* 用于插件隔离和权限控制
|
|
441
|
+
*/ function _define_property$I(obj, key, value) {
|
|
442
|
+
if (key in obj) {
|
|
443
|
+
Object.defineProperty(obj, key, {
|
|
444
|
+
value: value,
|
|
445
|
+
enumerable: true,
|
|
446
|
+
configurable: true,
|
|
447
|
+
writable: true
|
|
448
|
+
});
|
|
449
|
+
} else {
|
|
450
|
+
obj[key] = value;
|
|
451
|
+
}
|
|
452
|
+
return obj;
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* 插件沙箱
|
|
456
|
+
*/ class PluginSandbox {
|
|
422
457
|
/**
|
|
423
|
-
*
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
if (!
|
|
429
|
-
|
|
430
|
-
}
|
|
431
|
-
if (!signature || signature.length === 0) {
|
|
432
|
-
throw new utils.SecurityError('签名不能为空');
|
|
433
|
-
}
|
|
434
|
-
try {
|
|
435
|
-
// 使用 Web Crypto API 验证签名
|
|
436
|
-
if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {
|
|
437
|
-
throw new utils.SecurityError('签名验证需要浏览器支持 Web Crypto API');
|
|
438
|
-
}
|
|
439
|
-
// 将配置转换为字符串(用于签名验证)
|
|
440
|
-
// 使用稳定的 JSON 序列化(按键排序)
|
|
441
|
-
const configString = JSON.stringify(config, Object.keys(config).sort());
|
|
442
|
-
const encoder = new TextEncoder();
|
|
443
|
-
const data = encoder.encode(configString);
|
|
444
|
-
// 将签名从 Base64 解码
|
|
445
|
-
const signatureBuffer = Uint8Array.from(atob(signature), (c)=>c.charCodeAt(0));
|
|
446
|
-
// 导入公钥(支持 PEM 格式)
|
|
447
|
-
const algorithm = options.algorithm || 'RSASSA-PKCS1-v1_5';
|
|
448
|
-
let publicKey;
|
|
449
|
-
try {
|
|
450
|
-
// 尝试导入 PEM 格式的公钥
|
|
451
|
-
const pemHeader = '-----BEGIN PUBLIC KEY-----';
|
|
452
|
-
const pemFooter = '-----END PUBLIC KEY-----';
|
|
453
|
-
let pemKey = options.publicKey;
|
|
454
|
-
if (!pemKey.includes(pemHeader)) {
|
|
455
|
-
pemKey = `${pemHeader}\n${pemKey}\n${pemFooter}`;
|
|
456
|
-
}
|
|
457
|
-
// 将 PEM 转换为 ArrayBuffer
|
|
458
|
-
const pemContents = pemKey.replace(pemHeader, '').replace(pemFooter, '').replace(/\s/g, '');
|
|
459
|
-
const binaryDer = Uint8Array.from(atob(pemContents), (c)=>c.charCodeAt(0));
|
|
460
|
-
publicKey = await window.crypto.subtle.importKey('spki', binaryDer.buffer, {
|
|
461
|
-
name: algorithm,
|
|
462
|
-
hash: 'SHA-256'
|
|
463
|
-
}, false, [
|
|
464
|
-
'verify'
|
|
465
|
-
]);
|
|
466
|
-
} catch (importError) {
|
|
467
|
-
throw new utils.SecurityError('公钥导入失败', importError instanceof Error ? importError : undefined);
|
|
468
|
-
}
|
|
469
|
-
// 验证签名
|
|
470
|
-
const isValid = await window.crypto.subtle.verify({
|
|
471
|
-
name: algorithm
|
|
472
|
-
}, publicKey, signatureBuffer, data);
|
|
473
|
-
return isValid;
|
|
474
|
-
} catch (error) {
|
|
475
|
-
if (error instanceof utils.SecurityError) {
|
|
476
|
-
throw error;
|
|
477
|
-
}
|
|
478
|
-
throw new utils.SecurityError('签名验证失败', error instanceof Error ? error : undefined);
|
|
458
|
+
* 检查权限
|
|
459
|
+
*
|
|
460
|
+
* @param permission - 权限
|
|
461
|
+
* @returns 是否有权限
|
|
462
|
+
*/ hasPermission(permission) {
|
|
463
|
+
if (!this.config.strictMode) {
|
|
464
|
+
return true; // 非严格模式,允许所有权限
|
|
479
465
|
}
|
|
466
|
+
return this.permissions.has(permission);
|
|
480
467
|
}
|
|
481
468
|
/**
|
|
482
|
-
*
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
469
|
+
* 检查是否可以访问配置键
|
|
470
|
+
*
|
|
471
|
+
* @param key - 配置键
|
|
472
|
+
* @returns 是否可以访问
|
|
473
|
+
*/ canAccessConfig(key) {
|
|
474
|
+
if (!this.hasPermission("access_config")) {
|
|
475
|
+
return false;
|
|
486
476
|
}
|
|
487
|
-
if (
|
|
488
|
-
return
|
|
477
|
+
if (this.config.configWhitelist && this.config.configWhitelist.length > 0) {
|
|
478
|
+
return this.config.configWhitelist.includes(key);
|
|
489
479
|
}
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
480
|
+
return true;
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* 检查是否可以访问状态作用域
|
|
484
|
+
*
|
|
485
|
+
* @param scope - 状态作用域
|
|
486
|
+
* @returns 是否可以访问
|
|
487
|
+
*/ canAccessStateScope(scope) {
|
|
488
|
+
if (!this.hasPermission("access_state_manager")) {
|
|
489
|
+
return false;
|
|
495
490
|
}
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
try {
|
|
499
|
-
const refererOrigin = new URL(referer).origin;
|
|
500
|
-
if (options.allowedOrigins.includes(refererOrigin)) {
|
|
501
|
-
return true;
|
|
502
|
-
}
|
|
503
|
-
} catch {
|
|
504
|
-
// Referer 解析失败
|
|
505
|
-
}
|
|
491
|
+
if (this.config.stateScopeWhitelist && this.config.stateScopeWhitelist.length > 0) {
|
|
492
|
+
return this.config.stateScopeWhitelist.includes(scope);
|
|
506
493
|
}
|
|
507
|
-
return
|
|
494
|
+
return true;
|
|
508
495
|
}
|
|
509
496
|
/**
|
|
510
|
-
*
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
if (invalidKeys.length > 0) {
|
|
518
|
-
errors.push(`配置包含不允许的键: ${invalidKeys.join(', ')}`);
|
|
519
|
-
}
|
|
497
|
+
* 过滤配置(根据白名单)
|
|
498
|
+
*
|
|
499
|
+
* @param config - 完整配置
|
|
500
|
+
* @returns 过滤后的配置
|
|
501
|
+
*/ filterConfig(config) {
|
|
502
|
+
if (!this.hasPermission("access_config")) {
|
|
503
|
+
return {};
|
|
520
504
|
}
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
const configKeys = Object.keys(config);
|
|
524
|
-
const forbiddenFound = configKeys.filter((key)=>options.forbiddenKeys.includes(key));
|
|
525
|
-
if (forbiddenFound.length > 0) {
|
|
526
|
-
errors.push(`配置包含禁止的键: ${forbiddenFound.join(', ')}`);
|
|
527
|
-
}
|
|
505
|
+
if (!this.config.configWhitelist || this.config.configWhitelist.length === 0) {
|
|
506
|
+
return config;
|
|
528
507
|
}
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
errors.push(...result.errors);
|
|
508
|
+
const filtered = {};
|
|
509
|
+
for (const key of this.config.configWhitelist){
|
|
510
|
+
if (key in config) {
|
|
511
|
+
filtered[key] = config[key];
|
|
534
512
|
}
|
|
535
513
|
}
|
|
514
|
+
return filtered;
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* 获取沙箱配置
|
|
518
|
+
*/ getConfig() {
|
|
536
519
|
return {
|
|
537
|
-
|
|
538
|
-
errors
|
|
520
|
+
...this.config
|
|
539
521
|
};
|
|
540
522
|
}
|
|
541
523
|
/**
|
|
542
|
-
*
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
const validation = utils.SecurityUtils.validateInput(value);
|
|
549
|
-
if (validation.safe && validation.sanitized) {
|
|
550
|
-
sanitized[key] = validation.sanitized;
|
|
551
|
-
} else {
|
|
552
|
-
// 包含危险内容,跳过或记录警告
|
|
553
|
-
console.warn(`配置项 ${key} 包含潜在危险内容,已跳过`);
|
|
554
|
-
}
|
|
555
|
-
} else if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
556
|
-
// 递归清理对象
|
|
557
|
-
sanitized[key] = this.sanitizeConfig(value);
|
|
558
|
-
} else {
|
|
559
|
-
sanitized[key] = value;
|
|
560
|
-
}
|
|
561
|
-
}
|
|
562
|
-
return sanitized;
|
|
524
|
+
* 更新权限
|
|
525
|
+
*
|
|
526
|
+
* @param permissions - 权限列表
|
|
527
|
+
*/ updatePermissions(permissions) {
|
|
528
|
+
this.permissions = new Set(permissions);
|
|
529
|
+
this.config.permissions = permissions;
|
|
563
530
|
}
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
const originValid = this.verifyOrigin(options.origin);
|
|
571
|
-
if (!originValid) {
|
|
572
|
-
errors.push('配置来源验证失败');
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
// 验证白名单
|
|
576
|
-
if (options.whitelist) {
|
|
577
|
-
const whitelistResult = this.verifyWhitelist(config, options.whitelist);
|
|
578
|
-
if (!whitelistResult.valid) {
|
|
579
|
-
errors.push(...whitelistResult.errors);
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
// 清理配置(已实现但暂不使用返回值)
|
|
583
|
-
// const sanitizedConfig = this.sanitizeConfig(config);
|
|
584
|
-
return {
|
|
585
|
-
valid: errors.length === 0,
|
|
586
|
-
errors
|
|
531
|
+
constructor(config){
|
|
532
|
+
_define_property$I(this, "config", void 0);
|
|
533
|
+
_define_property$I(this, "permissions", void 0);
|
|
534
|
+
this.config = {
|
|
535
|
+
strictMode: true,
|
|
536
|
+
...config
|
|
587
537
|
};
|
|
538
|
+
this.permissions = new Set(config.permissions || []);
|
|
588
539
|
}
|
|
589
540
|
}
|
|
590
541
|
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
542
|
+
/**
|
|
543
|
+
* 插件事件总线
|
|
544
|
+
* 用于插件间通信
|
|
545
|
+
*/ /**
|
|
546
|
+
* 事件监听器类型
|
|
547
|
+
*/ function _define_property$H(obj, key, value) {
|
|
597
548
|
if (key in obj) {
|
|
598
549
|
Object.defineProperty(obj, key, {
|
|
599
550
|
value: value,
|
|
@@ -607,227 +558,273 @@
|
|
|
607
558
|
return obj;
|
|
608
559
|
}
|
|
609
560
|
/**
|
|
610
|
-
*
|
|
611
|
-
*/ class
|
|
561
|
+
* 事件总线
|
|
562
|
+
*/ class PluginEventBus {
|
|
612
563
|
/**
|
|
613
|
-
*
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
}
|
|
622
|
-
/**
|
|
623
|
-
* 停止批量上报定时器
|
|
624
|
-
*/ stopBatchTimer() {
|
|
625
|
-
if (this.batchTimer) {
|
|
626
|
-
clearInterval(this.batchTimer);
|
|
627
|
-
this.batchTimer = null;
|
|
564
|
+
* 订阅事件
|
|
565
|
+
*
|
|
566
|
+
* @param event - 事件名称
|
|
567
|
+
* @param listener - 事件监听器(可以接收 EventWrapper 或直接数据)
|
|
568
|
+
* @returns 取消订阅函数
|
|
569
|
+
*/ on(event, listener) {
|
|
570
|
+
if (!this.listeners.has(event)) {
|
|
571
|
+
this.listeners.set(event, new Set());
|
|
628
572
|
}
|
|
573
|
+
const listeners = this.listeners.get(event);
|
|
574
|
+
listeners.add(listener);
|
|
575
|
+
// 返回取消订阅函数
|
|
576
|
+
return ()=>{
|
|
577
|
+
listeners.delete(listener);
|
|
578
|
+
if (listeners.size === 0) {
|
|
579
|
+
this.listeners.delete(event);
|
|
580
|
+
}
|
|
581
|
+
};
|
|
629
582
|
}
|
|
630
583
|
/**
|
|
631
|
-
*
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
584
|
+
* 取消订阅事件
|
|
585
|
+
*
|
|
586
|
+
* @param event - 事件名称
|
|
587
|
+
* @param listener - 事件监听器
|
|
588
|
+
*/ off(event, listener) {
|
|
589
|
+
const listeners = this.listeners.get(event);
|
|
590
|
+
if (listeners) {
|
|
591
|
+
listeners.delete(listener);
|
|
592
|
+
if (listeners.size === 0) {
|
|
593
|
+
this.listeners.delete(event);
|
|
594
|
+
}
|
|
635
595
|
}
|
|
636
|
-
|
|
637
|
-
|
|
596
|
+
}
|
|
597
|
+
/**
|
|
598
|
+
* 发布事件
|
|
599
|
+
*
|
|
600
|
+
* @param event - 事件名称
|
|
601
|
+
* @param data - 事件数据
|
|
602
|
+
* @param metadata - 事件元数据(可选)
|
|
603
|
+
*/ async emit(event, data, metadata) {
|
|
604
|
+
// 事件验证
|
|
605
|
+
if (this.config.enableValidation && !this.config.validator(event, data)) {
|
|
606
|
+
console.warn(`事件 ${event} 验证失败,已忽略`);
|
|
638
607
|
return;
|
|
639
608
|
}
|
|
640
|
-
//
|
|
641
|
-
const
|
|
642
|
-
|
|
643
|
-
timestamp: Date.now(),
|
|
644
|
-
|
|
609
|
+
// 构建事件元数据
|
|
610
|
+
const eventMetadata = {
|
|
611
|
+
source: metadata?.source,
|
|
612
|
+
timestamp: metadata?.timestamp ?? Date.now(),
|
|
613
|
+
eventId: metadata?.eventId ?? `event_${++this.eventCounter}`,
|
|
614
|
+
priority: metadata?.priority ?? 0
|
|
645
615
|
};
|
|
646
|
-
//
|
|
647
|
-
this.
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
616
|
+
// 记录事件历史
|
|
617
|
+
if (this.config.enableTracking) {
|
|
618
|
+
this.eventHistory.push({
|
|
619
|
+
event,
|
|
620
|
+
data,
|
|
621
|
+
metadata: eventMetadata
|
|
622
|
+
});
|
|
623
|
+
// 限制历史记录大小
|
|
624
|
+
if (this.eventHistory.length > this.config.maxHistorySize) {
|
|
625
|
+
this.eventHistory.shift();
|
|
626
|
+
}
|
|
651
627
|
}
|
|
652
|
-
|
|
653
|
-
if (
|
|
654
|
-
|
|
628
|
+
const listeners = this.listeners.get(event);
|
|
629
|
+
if (!listeners || listeners.size === 0) {
|
|
630
|
+
return;
|
|
655
631
|
}
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
632
|
+
// 创建事件包装器
|
|
633
|
+
const eventWrapper = {
|
|
634
|
+
data: data,
|
|
635
|
+
metadata: eventMetadata
|
|
636
|
+
};
|
|
637
|
+
// 按优先级排序监听器(如果有优先级)
|
|
638
|
+
const sortedListeners = Array.from(listeners);
|
|
639
|
+
// 并行执行所有监听器
|
|
640
|
+
const promises = sortedListeners.map((listener)=>{
|
|
641
|
+
try {
|
|
642
|
+
return Promise.resolve(listener(eventWrapper));
|
|
643
|
+
} catch (error) {
|
|
644
|
+
console.error(`事件 ${event} 的监听器执行失败:`, error);
|
|
645
|
+
return Promise.resolve();
|
|
666
646
|
}
|
|
667
647
|
});
|
|
648
|
+
await Promise.allSettled(promises);
|
|
668
649
|
}
|
|
669
650
|
/**
|
|
670
|
-
*
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
element,
|
|
677
|
-
...properties
|
|
678
|
-
}
|
|
679
|
-
});
|
|
651
|
+
* 发布事件(仅数据,向后兼容)
|
|
652
|
+
*
|
|
653
|
+
* @param event - 事件名称
|
|
654
|
+
* @param data - 事件数据
|
|
655
|
+
*/ async emitData(event, data) {
|
|
656
|
+
return this.emit(event, data);
|
|
680
657
|
}
|
|
681
658
|
/**
|
|
682
|
-
*
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
659
|
+
* 一次性订阅事件
|
|
660
|
+
*
|
|
661
|
+
* @param event - 事件名称
|
|
662
|
+
* @param listener - 事件监听器
|
|
663
|
+
*/ once(event, listener) {
|
|
664
|
+
const wrappedListener = async (data)=>{
|
|
665
|
+
// 处理 EventWrapper 或直接数据
|
|
666
|
+
const actualData = data.data !== undefined ? data.data : data;
|
|
667
|
+
await listener(actualData);
|
|
668
|
+
this.off(event, wrappedListener);
|
|
669
|
+
};
|
|
670
|
+
this.on(event, wrappedListener);
|
|
689
671
|
}
|
|
690
672
|
/**
|
|
691
|
-
*
|
|
692
|
-
*/
|
|
693
|
-
this.
|
|
694
|
-
type: 'error',
|
|
695
|
-
name: 'error',
|
|
696
|
-
properties: {
|
|
697
|
-
errorName: error.name,
|
|
698
|
-
errorMessage: error.message,
|
|
699
|
-
errorStack: error.stack,
|
|
700
|
-
...properties
|
|
701
|
-
}
|
|
702
|
-
});
|
|
673
|
+
* 清空所有事件监听器
|
|
674
|
+
*/ clear() {
|
|
675
|
+
this.listeners.clear();
|
|
703
676
|
}
|
|
704
677
|
/**
|
|
705
|
-
*
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
678
|
+
* 获取事件监听器数量
|
|
679
|
+
*
|
|
680
|
+
* @param event - 事件名称,如果不提供则返回所有事件的监听器总数
|
|
681
|
+
*/ listenerCount(event) {
|
|
682
|
+
if (event) {
|
|
683
|
+
return this.listeners.get(event)?.size || 0;
|
|
684
|
+
}
|
|
685
|
+
let count = 0;
|
|
686
|
+
for (const listeners of this.listeners.values()){
|
|
687
|
+
count += listeners.size;
|
|
688
|
+
}
|
|
689
|
+
return count;
|
|
715
690
|
}
|
|
716
691
|
/**
|
|
717
|
-
*
|
|
718
|
-
*/
|
|
719
|
-
|
|
720
|
-
return properties;
|
|
721
|
-
}
|
|
722
|
-
// 使用深度脱敏处理
|
|
723
|
-
return utils.SecurityUtils.deepSanitize(properties);
|
|
692
|
+
* 获取所有事件名称
|
|
693
|
+
*/ eventNames() {
|
|
694
|
+
return Array.from(this.listeners.keys());
|
|
724
695
|
}
|
|
725
696
|
/**
|
|
726
|
-
*
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
697
|
+
* 获取事件历史记录
|
|
698
|
+
*
|
|
699
|
+
* @param event - 事件名称(可选,如果提供则只返回该事件的历史)
|
|
700
|
+
* @param limit - 限制返回的记录数
|
|
701
|
+
* @returns 事件历史记录
|
|
702
|
+
*/ getEventHistory(event, limit) {
|
|
703
|
+
if (!this.config.enableTracking) {
|
|
704
|
+
return [];
|
|
730
705
|
}
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
this.eventQueue = [];
|
|
735
|
-
if (this.config.onBatch) {
|
|
736
|
-
this.config.onBatch(events);
|
|
706
|
+
let history = this.eventHistory;
|
|
707
|
+
if (event) {
|
|
708
|
+
history = history.filter((h)=>h.event === event);
|
|
737
709
|
}
|
|
738
|
-
|
|
710
|
+
if (limit) {
|
|
711
|
+
history = history.slice(-limit);
|
|
712
|
+
}
|
|
713
|
+
return [
|
|
714
|
+
...history
|
|
715
|
+
];
|
|
739
716
|
}
|
|
740
717
|
/**
|
|
741
|
-
*
|
|
742
|
-
*/
|
|
743
|
-
this.
|
|
744
|
-
this.startBatchTimer();
|
|
718
|
+
* 清空事件历史记录
|
|
719
|
+
*/ clearHistory() {
|
|
720
|
+
this.eventHistory = [];
|
|
745
721
|
}
|
|
746
722
|
/**
|
|
747
|
-
*
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
723
|
+
* 请求-响应模式:发送请求并等待响应
|
|
724
|
+
*
|
|
725
|
+
* @param event - 事件名称
|
|
726
|
+
* @param data - 请求数据
|
|
727
|
+
* @param timeout - 超时时间(毫秒)
|
|
728
|
+
* @returns 响应数据
|
|
729
|
+
*/ async request(event, data, timeout = 5000) {
|
|
730
|
+
return new Promise((resolve, reject)=>{
|
|
731
|
+
const responseEvent = `${event}:response`;
|
|
732
|
+
const requestId = `req_${Date.now()}_${Math.random()}`;
|
|
733
|
+
// 设置超时
|
|
734
|
+
const timeoutId = setTimeout(()=>{
|
|
735
|
+
this.off(responseEvent, responseHandler);
|
|
736
|
+
reject(new Error(`请求 ${event} 超时`));
|
|
737
|
+
}, timeout);
|
|
738
|
+
// 响应处理器
|
|
739
|
+
const responseHandler = (response)=>{
|
|
740
|
+
// 处理 EventWrapper 或直接数据
|
|
741
|
+
const actualResponse = response.data !== undefined ? response.data : response;
|
|
742
|
+
if (actualResponse.requestId === requestId) {
|
|
743
|
+
clearTimeout(timeoutId);
|
|
744
|
+
this.off(responseEvent, responseHandler);
|
|
745
|
+
resolve(actualResponse.data);
|
|
746
|
+
}
|
|
747
|
+
};
|
|
748
|
+
// 订阅响应事件
|
|
749
|
+
this.on(responseEvent, responseHandler);
|
|
750
|
+
// 发送请求
|
|
751
|
+
this.emit(`${event}:request`, {
|
|
752
|
+
requestId,
|
|
753
|
+
data
|
|
754
|
+
});
|
|
755
|
+
});
|
|
752
756
|
}
|
|
753
757
|
/**
|
|
754
|
-
*
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
+
* 请求-响应模式:注册请求处理器
|
|
759
|
+
*
|
|
760
|
+
* @param event - 事件名称
|
|
761
|
+
* @param handler - 请求处理器
|
|
762
|
+
* @returns 取消注册函数
|
|
763
|
+
*/ onRequest(event, handler) {
|
|
764
|
+
const requestEvent = `${event}:request`;
|
|
765
|
+
const responseEvent = `${event}:response`;
|
|
766
|
+
return this.on(requestEvent, async (wrapper)=>{
|
|
767
|
+
try {
|
|
768
|
+
// 处理 EventWrapper 或直接数据
|
|
769
|
+
const actualWrapper = wrapper.data !== undefined ? wrapper : {
|
|
770
|
+
data: wrapper,
|
|
771
|
+
metadata: {
|
|
772
|
+
timestamp: Date.now()
|
|
773
|
+
}
|
|
774
|
+
};
|
|
775
|
+
const response = await handler(actualWrapper.data.data, actualWrapper.metadata);
|
|
776
|
+
this.emit(responseEvent, {
|
|
777
|
+
requestId: actualWrapper.data.requestId,
|
|
778
|
+
data: response
|
|
779
|
+
});
|
|
780
|
+
} catch (error) {
|
|
781
|
+
const actualWrapper = wrapper.data !== undefined ? wrapper : {
|
|
782
|
+
data: wrapper
|
|
783
|
+
};
|
|
784
|
+
this.emit(`${responseEvent}:error`, {
|
|
785
|
+
requestId: actualWrapper.data.requestId,
|
|
786
|
+
error: error instanceof Error ? error.message : String(error)
|
|
787
|
+
});
|
|
788
|
+
}
|
|
789
|
+
});
|
|
758
790
|
}
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
791
|
+
/**
|
|
792
|
+
* 获取配置
|
|
793
|
+
*/ getConfig() {
|
|
794
|
+
return {
|
|
795
|
+
...this.config
|
|
796
|
+
};
|
|
797
|
+
}
|
|
798
|
+
/**
|
|
799
|
+
* 更新配置
|
|
800
|
+
*/ updateConfig(config) {
|
|
763
801
|
this.config = {
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
anonymize: config.anonymize ?? true,
|
|
767
|
-
onEvent: config.onEvent ?? (()=>{}),
|
|
768
|
-
onBatch: config.onBatch ?? (()=>{}),
|
|
769
|
-
batchSize: config.batchSize ?? 10,
|
|
770
|
-
batchInterval: config.batchInterval ?? 5000
|
|
802
|
+
...this.config,
|
|
803
|
+
...config
|
|
771
804
|
};
|
|
772
|
-
if (this.config.enabled) {
|
|
773
|
-
this.startBatchTimer();
|
|
774
|
-
}
|
|
775
805
|
}
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
806
|
+
constructor(config = {}){
|
|
807
|
+
_define_property$H(this, "listeners", new Map());
|
|
808
|
+
_define_property$H(this, "eventHistory", []);
|
|
809
|
+
_define_property$H(this, "config", void 0);
|
|
810
|
+
_define_property$H(this, "eventCounter", 0);
|
|
811
|
+
this.config = {
|
|
812
|
+
enableTracking: config.enableTracking ?? false,
|
|
813
|
+
maxHistorySize: config.maxHistorySize ?? 100,
|
|
814
|
+
enableValidation: config.enableValidation ?? false,
|
|
815
|
+
validator: config.validator ?? (()=>true)
|
|
816
|
+
};
|
|
785
817
|
}
|
|
786
|
-
return defaultAnalyticsService;
|
|
787
818
|
}
|
|
788
819
|
/**
|
|
789
|
-
*
|
|
790
|
-
*/
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
return defaultAnalyticsService;
|
|
795
|
-
}
|
|
796
|
-
|
|
797
|
-
var analytics = /*#__PURE__*/Object.freeze({
|
|
798
|
-
__proto__: null,
|
|
799
|
-
AnalyticsService: AnalyticsService,
|
|
800
|
-
getAnalytics: getAnalytics,
|
|
801
|
-
initAnalytics: initAnalytics
|
|
820
|
+
* 全局插件事件总线实例
|
|
821
|
+
*/ const pluginEventBus = new PluginEventBus({
|
|
822
|
+
enableTracking: process.env.NODE_ENV === 'development',
|
|
823
|
+
maxHistorySize: 100,
|
|
824
|
+
enableValidation: false
|
|
802
825
|
});
|
|
803
826
|
|
|
804
|
-
|
|
805
|
-
* 等待指定时间后解析的 Promise 工具函数
|
|
806
|
-
*
|
|
807
|
-
* @param time - 等待时间(毫秒),默认为 100 毫秒
|
|
808
|
-
* @returns 返回一个 Promise,在指定时间后解析为 true
|
|
809
|
-
*
|
|
810
|
-
* @example
|
|
811
|
-
* ```typescript
|
|
812
|
-
* // 等待 500 毫秒
|
|
813
|
-
* await waitTime(500);
|
|
814
|
-
*
|
|
815
|
-
* // 使用默认等待时间(100 毫秒)
|
|
816
|
-
* await waitTime();
|
|
817
|
-
* ```
|
|
818
|
-
* @deprecated 建议使用基于实际完成状态的机制,而不是固定等待时间
|
|
819
|
-
*/ const waitTime = (time = 100)=>{
|
|
820
|
-
return new Promise((resolve)=>{
|
|
821
|
-
setTimeout(()=>{
|
|
822
|
-
resolve(true);
|
|
823
|
-
}, time);
|
|
824
|
-
});
|
|
825
|
-
};
|
|
826
|
-
|
|
827
|
-
/**
|
|
828
|
-
* 插件沙箱
|
|
829
|
-
* 用于插件隔离和权限控制
|
|
830
|
-
*/ function _define_property$H(obj, key, value) {
|
|
827
|
+
function _define_property$G(obj, key, value) {
|
|
831
828
|
if (key in obj) {
|
|
832
829
|
Object.defineProperty(obj, key, {
|
|
833
830
|
value: value,
|
|
@@ -841,804 +838,418 @@
|
|
|
841
838
|
return obj;
|
|
842
839
|
}
|
|
843
840
|
/**
|
|
844
|
-
*
|
|
845
|
-
|
|
841
|
+
* 插件管理器
|
|
842
|
+
*
|
|
843
|
+
* 优化:
|
|
844
|
+
* 1. 支持插件依赖管理
|
|
845
|
+
* 2. 支持插件优先级控制
|
|
846
|
+
* 3. 支持插件生命周期管理
|
|
847
|
+
* 4. 支持插件热插拔(动态加载/卸载)
|
|
848
|
+
*/ class PluginManager {
|
|
846
849
|
/**
|
|
847
|
-
*
|
|
848
|
-
*
|
|
849
|
-
*
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
return true; // 非严格模式,允许所有权限
|
|
850
|
+
* 注册插件
|
|
851
|
+
*
|
|
852
|
+
* 优化:检查插件依赖是否已注册
|
|
853
|
+
*/ register(plugin) {
|
|
854
|
+
if (this.plugins.has(plugin.name)) {
|
|
855
|
+
console.warn(`插件 ${plugin.name} 已存在,将被覆盖`);
|
|
854
856
|
}
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
* @returns 是否可以访问
|
|
862
|
-
*/ canAccessConfig(key) {
|
|
863
|
-
if (!this.hasPermission("access_config")) {
|
|
864
|
-
return false;
|
|
857
|
+
// 检查依赖是否已注册
|
|
858
|
+
if (plugin.dependencies && plugin.dependencies.length > 0) {
|
|
859
|
+
const missingDeps = plugin.dependencies.filter((dep)=>!this.plugins.has(dep));
|
|
860
|
+
if (missingDeps.length > 0) {
|
|
861
|
+
console.warn(`插件 ${plugin.name} 的依赖未注册: ${missingDeps.join(', ')}`);
|
|
862
|
+
}
|
|
865
863
|
}
|
|
866
|
-
|
|
867
|
-
|
|
864
|
+
this.plugins.set(plugin.name, plugin);
|
|
865
|
+
this.pluginStatus.set(plugin.name, 'registered');
|
|
866
|
+
// 创建插件沙箱
|
|
867
|
+
if (plugin.sandbox) {
|
|
868
|
+
const sandbox = new PluginSandbox({
|
|
869
|
+
...plugin.sandbox,
|
|
870
|
+
name: plugin.name
|
|
871
|
+
});
|
|
872
|
+
this.sandboxes.set(plugin.name, sandbox);
|
|
873
|
+
} else {
|
|
874
|
+
// 如果没有配置沙箱,创建默认沙箱(非严格模式)
|
|
875
|
+
const sandbox = new PluginSandbox({
|
|
876
|
+
strictMode: false,
|
|
877
|
+
name: plugin.name
|
|
878
|
+
});
|
|
879
|
+
this.sandboxes.set(plugin.name, sandbox);
|
|
868
880
|
}
|
|
869
|
-
return true;
|
|
870
881
|
}
|
|
871
882
|
/**
|
|
872
|
-
*
|
|
873
|
-
*
|
|
874
|
-
* @
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
return
|
|
883
|
+
* 获取插件加载顺序(考虑依赖和优先级)
|
|
884
|
+
*
|
|
885
|
+
* @returns 插件名称数组,按加载顺序排列
|
|
886
|
+
*/ getLoadOrder() {
|
|
887
|
+
const plugins = Array.from(this.plugins.values());
|
|
888
|
+
// 按优先级排序
|
|
889
|
+
const sortedPlugins = plugins.sort((a, b)=>{
|
|
890
|
+
const priorityA = a.priority ?? 100;
|
|
891
|
+
const priorityB = b.priority ?? 100;
|
|
892
|
+
return priorityA - priorityB;
|
|
893
|
+
});
|
|
894
|
+
// 构建依赖图并拓扑排序
|
|
895
|
+
const visited = new Set();
|
|
896
|
+
const visiting = new Set();
|
|
897
|
+
const result = [];
|
|
898
|
+
const visit = (pluginName)=>{
|
|
899
|
+
if (visiting.has(pluginName)) {
|
|
900
|
+
console.warn(`检测到循环依赖,涉及插件: ${pluginName}`);
|
|
901
|
+
return;
|
|
902
|
+
}
|
|
903
|
+
if (visited.has(pluginName)) {
|
|
904
|
+
return;
|
|
905
|
+
}
|
|
906
|
+
visiting.add(pluginName);
|
|
907
|
+
const plugin = this.plugins.get(pluginName);
|
|
908
|
+
if (plugin?.dependencies) {
|
|
909
|
+
for (const dep of plugin.dependencies){
|
|
910
|
+
visit(dep);
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
visiting.delete(pluginName);
|
|
914
|
+
visited.add(pluginName);
|
|
915
|
+
result.push(pluginName);
|
|
916
|
+
};
|
|
917
|
+
for (const plugin of sortedPlugins){
|
|
918
|
+
visit(plugin.name);
|
|
882
919
|
}
|
|
883
|
-
return
|
|
920
|
+
return result;
|
|
884
921
|
}
|
|
885
922
|
/**
|
|
886
|
-
*
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
if (!this.hasPermission("access_config")) {
|
|
892
|
-
return {};
|
|
893
|
-
}
|
|
894
|
-
if (!this.config.configWhitelist || this.config.configWhitelist.length === 0) {
|
|
895
|
-
return config;
|
|
896
|
-
}
|
|
897
|
-
const filtered = {};
|
|
898
|
-
for (const key of this.config.configWhitelist){
|
|
899
|
-
if (key in config) {
|
|
900
|
-
filtered[key] = config[key];
|
|
901
|
-
}
|
|
923
|
+
* 注销插件
|
|
924
|
+
*/ unregister(name) {
|
|
925
|
+
const plugin = this.plugins.get(name);
|
|
926
|
+
if (plugin && plugin.destroy) {
|
|
927
|
+
plugin.destroy();
|
|
902
928
|
}
|
|
903
|
-
|
|
929
|
+
this.plugins.delete(name);
|
|
930
|
+
this.sandboxes.delete(name);
|
|
931
|
+
this.pluginStatus.delete(name);
|
|
932
|
+
this.pluginLoaders.delete(name);
|
|
904
933
|
}
|
|
905
934
|
/**
|
|
906
|
-
*
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
};
|
|
927
|
-
this.permissions = new Set(config.permissions || []);
|
|
928
|
-
}
|
|
929
|
-
}
|
|
930
|
-
|
|
931
|
-
/**
|
|
932
|
-
* 插件事件总线
|
|
933
|
-
* 用于插件间通信
|
|
934
|
-
*/ /**
|
|
935
|
-
* 事件监听器类型
|
|
936
|
-
*/ function _define_property$G(obj, key, value) {
|
|
937
|
-
if (key in obj) {
|
|
938
|
-
Object.defineProperty(obj, key, {
|
|
939
|
-
value: value,
|
|
940
|
-
enumerable: true,
|
|
941
|
-
configurable: true,
|
|
942
|
-
writable: true
|
|
943
|
-
});
|
|
944
|
-
} else {
|
|
945
|
-
obj[key] = value;
|
|
946
|
-
}
|
|
947
|
-
return obj;
|
|
948
|
-
}
|
|
949
|
-
/**
|
|
950
|
-
* 事件总线
|
|
951
|
-
*/ class PluginEventBus {
|
|
952
|
-
/**
|
|
953
|
-
* 订阅事件
|
|
954
|
-
*
|
|
955
|
-
* @param event - 事件名称
|
|
956
|
-
* @param listener - 事件监听器(可以接收 EventWrapper 或直接数据)
|
|
957
|
-
* @returns 取消订阅函数
|
|
958
|
-
*/ on(event, listener) {
|
|
959
|
-
if (!this.listeners.has(event)) {
|
|
960
|
-
this.listeners.set(event, new Set());
|
|
935
|
+
* 动态加载插件(热插拔)
|
|
936
|
+
*
|
|
937
|
+
* @param options - 插件加载选项
|
|
938
|
+
* @returns 加载的插件
|
|
939
|
+
*/ async loadPlugin(options) {
|
|
940
|
+
let plugin;
|
|
941
|
+
if (options.url) {
|
|
942
|
+
// 从URL加载插件
|
|
943
|
+
const response = await fetch(options.url);
|
|
944
|
+
if (!response.ok) {
|
|
945
|
+
throw new Error(`无法加载插件: ${options.url} (${response.status})`);
|
|
946
|
+
}
|
|
947
|
+
const pluginModule = await response.json();
|
|
948
|
+
plugin = pluginModule.default || pluginModule;
|
|
949
|
+
} else if (options.modulePath) {
|
|
950
|
+
// 从模块路径动态导入
|
|
951
|
+
const pluginModule = await import(/* @vite-ignore */ options.modulePath);
|
|
952
|
+
plugin = pluginModule.default || pluginModule;
|
|
953
|
+
} else {
|
|
954
|
+
throw new Error('必须提供 url 或 modulePath');
|
|
961
955
|
}
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
956
|
+
if (!plugin || !plugin.name) {
|
|
957
|
+
throw new Error('插件格式无效:必须包含 name 属性');
|
|
958
|
+
}
|
|
959
|
+
// 检查插件是否已加载
|
|
960
|
+
if (this.plugins.has(plugin.name)) {
|
|
961
|
+
throw new Error(`插件 ${plugin.name} 已加载`);
|
|
962
|
+
}
|
|
963
|
+
// 设置加载状态
|
|
964
|
+
this.pluginStatus.set(plugin.name, 'loading');
|
|
965
|
+
try {
|
|
966
|
+
// 注册插件
|
|
967
|
+
this.register(plugin);
|
|
968
|
+
// 如果要求立即初始化
|
|
969
|
+
if (options.initialize && options.initContext && options.startOptions) {
|
|
970
|
+
await this.initializePlugin(plugin.name, options.startOptions, options.initContext);
|
|
969
971
|
}
|
|
970
|
-
|
|
972
|
+
return plugin;
|
|
973
|
+
} catch (error) {
|
|
974
|
+
this.pluginStatus.delete(plugin.name);
|
|
975
|
+
throw error;
|
|
976
|
+
}
|
|
971
977
|
}
|
|
972
978
|
/**
|
|
973
|
-
*
|
|
974
|
-
*
|
|
975
|
-
* @param
|
|
976
|
-
* @param
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
979
|
+
* 初始化单个插件
|
|
980
|
+
*
|
|
981
|
+
* @param name - 插件名称
|
|
982
|
+
* @param options - 启动选项
|
|
983
|
+
* @param context - 初始化上下文
|
|
984
|
+
*/ async initializePlugin(name, options, context) {
|
|
985
|
+
const plugin = this.plugins.get(name);
|
|
986
|
+
if (!plugin) {
|
|
987
|
+
throw new Error(`插件 ${name} 未注册`);
|
|
988
|
+
}
|
|
989
|
+
const status = this.pluginStatus.get(name);
|
|
990
|
+
if (status === 'initialized') {
|
|
991
|
+
return; // 已经初始化
|
|
992
|
+
}
|
|
993
|
+
try {
|
|
994
|
+
const sandbox = this.sandboxes.get(name);
|
|
995
|
+
if (!sandbox) {
|
|
996
|
+
throw new Error(`插件 ${name} 的沙箱未找到`);
|
|
997
|
+
}
|
|
998
|
+
// 执行初始化钩子
|
|
999
|
+
if (plugin.init) {
|
|
1000
|
+
const filteredOptions = sandbox.filterConfig(options);
|
|
1001
|
+
await plugin.init(filteredOptions, context, sandbox, pluginEventBus);
|
|
983
1002
|
}
|
|
1003
|
+
this.pluginStatus.set(name, 'initialized');
|
|
1004
|
+
} catch (error) {
|
|
1005
|
+
console.error(`插件 ${name} 初始化失败:`, error);
|
|
1006
|
+
throw error;
|
|
984
1007
|
}
|
|
985
1008
|
}
|
|
986
1009
|
/**
|
|
987
|
-
*
|
|
988
|
-
*
|
|
989
|
-
* @param
|
|
990
|
-
* @param
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
console.warn(`事件 ${event} 验证失败,已忽略`);
|
|
996
|
-
return;
|
|
1010
|
+
* 卸载插件(热插拔)
|
|
1011
|
+
*
|
|
1012
|
+
* @param name - 插件名称
|
|
1013
|
+
* @param force - 是否强制卸载(即使有依赖)
|
|
1014
|
+
*/ async unloadPlugin(name, force = false) {
|
|
1015
|
+
const plugin = this.plugins.get(name);
|
|
1016
|
+
if (!plugin) {
|
|
1017
|
+
throw new Error(`插件 ${name} 未加载`);
|
|
997
1018
|
}
|
|
998
|
-
//
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
priority: metadata?.priority ?? 0
|
|
1004
|
-
};
|
|
1005
|
-
// 记录事件历史
|
|
1006
|
-
if (this.config.enableTracking) {
|
|
1007
|
-
this.eventHistory.push({
|
|
1008
|
-
event,
|
|
1009
|
-
data,
|
|
1010
|
-
metadata: eventMetadata
|
|
1011
|
-
});
|
|
1012
|
-
// 限制历史记录大小
|
|
1013
|
-
if (this.eventHistory.length > this.config.maxHistorySize) {
|
|
1014
|
-
this.eventHistory.shift();
|
|
1019
|
+
// 检查是否有其他插件依赖此插件
|
|
1020
|
+
if (!force) {
|
|
1021
|
+
const dependents = Array.from(this.plugins.values()).filter((p)=>p.dependencies && p.dependencies.includes(name));
|
|
1022
|
+
if (dependents.length > 0) {
|
|
1023
|
+
throw new Error(`无法卸载插件 ${name},以下插件依赖它: ${dependents.map((p)=>p.name).join(', ')}`);
|
|
1015
1024
|
}
|
|
1016
1025
|
}
|
|
1017
|
-
|
|
1018
|
-
if (
|
|
1019
|
-
return;
|
|
1020
|
-
}
|
|
1021
|
-
// 创建事件包装器
|
|
1022
|
-
const eventWrapper = {
|
|
1023
|
-
data: data,
|
|
1024
|
-
metadata: eventMetadata
|
|
1025
|
-
};
|
|
1026
|
-
// 按优先级排序监听器(如果有优先级)
|
|
1027
|
-
const sortedListeners = Array.from(listeners);
|
|
1028
|
-
// 并行执行所有监听器
|
|
1029
|
-
const promises = sortedListeners.map((listener)=>{
|
|
1026
|
+
// 执行销毁钩子
|
|
1027
|
+
if (plugin.destroy) {
|
|
1030
1028
|
try {
|
|
1031
|
-
|
|
1029
|
+
await plugin.destroy();
|
|
1032
1030
|
} catch (error) {
|
|
1033
|
-
console.error(
|
|
1034
|
-
return Promise.resolve();
|
|
1031
|
+
console.error(`插件 ${name} 的 destroy 钩子执行失败:`, error);
|
|
1035
1032
|
}
|
|
1036
|
-
}
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
* @param data - 事件数据
|
|
1044
|
-
*/ async emitData(event, data) {
|
|
1045
|
-
return this.emit(event, data);
|
|
1033
|
+
}
|
|
1034
|
+
// 从事件总线移除相关监听器(如果有)
|
|
1035
|
+
// 注意:事件总线是全局的,这里只移除插件相关的事件
|
|
1036
|
+
// 实际实现可能需要更细粒度的控制
|
|
1037
|
+
// 清理插件
|
|
1038
|
+
this.unregister(name);
|
|
1039
|
+
this.pluginStatus.set(name, 'destroyed');
|
|
1046
1040
|
}
|
|
1047
1041
|
/**
|
|
1048
|
-
*
|
|
1049
|
-
*
|
|
1050
|
-
* @param
|
|
1051
|
-
* @
|
|
1052
|
-
*/
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
const
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1042
|
+
* 检查插件是否可以热加载
|
|
1043
|
+
*
|
|
1044
|
+
* @param plugin - 插件
|
|
1045
|
+
* @returns 是否可以热加载
|
|
1046
|
+
*/ canHotLoad(plugin) {
|
|
1047
|
+
// 检查依赖是否都已加载
|
|
1048
|
+
if (plugin.dependencies && plugin.dependencies.length > 0) {
|
|
1049
|
+
const missingDeps = plugin.dependencies.filter((dep)=>!this.plugins.has(dep));
|
|
1050
|
+
if (missingDeps.length > 0) {
|
|
1051
|
+
return false;
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
return true;
|
|
1060
1055
|
}
|
|
1061
1056
|
/**
|
|
1062
|
-
*
|
|
1063
|
-
|
|
1064
|
-
|
|
1057
|
+
* 注册插件加载器(用于延迟加载)
|
|
1058
|
+
*
|
|
1059
|
+
* @param name - 插件名称
|
|
1060
|
+
* @param loader - 加载器函数
|
|
1061
|
+
*/ registerLoader(name, loader) {
|
|
1062
|
+
this.pluginLoaders.set(name, loader);
|
|
1065
1063
|
}
|
|
1066
1064
|
/**
|
|
1067
|
-
*
|
|
1068
|
-
*
|
|
1069
|
-
* @param
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
count += listeners.size;
|
|
1065
|
+
* 使用加载器加载插件
|
|
1066
|
+
*
|
|
1067
|
+
* @param name - 插件名称
|
|
1068
|
+
* @param options - 加载选项
|
|
1069
|
+
* @returns 加载的插件
|
|
1070
|
+
*/ async loadPluginByLoader(name, options) {
|
|
1071
|
+
const loader = this.pluginLoaders.get(name);
|
|
1072
|
+
if (!loader) {
|
|
1073
|
+
throw new Error(`插件 ${name} 的加载器未注册`);
|
|
1077
1074
|
}
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
* 获取所有事件名称
|
|
1082
|
-
*/ eventNames() {
|
|
1083
|
-
return Array.from(this.listeners.keys());
|
|
1084
|
-
}
|
|
1085
|
-
/**
|
|
1086
|
-
* 获取事件历史记录
|
|
1087
|
-
*
|
|
1088
|
-
* @param event - 事件名称(可选,如果提供则只返回该事件的历史)
|
|
1089
|
-
* @param limit - 限制返回的记录数
|
|
1090
|
-
* @returns 事件历史记录
|
|
1091
|
-
*/ getEventHistory(event, limit) {
|
|
1092
|
-
if (!this.config.enableTracking) {
|
|
1093
|
-
return [];
|
|
1075
|
+
const plugin = await loader();
|
|
1076
|
+
if (!plugin || !plugin.name) {
|
|
1077
|
+
throw new Error('插件格式无效:必须包含 name 属性');
|
|
1094
1078
|
}
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
history = history.filter((h)=>h.event === event);
|
|
1079
|
+
if (plugin.name !== name) {
|
|
1080
|
+
throw new Error(`插件名称不匹配: 期望 ${name},实际 ${plugin.name}`);
|
|
1098
1081
|
}
|
|
1099
|
-
|
|
1100
|
-
|
|
1082
|
+
// 检查插件是否已加载
|
|
1083
|
+
if (this.plugins.has(plugin.name)) {
|
|
1084
|
+
return this.plugins.get(plugin.name);
|
|
1085
|
+
}
|
|
1086
|
+
// 设置加载状态
|
|
1087
|
+
this.pluginStatus.set(plugin.name, 'loading');
|
|
1088
|
+
try {
|
|
1089
|
+
// 注册插件
|
|
1090
|
+
this.register(plugin);
|
|
1091
|
+
// 如果要求立即初始化
|
|
1092
|
+
if (options?.initialize && options.initContext && options.startOptions) {
|
|
1093
|
+
await this.initializePlugin(plugin.name, options.startOptions, options.initContext);
|
|
1094
|
+
}
|
|
1095
|
+
return plugin;
|
|
1096
|
+
} catch (error) {
|
|
1097
|
+
this.pluginStatus.delete(plugin.name);
|
|
1098
|
+
throw error;
|
|
1101
1099
|
}
|
|
1102
|
-
return [
|
|
1103
|
-
...history
|
|
1104
|
-
];
|
|
1105
1100
|
}
|
|
1106
1101
|
/**
|
|
1107
|
-
*
|
|
1108
|
-
*/
|
|
1109
|
-
this.
|
|
1102
|
+
* 获取插件
|
|
1103
|
+
*/ get(name) {
|
|
1104
|
+
return this.plugins.get(name);
|
|
1110
1105
|
}
|
|
1111
1106
|
/**
|
|
1112
|
-
*
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
* @param data - 请求数据
|
|
1116
|
-
* @param timeout - 超时时间(毫秒)
|
|
1117
|
-
* @returns 响应数据
|
|
1118
|
-
*/ async request(event, data, timeout = 5000) {
|
|
1119
|
-
return new Promise((resolve, reject)=>{
|
|
1120
|
-
const responseEvent = `${event}:response`;
|
|
1121
|
-
const requestId = `req_${Date.now()}_${Math.random()}`;
|
|
1122
|
-
// 设置超时
|
|
1123
|
-
const timeoutId = setTimeout(()=>{
|
|
1124
|
-
this.off(responseEvent, responseHandler);
|
|
1125
|
-
reject(new Error(`请求 ${event} 超时`));
|
|
1126
|
-
}, timeout);
|
|
1127
|
-
// 响应处理器
|
|
1128
|
-
const responseHandler = (response)=>{
|
|
1129
|
-
// 处理 EventWrapper 或直接数据
|
|
1130
|
-
const actualResponse = response.data !== undefined ? response.data : response;
|
|
1131
|
-
if (actualResponse.requestId === requestId) {
|
|
1132
|
-
clearTimeout(timeoutId);
|
|
1133
|
-
this.off(responseEvent, responseHandler);
|
|
1134
|
-
resolve(actualResponse.data);
|
|
1135
|
-
}
|
|
1136
|
-
};
|
|
1137
|
-
// 订阅响应事件
|
|
1138
|
-
this.on(responseEvent, responseHandler);
|
|
1139
|
-
// 发送请求
|
|
1140
|
-
this.emit(`${event}:request`, {
|
|
1141
|
-
requestId,
|
|
1142
|
-
data
|
|
1143
|
-
});
|
|
1144
|
-
});
|
|
1107
|
+
* 获取所有插件
|
|
1108
|
+
*/ getAll() {
|
|
1109
|
+
return Array.from(this.plugins.values());
|
|
1145
1110
|
}
|
|
1146
1111
|
/**
|
|
1147
|
-
*
|
|
1148
|
-
*
|
|
1149
|
-
*
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1112
|
+
* 执行初始化前钩子
|
|
1113
|
+
*
|
|
1114
|
+
* 优化:按依赖顺序执行
|
|
1115
|
+
*/ async executeBeforeInit(options) {
|
|
1116
|
+
const loadOrder = this.getLoadOrder();
|
|
1117
|
+
for (const pluginName of loadOrder){
|
|
1118
|
+
const plugin = this.plugins.get(pluginName);
|
|
1119
|
+
if (!plugin || !plugin.beforeInit) {
|
|
1120
|
+
continue;
|
|
1121
|
+
}
|
|
1156
1122
|
try {
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
this.emit(responseEvent, {
|
|
1166
|
-
requestId: actualWrapper.data.requestId,
|
|
1167
|
-
data: response
|
|
1168
|
-
});
|
|
1123
|
+
const sandbox = this.sandboxes.get(plugin.name);
|
|
1124
|
+
if (!sandbox) {
|
|
1125
|
+
console.warn(`插件 ${plugin.name} 的沙箱未找到`);
|
|
1126
|
+
continue;
|
|
1127
|
+
}
|
|
1128
|
+
// 根据沙箱配置过滤选项
|
|
1129
|
+
const filteredOptions = sandbox.filterConfig(options);
|
|
1130
|
+
await plugin.beforeInit(filteredOptions, sandbox, pluginEventBus);
|
|
1169
1131
|
} catch (error) {
|
|
1170
|
-
|
|
1171
|
-
data: wrapper
|
|
1172
|
-
};
|
|
1173
|
-
this.emit(`${responseEvent}:error`, {
|
|
1174
|
-
requestId: actualWrapper.data.requestId,
|
|
1175
|
-
error: error instanceof Error ? error.message : String(error)
|
|
1176
|
-
});
|
|
1132
|
+
console.error(`插件 ${plugin.name} 的 beforeInit 钩子执行失败:`, error);
|
|
1177
1133
|
}
|
|
1178
|
-
}
|
|
1179
|
-
}
|
|
1180
|
-
/**
|
|
1181
|
-
* 获取配置
|
|
1182
|
-
*/ getConfig() {
|
|
1183
|
-
return {
|
|
1184
|
-
...this.config
|
|
1185
|
-
};
|
|
1186
|
-
}
|
|
1187
|
-
/**
|
|
1188
|
-
* 更新配置
|
|
1189
|
-
*/ updateConfig(config) {
|
|
1190
|
-
this.config = {
|
|
1191
|
-
...this.config,
|
|
1192
|
-
...config
|
|
1193
|
-
};
|
|
1194
|
-
}
|
|
1195
|
-
constructor(config = {}){
|
|
1196
|
-
_define_property$G(this, "listeners", new Map());
|
|
1197
|
-
_define_property$G(this, "eventHistory", []);
|
|
1198
|
-
_define_property$G(this, "config", void 0);
|
|
1199
|
-
_define_property$G(this, "eventCounter", 0);
|
|
1200
|
-
this.config = {
|
|
1201
|
-
enableTracking: config.enableTracking ?? false,
|
|
1202
|
-
maxHistorySize: config.maxHistorySize ?? 100,
|
|
1203
|
-
enableValidation: config.enableValidation ?? false,
|
|
1204
|
-
validator: config.validator ?? (()=>true)
|
|
1205
|
-
};
|
|
1206
|
-
}
|
|
1207
|
-
}
|
|
1208
|
-
/**
|
|
1209
|
-
* 全局插件事件总线实例
|
|
1210
|
-
*/ const pluginEventBus = new PluginEventBus({
|
|
1211
|
-
enableTracking: process.env.NODE_ENV === 'development',
|
|
1212
|
-
maxHistorySize: 100,
|
|
1213
|
-
enableValidation: false
|
|
1214
|
-
});
|
|
1215
|
-
|
|
1216
|
-
function _define_property$F(obj, key, value) {
|
|
1217
|
-
if (key in obj) {
|
|
1218
|
-
Object.defineProperty(obj, key, {
|
|
1219
|
-
value: value,
|
|
1220
|
-
enumerable: true,
|
|
1221
|
-
configurable: true,
|
|
1222
|
-
writable: true
|
|
1223
|
-
});
|
|
1224
|
-
} else {
|
|
1225
|
-
obj[key] = value;
|
|
1134
|
+
}
|
|
1226
1135
|
}
|
|
1227
|
-
return obj;
|
|
1228
|
-
}
|
|
1229
|
-
/**
|
|
1230
|
-
* 插件管理器
|
|
1231
|
-
*
|
|
1232
|
-
* 优化:
|
|
1233
|
-
* 1. 支持插件依赖管理
|
|
1234
|
-
* 2. 支持插件优先级控制
|
|
1235
|
-
* 3. 支持插件生命周期管理
|
|
1236
|
-
* 4. 支持插件热插拔(动态加载/卸载)
|
|
1237
|
-
*/ class PluginManager {
|
|
1238
1136
|
/**
|
|
1239
|
-
*
|
|
1137
|
+
* 执行初始化钩子
|
|
1240
1138
|
*
|
|
1241
|
-
*
|
|
1242
|
-
*/
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1139
|
+
* 优化:按依赖顺序执行,并更新插件状态
|
|
1140
|
+
*/ async executeInit(options, context) {
|
|
1141
|
+
const loadOrder = this.getLoadOrder();
|
|
1142
|
+
for (const pluginName of loadOrder){
|
|
1143
|
+
const plugin = this.plugins.get(pluginName);
|
|
1144
|
+
if (!plugin || !plugin.init) {
|
|
1145
|
+
continue;
|
|
1146
|
+
}
|
|
1147
|
+
try {
|
|
1148
|
+
const sandbox = this.sandboxes.get(plugin.name);
|
|
1149
|
+
if (!sandbox) {
|
|
1150
|
+
console.warn(`插件 ${plugin.name} 的沙箱未找到`);
|
|
1151
|
+
continue;
|
|
1152
|
+
}
|
|
1153
|
+
// 根据沙箱配置过滤选项
|
|
1154
|
+
const filteredOptions = sandbox.filterConfig(options);
|
|
1155
|
+
await plugin.init(filteredOptions, context, sandbox, pluginEventBus);
|
|
1156
|
+
this.pluginStatus.set(plugin.name, 'initialized');
|
|
1157
|
+
} catch (error) {
|
|
1158
|
+
console.error(`插件 ${plugin.name} 的 init 钩子执行失败:`, error);
|
|
1251
1159
|
}
|
|
1252
|
-
}
|
|
1253
|
-
this.plugins.set(plugin.name, plugin);
|
|
1254
|
-
this.pluginStatus.set(plugin.name, 'registered');
|
|
1255
|
-
// 创建插件沙箱
|
|
1256
|
-
if (plugin.sandbox) {
|
|
1257
|
-
const sandbox = new PluginSandbox({
|
|
1258
|
-
...plugin.sandbox,
|
|
1259
|
-
name: plugin.name
|
|
1260
|
-
});
|
|
1261
|
-
this.sandboxes.set(plugin.name, sandbox);
|
|
1262
|
-
} else {
|
|
1263
|
-
// 如果没有配置沙箱,创建默认沙箱(非严格模式)
|
|
1264
|
-
const sandbox = new PluginSandbox({
|
|
1265
|
-
strictMode: false,
|
|
1266
|
-
name: plugin.name
|
|
1267
|
-
});
|
|
1268
|
-
this.sandboxes.set(plugin.name, sandbox);
|
|
1269
1160
|
}
|
|
1270
1161
|
}
|
|
1271
1162
|
/**
|
|
1272
|
-
*
|
|
1163
|
+
* 执行初始化后钩子
|
|
1273
1164
|
*
|
|
1274
|
-
*
|
|
1275
|
-
*/
|
|
1276
|
-
const
|
|
1277
|
-
//
|
|
1278
|
-
const
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
});
|
|
1283
|
-
// 构建依赖图并拓扑排序
|
|
1284
|
-
const visited = new Set();
|
|
1285
|
-
const visiting = new Set();
|
|
1286
|
-
const result = [];
|
|
1287
|
-
const visit = (pluginName)=>{
|
|
1288
|
-
if (visiting.has(pluginName)) {
|
|
1289
|
-
console.warn(`检测到循环依赖,涉及插件: ${pluginName}`);
|
|
1290
|
-
return;
|
|
1291
|
-
}
|
|
1292
|
-
if (visited.has(pluginName)) {
|
|
1293
|
-
return;
|
|
1294
|
-
}
|
|
1295
|
-
visiting.add(pluginName);
|
|
1165
|
+
* 优化:按依赖顺序执行(逆序,确保依赖插件先执行)
|
|
1166
|
+
*/ async executeAfterInit(options, context) {
|
|
1167
|
+
const loadOrder = this.getLoadOrder();
|
|
1168
|
+
// 逆序执行,确保依赖插件先执行
|
|
1169
|
+
const reverseOrder = [
|
|
1170
|
+
...loadOrder
|
|
1171
|
+
].reverse();
|
|
1172
|
+
for (const pluginName of reverseOrder){
|
|
1296
1173
|
const plugin = this.plugins.get(pluginName);
|
|
1297
|
-
if (plugin
|
|
1298
|
-
|
|
1299
|
-
visit(dep);
|
|
1300
|
-
}
|
|
1301
|
-
}
|
|
1302
|
-
visiting.delete(pluginName);
|
|
1303
|
-
visited.add(pluginName);
|
|
1304
|
-
result.push(pluginName);
|
|
1305
|
-
};
|
|
1306
|
-
for (const plugin of sortedPlugins){
|
|
1307
|
-
visit(plugin.name);
|
|
1308
|
-
}
|
|
1309
|
-
return result;
|
|
1310
|
-
}
|
|
1311
|
-
/**
|
|
1312
|
-
* 注销插件
|
|
1313
|
-
*/ unregister(name) {
|
|
1314
|
-
const plugin = this.plugins.get(name);
|
|
1315
|
-
if (plugin && plugin.destroy) {
|
|
1316
|
-
plugin.destroy();
|
|
1317
|
-
}
|
|
1318
|
-
this.plugins.delete(name);
|
|
1319
|
-
this.sandboxes.delete(name);
|
|
1320
|
-
this.pluginStatus.delete(name);
|
|
1321
|
-
this.pluginLoaders.delete(name);
|
|
1322
|
-
}
|
|
1323
|
-
/**
|
|
1324
|
-
* 动态加载插件(热插拔)
|
|
1325
|
-
*
|
|
1326
|
-
* @param options - 插件加载选项
|
|
1327
|
-
* @returns 加载的插件
|
|
1328
|
-
*/ async loadPlugin(options) {
|
|
1329
|
-
let plugin;
|
|
1330
|
-
if (options.url) {
|
|
1331
|
-
// 从URL加载插件
|
|
1332
|
-
const response = await fetch(options.url);
|
|
1333
|
-
if (!response.ok) {
|
|
1334
|
-
throw new Error(`无法加载插件: ${options.url} (${response.status})`);
|
|
1174
|
+
if (!plugin || !plugin.afterInit) {
|
|
1175
|
+
continue;
|
|
1335
1176
|
}
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
}
|
|
1348
|
-
// 检查插件是否已加载
|
|
1349
|
-
if (this.plugins.has(plugin.name)) {
|
|
1350
|
-
throw new Error(`插件 ${plugin.name} 已加载`);
|
|
1351
|
-
}
|
|
1352
|
-
// 设置加载状态
|
|
1353
|
-
this.pluginStatus.set(plugin.name, 'loading');
|
|
1354
|
-
try {
|
|
1355
|
-
// 注册插件
|
|
1356
|
-
this.register(plugin);
|
|
1357
|
-
// 如果要求立即初始化
|
|
1358
|
-
if (options.initialize && options.initContext && options.startOptions) {
|
|
1359
|
-
await this.initializePlugin(plugin.name, options.startOptions, options.initContext);
|
|
1177
|
+
try {
|
|
1178
|
+
const sandbox = this.sandboxes.get(plugin.name);
|
|
1179
|
+
if (!sandbox) {
|
|
1180
|
+
console.warn(`插件 ${plugin.name} 的沙箱未找到`);
|
|
1181
|
+
continue;
|
|
1182
|
+
}
|
|
1183
|
+
// 根据沙箱配置过滤选项
|
|
1184
|
+
const filteredOptions = sandbox.filterConfig(options);
|
|
1185
|
+
await plugin.afterInit(filteredOptions, context, sandbox, pluginEventBus);
|
|
1186
|
+
} catch (error) {
|
|
1187
|
+
console.error(`插件 ${plugin.name} 的 afterInit 钩子执行失败:`, error);
|
|
1360
1188
|
}
|
|
1361
|
-
return plugin;
|
|
1362
|
-
} catch (error) {
|
|
1363
|
-
this.pluginStatus.delete(plugin.name);
|
|
1364
|
-
throw error;
|
|
1365
1189
|
}
|
|
1366
1190
|
}
|
|
1367
1191
|
/**
|
|
1368
|
-
*
|
|
1192
|
+
* 获取插件状态
|
|
1369
1193
|
*
|
|
1370
1194
|
* @param name - 插件名称
|
|
1371
|
-
* @
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
const plugin = this.plugins.get(name);
|
|
1375
|
-
if (!plugin) {
|
|
1376
|
-
throw new Error(`插件 ${name} 未注册`);
|
|
1377
|
-
}
|
|
1378
|
-
const status = this.pluginStatus.get(name);
|
|
1379
|
-
if (status === 'initialized') {
|
|
1380
|
-
return; // 已经初始化
|
|
1381
|
-
}
|
|
1382
|
-
try {
|
|
1383
|
-
const sandbox = this.sandboxes.get(name);
|
|
1384
|
-
if (!sandbox) {
|
|
1385
|
-
throw new Error(`插件 ${name} 的沙箱未找到`);
|
|
1386
|
-
}
|
|
1387
|
-
// 执行初始化钩子
|
|
1388
|
-
if (plugin.init) {
|
|
1389
|
-
const filteredOptions = sandbox.filterConfig(options);
|
|
1390
|
-
await plugin.init(filteredOptions, context, sandbox, pluginEventBus);
|
|
1391
|
-
}
|
|
1392
|
-
this.pluginStatus.set(name, 'initialized');
|
|
1393
|
-
} catch (error) {
|
|
1394
|
-
console.error(`插件 ${name} 初始化失败:`, error);
|
|
1395
|
-
throw error;
|
|
1396
|
-
}
|
|
1195
|
+
* @returns 插件状态
|
|
1196
|
+
*/ getPluginStatus(name) {
|
|
1197
|
+
return this.pluginStatus.get(name);
|
|
1397
1198
|
}
|
|
1398
1199
|
/**
|
|
1399
|
-
*
|
|
1200
|
+
* 检查插件是否已加载
|
|
1400
1201
|
*
|
|
1401
1202
|
* @param name - 插件名称
|
|
1402
|
-
* @
|
|
1403
|
-
*/
|
|
1404
|
-
|
|
1405
|
-
if (!plugin) {
|
|
1406
|
-
throw new Error(`插件 ${name} 未加载`);
|
|
1407
|
-
}
|
|
1408
|
-
// 检查是否有其他插件依赖此插件
|
|
1409
|
-
if (!force) {
|
|
1410
|
-
const dependents = Array.from(this.plugins.values()).filter((p)=>p.dependencies && p.dependencies.includes(name));
|
|
1411
|
-
if (dependents.length > 0) {
|
|
1412
|
-
throw new Error(`无法卸载插件 ${name},以下插件依赖它: ${dependents.map((p)=>p.name).join(', ')}`);
|
|
1413
|
-
}
|
|
1414
|
-
}
|
|
1415
|
-
// 执行销毁钩子
|
|
1416
|
-
if (plugin.destroy) {
|
|
1417
|
-
try {
|
|
1418
|
-
await plugin.destroy();
|
|
1419
|
-
} catch (error) {
|
|
1420
|
-
console.error(`插件 ${name} 的 destroy 钩子执行失败:`, error);
|
|
1421
|
-
}
|
|
1422
|
-
}
|
|
1423
|
-
// 从事件总线移除相关监听器(如果有)
|
|
1424
|
-
// 注意:事件总线是全局的,这里只移除插件相关的事件
|
|
1425
|
-
// 实际实现可能需要更细粒度的控制
|
|
1426
|
-
// 清理插件
|
|
1427
|
-
this.unregister(name);
|
|
1428
|
-
this.pluginStatus.set(name, 'destroyed');
|
|
1203
|
+
* @returns 是否已加载
|
|
1204
|
+
*/ isLoaded(name) {
|
|
1205
|
+
return this.plugins.has(name);
|
|
1429
1206
|
}
|
|
1430
1207
|
/**
|
|
1431
|
-
*
|
|
1208
|
+
* 获取已加载的插件列表
|
|
1432
1209
|
*
|
|
1433
|
-
* @
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
// 检查依赖是否都已加载
|
|
1437
|
-
if (plugin.dependencies && plugin.dependencies.length > 0) {
|
|
1438
|
-
const missingDeps = plugin.dependencies.filter((dep)=>!this.plugins.has(dep));
|
|
1439
|
-
if (missingDeps.length > 0) {
|
|
1440
|
-
return false;
|
|
1441
|
-
}
|
|
1442
|
-
}
|
|
1443
|
-
return true;
|
|
1210
|
+
* @returns 插件名称数组
|
|
1211
|
+
*/ getLoadedPlugins() {
|
|
1212
|
+
return Array.from(this.plugins.keys());
|
|
1444
1213
|
}
|
|
1445
1214
|
/**
|
|
1446
|
-
*
|
|
1215
|
+
* 获取所有插件状态
|
|
1447
1216
|
*
|
|
1448
|
-
* @
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
this.pluginLoaders.set(name, loader);
|
|
1217
|
+
* @returns 插件状态映射
|
|
1218
|
+
*/ getAllPluginStatus() {
|
|
1219
|
+
return new Map(this.pluginStatus);
|
|
1452
1220
|
}
|
|
1453
1221
|
/**
|
|
1454
|
-
*
|
|
1222
|
+
* 获取插件沙箱
|
|
1455
1223
|
*
|
|
1456
1224
|
* @param name - 插件名称
|
|
1457
|
-
* @
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
const loader = this.pluginLoaders.get(name);
|
|
1461
|
-
if (!loader) {
|
|
1462
|
-
throw new Error(`插件 ${name} 的加载器未注册`);
|
|
1463
|
-
}
|
|
1464
|
-
const plugin = await loader();
|
|
1465
|
-
if (!plugin || !plugin.name) {
|
|
1466
|
-
throw new Error('插件格式无效:必须包含 name 属性');
|
|
1467
|
-
}
|
|
1468
|
-
if (plugin.name !== name) {
|
|
1469
|
-
throw new Error(`插件名称不匹配: 期望 ${name},实际 ${plugin.name}`);
|
|
1470
|
-
}
|
|
1471
|
-
// 检查插件是否已加载
|
|
1472
|
-
if (this.plugins.has(plugin.name)) {
|
|
1473
|
-
return this.plugins.get(plugin.name);
|
|
1474
|
-
}
|
|
1475
|
-
// 设置加载状态
|
|
1476
|
-
this.pluginStatus.set(plugin.name, 'loading');
|
|
1477
|
-
try {
|
|
1478
|
-
// 注册插件
|
|
1479
|
-
this.register(plugin);
|
|
1480
|
-
// 如果要求立即初始化
|
|
1481
|
-
if (options?.initialize && options.initContext && options.startOptions) {
|
|
1482
|
-
await this.initializePlugin(plugin.name, options.startOptions, options.initContext);
|
|
1483
|
-
}
|
|
1484
|
-
return plugin;
|
|
1485
|
-
} catch (error) {
|
|
1486
|
-
this.pluginStatus.delete(plugin.name);
|
|
1487
|
-
throw error;
|
|
1488
|
-
}
|
|
1225
|
+
* @returns 插件沙箱或undefined
|
|
1226
|
+
*/ getSandbox(name) {
|
|
1227
|
+
return this.sandboxes.get(name);
|
|
1489
1228
|
}
|
|
1490
1229
|
/**
|
|
1491
|
-
*
|
|
1492
|
-
*/
|
|
1493
|
-
return
|
|
1230
|
+
* 获取事件总线
|
|
1231
|
+
*/ getEventBus() {
|
|
1232
|
+
return pluginEventBus;
|
|
1494
1233
|
}
|
|
1495
1234
|
/**
|
|
1496
|
-
*
|
|
1497
|
-
*/
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
if (!plugin || !plugin.beforeInit) {
|
|
1509
|
-
continue;
|
|
1510
|
-
}
|
|
1511
|
-
try {
|
|
1512
|
-
const sandbox = this.sandboxes.get(plugin.name);
|
|
1513
|
-
if (!sandbox) {
|
|
1514
|
-
console.warn(`插件 ${plugin.name} 的沙箱未找到`);
|
|
1515
|
-
continue;
|
|
1516
|
-
}
|
|
1517
|
-
// 根据沙箱配置过滤选项
|
|
1518
|
-
const filteredOptions = sandbox.filterConfig(options);
|
|
1519
|
-
await plugin.beforeInit(filteredOptions, sandbox, pluginEventBus);
|
|
1520
|
-
} catch (error) {
|
|
1521
|
-
console.error(`插件 ${plugin.name} 的 beforeInit 钩子执行失败:`, error);
|
|
1522
|
-
}
|
|
1523
|
-
}
|
|
1524
|
-
}
|
|
1525
|
-
/**
|
|
1526
|
-
* 执行初始化钩子
|
|
1527
|
-
*
|
|
1528
|
-
* 优化:按依赖顺序执行,并更新插件状态
|
|
1529
|
-
*/ async executeInit(options, context) {
|
|
1530
|
-
const loadOrder = this.getLoadOrder();
|
|
1531
|
-
for (const pluginName of loadOrder){
|
|
1532
|
-
const plugin = this.plugins.get(pluginName);
|
|
1533
|
-
if (!plugin || !plugin.init) {
|
|
1534
|
-
continue;
|
|
1535
|
-
}
|
|
1536
|
-
try {
|
|
1537
|
-
const sandbox = this.sandboxes.get(plugin.name);
|
|
1538
|
-
if (!sandbox) {
|
|
1539
|
-
console.warn(`插件 ${plugin.name} 的沙箱未找到`);
|
|
1540
|
-
continue;
|
|
1541
|
-
}
|
|
1542
|
-
// 根据沙箱配置过滤选项
|
|
1543
|
-
const filteredOptions = sandbox.filterConfig(options);
|
|
1544
|
-
await plugin.init(filteredOptions, context, sandbox, pluginEventBus);
|
|
1545
|
-
this.pluginStatus.set(plugin.name, 'initialized');
|
|
1546
|
-
} catch (error) {
|
|
1547
|
-
console.error(`插件 ${plugin.name} 的 init 钩子执行失败:`, error);
|
|
1548
|
-
}
|
|
1549
|
-
}
|
|
1550
|
-
}
|
|
1551
|
-
/**
|
|
1552
|
-
* 执行初始化后钩子
|
|
1553
|
-
*
|
|
1554
|
-
* 优化:按依赖顺序执行(逆序,确保依赖插件先执行)
|
|
1555
|
-
*/ async executeAfterInit(options, context) {
|
|
1556
|
-
const loadOrder = this.getLoadOrder();
|
|
1557
|
-
// 逆序执行,确保依赖插件先执行
|
|
1558
|
-
const reverseOrder = [
|
|
1559
|
-
...loadOrder
|
|
1560
|
-
].reverse();
|
|
1561
|
-
for (const pluginName of reverseOrder){
|
|
1562
|
-
const plugin = this.plugins.get(pluginName);
|
|
1563
|
-
if (!plugin || !plugin.afterInit) {
|
|
1564
|
-
continue;
|
|
1565
|
-
}
|
|
1566
|
-
try {
|
|
1567
|
-
const sandbox = this.sandboxes.get(plugin.name);
|
|
1568
|
-
if (!sandbox) {
|
|
1569
|
-
console.warn(`插件 ${plugin.name} 的沙箱未找到`);
|
|
1570
|
-
continue;
|
|
1571
|
-
}
|
|
1572
|
-
// 根据沙箱配置过滤选项
|
|
1573
|
-
const filteredOptions = sandbox.filterConfig(options);
|
|
1574
|
-
await plugin.afterInit(filteredOptions, context, sandbox, pluginEventBus);
|
|
1575
|
-
} catch (error) {
|
|
1576
|
-
console.error(`插件 ${plugin.name} 的 afterInit 钩子执行失败:`, error);
|
|
1577
|
-
}
|
|
1578
|
-
}
|
|
1579
|
-
}
|
|
1580
|
-
/**
|
|
1581
|
-
* 获取插件状态
|
|
1582
|
-
*
|
|
1583
|
-
* @param name - 插件名称
|
|
1584
|
-
* @returns 插件状态
|
|
1585
|
-
*/ getPluginStatus(name) {
|
|
1586
|
-
return this.pluginStatus.get(name);
|
|
1587
|
-
}
|
|
1588
|
-
/**
|
|
1589
|
-
* 检查插件是否已加载
|
|
1590
|
-
*
|
|
1591
|
-
* @param name - 插件名称
|
|
1592
|
-
* @returns 是否已加载
|
|
1593
|
-
*/ isLoaded(name) {
|
|
1594
|
-
return this.plugins.has(name);
|
|
1595
|
-
}
|
|
1596
|
-
/**
|
|
1597
|
-
* 获取已加载的插件列表
|
|
1598
|
-
*
|
|
1599
|
-
* @returns 插件名称数组
|
|
1600
|
-
*/ getLoadedPlugins() {
|
|
1601
|
-
return Array.from(this.plugins.keys());
|
|
1602
|
-
}
|
|
1603
|
-
/**
|
|
1604
|
-
* 获取所有插件状态
|
|
1605
|
-
*
|
|
1606
|
-
* @returns 插件状态映射
|
|
1607
|
-
*/ getAllPluginStatus() {
|
|
1608
|
-
return new Map(this.pluginStatus);
|
|
1609
|
-
}
|
|
1610
|
-
/**
|
|
1611
|
-
* 获取插件沙箱
|
|
1612
|
-
*
|
|
1613
|
-
* @param name - 插件名称
|
|
1614
|
-
* @returns 插件沙箱或undefined
|
|
1615
|
-
*/ getSandbox(name) {
|
|
1616
|
-
return this.sandboxes.get(name);
|
|
1617
|
-
}
|
|
1618
|
-
/**
|
|
1619
|
-
* 获取事件总线
|
|
1620
|
-
*/ getEventBus() {
|
|
1621
|
-
return pluginEventBus;
|
|
1622
|
-
}
|
|
1623
|
-
/**
|
|
1624
|
-
* 销毁所有插件
|
|
1625
|
-
*/ async destroyAll() {
|
|
1626
|
-
for (const plugin of this.plugins.values()){
|
|
1627
|
-
if (plugin.destroy) {
|
|
1628
|
-
try {
|
|
1629
|
-
await plugin.destroy();
|
|
1630
|
-
} catch (error) {
|
|
1631
|
-
console.error(`插件 ${plugin.name} 的 destroy 钩子执行失败:`, error);
|
|
1632
|
-
}
|
|
1633
|
-
}
|
|
1634
|
-
}
|
|
1635
|
-
this.plugins.clear();
|
|
1235
|
+
* 销毁所有插件
|
|
1236
|
+
*/ async destroyAll() {
|
|
1237
|
+
for (const plugin of this.plugins.values()){
|
|
1238
|
+
if (plugin.destroy) {
|
|
1239
|
+
try {
|
|
1240
|
+
await plugin.destroy();
|
|
1241
|
+
} catch (error) {
|
|
1242
|
+
console.error(`插件 ${plugin.name} 的 destroy 钩子执行失败:`, error);
|
|
1243
|
+
}
|
|
1244
|
+
}
|
|
1245
|
+
}
|
|
1246
|
+
this.plugins.clear();
|
|
1636
1247
|
}
|
|
1637
1248
|
constructor(){
|
|
1638
|
-
_define_property$
|
|
1639
|
-
_define_property$
|
|
1640
|
-
_define_property$
|
|
1641
|
-
_define_property$
|
|
1249
|
+
_define_property$G(this, "plugins", new Map());
|
|
1250
|
+
_define_property$G(this, "sandboxes", new Map());
|
|
1251
|
+
_define_property$G(this, "pluginStatus", new Map());
|
|
1252
|
+
_define_property$G(this, "pluginLoaders", new Map());
|
|
1642
1253
|
}
|
|
1643
1254
|
}
|
|
1644
1255
|
/**
|
|
@@ -1719,7 +1330,7 @@
|
|
|
1719
1330
|
}
|
|
1720
1331
|
}
|
|
1721
1332
|
|
|
1722
|
-
function _define_property$
|
|
1333
|
+
function _define_property$F(obj, key, value) {
|
|
1723
1334
|
if (key in obj) {
|
|
1724
1335
|
Object.defineProperty(obj, key, {
|
|
1725
1336
|
value: value,
|
|
@@ -1740,7 +1351,7 @@
|
|
|
1740
1351
|
/**
|
|
1741
1352
|
* 设置错误
|
|
1742
1353
|
*/ setError(error) {
|
|
1743
|
-
this.error =
|
|
1354
|
+
this.error = vlianUtils.errorUtils.normalizeError(error);
|
|
1744
1355
|
// 通知所有监听器
|
|
1745
1356
|
this.listeners.forEach((listener)=>listener());
|
|
1746
1357
|
}
|
|
@@ -1769,8 +1380,8 @@
|
|
|
1769
1380
|
return this.error !== null;
|
|
1770
1381
|
}
|
|
1771
1382
|
constructor(){
|
|
1772
|
-
_define_property$
|
|
1773
|
-
_define_property$
|
|
1383
|
+
_define_property$F(this, "error", null);
|
|
1384
|
+
_define_property$F(this, "listeners", new Set());
|
|
1774
1385
|
}
|
|
1775
1386
|
};
|
|
1776
1387
|
/**
|
|
@@ -2120,7 +1731,7 @@
|
|
|
2120
1731
|
return true;
|
|
2121
1732
|
}
|
|
2122
1733
|
|
|
2123
|
-
function _define_property$
|
|
1734
|
+
function _define_property$E(obj, key, value) {
|
|
2124
1735
|
if (key in obj) {
|
|
2125
1736
|
Object.defineProperty(obj, key, {
|
|
2126
1737
|
value: value,
|
|
@@ -2173,7 +1784,7 @@
|
|
|
2173
1784
|
return this.middlewares.length;
|
|
2174
1785
|
}
|
|
2175
1786
|
constructor(){
|
|
2176
|
-
_define_property$
|
|
1787
|
+
_define_property$E(this, "middlewares", []);
|
|
2177
1788
|
}
|
|
2178
1789
|
}
|
|
2179
1790
|
/**
|
|
@@ -2182,7 +1793,7 @@
|
|
|
2182
1793
|
|
|
2183
1794
|
/**
|
|
2184
1795
|
* 状态实例核心实现
|
|
2185
|
-
*/ function _define_property$
|
|
1796
|
+
*/ function _define_property$D(obj, key, value) {
|
|
2186
1797
|
if (key in obj) {
|
|
2187
1798
|
Object.defineProperty(obj, key, {
|
|
2188
1799
|
value: value,
|
|
@@ -2314,25 +1925,25 @@
|
|
|
2314
1925
|
*/ constructor(initialValue, options = {}){
|
|
2315
1926
|
/**
|
|
2316
1927
|
* 状态实例标识符
|
|
2317
|
-
*/ _define_property$
|
|
1928
|
+
*/ _define_property$D(this, "id", void 0);
|
|
2318
1929
|
/**
|
|
2319
1930
|
* 状态作用域
|
|
2320
|
-
*/ _define_property$
|
|
1931
|
+
*/ _define_property$D(this, "scope", void 0);
|
|
2321
1932
|
/**
|
|
2322
1933
|
* 当前状态值
|
|
2323
|
-
*/ _define_property$
|
|
1934
|
+
*/ _define_property$D(this, "value", void 0);
|
|
2324
1935
|
/**
|
|
2325
1936
|
* 订阅者集合
|
|
2326
|
-
*/ _define_property$
|
|
1937
|
+
*/ _define_property$D(this, "subscribers", new Set());
|
|
2327
1938
|
/**
|
|
2328
1939
|
* 是否已销毁
|
|
2329
|
-
*/ _define_property$
|
|
1940
|
+
*/ _define_property$D(this, "destroyed", false);
|
|
2330
1941
|
/**
|
|
2331
1942
|
* 开发模式标志
|
|
2332
|
-
*/ _define_property$
|
|
1943
|
+
*/ _define_property$D(this, "devMode", void 0);
|
|
2333
1944
|
/**
|
|
2334
1945
|
* 中间件函数数组
|
|
2335
|
-
*/ _define_property$
|
|
1946
|
+
*/ _define_property$D(this, "middleware", void 0);
|
|
2336
1947
|
this.value = initialValue;
|
|
2337
1948
|
this.id = options.id ?? Symbol('StateInstance');
|
|
2338
1949
|
this.scope = options.scope;
|
|
@@ -2349,7 +1960,7 @@
|
|
|
2349
1960
|
|
|
2350
1961
|
/**
|
|
2351
1962
|
* 状态作用域管理
|
|
2352
|
-
*/ function _define_property$
|
|
1963
|
+
*/ function _define_property$C(obj, key, value) {
|
|
2353
1964
|
if (key in obj) {
|
|
2354
1965
|
Object.defineProperty(obj, key, {
|
|
2355
1966
|
value: value,
|
|
@@ -2472,16 +2083,16 @@
|
|
|
2472
2083
|
constructor(){
|
|
2473
2084
|
/**
|
|
2474
2085
|
* 作用域到状态实例的映射
|
|
2475
|
-
*/ _define_property$
|
|
2086
|
+
*/ _define_property$C(this, "scopeMap", new Map());
|
|
2476
2087
|
/**
|
|
2477
2088
|
* 状态实例到作用域的映射(用于快速查找)
|
|
2478
|
-
*/ _define_property$
|
|
2089
|
+
*/ _define_property$C(this, "instanceToScopeMap", new Map());
|
|
2479
2090
|
}
|
|
2480
2091
|
}
|
|
2481
2092
|
|
|
2482
2093
|
/**
|
|
2483
2094
|
* 状态注册表实现
|
|
2484
|
-
*/ function _define_property$
|
|
2095
|
+
*/ function _define_property$B(obj, key, value) {
|
|
2485
2096
|
if (key in obj) {
|
|
2486
2097
|
Object.defineProperty(obj, key, {
|
|
2487
2098
|
value: value,
|
|
@@ -2575,17 +2186,17 @@
|
|
|
2575
2186
|
*/ constructor(){
|
|
2576
2187
|
/**
|
|
2577
2188
|
* 状态实例映射表(ID -> Instance)
|
|
2578
|
-
*/ _define_property$
|
|
2189
|
+
*/ _define_property$B(this, "instances", new Map());
|
|
2579
2190
|
/**
|
|
2580
2191
|
* 作用域管理器
|
|
2581
|
-
*/ _define_property$
|
|
2192
|
+
*/ _define_property$B(this, "scopeManager", void 0);
|
|
2582
2193
|
this.scopeManager = new StateScopeManager();
|
|
2583
2194
|
}
|
|
2584
2195
|
}
|
|
2585
2196
|
|
|
2586
2197
|
/**
|
|
2587
2198
|
* 派生状态实例实现
|
|
2588
|
-
*/ function _define_property$
|
|
2199
|
+
*/ function _define_property$A(obj, key, value) {
|
|
2589
2200
|
if (key in obj) {
|
|
2590
2201
|
Object.defineProperty(obj, key, {
|
|
2591
2202
|
value: value,
|
|
@@ -2723,28 +2334,28 @@
|
|
|
2723
2334
|
*/ constructor(config, options = {}){
|
|
2724
2335
|
/**
|
|
2725
2336
|
* 状态实例标识符
|
|
2726
|
-
*/ _define_property$
|
|
2337
|
+
*/ _define_property$A(this, "id", void 0);
|
|
2727
2338
|
/**
|
|
2728
2339
|
* 状态作用域
|
|
2729
|
-
*/ _define_property$
|
|
2340
|
+
*/ _define_property$A(this, "scope", void 0);
|
|
2730
2341
|
/**
|
|
2731
2342
|
* 派生状态配置
|
|
2732
|
-
*/ _define_property$
|
|
2343
|
+
*/ _define_property$A(this, "config", void 0);
|
|
2733
2344
|
/**
|
|
2734
2345
|
* 当前派生值
|
|
2735
|
-
*/ _define_property$
|
|
2346
|
+
*/ _define_property$A(this, "value", void 0);
|
|
2736
2347
|
/**
|
|
2737
2348
|
* 订阅者集合
|
|
2738
|
-
*/ _define_property$
|
|
2349
|
+
*/ _define_property$A(this, "subscribers", new Set());
|
|
2739
2350
|
/**
|
|
2740
2351
|
* 依赖状态的取消订阅函数数组
|
|
2741
|
-
*/ _define_property$
|
|
2352
|
+
*/ _define_property$A(this, "dependencyUnsubscribes", []);
|
|
2742
2353
|
/**
|
|
2743
2354
|
* 是否已销毁
|
|
2744
|
-
*/ _define_property$
|
|
2355
|
+
*/ _define_property$A(this, "destroyed", false);
|
|
2745
2356
|
/**
|
|
2746
2357
|
* 是否正在重新计算
|
|
2747
|
-
*/ _define_property$
|
|
2358
|
+
*/ _define_property$A(this, "recomputing", false);
|
|
2748
2359
|
this.config = config;
|
|
2749
2360
|
this.id = options.id ?? Symbol('DerivedStateInstance');
|
|
2750
2361
|
this.scope = options.scope;
|
|
@@ -2760,7 +2371,7 @@
|
|
|
2760
2371
|
*
|
|
2761
2372
|
* 这是 Secra Framework 内置的默认状态适配器实现
|
|
2762
2373
|
* 不依赖任何外部状态管理库,提供基础的状态管理能力
|
|
2763
|
-
*/ function _define_property$
|
|
2374
|
+
*/ function _define_property$z(obj, key, value) {
|
|
2764
2375
|
if (key in obj) {
|
|
2765
2376
|
Object.defineProperty(obj, key, {
|
|
2766
2377
|
value: value,
|
|
@@ -2814,19 +2425,19 @@
|
|
|
2814
2425
|
constructor(){
|
|
2815
2426
|
/**
|
|
2816
2427
|
* 适配器名称
|
|
2817
|
-
*/ _define_property$
|
|
2428
|
+
*/ _define_property$z(this, "name", 'DefaultAdapter');
|
|
2818
2429
|
/**
|
|
2819
2430
|
* 是否已销毁
|
|
2820
|
-
*/ _define_property$
|
|
2431
|
+
*/ _define_property$z(this, "destroyed", false);
|
|
2821
2432
|
/**
|
|
2822
2433
|
* 创建的状态实例集合(用于销毁时清理)
|
|
2823
|
-
*/ _define_property$
|
|
2434
|
+
*/ _define_property$z(this, "instances", new Set());
|
|
2824
2435
|
}
|
|
2825
2436
|
}
|
|
2826
2437
|
|
|
2827
2438
|
/**
|
|
2828
2439
|
* 状态适配器工厂
|
|
2829
|
-
*/ function _define_property$
|
|
2440
|
+
*/ function _define_property$y(obj, key, value) {
|
|
2830
2441
|
if (key in obj) {
|
|
2831
2442
|
Object.defineProperty(obj, key, {
|
|
2832
2443
|
value: value,
|
|
@@ -2902,10 +2513,10 @@
|
|
|
2902
2513
|
}
|
|
2903
2514
|
/**
|
|
2904
2515
|
* 默认适配器实例
|
|
2905
|
-
*/ _define_property$
|
|
2516
|
+
*/ _define_property$y(AdapterFactory, "defaultAdapter", null);
|
|
2906
2517
|
/**
|
|
2907
2518
|
* 自定义适配器映射
|
|
2908
|
-
*/ _define_property$
|
|
2519
|
+
*/ _define_property$y(AdapterFactory, "customAdapters", new Map());
|
|
2909
2520
|
|
|
2910
2521
|
/**
|
|
2911
2522
|
* Redux Toolkit 适配器
|
|
@@ -2928,7 +2539,7 @@
|
|
|
2928
2539
|
* state.set(1);
|
|
2929
2540
|
* console.log(state.get()); // 1
|
|
2930
2541
|
* ```
|
|
2931
|
-
*/ function _define_property$
|
|
2542
|
+
*/ function _define_property$x(obj, key, value) {
|
|
2932
2543
|
if (key in obj) {
|
|
2933
2544
|
Object.defineProperty(obj, key, {
|
|
2934
2545
|
value: value,
|
|
@@ -3086,37 +2697,37 @@
|
|
|
3086
2697
|
*/ constructor(store, sliceName, actions, initialValue, options = {}){
|
|
3087
2698
|
/**
|
|
3088
2699
|
* 状态实例标识符
|
|
3089
|
-
*/ _define_property$
|
|
2700
|
+
*/ _define_property$x(this, "id", void 0);
|
|
3090
2701
|
/**
|
|
3091
2702
|
* 状态作用域
|
|
3092
|
-
*/ _define_property$
|
|
2703
|
+
*/ _define_property$x(this, "scope", void 0);
|
|
3093
2704
|
/**
|
|
3094
2705
|
* Redux store 引用
|
|
3095
|
-
*/ _define_property$
|
|
2706
|
+
*/ _define_property$x(this, "store", void 0);
|
|
3096
2707
|
/**
|
|
3097
2708
|
* Redux slice 名称(在 store 中的路径)
|
|
3098
|
-
*/ _define_property$
|
|
2709
|
+
*/ _define_property$x(this, "sliceName", void 0);
|
|
3099
2710
|
/**
|
|
3100
2711
|
* Redux slice actions
|
|
3101
|
-
*/ _define_property$
|
|
2712
|
+
*/ _define_property$x(this, "actions", void 0);
|
|
3102
2713
|
/**
|
|
3103
2714
|
* 订阅者集合
|
|
3104
|
-
*/ _define_property$
|
|
2715
|
+
*/ _define_property$x(this, "subscribers", new Set());
|
|
3105
2716
|
/**
|
|
3106
2717
|
* Redux store 订阅取消函数
|
|
3107
|
-
*/ _define_property$
|
|
2718
|
+
*/ _define_property$x(this, "unsubscribeStore", void 0);
|
|
3108
2719
|
/**
|
|
3109
2720
|
* 是否已销毁
|
|
3110
|
-
*/ _define_property$
|
|
2721
|
+
*/ _define_property$x(this, "destroyed", false);
|
|
3111
2722
|
/**
|
|
3112
2723
|
* 开发模式标志
|
|
3113
|
-
*/ _define_property$
|
|
2724
|
+
*/ _define_property$x(this, "devMode", void 0);
|
|
3114
2725
|
/**
|
|
3115
2726
|
* 中间件函数数组
|
|
3116
|
-
*/ _define_property$
|
|
2727
|
+
*/ _define_property$x(this, "middleware", void 0);
|
|
3117
2728
|
/**
|
|
3118
2729
|
* 上一次的状态值(用于订阅通知)
|
|
3119
|
-
*/ _define_property$
|
|
2730
|
+
*/ _define_property$x(this, "previousValue", void 0);
|
|
3120
2731
|
this.store = store;
|
|
3121
2732
|
this.sliceName = sliceName;
|
|
3122
2733
|
this.actions = actions;
|
|
@@ -3168,10 +2779,10 @@
|
|
|
3168
2779
|
*/ constructor(){
|
|
3169
2780
|
/**
|
|
3170
2781
|
* 当前 reducer 映射
|
|
3171
|
-
*/ _define_property$
|
|
2782
|
+
*/ _define_property$x(this, "reducers", new Map());
|
|
3172
2783
|
/**
|
|
3173
2784
|
* 根 reducer 函数
|
|
3174
|
-
*/ _define_property$
|
|
2785
|
+
*/ _define_property$x(this, "rootReducer", void 0);
|
|
3175
2786
|
this.rootReducer = (state, action)=>{
|
|
3176
2787
|
const stateRecord = state ?? {};
|
|
3177
2788
|
const newState = {
|
|
@@ -3315,28 +2926,28 @@
|
|
|
3315
2926
|
*/ constructor(options){
|
|
3316
2927
|
/**
|
|
3317
2928
|
* 适配器名称
|
|
3318
|
-
*/ _define_property$
|
|
2929
|
+
*/ _define_property$x(this, "name", 'ReduxAdapter');
|
|
3319
2930
|
/**
|
|
3320
2931
|
* 是否已销毁
|
|
3321
|
-
*/ _define_property$
|
|
2932
|
+
*/ _define_property$x(this, "destroyed", false);
|
|
3322
2933
|
/**
|
|
3323
2934
|
* 创建的状态实例集合
|
|
3324
|
-
*/ _define_property$
|
|
2935
|
+
*/ _define_property$x(this, "instances", new Set());
|
|
3325
2936
|
/**
|
|
3326
2937
|
* Redux store 实例
|
|
3327
|
-
*/ _define_property$
|
|
2938
|
+
*/ _define_property$x(this, "store", null);
|
|
3328
2939
|
/**
|
|
3329
2940
|
* Redux slice 名称计数器(用于生成唯一的 slice 名称)
|
|
3330
|
-
*/ _define_property$
|
|
2941
|
+
*/ _define_property$x(this, "sliceCounter", 0);
|
|
3331
2942
|
/**
|
|
3332
2943
|
* Redux slice 名称到状态实例的映射
|
|
3333
|
-
*/ _define_property$
|
|
2944
|
+
*/ _define_property$x(this, "sliceToInstance", new Map());
|
|
3334
2945
|
/**
|
|
3335
2946
|
* 动态 reducer 管理器
|
|
3336
|
-
*/ _define_property$
|
|
2947
|
+
*/ _define_property$x(this, "reducerManager", void 0);
|
|
3337
2948
|
/**
|
|
3338
2949
|
* 是否启用开发模式
|
|
3339
|
-
*/ _define_property$
|
|
2950
|
+
*/ _define_property$x(this, "devMode", void 0);
|
|
3340
2951
|
this.devMode = options?.devMode ?? false;
|
|
3341
2952
|
this.reducerManager = new DynamicReducerManager();
|
|
3342
2953
|
this.store = options?.store ?? null;
|
|
@@ -3351,7 +2962,7 @@
|
|
|
3351
2962
|
* 这是一个适配器接口示例,展示如何将 Zustand 集成到 Secra 状态管理器
|
|
3352
2963
|
*
|
|
3353
2964
|
* ⚠️ 注意:这是一个占位实现,实际使用时需要安装 zustand 依赖
|
|
3354
|
-
*/ function _define_property$
|
|
2965
|
+
*/ function _define_property$w(obj, key, value) {
|
|
3355
2966
|
if (key in obj) {
|
|
3356
2967
|
Object.defineProperty(obj, key, {
|
|
3357
2968
|
value: value,
|
|
@@ -3404,13 +3015,13 @@
|
|
|
3404
3015
|
constructor(){
|
|
3405
3016
|
/**
|
|
3406
3017
|
* 适配器名称
|
|
3407
|
-
*/ _define_property$
|
|
3018
|
+
*/ _define_property$w(this, "name", 'ZustandAdapter');
|
|
3408
3019
|
/**
|
|
3409
3020
|
* 是否已销毁
|
|
3410
|
-
*/ _define_property$
|
|
3021
|
+
*/ _define_property$w(this, "destroyed", false);
|
|
3411
3022
|
/**
|
|
3412
3023
|
* 创建的状态实例集合
|
|
3413
|
-
*/ _define_property$
|
|
3024
|
+
*/ _define_property$w(this, "instances", new Set());
|
|
3414
3025
|
}
|
|
3415
3026
|
}
|
|
3416
3027
|
|
|
@@ -3418,7 +3029,7 @@
|
|
|
3418
3029
|
* 状态管理器主类
|
|
3419
3030
|
*
|
|
3420
3031
|
* 这是状态管理器的核心入口,提供统一的状态管理 API
|
|
3421
|
-
*/ function _define_property$
|
|
3032
|
+
*/ function _define_property$v(obj, key, value) {
|
|
3422
3033
|
if (key in obj) {
|
|
3423
3034
|
Object.defineProperty(obj, key, {
|
|
3424
3035
|
value: value,
|
|
@@ -3543,19 +3154,19 @@
|
|
|
3543
3154
|
*/ constructor(options = {}){
|
|
3544
3155
|
/**
|
|
3545
3156
|
* 默认适配器
|
|
3546
|
-
*/ _define_property$
|
|
3157
|
+
*/ _define_property$v(this, "adapter", void 0);
|
|
3547
3158
|
/**
|
|
3548
3159
|
* 状态注册表(如果启用)
|
|
3549
|
-
*/ _define_property$
|
|
3160
|
+
*/ _define_property$v(this, "registry", void 0);
|
|
3550
3161
|
/**
|
|
3551
3162
|
* 默认作用域
|
|
3552
|
-
*/ _define_property$
|
|
3163
|
+
*/ _define_property$v(this, "defaultScope", void 0);
|
|
3553
3164
|
/**
|
|
3554
3165
|
* 是否启用开发模式
|
|
3555
|
-
*/ _define_property$
|
|
3166
|
+
*/ _define_property$v(this, "devMode", void 0);
|
|
3556
3167
|
/**
|
|
3557
3168
|
* 是否已销毁
|
|
3558
|
-
*/ _define_property$
|
|
3169
|
+
*/ _define_property$v(this, "destroyed", false);
|
|
3559
3170
|
this.adapter = options.defaultAdapter ?? AdapterFactory.getDefaultAdapter();
|
|
3560
3171
|
this.defaultScope = options.defaultScope;
|
|
3561
3172
|
this.devMode = options.devMode ?? false;
|
|
@@ -3570,7 +3181,7 @@
|
|
|
3570
3181
|
}
|
|
3571
3182
|
}
|
|
3572
3183
|
|
|
3573
|
-
function _define_property$
|
|
3184
|
+
function _define_property$u(obj, key, value) {
|
|
3574
3185
|
if (key in obj) {
|
|
3575
3186
|
Object.defineProperty(obj, key, {
|
|
3576
3187
|
value: value,
|
|
@@ -3970,25 +3581,25 @@
|
|
|
3970
3581
|
/**
|
|
3971
3582
|
* 事件监听器映射表
|
|
3972
3583
|
* 使用 Map + Set 结构提高性能
|
|
3973
|
-
*/ _define_property$
|
|
3584
|
+
*/ _define_property$u(this, "listeners", new Map());
|
|
3974
3585
|
/**
|
|
3975
3586
|
* 事件历史记录
|
|
3976
|
-
*/ _define_property$
|
|
3587
|
+
*/ _define_property$u(this, "eventHistory", []);
|
|
3977
3588
|
/**
|
|
3978
3589
|
* 事件中间件列表
|
|
3979
|
-
*/ _define_property$
|
|
3590
|
+
*/ _define_property$u(this, "middlewares", []);
|
|
3980
3591
|
/**
|
|
3981
3592
|
* 事件统计信息
|
|
3982
|
-
*/ _define_property$
|
|
3593
|
+
*/ _define_property$u(this, "stats", new Map());
|
|
3983
3594
|
/**
|
|
3984
3595
|
* 配置
|
|
3985
|
-
*/ _define_property$
|
|
3596
|
+
*/ _define_property$u(this, "config", void 0);
|
|
3986
3597
|
/**
|
|
3987
3598
|
* 事件计数器(用于生成唯一事件ID)
|
|
3988
|
-
*/ _define_property$
|
|
3599
|
+
*/ _define_property$u(this, "eventCounter", 0);
|
|
3989
3600
|
/**
|
|
3990
3601
|
* 监听器ID计数器
|
|
3991
|
-
*/ _define_property$
|
|
3602
|
+
*/ _define_property$u(this, "listenerIdCounter", 0);
|
|
3992
3603
|
this.config = {
|
|
3993
3604
|
enableTracking: config.enableTracking ?? process.env.NODE_ENV === 'development',
|
|
3994
3605
|
maxHistorySize: config.maxHistorySize ?? 100,
|
|
@@ -4094,7 +3705,7 @@
|
|
|
4094
3705
|
]);
|
|
4095
3706
|
logger.logger.info('关键服务初始化完成');
|
|
4096
3707
|
// 初始化性能监控(依赖监控服务,必须在监控服务初始化后)
|
|
4097
|
-
const performanceMonitor = new
|
|
3708
|
+
const performanceMonitor = new vlianUtils.PerformanceMonitor({
|
|
4098
3709
|
...options.performanceMonitor,
|
|
4099
3710
|
onReport: (metrics)=>{
|
|
4100
3711
|
monitoring$1.reportPerformance(metrics);
|
|
@@ -4181,7 +3792,7 @@
|
|
|
4181
3792
|
};
|
|
4182
3793
|
}
|
|
4183
3794
|
|
|
4184
|
-
function _define_property$
|
|
3795
|
+
function _define_property$t(obj, key, value) {
|
|
4185
3796
|
if (key in obj) {
|
|
4186
3797
|
Object.defineProperty(obj, key, {
|
|
4187
3798
|
value: value,
|
|
@@ -4299,7 +3910,7 @@
|
|
|
4299
3910
|
/**
|
|
4300
3911
|
* 私有构造函数,防止外部直接实例化
|
|
4301
3912
|
*/ constructor(){
|
|
4302
|
-
_define_property$
|
|
3913
|
+
_define_property$t(this, "_config", void 0);
|
|
4303
3914
|
this._config = {
|
|
4304
3915
|
theme: {
|
|
4305
3916
|
mode: 'light'
|
|
@@ -4308,7 +3919,7 @@
|
|
|
4308
3919
|
};
|
|
4309
3920
|
}
|
|
4310
3921
|
};
|
|
4311
|
-
_define_property$
|
|
3922
|
+
_define_property$t(AppConfigManager, "instance", null);
|
|
4312
3923
|
/**
|
|
4313
3924
|
* 应用配置单例实例
|
|
4314
3925
|
*/ const appConfig = AppConfigManager.getInstance();
|
|
@@ -4914,7 +4525,7 @@
|
|
|
4914
4525
|
return r.length !== e.length || r.some((t, o) => !Object.is(t, e[o]));
|
|
4915
4526
|
}
|
|
4916
4527
|
|
|
4917
|
-
function _define_property$
|
|
4528
|
+
function _define_property$s(obj, key, value) {
|
|
4918
4529
|
if (key in obj) {
|
|
4919
4530
|
Object.defineProperty(obj, key, {
|
|
4920
4531
|
value: value,
|
|
@@ -4943,9 +4554,9 @@
|
|
|
4943
4554
|
* @returns 错误处理结果
|
|
4944
4555
|
*/ async handleError(error, context) {
|
|
4945
4556
|
// 标准化错误对象
|
|
4946
|
-
const normalizedError =
|
|
4557
|
+
const normalizedError = vlianUtils.errorUtils.normalizeError(error);
|
|
4947
4558
|
// 创建包含上下文信息的错误对象(由于 context 是只读的,需要创建新对象)
|
|
4948
|
-
const errorWithContext = context ? new
|
|
4559
|
+
const errorWithContext = context ? new vlianUtils.FrameworkError(normalizedError.message, normalizedError.type, normalizedError.severity, {
|
|
4949
4560
|
code: normalizedError.code,
|
|
4950
4561
|
originalError: normalizedError.originalError,
|
|
4951
4562
|
context: {
|
|
@@ -5025,23 +4636,23 @@
|
|
|
5025
4636
|
/**
|
|
5026
4637
|
* 记录错误
|
|
5027
4638
|
*/ logError(error) {
|
|
5028
|
-
const errorInfo =
|
|
4639
|
+
const errorInfo = vlianUtils.errorUtils.extractErrorInfo(error);
|
|
5029
4640
|
// 根据错误严重程度选择日志级别
|
|
5030
4641
|
switch(error.severity){
|
|
5031
|
-
case
|
|
5032
|
-
case
|
|
4642
|
+
case vlianUtils.ErrorSeverity.CRITICAL:
|
|
4643
|
+
case vlianUtils.ErrorSeverity.HIGH:
|
|
5033
4644
|
logger.logger.error('错误:', errorInfo);
|
|
5034
4645
|
break;
|
|
5035
|
-
case
|
|
4646
|
+
case vlianUtils.ErrorSeverity.MEDIUM:
|
|
5036
4647
|
logger.logger.warn('警告:', errorInfo);
|
|
5037
4648
|
break;
|
|
5038
|
-
case
|
|
4649
|
+
case vlianUtils.ErrorSeverity.LOW:
|
|
5039
4650
|
logger.logger.info('信息:', errorInfo);
|
|
5040
4651
|
break;
|
|
5041
4652
|
}
|
|
5042
4653
|
// 开发环境显示详细错误信息
|
|
5043
4654
|
if (this.config.showDetailedErrorsInDev && process.env.NODE_ENV === 'development') {
|
|
5044
|
-
const detailedError =
|
|
4655
|
+
const detailedError = vlianUtils.errorUtils.formatErrorForDev(error);
|
|
5045
4656
|
console.error(detailedError);
|
|
5046
4657
|
}
|
|
5047
4658
|
}
|
|
@@ -5113,8 +4724,8 @@
|
|
|
5113
4724
|
return new ErrorHandler(config);
|
|
5114
4725
|
}
|
|
5115
4726
|
constructor(config = {}){
|
|
5116
|
-
_define_property$
|
|
5117
|
-
_define_property$
|
|
4727
|
+
_define_property$s(this, "config", void 0);
|
|
4728
|
+
_define_property$s(this, "monitoring", void 0);
|
|
5118
4729
|
this.monitoring = config.monitoring;
|
|
5119
4730
|
this.config = {
|
|
5120
4731
|
defaultStrategies: config.defaultStrategies ?? [
|
|
@@ -5176,7 +4787,7 @@
|
|
|
5176
4787
|
const errorHandler = React.useMemo(()=>getDefaultErrorHandler(), []);
|
|
5177
4788
|
// 处理错误,将标准 Error 转换为 FrameworkError
|
|
5178
4789
|
const handleError = React.useCallback(async (error, errorInfo)=>{
|
|
5179
|
-
const normalizedError =
|
|
4790
|
+
const normalizedError = vlianUtils.errorUtils.normalizeError(error);
|
|
5180
4791
|
// 将 react-error-boundary 的 errorInfo 转换为 React 的 ErrorInfo 格式
|
|
5181
4792
|
const reactErrorInfo = {
|
|
5182
4793
|
componentStack: errorInfo.componentStack || ''
|
|
@@ -5221,7 +4832,7 @@
|
|
|
5221
4832
|
// 默认 fallback UI(使用无框架 HTML 组件)
|
|
5222
4833
|
// 使用内部组件来管理重试计数状态,使用 React.memo 优化性能
|
|
5223
4834
|
const DefaultFallbackComponent = /*#__PURE__*/ React.memo(({ error, resetErrorBoundary })=>{
|
|
5224
|
-
const normalizedError =
|
|
4835
|
+
const normalizedError = vlianUtils.errorUtils.normalizeError(error);
|
|
5225
4836
|
const [retryCount, setRetryCount] = React.useState(retryCountRef.current);
|
|
5226
4837
|
const [showDetails, setShowDetails] = React.useState(false);
|
|
5227
4838
|
// 同步 ref 的值到 state,确保组件重新创建时能读取到最新的重试计数
|
|
@@ -5451,7 +5062,7 @@
|
|
|
5451
5062
|
};
|
|
5452
5063
|
// 如果提供了自定义 fallback,使用自定义的
|
|
5453
5064
|
const fallbackRender = fallback ? ({ error, resetErrorBoundary })=>{
|
|
5454
|
-
const normalizedError =
|
|
5065
|
+
const normalizedError = vlianUtils.errorUtils.normalizeError(error);
|
|
5455
5066
|
return fallback(normalizedError, ()=>{
|
|
5456
5067
|
handleReset();
|
|
5457
5068
|
resetErrorBoundary();
|
|
@@ -5531,7 +5142,7 @@
|
|
|
5531
5142
|
};
|
|
5532
5143
|
}
|
|
5533
5144
|
|
|
5534
|
-
function _define_property$
|
|
5145
|
+
function _define_property$r(obj, key, value) {
|
|
5535
5146
|
if (key in obj) {
|
|
5536
5147
|
Object.defineProperty(obj, key, {
|
|
5537
5148
|
value: value,
|
|
@@ -5590,8 +5201,8 @@
|
|
|
5590
5201
|
}
|
|
5591
5202
|
}
|
|
5592
5203
|
constructor(maxSize = 50){
|
|
5593
|
-
_define_property$
|
|
5594
|
-
_define_property$
|
|
5204
|
+
_define_property$r(this, "cache", new Map());
|
|
5205
|
+
_define_property$r(this, "maxSize", void 0);
|
|
5595
5206
|
this.maxSize = maxSize;
|
|
5596
5207
|
}
|
|
5597
5208
|
};
|
|
@@ -5829,7 +5440,7 @@
|
|
|
5829
5440
|
}
|
|
5830
5441
|
}
|
|
5831
5442
|
// 使用 SecurityUtils 验证输入(最后检查,因为可能较慢)
|
|
5832
|
-
const validation =
|
|
5443
|
+
const validation = vlianUtils.SecurityUtils.validateInput(path);
|
|
5833
5444
|
if (!validation.safe) {
|
|
5834
5445
|
return {
|
|
5835
5446
|
valid: false,
|
|
@@ -5940,7 +5551,7 @@
|
|
|
5940
5551
|
if (!validation.valid) {
|
|
5941
5552
|
// 生产环境错误信息脱敏
|
|
5942
5553
|
const errorMessage = process.env.NODE_ENV === 'development' ? `路径验证失败: ${validation.error}` : '路径验证失败';
|
|
5943
|
-
const error = new
|
|
5554
|
+
const error = new vlianUtils.SecurityError(errorMessage, undefined, process.env.NODE_ENV === 'development' ? {
|
|
5944
5555
|
path: normalizedPath
|
|
5945
5556
|
} : {});
|
|
5946
5557
|
if (options.enableDebugLog) {
|
|
@@ -5985,8 +5596,8 @@
|
|
|
5985
5596
|
}
|
|
5986
5597
|
}
|
|
5987
5598
|
constructor(){
|
|
5988
|
-
_define_property$
|
|
5989
|
-
_define_property$
|
|
5599
|
+
_define_property$r(this, "pool", []);
|
|
5600
|
+
_define_property$r(this, "maxPoolSize", 100);
|
|
5990
5601
|
}
|
|
5991
5602
|
};
|
|
5992
5603
|
const stackNodePool = new StackNodePool();
|
|
@@ -6201,7 +5812,7 @@
|
|
|
6201
5812
|
} catch (error) {
|
|
6202
5813
|
const err = error instanceof Error ? error : new Error('路由配置加载失败');
|
|
6203
5814
|
logger.logger.error('路由配置加载失败:', err);
|
|
6204
|
-
throw new
|
|
5815
|
+
throw new vlianUtils.ValidationError('路由配置加载失败', {
|
|
6205
5816
|
originalError: err
|
|
6206
5817
|
});
|
|
6207
5818
|
}
|
|
@@ -6313,7 +5924,7 @@
|
|
|
6313
5924
|
} catch (error) {
|
|
6314
5925
|
const err = error instanceof Error ? error : new Error('路由转换失败');
|
|
6315
5926
|
logger.logger.error('路由转换失败:', err);
|
|
6316
|
-
throw new
|
|
5927
|
+
throw new vlianUtils.ValidationError('路由转换失败', {
|
|
6317
5928
|
originalError: err
|
|
6318
5929
|
});
|
|
6319
5930
|
}
|
|
@@ -6816,7 +6427,7 @@
|
|
|
6816
6427
|
return routerConfigSchema.safeParse(config);
|
|
6817
6428
|
}
|
|
6818
6429
|
|
|
6819
|
-
function _define_property$
|
|
6430
|
+
function _define_property$q(obj, key, value) {
|
|
6820
6431
|
if (key in obj) {
|
|
6821
6432
|
Object.defineProperty(obj, key, {
|
|
6822
6433
|
value: value,
|
|
@@ -6833,7 +6444,7 @@
|
|
|
6833
6444
|
* 配置验证错误
|
|
6834
6445
|
*/ class ConfigValidationError extends Error {
|
|
6835
6446
|
constructor(message, errors){
|
|
6836
|
-
super(message), _define_property$
|
|
6447
|
+
super(message), _define_property$q(this, "errors", void 0), this.errors = errors;
|
|
6837
6448
|
this.name = 'ConfigValidationError';
|
|
6838
6449
|
}
|
|
6839
6450
|
}
|
|
@@ -7002,7 +6613,7 @@
|
|
|
7002
6613
|
}
|
|
7003
6614
|
}
|
|
7004
6615
|
|
|
7005
|
-
function _define_property$
|
|
6616
|
+
function _define_property$p(obj, key, value) {
|
|
7006
6617
|
if (key in obj) {
|
|
7007
6618
|
Object.defineProperty(obj, key, {
|
|
7008
6619
|
value: value,
|
|
@@ -7114,7 +6725,7 @@
|
|
|
7114
6725
|
return this.hooks.length;
|
|
7115
6726
|
}
|
|
7116
6727
|
constructor(){
|
|
7117
|
-
_define_property$
|
|
6728
|
+
_define_property$p(this, "hooks", []);
|
|
7118
6729
|
}
|
|
7119
6730
|
}
|
|
7120
6731
|
/**
|
|
@@ -7127,7 +6738,7 @@
|
|
|
7127
6738
|
return lifecycleManagerInstance;
|
|
7128
6739
|
}
|
|
7129
6740
|
|
|
7130
|
-
function _define_property$
|
|
6741
|
+
function _define_property$o(obj, key, value) {
|
|
7131
6742
|
if (key in obj) {
|
|
7132
6743
|
Object.defineProperty(obj, key, {
|
|
7133
6744
|
value: value,
|
|
@@ -7287,10 +6898,10 @@
|
|
|
7287
6898
|
return this.middlewares.length;
|
|
7288
6899
|
}
|
|
7289
6900
|
constructor(){
|
|
7290
|
-
_define_property$
|
|
6901
|
+
_define_property$o(this, "middlewares", []);
|
|
7291
6902
|
}
|
|
7292
6903
|
}
|
|
7293
|
-
_define_property$
|
|
6904
|
+
_define_property$o(RouterMiddlewareManager, "SAFE_REDIRECT_PATH_REGEX", /^(\/|\.\/|\.\.\/|#)/);
|
|
7294
6905
|
/**
|
|
7295
6906
|
* 获取路由中间件管理器单例
|
|
7296
6907
|
*/ let middlewareManagerInstance = null;
|
|
@@ -7388,9 +6999,9 @@
|
|
|
7388
6999
|
}({});
|
|
7389
7000
|
/**
|
|
7390
7001
|
* 路由错误
|
|
7391
|
-
*/ class RouterError extends
|
|
7392
|
-
constructor(message, code, severity =
|
|
7393
|
-
super(message,
|
|
7002
|
+
*/ class RouterError extends vlianUtils.FrameworkError {
|
|
7003
|
+
constructor(message, code, severity = vlianUtils.ErrorSeverity.MEDIUM, cause, context){
|
|
7004
|
+
super(message, vlianUtils.ErrorType.RUNTIME, severity, {
|
|
7394
7005
|
code,
|
|
7395
7006
|
originalError: cause,
|
|
7396
7007
|
context: context || {}
|
|
@@ -7404,7 +7015,7 @@
|
|
|
7404
7015
|
return new RouterError(message, code, severity, cause, context);
|
|
7405
7016
|
}
|
|
7406
7017
|
|
|
7407
|
-
function _define_property$
|
|
7018
|
+
function _define_property$n(obj, key, value) {
|
|
7408
7019
|
if (key in obj) {
|
|
7409
7020
|
Object.defineProperty(obj, key, {
|
|
7410
7021
|
value: value,
|
|
@@ -7642,12 +7253,12 @@
|
|
|
7642
7253
|
};
|
|
7643
7254
|
}
|
|
7644
7255
|
constructor(config = {}){
|
|
7645
|
-
_define_property$
|
|
7646
|
-
_define_property$
|
|
7647
|
-
_define_property$
|
|
7648
|
-
_define_property$
|
|
7649
|
-
_define_property$
|
|
7650
|
-
_define_property$
|
|
7256
|
+
_define_property$n(this, "cache", new Map());
|
|
7257
|
+
_define_property$n(this, "matchCache", new Map());
|
|
7258
|
+
_define_property$n(this, "config", void 0);
|
|
7259
|
+
_define_property$n(this, "persistenceEnabled", false);
|
|
7260
|
+
_define_property$n(this, "cleanupTimer", null);
|
|
7261
|
+
_define_property$n(this, "stats", {
|
|
7651
7262
|
transformHits: 0,
|
|
7652
7263
|
transformMisses: 0,
|
|
7653
7264
|
matchHits: 0,
|
|
@@ -7677,7 +7288,7 @@
|
|
|
7677
7288
|
return routeCacheInstance;
|
|
7678
7289
|
}
|
|
7679
7290
|
|
|
7680
|
-
function _define_property$
|
|
7291
|
+
function _define_property$m(obj, key, value) {
|
|
7681
7292
|
if (key in obj) {
|
|
7682
7293
|
Object.defineProperty(obj, key, {
|
|
7683
7294
|
value: value,
|
|
@@ -7927,10 +7538,10 @@
|
|
|
7927
7538
|
return stats;
|
|
7928
7539
|
}
|
|
7929
7540
|
constructor(config = {}){
|
|
7930
|
-
_define_property$
|
|
7931
|
-
_define_property$
|
|
7932
|
-
_define_property$
|
|
7933
|
-
_define_property$
|
|
7541
|
+
_define_property$m(this, "tasks", new Map());
|
|
7542
|
+
_define_property$m(this, "config", void 0);
|
|
7543
|
+
_define_property$m(this, "preloadTimer", null);
|
|
7544
|
+
_define_property$m(this, "idleHandle", null);
|
|
7934
7545
|
this.config = {
|
|
7935
7546
|
strategy: config.strategy ?? "none",
|
|
7936
7547
|
delay: config.delay ?? 1000,
|
|
@@ -7981,7 +7592,7 @@
|
|
|
7981
7592
|
return PluginLifecycleStage;
|
|
7982
7593
|
}({});
|
|
7983
7594
|
|
|
7984
|
-
function _define_property$
|
|
7595
|
+
function _define_property$l(obj, key, value) {
|
|
7985
7596
|
if (key in obj) {
|
|
7986
7597
|
Object.defineProperty(obj, key, {
|
|
7987
7598
|
value: value,
|
|
@@ -8210,7 +7821,7 @@
|
|
|
8210
7821
|
return this.plugins.size;
|
|
8211
7822
|
}
|
|
8212
7823
|
constructor(){
|
|
8213
|
-
_define_property$
|
|
7824
|
+
_define_property$l(this, "plugins", new Map());
|
|
8214
7825
|
}
|
|
8215
7826
|
}
|
|
8216
7827
|
/**
|
|
@@ -8223,7 +7834,7 @@
|
|
|
8223
7834
|
return pluginManagerInstance;
|
|
8224
7835
|
}
|
|
8225
7836
|
|
|
8226
|
-
function _define_property$
|
|
7837
|
+
function _define_property$k(obj, key, value) {
|
|
8227
7838
|
if (key in obj) {
|
|
8228
7839
|
Object.defineProperty(obj, key, {
|
|
8229
7840
|
value: value,
|
|
@@ -8404,12 +8015,12 @@
|
|
|
8404
8015
|
};
|
|
8405
8016
|
}
|
|
8406
8017
|
constructor(config = {}){
|
|
8407
|
-
_define_property$
|
|
8408
|
-
_define_property$
|
|
8409
|
-
_define_property$
|
|
8410
|
-
_define_property$
|
|
8411
|
-
_define_property$
|
|
8412
|
-
_define_property$
|
|
8018
|
+
_define_property$k(this, "accessRecords", []);
|
|
8019
|
+
_define_property$k(this, "performanceMetrics", new Map());
|
|
8020
|
+
_define_property$k(this, "config", void 0);
|
|
8021
|
+
_define_property$k(this, "monitoringService", monitoring.getMonitoring());
|
|
8022
|
+
_define_property$k(this, "currentRouteStartTime", 0);
|
|
8023
|
+
_define_property$k(this, "currentRoute", void 0);
|
|
8413
8024
|
this.config = {
|
|
8414
8025
|
enabled: config.enabled ?? true,
|
|
8415
8026
|
trackAccess: config.trackAccess ?? true,
|
|
@@ -8430,7 +8041,7 @@
|
|
|
8430
8041
|
return routerMonitoringInstance;
|
|
8431
8042
|
}
|
|
8432
8043
|
|
|
8433
|
-
function _define_property$
|
|
8044
|
+
function _define_property$j(obj, key, value) {
|
|
8434
8045
|
if (key in obj) {
|
|
8435
8046
|
Object.defineProperty(obj, key, {
|
|
8436
8047
|
value: value,
|
|
@@ -8630,9 +8241,9 @@
|
|
|
8630
8241
|
return this.adapters.size;
|
|
8631
8242
|
}
|
|
8632
8243
|
constructor(){
|
|
8633
|
-
_define_property$
|
|
8634
|
-
_define_property$
|
|
8635
|
-
_define_property$
|
|
8244
|
+
_define_property$j(this, "adapters", new Map());
|
|
8245
|
+
_define_property$j(this, "currentAdapter", null);
|
|
8246
|
+
_define_property$j(this, "defaultAdapterName", null);
|
|
8636
8247
|
}
|
|
8637
8248
|
}
|
|
8638
8249
|
/**
|
|
@@ -8647,7 +8258,7 @@
|
|
|
8647
8258
|
|
|
8648
8259
|
/**
|
|
8649
8260
|
* React Router 适配器实现
|
|
8650
|
-
*/ function _define_property$
|
|
8261
|
+
*/ function _define_property$i(obj, key, value) {
|
|
8651
8262
|
if (key in obj) {
|
|
8652
8263
|
Object.defineProperty(obj, key, {
|
|
8653
8264
|
value: value,
|
|
@@ -8743,9 +8354,9 @@
|
|
|
8743
8354
|
logger.logger.debug('React Router 适配器已销毁');
|
|
8744
8355
|
}
|
|
8745
8356
|
constructor(){
|
|
8746
|
-
_define_property$
|
|
8747
|
-
_define_property$
|
|
8748
|
-
_define_property$
|
|
8357
|
+
_define_property$i(this, "name", 'react-router');
|
|
8358
|
+
_define_property$i(this, "version", '6.0.0');
|
|
8359
|
+
_define_property$i(this, "router", null);
|
|
8749
8360
|
}
|
|
8750
8361
|
}
|
|
8751
8362
|
/**
|
|
@@ -8756,7 +8367,7 @@
|
|
|
8756
8367
|
};
|
|
8757
8368
|
}
|
|
8758
8369
|
|
|
8759
|
-
function _define_property$
|
|
8370
|
+
function _define_property$h(obj, key, value) {
|
|
8760
8371
|
if (key in obj) {
|
|
8761
8372
|
Object.defineProperty(obj, key, {
|
|
8762
8373
|
value: value,
|
|
@@ -8978,25 +8589,25 @@
|
|
|
8978
8589
|
/**
|
|
8979
8590
|
* 路由实例
|
|
8980
8591
|
* 只能在 initialize 方法中赋值
|
|
8981
|
-
*/ _define_property$
|
|
8592
|
+
*/ _define_property$h(this, "router", null);
|
|
8982
8593
|
/**
|
|
8983
8594
|
* 是否已初始化
|
|
8984
|
-
*/ _define_property$
|
|
8595
|
+
*/ _define_property$h(this, "initialized", false);
|
|
8985
8596
|
/**
|
|
8986
8597
|
* 路由缓存实例
|
|
8987
|
-
*/ _define_property$
|
|
8598
|
+
*/ _define_property$h(this, "cache", getRouteCache());
|
|
8988
8599
|
/**
|
|
8989
8600
|
* 路由预加载器实例
|
|
8990
|
-
*/ _define_property$
|
|
8601
|
+
*/ _define_property$h(this, "preloader", getRoutePreloader());
|
|
8991
8602
|
/**
|
|
8992
8603
|
* 路由插件管理器实例
|
|
8993
|
-
*/ _define_property$
|
|
8604
|
+
*/ _define_property$h(this, "pluginManager", getRouterPluginManager());
|
|
8994
8605
|
/**
|
|
8995
8606
|
* 路由监控服务实例
|
|
8996
|
-
*/ _define_property$
|
|
8607
|
+
*/ _define_property$h(this, "monitoring", getRouterMonitoring());
|
|
8997
8608
|
/**
|
|
8998
8609
|
* 路由适配器管理器实例
|
|
8999
|
-
*/ _define_property$
|
|
8610
|
+
*/ _define_property$h(this, "adapterManager", getAdapterManager());
|
|
9000
8611
|
// 私有构造函数
|
|
9001
8612
|
// 注册默认的 React Router 适配器
|
|
9002
8613
|
this.adapterManager.register({
|
|
@@ -9006,7 +8617,7 @@
|
|
|
9006
8617
|
});
|
|
9007
8618
|
}
|
|
9008
8619
|
}
|
|
9009
|
-
_define_property$
|
|
8620
|
+
_define_property$h(RouterManager, "instance", null);
|
|
9010
8621
|
/**
|
|
9011
8622
|
* 获取路由管理器
|
|
9012
8623
|
*/ function getRouterManager() {
|
|
@@ -9019,7 +8630,7 @@
|
|
|
9019
8630
|
getRouterManager: getRouterManager
|
|
9020
8631
|
});
|
|
9021
8632
|
|
|
9022
|
-
function _define_property$
|
|
8633
|
+
function _define_property$g(obj, key, value) {
|
|
9023
8634
|
if (key in obj) {
|
|
9024
8635
|
Object.defineProperty(obj, key, {
|
|
9025
8636
|
value: value,
|
|
@@ -9147,7 +8758,7 @@
|
|
|
9147
8758
|
Promise.resolve().then(()=>{
|
|
9148
8759
|
try {
|
|
9149
8760
|
const configStr = JSON.stringify(options);
|
|
9150
|
-
const validation =
|
|
8761
|
+
const validation = vlianUtils.SecurityUtils.validateInput(configStr);
|
|
9151
8762
|
if (!validation.safe) {
|
|
9152
8763
|
services.monitoring.captureError(new Error('配置项包含不安全内容'), {
|
|
9153
8764
|
reason: validation.reason
|
|
@@ -9267,15 +8878,15 @@
|
|
|
9267
8878
|
return this.container;
|
|
9268
8879
|
}
|
|
9269
8880
|
constructor(){
|
|
9270
|
-
_define_property$
|
|
9271
|
-
_define_property$
|
|
8881
|
+
_define_property$g(this, "root", null);
|
|
8882
|
+
_define_property$g(this, "container", null);
|
|
9272
8883
|
}
|
|
9273
8884
|
}
|
|
9274
8885
|
|
|
9275
8886
|
/**
|
|
9276
8887
|
* 性能追踪模块
|
|
9277
8888
|
* 负责收集和上报启动性能指标
|
|
9278
|
-
*/ function _define_property$
|
|
8889
|
+
*/ function _define_property$f(obj, key, value) {
|
|
9279
8890
|
if (key in obj) {
|
|
9280
8891
|
Object.defineProperty(obj, key, {
|
|
9281
8892
|
value: value,
|
|
@@ -9430,9 +9041,9 @@
|
|
|
9430
9041
|
return performance.now() - this.startTime;
|
|
9431
9042
|
}
|
|
9432
9043
|
constructor(monitoring){
|
|
9433
|
-
_define_property$
|
|
9434
|
-
_define_property$
|
|
9435
|
-
_define_property$
|
|
9044
|
+
_define_property$f(this, "monitoring", void 0);
|
|
9045
|
+
_define_property$f(this, "metrics", {});
|
|
9046
|
+
_define_property$f(this, "startTime", void 0);
|
|
9436
9047
|
this.monitoring = monitoring;
|
|
9437
9048
|
this.startTime = performance.now();
|
|
9438
9049
|
}
|
|
@@ -9441,7 +9052,7 @@
|
|
|
9441
9052
|
/**
|
|
9442
9053
|
* 应用实例管理模块
|
|
9443
9054
|
* 支持多实例隔离
|
|
9444
|
-
*/ function _define_property$
|
|
9055
|
+
*/ function _define_property$e(obj, key, value) {
|
|
9445
9056
|
if (key in obj) {
|
|
9446
9057
|
Object.defineProperty(obj, key, {
|
|
9447
9058
|
value: value,
|
|
@@ -9533,25 +9144,25 @@
|
|
|
9533
9144
|
constructor(id, options){
|
|
9534
9145
|
/**
|
|
9535
9146
|
* 实例ID
|
|
9536
|
-
*/ _define_property$
|
|
9147
|
+
*/ _define_property$e(this, "id", void 0);
|
|
9537
9148
|
/**
|
|
9538
9149
|
* 应用渲染器
|
|
9539
|
-
*/ _define_property$
|
|
9150
|
+
*/ _define_property$e(this, "renderer", void 0);
|
|
9540
9151
|
/**
|
|
9541
9152
|
* 服务实例
|
|
9542
|
-
*/ _define_property$
|
|
9153
|
+
*/ _define_property$e(this, "services", null);
|
|
9543
9154
|
/**
|
|
9544
9155
|
* 性能追踪器
|
|
9545
|
-
*/ _define_property$
|
|
9156
|
+
*/ _define_property$e(this, "performanceTracker", null);
|
|
9546
9157
|
/**
|
|
9547
9158
|
* 启动配置
|
|
9548
|
-
*/ _define_property$
|
|
9159
|
+
*/ _define_property$e(this, "options", void 0);
|
|
9549
9160
|
/**
|
|
9550
9161
|
* 是否已初始化
|
|
9551
|
-
*/ _define_property$
|
|
9162
|
+
*/ _define_property$e(this, "initialized", false);
|
|
9552
9163
|
/**
|
|
9553
9164
|
* 是否已销毁
|
|
9554
|
-
*/ _define_property$
|
|
9165
|
+
*/ _define_property$e(this, "destroyed", false);
|
|
9555
9166
|
this.id = id;
|
|
9556
9167
|
this.options = options;
|
|
9557
9168
|
this.renderer = new AppRenderer();
|
|
@@ -9649,19 +9260,19 @@
|
|
|
9649
9260
|
this.defaultInstanceId = null;
|
|
9650
9261
|
}
|
|
9651
9262
|
constructor(){
|
|
9652
|
-
_define_property$
|
|
9653
|
-
_define_property$
|
|
9263
|
+
_define_property$e(this, "instances", new Map());
|
|
9264
|
+
_define_property$e(this, "defaultInstanceId", null);
|
|
9654
9265
|
// 私有构造函数
|
|
9655
9266
|
}
|
|
9656
9267
|
}
|
|
9657
|
-
_define_property$
|
|
9268
|
+
_define_property$e(AppInstanceManager, "instance", null);
|
|
9658
9269
|
/**
|
|
9659
9270
|
* 获取应用实例管理器
|
|
9660
9271
|
*/ function getAppInstanceManager() {
|
|
9661
9272
|
return AppInstanceManager.getInstance();
|
|
9662
9273
|
}
|
|
9663
9274
|
|
|
9664
|
-
function _define_property$
|
|
9275
|
+
function _define_property$d(obj, key, value) {
|
|
9665
9276
|
if (key in obj) {
|
|
9666
9277
|
Object.defineProperty(obj, key, {
|
|
9667
9278
|
value: value,
|
|
@@ -9797,17 +9408,17 @@
|
|
|
9797
9408
|
}
|
|
9798
9409
|
}
|
|
9799
9410
|
constructor(){
|
|
9800
|
-
_define_property$
|
|
9801
|
-
_define_property$
|
|
9802
|
-
_define_property$
|
|
9803
|
-
_define_property$
|
|
9411
|
+
_define_property$d(this, "environment", void 0);
|
|
9412
|
+
_define_property$d(this, "isBrowser", void 0);
|
|
9413
|
+
_define_property$d(this, "isSSR", void 0);
|
|
9414
|
+
_define_property$d(this, "isMicroFrontend", void 0);
|
|
9804
9415
|
this.isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';
|
|
9805
9416
|
this.isSSR = typeof window === 'undefined' && typeof process !== 'undefined';
|
|
9806
9417
|
this.isMicroFrontend = this.detectMicroFrontend();
|
|
9807
9418
|
this.environment = this.detectEnvironment();
|
|
9808
9419
|
}
|
|
9809
9420
|
}
|
|
9810
|
-
_define_property$
|
|
9421
|
+
_define_property$d(EnvironmentDetector, "instance", null);
|
|
9811
9422
|
/**
|
|
9812
9423
|
* 获取环境检测器实例
|
|
9813
9424
|
*/ function getEnvironmentDetector() {
|
|
@@ -9872,7 +9483,7 @@
|
|
|
9872
9483
|
/**
|
|
9873
9484
|
* 框架生命周期事件集成
|
|
9874
9485
|
* 自动在框架关键节点触发事件
|
|
9875
|
-
*/ function _define_property$
|
|
9486
|
+
*/ function _define_property$c(obj, key, value) {
|
|
9876
9487
|
if (key in obj) {
|
|
9877
9488
|
Object.defineProperty(obj, key, {
|
|
9878
9489
|
value: value,
|
|
@@ -9997,12 +9608,12 @@
|
|
|
9997
9608
|
});
|
|
9998
9609
|
}
|
|
9999
9610
|
constructor(eventBus){
|
|
10000
|
-
_define_property$
|
|
9611
|
+
_define_property$c(this, "eventBus", void 0);
|
|
10001
9612
|
this.eventBus = eventBus;
|
|
10002
9613
|
}
|
|
10003
9614
|
}
|
|
10004
9615
|
|
|
10005
|
-
function _define_property$
|
|
9616
|
+
function _define_property$b(obj, key, value) {
|
|
10006
9617
|
if (key in obj) {
|
|
10007
9618
|
Object.defineProperty(obj, key, {
|
|
10008
9619
|
value: value,
|
|
@@ -10024,7 +9635,7 @@
|
|
|
10024
9635
|
}
|
|
10025
9636
|
class KernelBootError extends Error {
|
|
10026
9637
|
constructor(message, options){
|
|
10027
|
-
super(message), _define_property$
|
|
9638
|
+
super(message), _define_property$b(this, "code", void 0), _define_property$b(this, "phase", void 0), _define_property$b(this, "severity", void 0), _define_property$b(this, "retryable", void 0), _define_property$b(this, "traceId", void 0), _define_property$b(this, "cause", void 0);
|
|
10028
9639
|
this.name = 'KernelBootError';
|
|
10029
9640
|
this.code = options.code;
|
|
10030
9641
|
this.phase = options.phase;
|
|
@@ -10054,7 +9665,7 @@
|
|
|
10054
9665
|
});
|
|
10055
9666
|
}
|
|
10056
9667
|
|
|
10057
|
-
function _define_property$
|
|
9668
|
+
function _define_property$a(obj, key, value) {
|
|
10058
9669
|
if (key in obj) {
|
|
10059
9670
|
Object.defineProperty(obj, key, {
|
|
10060
9671
|
value: value,
|
|
@@ -10131,7 +9742,7 @@
|
|
|
10131
9742
|
}
|
|
10132
9743
|
}
|
|
10133
9744
|
constructor(){
|
|
10134
|
-
_define_property$
|
|
9745
|
+
_define_property$a(this, "instance", null);
|
|
10135
9746
|
}
|
|
10136
9747
|
};
|
|
10137
9748
|
let DefaultEventBusAdapter = class DefaultEventBusAdapter {
|
|
@@ -10163,7 +9774,7 @@
|
|
|
10163
9774
|
}
|
|
10164
9775
|
}
|
|
10165
9776
|
constructor(){
|
|
10166
|
-
_define_property$
|
|
9777
|
+
_define_property$a(this, "bus", null);
|
|
10167
9778
|
}
|
|
10168
9779
|
};
|
|
10169
9780
|
const defaultI18nAdapter = {
|
|
@@ -10432,9 +10043,9 @@
|
|
|
10432
10043
|
// 1. 环境检测和容器获取
|
|
10433
10044
|
const container = options.container || envDetector.safeGetElement('#root');
|
|
10434
10045
|
if (!container) {
|
|
10435
|
-
throw new
|
|
10046
|
+
throw new vlianUtils.InitializationError('未找到挂载容器', undefined, {
|
|
10436
10047
|
container: options.container
|
|
10437
|
-
},
|
|
10048
|
+
}, vlianUtils.ErrorCode.CONTAINER_NOT_FOUND);
|
|
10438
10049
|
}
|
|
10439
10050
|
logger.logger.info('框架启动中...');
|
|
10440
10051
|
if (options.antd && !options.uiProvider) {
|
|
@@ -10710,7 +10321,7 @@
|
|
|
10710
10321
|
}
|
|
10711
10322
|
}
|
|
10712
10323
|
|
|
10713
|
-
function _define_property$
|
|
10324
|
+
function _define_property$9(obj, key, value) {
|
|
10714
10325
|
if (key in obj) {
|
|
10715
10326
|
Object.defineProperty(obj, key, {
|
|
10716
10327
|
value: value,
|
|
@@ -10764,7 +10375,7 @@
|
|
|
10764
10375
|
this.listeners.clear();
|
|
10765
10376
|
}
|
|
10766
10377
|
constructor(){
|
|
10767
|
-
_define_property$
|
|
10378
|
+
_define_property$9(this, "listeners", new Set());
|
|
10768
10379
|
}
|
|
10769
10380
|
};
|
|
10770
10381
|
/**
|
|
@@ -11015,7 +10626,7 @@
|
|
|
11015
10626
|
}
|
|
11016
10627
|
}
|
|
11017
10628
|
|
|
11018
|
-
function _define_property$
|
|
10629
|
+
function _define_property$8(obj, key, value) {
|
|
11019
10630
|
if (key in obj) {
|
|
11020
10631
|
Object.defineProperty(obj, key, {
|
|
11021
10632
|
value: value,
|
|
@@ -11198,9 +10809,9 @@
|
|
|
11198
10809
|
});
|
|
11199
10810
|
}
|
|
11200
10811
|
}
|
|
11201
|
-
_define_property$
|
|
10812
|
+
_define_property$8(RouterNavigation, "MAX_REDIRECTS", 10);
|
|
11202
10813
|
|
|
11203
|
-
function _define_property$
|
|
10814
|
+
function _define_property$7(obj, key, value) {
|
|
11204
10815
|
if (key in obj) {
|
|
11205
10816
|
Object.defineProperty(obj, key, {
|
|
11206
10817
|
value: value,
|
|
@@ -11357,8 +10968,8 @@
|
|
|
11357
10968
|
logger.logger.info('路由重新加载完成');
|
|
11358
10969
|
}
|
|
11359
10970
|
constructor(){
|
|
11360
|
-
_define_property$
|
|
11361
|
-
_define_property$
|
|
10971
|
+
_define_property$7(this, "registeredRoutes", new Map());
|
|
10972
|
+
_define_property$7(this, "routeVersion", 0);
|
|
11362
10973
|
}
|
|
11363
10974
|
}
|
|
11364
10975
|
/**
|
|
@@ -11371,7 +10982,7 @@
|
|
|
11371
10982
|
return dynamicRouteManagerInstance;
|
|
11372
10983
|
}
|
|
11373
10984
|
|
|
11374
|
-
function _define_property$
|
|
10985
|
+
function _define_property$6(obj, key, value) {
|
|
11375
10986
|
if (key in obj) {
|
|
11376
10987
|
Object.defineProperty(obj, key, {
|
|
11377
10988
|
value: value,
|
|
@@ -11533,9 +11144,9 @@
|
|
|
11533
11144
|
return this.migrate(this.config.currentVersion, version, routes);
|
|
11534
11145
|
}
|
|
11535
11146
|
constructor(config){
|
|
11536
|
-
_define_property$
|
|
11537
|
-
_define_property$
|
|
11538
|
-
_define_property$
|
|
11147
|
+
_define_property$6(this, "versions", new Map());
|
|
11148
|
+
_define_property$6(this, "migrations", new Map());
|
|
11149
|
+
_define_property$6(this, "config", void 0);
|
|
11539
11150
|
this.config = {
|
|
11540
11151
|
enableVersionCheck: config.enableVersionCheck ?? true,
|
|
11541
11152
|
enableAutoMigration: config.enableAutoMigration ?? false,
|
|
@@ -11844,85 +11455,509 @@
|
|
|
11844
11455
|
]
|
|
11845
11456
|
});
|
|
11846
11457
|
}
|
|
11847
|
-
function resolvePosition(position) {
|
|
11848
|
-
const style = {
|
|
11849
|
-
position: 'fixed',
|
|
11850
|
-
zIndex: 9998
|
|
11851
|
-
};
|
|
11852
|
-
const pos = position || 'bottom-right';
|
|
11853
|
-
if (pos.includes('bottom')) style.bottom = 16;
|
|
11854
|
-
if (pos.includes('top')) style.top = 16;
|
|
11855
|
-
if (pos.includes('right')) style.right = 16;
|
|
11856
|
-
if (pos.includes('left')) style.left = 16;
|
|
11857
|
-
return style;
|
|
11458
|
+
function resolvePosition(position) {
|
|
11459
|
+
const style = {
|
|
11460
|
+
position: 'fixed',
|
|
11461
|
+
zIndex: 9998
|
|
11462
|
+
};
|
|
11463
|
+
const pos = position || 'bottom-right';
|
|
11464
|
+
if (pos.includes('bottom')) style.bottom = 16;
|
|
11465
|
+
if (pos.includes('top')) style.top = 16;
|
|
11466
|
+
if (pos.includes('right')) style.right = 16;
|
|
11467
|
+
if (pos.includes('left')) style.left = 16;
|
|
11468
|
+
return style;
|
|
11469
|
+
}
|
|
11470
|
+
function DevToolsTrigger({ appInstance, position = 'bottom-right' }) {
|
|
11471
|
+
const [visible, setVisible] = React.useState(false);
|
|
11472
|
+
if (process.env.NODE_ENV !== 'development') {
|
|
11473
|
+
return null;
|
|
11474
|
+
}
|
|
11475
|
+
return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
11476
|
+
children: [
|
|
11477
|
+
/*#__PURE__*/ jsxRuntime.jsx("button", {
|
|
11478
|
+
onClick: ()=>setVisible(true),
|
|
11479
|
+
style: {
|
|
11480
|
+
...resolvePosition(position),
|
|
11481
|
+
border: 'none',
|
|
11482
|
+
background: '#2f80ed',
|
|
11483
|
+
color: '#fff',
|
|
11484
|
+
borderRadius: 999,
|
|
11485
|
+
padding: '8px 14px',
|
|
11486
|
+
cursor: 'pointer'
|
|
11487
|
+
},
|
|
11488
|
+
children: "DevTools"
|
|
11489
|
+
}),
|
|
11490
|
+
/*#__PURE__*/ jsxRuntime.jsx(DevTools, {
|
|
11491
|
+
appInstance: appInstance,
|
|
11492
|
+
visible: visible,
|
|
11493
|
+
onClose: ()=>setVisible(false)
|
|
11494
|
+
})
|
|
11495
|
+
]
|
|
11496
|
+
});
|
|
11497
|
+
}
|
|
11498
|
+
|
|
11499
|
+
/**
|
|
11500
|
+
* 启动框架
|
|
11501
|
+
*
|
|
11502
|
+
* @param options - 启动配置选项
|
|
11503
|
+
* @returns Promise<void>
|
|
11504
|
+
*
|
|
11505
|
+
* @example
|
|
11506
|
+
* ```typescript
|
|
11507
|
+
* import { start } from '@vlian/framework';
|
|
11508
|
+
*
|
|
11509
|
+
* start({
|
|
11510
|
+
* loggerLevel: LogLevel.DEBUG,
|
|
11511
|
+
* lifecycle: {
|
|
11512
|
+
* beforeInitialization: async () => {
|
|
11513
|
+
* console.log('初始化前执行');
|
|
11514
|
+
* },
|
|
11515
|
+
* },
|
|
11516
|
+
* });
|
|
11517
|
+
* ```
|
|
11518
|
+
*/ /**
|
|
11519
|
+
* 启动框架(向后兼容的API)
|
|
11520
|
+
*
|
|
11521
|
+
* @param options - 启动配置选项
|
|
11522
|
+
* @returns Promise<void>
|
|
11523
|
+
*
|
|
11524
|
+
* @deprecated 建议使用 startApp 函数,支持多实例
|
|
11525
|
+
*/ const start = async (options = {})=>{
|
|
11526
|
+
// 使用新的启动函数,保持向后兼容
|
|
11527
|
+
await startApp(options);
|
|
11528
|
+
};
|
|
11529
|
+
// 导出getStateManager(向后兼容)
|
|
11530
|
+
const getStateManager = ()=>{
|
|
11531
|
+
const instanceManager = getAppInstanceManager();
|
|
11532
|
+
const instance = instanceManager.getInstance();
|
|
11533
|
+
if (instance) {
|
|
11534
|
+
return instance.getServices().stateManager;
|
|
11535
|
+
}
|
|
11536
|
+
return null;
|
|
11537
|
+
};
|
|
11538
|
+
|
|
11539
|
+
const utils = vlianUtils__namespace;
|
|
11540
|
+
const ErrorCode = utils.ErrorCode;
|
|
11541
|
+
const ErrorMessages = utils.ErrorMessages;
|
|
11542
|
+
const getErrorMessage = utils.getErrorMessage;
|
|
11543
|
+
const getUserFriendlyMessage = utils.getUserFriendlyMessage;
|
|
11544
|
+
const ErrorType = utils.ErrorType;
|
|
11545
|
+
const ErrorSeverity = utils.ErrorSeverity;
|
|
11546
|
+
const FrameworkError = utils.FrameworkError;
|
|
11547
|
+
const InitializationError = utils.InitializationError;
|
|
11548
|
+
const ConfigError = utils.ConfigError;
|
|
11549
|
+
const StorageError = utils.StorageError;
|
|
11550
|
+
const NetworkError = utils.NetworkError;
|
|
11551
|
+
const ValidationError = utils.ValidationError;
|
|
11552
|
+
const SecurityError = utils.SecurityError;
|
|
11553
|
+
const errorUtils = utils.errorUtils;
|
|
11554
|
+
|
|
11555
|
+
/**
|
|
11556
|
+
* 配置安全工具类
|
|
11557
|
+
*/ class ConfigSecurity {
|
|
11558
|
+
/**
|
|
11559
|
+
* 验证配置签名
|
|
11560
|
+
*/ static async verifySignature(config, signature, options) {
|
|
11561
|
+
if (!options.enabled) {
|
|
11562
|
+
return true;
|
|
11563
|
+
}
|
|
11564
|
+
if (!options.publicKey) {
|
|
11565
|
+
throw new SecurityError('签名验证需要提供公钥');
|
|
11566
|
+
}
|
|
11567
|
+
if (!signature || signature.length === 0) {
|
|
11568
|
+
throw new SecurityError('签名不能为空');
|
|
11569
|
+
}
|
|
11570
|
+
try {
|
|
11571
|
+
// 使用 Web Crypto API 验证签名
|
|
11572
|
+
if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {
|
|
11573
|
+
throw new SecurityError('签名验证需要浏览器支持 Web Crypto API');
|
|
11574
|
+
}
|
|
11575
|
+
// 将配置转换为字符串(用于签名验证)
|
|
11576
|
+
// 使用稳定的 JSON 序列化(按键排序)
|
|
11577
|
+
const configString = JSON.stringify(config, Object.keys(config).sort());
|
|
11578
|
+
const encoder = new TextEncoder();
|
|
11579
|
+
const data = encoder.encode(configString);
|
|
11580
|
+
// 将签名从 Base64 解码
|
|
11581
|
+
const signatureBuffer = Uint8Array.from(atob(signature), (c)=>c.charCodeAt(0));
|
|
11582
|
+
// 导入公钥(支持 PEM 格式)
|
|
11583
|
+
const algorithm = options.algorithm || 'RSASSA-PKCS1-v1_5';
|
|
11584
|
+
let publicKey;
|
|
11585
|
+
try {
|
|
11586
|
+
// 尝试导入 PEM 格式的公钥
|
|
11587
|
+
const pemHeader = '-----BEGIN PUBLIC KEY-----';
|
|
11588
|
+
const pemFooter = '-----END PUBLIC KEY-----';
|
|
11589
|
+
let pemKey = options.publicKey;
|
|
11590
|
+
if (!pemKey.includes(pemHeader)) {
|
|
11591
|
+
pemKey = `${pemHeader}\n${pemKey}\n${pemFooter}`;
|
|
11592
|
+
}
|
|
11593
|
+
// 将 PEM 转换为 ArrayBuffer
|
|
11594
|
+
const pemContents = pemKey.replace(pemHeader, '').replace(pemFooter, '').replace(/\s/g, '');
|
|
11595
|
+
const binaryDer = Uint8Array.from(atob(pemContents), (c)=>c.charCodeAt(0));
|
|
11596
|
+
publicKey = await window.crypto.subtle.importKey('spki', binaryDer.buffer, {
|
|
11597
|
+
name: algorithm,
|
|
11598
|
+
hash: 'SHA-256'
|
|
11599
|
+
}, false, [
|
|
11600
|
+
'verify'
|
|
11601
|
+
]);
|
|
11602
|
+
} catch (importError) {
|
|
11603
|
+
throw new SecurityError('公钥导入失败', importError instanceof Error ? importError : undefined);
|
|
11604
|
+
}
|
|
11605
|
+
// 验证签名
|
|
11606
|
+
const isValid = await window.crypto.subtle.verify({
|
|
11607
|
+
name: algorithm
|
|
11608
|
+
}, publicKey, signatureBuffer, data);
|
|
11609
|
+
return isValid;
|
|
11610
|
+
} catch (error) {
|
|
11611
|
+
if (error instanceof SecurityError) {
|
|
11612
|
+
throw error;
|
|
11613
|
+
}
|
|
11614
|
+
throw new SecurityError('签名验证失败', error instanceof Error ? error : undefined);
|
|
11615
|
+
}
|
|
11616
|
+
}
|
|
11617
|
+
/**
|
|
11618
|
+
* 验证配置来源
|
|
11619
|
+
*/ static verifyOrigin(options) {
|
|
11620
|
+
if (!options.allowedOrigins || options.allowedOrigins.length === 0) {
|
|
11621
|
+
return true; // 如果没有配置白名单,允许所有来源
|
|
11622
|
+
}
|
|
11623
|
+
if (typeof window === 'undefined') {
|
|
11624
|
+
return true; // 非浏览器环境,跳过验证
|
|
11625
|
+
}
|
|
11626
|
+
const currentOrigin = window.location.origin;
|
|
11627
|
+
const referer = document.referrer;
|
|
11628
|
+
// 验证当前来源
|
|
11629
|
+
if (options.allowedOrigins.includes(currentOrigin)) {
|
|
11630
|
+
return true;
|
|
11631
|
+
}
|
|
11632
|
+
// 验证 Referer
|
|
11633
|
+
if (options.verifyReferer && referer) {
|
|
11634
|
+
try {
|
|
11635
|
+
const refererOrigin = new URL(referer).origin;
|
|
11636
|
+
if (options.allowedOrigins.includes(refererOrigin)) {
|
|
11637
|
+
return true;
|
|
11638
|
+
}
|
|
11639
|
+
} catch {
|
|
11640
|
+
// Referer 解析失败
|
|
11641
|
+
}
|
|
11642
|
+
}
|
|
11643
|
+
return false;
|
|
11644
|
+
}
|
|
11645
|
+
/**
|
|
11646
|
+
* 验证配置白名单
|
|
11647
|
+
*/ static verifyWhitelist(config, options) {
|
|
11648
|
+
const errors = [];
|
|
11649
|
+
// 检查允许的键
|
|
11650
|
+
if (options.allowedKeys && options.allowedKeys.length > 0) {
|
|
11651
|
+
const configKeys = Object.keys(config);
|
|
11652
|
+
const invalidKeys = configKeys.filter((key)=>!options.allowedKeys.includes(key));
|
|
11653
|
+
if (invalidKeys.length > 0) {
|
|
11654
|
+
errors.push(`配置包含不允许的键: ${invalidKeys.join(', ')}`);
|
|
11655
|
+
}
|
|
11656
|
+
}
|
|
11657
|
+
// 检查禁止的键
|
|
11658
|
+
if (options.forbiddenKeys && options.forbiddenKeys.length > 0) {
|
|
11659
|
+
const configKeys = Object.keys(config);
|
|
11660
|
+
const forbiddenFound = configKeys.filter((key)=>options.forbiddenKeys.includes(key));
|
|
11661
|
+
if (forbiddenFound.length > 0) {
|
|
11662
|
+
errors.push(`配置包含禁止的键: ${forbiddenFound.join(', ')}`);
|
|
11663
|
+
}
|
|
11664
|
+
}
|
|
11665
|
+
// 验证配置值
|
|
11666
|
+
if (options.valueSchema) {
|
|
11667
|
+
const result = vlianUtils.Validator.validateObject(options.valueSchema, config);
|
|
11668
|
+
if (!result.valid) {
|
|
11669
|
+
errors.push(...result.errors);
|
|
11670
|
+
}
|
|
11671
|
+
}
|
|
11672
|
+
return {
|
|
11673
|
+
valid: errors.length === 0,
|
|
11674
|
+
errors
|
|
11675
|
+
};
|
|
11676
|
+
}
|
|
11677
|
+
/**
|
|
11678
|
+
* 清理配置中的危险内容
|
|
11679
|
+
*/ static sanitizeConfig(config) {
|
|
11680
|
+
const sanitized = {};
|
|
11681
|
+
for (const [key, value] of Object.entries(config)){
|
|
11682
|
+
if (typeof value === 'string') {
|
|
11683
|
+
// 检查是否包含危险内容
|
|
11684
|
+
const validation = vlianUtils.SecurityUtils.validateInput(value);
|
|
11685
|
+
if (validation.safe && validation.sanitized) {
|
|
11686
|
+
sanitized[key] = validation.sanitized;
|
|
11687
|
+
} else {
|
|
11688
|
+
// 包含危险内容,跳过或记录警告
|
|
11689
|
+
console.warn(`配置项 ${key} 包含潜在危险内容,已跳过`);
|
|
11690
|
+
}
|
|
11691
|
+
} else if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
11692
|
+
// 递归清理对象
|
|
11693
|
+
sanitized[key] = this.sanitizeConfig(value);
|
|
11694
|
+
} else {
|
|
11695
|
+
sanitized[key] = value;
|
|
11696
|
+
}
|
|
11697
|
+
}
|
|
11698
|
+
return sanitized;
|
|
11699
|
+
}
|
|
11700
|
+
/**
|
|
11701
|
+
* 验证配置安全性
|
|
11702
|
+
*/ static async validateConfigSecurity(config, options) {
|
|
11703
|
+
const errors = [];
|
|
11704
|
+
// 验证来源
|
|
11705
|
+
if (options.origin) {
|
|
11706
|
+
const originValid = this.verifyOrigin(options.origin);
|
|
11707
|
+
if (!originValid) {
|
|
11708
|
+
errors.push('配置来源验证失败');
|
|
11709
|
+
}
|
|
11710
|
+
}
|
|
11711
|
+
// 验证白名单
|
|
11712
|
+
if (options.whitelist) {
|
|
11713
|
+
const whitelistResult = this.verifyWhitelist(config, options.whitelist);
|
|
11714
|
+
if (!whitelistResult.valid) {
|
|
11715
|
+
errors.push(...whitelistResult.errors);
|
|
11716
|
+
}
|
|
11717
|
+
}
|
|
11718
|
+
// 清理配置(已实现但暂不使用返回值)
|
|
11719
|
+
// const sanitizedConfig = this.sanitizeConfig(config);
|
|
11720
|
+
return {
|
|
11721
|
+
valid: errors.length === 0,
|
|
11722
|
+
errors
|
|
11723
|
+
};
|
|
11724
|
+
}
|
|
11725
|
+
}
|
|
11726
|
+
|
|
11727
|
+
var runtimeSecurity = /*#__PURE__*/Object.freeze({
|
|
11728
|
+
__proto__: null,
|
|
11729
|
+
RuntimeSecurity: vlianUtils.RuntimeSecurity
|
|
11730
|
+
});
|
|
11731
|
+
|
|
11732
|
+
function _define_property$5(obj, key, value) {
|
|
11733
|
+
if (key in obj) {
|
|
11734
|
+
Object.defineProperty(obj, key, {
|
|
11735
|
+
value: value,
|
|
11736
|
+
enumerable: true,
|
|
11737
|
+
configurable: true,
|
|
11738
|
+
writable: true
|
|
11739
|
+
});
|
|
11740
|
+
} else {
|
|
11741
|
+
obj[key] = value;
|
|
11742
|
+
}
|
|
11743
|
+
return obj;
|
|
11744
|
+
}
|
|
11745
|
+
/**
|
|
11746
|
+
* 分析服务类
|
|
11747
|
+
*/ class AnalyticsService {
|
|
11748
|
+
/**
|
|
11749
|
+
* 启动批量上报定时器
|
|
11750
|
+
*/ startBatchTimer() {
|
|
11751
|
+
if (this.batchTimer) {
|
|
11752
|
+
return;
|
|
11753
|
+
}
|
|
11754
|
+
this.batchTimer = setInterval(()=>{
|
|
11755
|
+
this.flush();
|
|
11756
|
+
}, this.config.batchInterval);
|
|
11757
|
+
}
|
|
11758
|
+
/**
|
|
11759
|
+
* 停止批量上报定时器
|
|
11760
|
+
*/ stopBatchTimer() {
|
|
11761
|
+
if (this.batchTimer) {
|
|
11762
|
+
clearInterval(this.batchTimer);
|
|
11763
|
+
this.batchTimer = null;
|
|
11764
|
+
}
|
|
11765
|
+
}
|
|
11766
|
+
/**
|
|
11767
|
+
* 记录事件
|
|
11768
|
+
*/ track(event) {
|
|
11769
|
+
if (!this.config.enabled) {
|
|
11770
|
+
return;
|
|
11771
|
+
}
|
|
11772
|
+
// 采样检查
|
|
11773
|
+
if (Math.random() > this.config.sampleRate) {
|
|
11774
|
+
return;
|
|
11775
|
+
}
|
|
11776
|
+
// 匿名化处理
|
|
11777
|
+
const anonymizedEvent = {
|
|
11778
|
+
...event,
|
|
11779
|
+
timestamp: Date.now(),
|
|
11780
|
+
properties: this.anonymizeProperties(event.properties)
|
|
11781
|
+
};
|
|
11782
|
+
// 添加到队列
|
|
11783
|
+
this.eventQueue.push(anonymizedEvent);
|
|
11784
|
+
// 立即上报单个事件
|
|
11785
|
+
if (this.config.onEvent) {
|
|
11786
|
+
this.config.onEvent(anonymizedEvent);
|
|
11787
|
+
}
|
|
11788
|
+
// 检查是否需要批量上报
|
|
11789
|
+
if (this.eventQueue.length >= this.config.batchSize) {
|
|
11790
|
+
this.flush();
|
|
11791
|
+
}
|
|
11792
|
+
}
|
|
11793
|
+
/**
|
|
11794
|
+
* 记录页面浏览
|
|
11795
|
+
*/ trackPageView(page, properties) {
|
|
11796
|
+
this.track({
|
|
11797
|
+
type: 'pageview',
|
|
11798
|
+
name: 'page_view',
|
|
11799
|
+
properties: {
|
|
11800
|
+
page,
|
|
11801
|
+
...properties
|
|
11802
|
+
}
|
|
11803
|
+
});
|
|
11804
|
+
}
|
|
11805
|
+
/**
|
|
11806
|
+
* 记录点击事件
|
|
11807
|
+
*/ trackClick(element, properties) {
|
|
11808
|
+
this.track({
|
|
11809
|
+
type: 'click',
|
|
11810
|
+
name: 'click',
|
|
11811
|
+
properties: {
|
|
11812
|
+
element,
|
|
11813
|
+
...properties
|
|
11814
|
+
}
|
|
11815
|
+
});
|
|
11816
|
+
}
|
|
11817
|
+
/**
|
|
11818
|
+
* 记录自定义事件
|
|
11819
|
+
*/ trackCustom(name, properties) {
|
|
11820
|
+
this.track({
|
|
11821
|
+
type: 'custom',
|
|
11822
|
+
name,
|
|
11823
|
+
properties
|
|
11824
|
+
});
|
|
11825
|
+
}
|
|
11826
|
+
/**
|
|
11827
|
+
* 记录错误事件
|
|
11828
|
+
*/ trackError(error, properties) {
|
|
11829
|
+
this.track({
|
|
11830
|
+
type: 'error',
|
|
11831
|
+
name: 'error',
|
|
11832
|
+
properties: {
|
|
11833
|
+
errorName: error.name,
|
|
11834
|
+
errorMessage: error.message,
|
|
11835
|
+
errorStack: error.stack,
|
|
11836
|
+
...properties
|
|
11837
|
+
}
|
|
11838
|
+
});
|
|
11839
|
+
}
|
|
11840
|
+
/**
|
|
11841
|
+
* 记录性能事件
|
|
11842
|
+
*/ trackPerformance(metrics, properties) {
|
|
11843
|
+
this.track({
|
|
11844
|
+
type: 'performance',
|
|
11845
|
+
name: 'performance',
|
|
11846
|
+
properties: {
|
|
11847
|
+
...metrics,
|
|
11848
|
+
...properties
|
|
11849
|
+
}
|
|
11850
|
+
});
|
|
11851
|
+
}
|
|
11852
|
+
/**
|
|
11853
|
+
* 匿名化属性(使用深度脱敏)
|
|
11854
|
+
*/ anonymizeProperties(properties) {
|
|
11855
|
+
if (!this.config.anonymize || !properties) {
|
|
11856
|
+
return properties;
|
|
11857
|
+
}
|
|
11858
|
+
// 使用深度脱敏处理
|
|
11859
|
+
return vlianUtils.SecurityUtils.deepSanitize(properties);
|
|
11860
|
+
}
|
|
11861
|
+
/**
|
|
11862
|
+
* 刷新队列(批量上报)
|
|
11863
|
+
*/ flush() {
|
|
11864
|
+
if (this.eventQueue.length === 0) {
|
|
11865
|
+
return;
|
|
11866
|
+
}
|
|
11867
|
+
const events = [
|
|
11868
|
+
...this.eventQueue
|
|
11869
|
+
];
|
|
11870
|
+
this.eventQueue = [];
|
|
11871
|
+
if (this.config.onBatch) {
|
|
11872
|
+
this.config.onBatch(events);
|
|
11873
|
+
}
|
|
11874
|
+
logger.logger.debug(`分析服务批量上报 ${events.length} 个事件`);
|
|
11875
|
+
}
|
|
11876
|
+
/**
|
|
11877
|
+
* 启用分析
|
|
11878
|
+
*/ enable() {
|
|
11879
|
+
this.config.enabled = true;
|
|
11880
|
+
this.startBatchTimer();
|
|
11881
|
+
}
|
|
11882
|
+
/**
|
|
11883
|
+
* 禁用分析
|
|
11884
|
+
*/ disable() {
|
|
11885
|
+
this.config.enabled = false;
|
|
11886
|
+
this.stopBatchTimer();
|
|
11887
|
+
this.flush();
|
|
11888
|
+
}
|
|
11889
|
+
/**
|
|
11890
|
+
* 销毁服务
|
|
11891
|
+
*/ destroy() {
|
|
11892
|
+
this.stopBatchTimer();
|
|
11893
|
+
this.flush();
|
|
11894
|
+
}
|
|
11895
|
+
constructor(config = {}){
|
|
11896
|
+
_define_property$5(this, "config", void 0);
|
|
11897
|
+
_define_property$5(this, "eventQueue", []);
|
|
11898
|
+
_define_property$5(this, "batchTimer", null);
|
|
11899
|
+
this.config = {
|
|
11900
|
+
enabled: config.enabled ?? true,
|
|
11901
|
+
sampleRate: config.sampleRate ?? 1.0,
|
|
11902
|
+
anonymize: config.anonymize ?? true,
|
|
11903
|
+
onEvent: config.onEvent ?? (()=>{}),
|
|
11904
|
+
onBatch: config.onBatch ?? (()=>{}),
|
|
11905
|
+
batchSize: config.batchSize ?? 10,
|
|
11906
|
+
batchInterval: config.batchInterval ?? 5000
|
|
11907
|
+
};
|
|
11908
|
+
if (this.config.enabled) {
|
|
11909
|
+
this.startBatchTimer();
|
|
11910
|
+
}
|
|
11911
|
+
}
|
|
11912
|
+
}
|
|
11913
|
+
/**
|
|
11914
|
+
* 默认分析服务实例
|
|
11915
|
+
*/ let defaultAnalyticsService = null;
|
|
11916
|
+
/**
|
|
11917
|
+
* 初始化默认分析服务
|
|
11918
|
+
*/ function initAnalytics(config) {
|
|
11919
|
+
if (!defaultAnalyticsService) {
|
|
11920
|
+
defaultAnalyticsService = new AnalyticsService(config);
|
|
11921
|
+
}
|
|
11922
|
+
return defaultAnalyticsService;
|
|
11858
11923
|
}
|
|
11859
|
-
|
|
11860
|
-
|
|
11861
|
-
|
|
11862
|
-
|
|
11924
|
+
/**
|
|
11925
|
+
* 获取默认分析服务
|
|
11926
|
+
*/ function getAnalytics() {
|
|
11927
|
+
if (!defaultAnalyticsService) {
|
|
11928
|
+
return initAnalytics();
|
|
11863
11929
|
}
|
|
11864
|
-
return
|
|
11865
|
-
children: [
|
|
11866
|
-
/*#__PURE__*/ jsxRuntime.jsx("button", {
|
|
11867
|
-
onClick: ()=>setVisible(true),
|
|
11868
|
-
style: {
|
|
11869
|
-
...resolvePosition(position),
|
|
11870
|
-
border: 'none',
|
|
11871
|
-
background: '#2f80ed',
|
|
11872
|
-
color: '#fff',
|
|
11873
|
-
borderRadius: 999,
|
|
11874
|
-
padding: '8px 14px',
|
|
11875
|
-
cursor: 'pointer'
|
|
11876
|
-
},
|
|
11877
|
-
children: "DevTools"
|
|
11878
|
-
}),
|
|
11879
|
-
/*#__PURE__*/ jsxRuntime.jsx(DevTools, {
|
|
11880
|
-
appInstance: appInstance,
|
|
11881
|
-
visible: visible,
|
|
11882
|
-
onClose: ()=>setVisible(false)
|
|
11883
|
-
})
|
|
11884
|
-
]
|
|
11885
|
-
});
|
|
11930
|
+
return defaultAnalyticsService;
|
|
11886
11931
|
}
|
|
11887
11932
|
|
|
11933
|
+
var analytics = /*#__PURE__*/Object.freeze({
|
|
11934
|
+
__proto__: null,
|
|
11935
|
+
AnalyticsService: AnalyticsService,
|
|
11936
|
+
getAnalytics: getAnalytics,
|
|
11937
|
+
initAnalytics: initAnalytics
|
|
11938
|
+
});
|
|
11939
|
+
|
|
11888
11940
|
/**
|
|
11889
|
-
*
|
|
11941
|
+
* 等待指定时间后解析的 Promise 工具函数
|
|
11890
11942
|
*
|
|
11891
|
-
* @param
|
|
11892
|
-
* @returns Promise
|
|
11943
|
+
* @param time - 等待时间(毫秒),默认为 100 毫秒
|
|
11944
|
+
* @returns 返回一个 Promise,在指定时间后解析为 true
|
|
11893
11945
|
*
|
|
11894
11946
|
* @example
|
|
11895
11947
|
* ```typescript
|
|
11896
|
-
*
|
|
11948
|
+
* // 等待 500 毫秒
|
|
11949
|
+
* await waitTime(500);
|
|
11897
11950
|
*
|
|
11898
|
-
*
|
|
11899
|
-
*
|
|
11900
|
-
* lifecycle: {
|
|
11901
|
-
* beforeInitialization: async () => {
|
|
11902
|
-
* console.log('初始化前执行');
|
|
11903
|
-
* },
|
|
11904
|
-
* },
|
|
11905
|
-
* });
|
|
11951
|
+
* // 使用默认等待时间(100 毫秒)
|
|
11952
|
+
* await waitTime();
|
|
11906
11953
|
* ```
|
|
11907
|
-
|
|
11908
|
-
|
|
11909
|
-
|
|
11910
|
-
|
|
11911
|
-
|
|
11912
|
-
|
|
11913
|
-
|
|
11914
|
-
*/ const start = async (options = {})=>{
|
|
11915
|
-
// 使用新的启动函数,保持向后兼容
|
|
11916
|
-
await startApp(options);
|
|
11917
|
-
};
|
|
11918
|
-
// 导出getStateManager(向后兼容)
|
|
11919
|
-
const getStateManager = ()=>{
|
|
11920
|
-
const instanceManager = getAppInstanceManager();
|
|
11921
|
-
const instance = instanceManager.getInstance();
|
|
11922
|
-
if (instance) {
|
|
11923
|
-
return instance.getServices().stateManager;
|
|
11924
|
-
}
|
|
11925
|
-
return null;
|
|
11954
|
+
* @deprecated 建议使用基于实际完成状态的机制,而不是固定等待时间
|
|
11955
|
+
*/ const waitTime = (time = 100)=>{
|
|
11956
|
+
return new Promise((resolve)=>{
|
|
11957
|
+
setTimeout(()=>{
|
|
11958
|
+
resolve(true);
|
|
11959
|
+
}, time);
|
|
11960
|
+
});
|
|
11926
11961
|
};
|
|
11927
11962
|
|
|
11928
11963
|
function resolveStorage(storage) {
|
|
@@ -12759,113 +12794,45 @@
|
|
|
12759
12794
|
return adapter();
|
|
12760
12795
|
}
|
|
12761
12796
|
|
|
12762
|
-
Object.defineProperty(exports, "ConfigError", {
|
|
12763
|
-
enumerable: true,
|
|
12764
|
-
get: function () { return utils.ConfigError; }
|
|
12765
|
-
});
|
|
12766
|
-
Object.defineProperty(exports, "ErrorCode", {
|
|
12767
|
-
enumerable: true,
|
|
12768
|
-
get: function () { return utils.ErrorCode; }
|
|
12769
|
-
});
|
|
12770
|
-
Object.defineProperty(exports, "ErrorMessages", {
|
|
12771
|
-
enumerable: true,
|
|
12772
|
-
get: function () { return utils.ErrorMessages; }
|
|
12773
|
-
});
|
|
12774
|
-
Object.defineProperty(exports, "ErrorSeverity", {
|
|
12775
|
-
enumerable: true,
|
|
12776
|
-
get: function () { return utils.ErrorSeverity; }
|
|
12777
|
-
});
|
|
12778
|
-
Object.defineProperty(exports, "ErrorType", {
|
|
12779
|
-
enumerable: true,
|
|
12780
|
-
get: function () { return utils.ErrorType; }
|
|
12781
|
-
});
|
|
12782
|
-
Object.defineProperty(exports, "FrameworkError", {
|
|
12783
|
-
enumerable: true,
|
|
12784
|
-
get: function () { return utils.FrameworkError; }
|
|
12785
|
-
});
|
|
12786
|
-
Object.defineProperty(exports, "InitializationError", {
|
|
12787
|
-
enumerable: true,
|
|
12788
|
-
get: function () { return utils.InitializationError; }
|
|
12789
|
-
});
|
|
12790
|
-
Object.defineProperty(exports, "NetworkError", {
|
|
12791
|
-
enumerable: true,
|
|
12792
|
-
get: function () { return utils.NetworkError; }
|
|
12793
|
-
});
|
|
12794
12797
|
Object.defineProperty(exports, "PERFORMANCE_METRIC_UNITS", {
|
|
12795
12798
|
enumerable: true,
|
|
12796
|
-
get: function () { return
|
|
12799
|
+
get: function () { return vlianUtils.PERFORMANCE_METRIC_UNITS; }
|
|
12797
12800
|
});
|
|
12798
12801
|
Object.defineProperty(exports, "PerformanceMonitor", {
|
|
12799
12802
|
enumerable: true,
|
|
12800
|
-
get: function () { return
|
|
12803
|
+
get: function () { return vlianUtils.PerformanceMonitor; }
|
|
12801
12804
|
});
|
|
12802
12805
|
Object.defineProperty(exports, "ResourceLoader", {
|
|
12803
12806
|
enumerable: true,
|
|
12804
|
-
get: function () { return
|
|
12807
|
+
get: function () { return vlianUtils.ResourceLoader; }
|
|
12805
12808
|
});
|
|
12806
12809
|
Object.defineProperty(exports, "RuntimeSecurity", {
|
|
12807
12810
|
enumerable: true,
|
|
12808
|
-
get: function () { return
|
|
12811
|
+
get: function () { return vlianUtils.RuntimeSecurity; }
|
|
12809
12812
|
});
|
|
12810
12813
|
Object.defineProperty(exports, "SENSITIVE_FIELDS", {
|
|
12811
12814
|
enumerable: true,
|
|
12812
|
-
get: function () { return
|
|
12813
|
-
});
|
|
12814
|
-
Object.defineProperty(exports, "SecurityError", {
|
|
12815
|
-
enumerable: true,
|
|
12816
|
-
get: function () { return utils.SecurityError; }
|
|
12815
|
+
get: function () { return vlianUtils.SENSITIVE_FIELDS; }
|
|
12817
12816
|
});
|
|
12818
12817
|
Object.defineProperty(exports, "SecurityUtils", {
|
|
12819
12818
|
enumerable: true,
|
|
12820
|
-
get: function () { return
|
|
12821
|
-
});
|
|
12822
|
-
Object.defineProperty(exports, "StorageError", {
|
|
12823
|
-
enumerable: true,
|
|
12824
|
-
get: function () { return utils.StorageError; }
|
|
12825
|
-
});
|
|
12826
|
-
Object.defineProperty(exports, "ValidationError", {
|
|
12827
|
-
enumerable: true,
|
|
12828
|
-
get: function () { return utils.ValidationError; }
|
|
12819
|
+
get: function () { return vlianUtils.SecurityUtils; }
|
|
12829
12820
|
});
|
|
12830
12821
|
Object.defineProperty(exports, "Validator", {
|
|
12831
12822
|
enumerable: true,
|
|
12832
|
-
get: function () { return
|
|
12823
|
+
get: function () { return vlianUtils.Validator; }
|
|
12833
12824
|
});
|
|
12834
12825
|
Object.defineProperty(exports, "commonSchemas", {
|
|
12835
12826
|
enumerable: true,
|
|
12836
|
-
get: function () { return
|
|
12827
|
+
get: function () { return vlianUtils.commonSchemas; }
|
|
12837
12828
|
});
|
|
12838
12829
|
Object.defineProperty(exports, "convertMetricsToWithUnits", {
|
|
12839
12830
|
enumerable: true,
|
|
12840
|
-
get: function () { return
|
|
12841
|
-
});
|
|
12842
|
-
Object.defineProperty(exports, "errorUtils", {
|
|
12843
|
-
enumerable: true,
|
|
12844
|
-
get: function () { return utils.errorUtils; }
|
|
12845
|
-
});
|
|
12846
|
-
Object.defineProperty(exports, "getErrorMessage", {
|
|
12847
|
-
enumerable: true,
|
|
12848
|
-
get: function () { return utils.getErrorMessage; }
|
|
12849
|
-
});
|
|
12850
|
-
Object.defineProperty(exports, "getUserFriendlyMessage", {
|
|
12851
|
-
enumerable: true,
|
|
12852
|
-
get: function () { return utils.getUserFriendlyMessage; }
|
|
12831
|
+
get: function () { return vlianUtils.convertMetricsToWithUnits; }
|
|
12853
12832
|
});
|
|
12854
12833
|
Object.defineProperty(exports, "resourceLoader", {
|
|
12855
12834
|
enumerable: true,
|
|
12856
|
-
get: function () { return
|
|
12857
|
-
});
|
|
12858
|
-
Object.defineProperty(exports, "MonitoringService", {
|
|
12859
|
-
enumerable: true,
|
|
12860
|
-
get: function () { return monitoring.MonitoringService; }
|
|
12861
|
-
});
|
|
12862
|
-
Object.defineProperty(exports, "getMonitoring", {
|
|
12863
|
-
enumerable: true,
|
|
12864
|
-
get: function () { return monitoring.getMonitoring; }
|
|
12865
|
-
});
|
|
12866
|
-
Object.defineProperty(exports, "initMonitoring", {
|
|
12867
|
-
enumerable: true,
|
|
12868
|
-
get: function () { return monitoring.initMonitoring; }
|
|
12835
|
+
get: function () { return vlianUtils.resourceLoader; }
|
|
12869
12836
|
});
|
|
12870
12837
|
Object.defineProperty(exports, "LogFormat", {
|
|
12871
12838
|
enumerable: true,
|
|
@@ -12919,6 +12886,18 @@
|
|
|
12919
12886
|
enumerable: true,
|
|
12920
12887
|
get: function () { return logger.setCurrentTraceId; }
|
|
12921
12888
|
});
|
|
12889
|
+
Object.defineProperty(exports, "MonitoringService", {
|
|
12890
|
+
enumerable: true,
|
|
12891
|
+
get: function () { return monitoring.MonitoringService; }
|
|
12892
|
+
});
|
|
12893
|
+
Object.defineProperty(exports, "getMonitoring", {
|
|
12894
|
+
enumerable: true,
|
|
12895
|
+
get: function () { return monitoring.getMonitoring; }
|
|
12896
|
+
});
|
|
12897
|
+
Object.defineProperty(exports, "initMonitoring", {
|
|
12898
|
+
enumerable: true,
|
|
12899
|
+
get: function () { return monitoring.initMonitoring; }
|
|
12900
|
+
});
|
|
12922
12901
|
Object.defineProperty(exports, "MonitoringEventType", {
|
|
12923
12902
|
enumerable: true,
|
|
12924
12903
|
get: function () { return request.MonitoringEventType; }
|
|
@@ -13022,6 +13001,7 @@
|
|
|
13022
13001
|
exports.AppContextProvider = AppContextProvider;
|
|
13023
13002
|
exports.AppEventBus = AppEventBus;
|
|
13024
13003
|
exports.AppRenderer = AppRenderer;
|
|
13004
|
+
exports.ConfigError = ConfigError;
|
|
13025
13005
|
exports.ConfigFileFormat = ConfigFileFormat;
|
|
13026
13006
|
exports.ConfigLoader = ConfigLoader;
|
|
13027
13007
|
exports.ConfigSecurity = ConfigSecurity;
|
|
@@ -13034,12 +13014,19 @@
|
|
|
13034
13014
|
exports.DynamicRouteManager = DynamicRouteManager;
|
|
13035
13015
|
exports.EnvironmentDetector = EnvironmentDetector;
|
|
13036
13016
|
exports.ErrorBoundary = ErrorBoundary;
|
|
13017
|
+
exports.ErrorCode = ErrorCode;
|
|
13018
|
+
exports.ErrorMessages = ErrorMessages;
|
|
13019
|
+
exports.ErrorSeverity = ErrorSeverity;
|
|
13020
|
+
exports.ErrorType = ErrorType;
|
|
13021
|
+
exports.FrameworkError = FrameworkError;
|
|
13037
13022
|
exports.FrameworkEventManager = FrameworkEventManager;
|
|
13038
13023
|
exports.FrameworkEventType = FrameworkEventType;
|
|
13024
|
+
exports.InitializationError = InitializationError;
|
|
13039
13025
|
exports.Kernel = Kernel;
|
|
13040
13026
|
exports.KernelBootError = KernelBootError;
|
|
13041
13027
|
exports.LocaleSwitch = LocaleSwitch;
|
|
13042
13028
|
exports.MiddlewareManager = MiddlewareManager;
|
|
13029
|
+
exports.NetworkError = NetworkError;
|
|
13043
13030
|
exports.PerformanceTracker = PerformanceTracker;
|
|
13044
13031
|
exports.PluginManager = PluginManager;
|
|
13045
13032
|
exports.PreloadStrategy = PreloadStrategy;
|
|
@@ -13059,22 +13046,27 @@
|
|
|
13059
13046
|
exports.RouterPluginManager = RouterPluginManager;
|
|
13060
13047
|
exports.RuntimeEnvironment = RuntimeEnvironment;
|
|
13061
13048
|
exports.STARTUP_METRIC_UNITS = STARTUP_METRIC_UNITS;
|
|
13049
|
+
exports.SecurityError = SecurityError;
|
|
13062
13050
|
exports.StateInstance = StateInstance;
|
|
13063
13051
|
exports.StateManager = StateManager;
|
|
13064
13052
|
exports.StateRegistry = StateRegistry;
|
|
13065
13053
|
exports.StateScopeManager = StateScopeManager;
|
|
13054
|
+
exports.StorageError = StorageError;
|
|
13066
13055
|
exports.ThemeSwitch = ThemeSwitch;
|
|
13056
|
+
exports.ValidationError = ValidationError;
|
|
13067
13057
|
exports.ZustandAdapter = ZustandAdapter;
|
|
13068
13058
|
exports.appConfig = appConfig;
|
|
13069
13059
|
exports.componentImportSchema = componentImportSchema;
|
|
13070
13060
|
exports.createAuthMiddleware = createAuthMiddleware;
|
|
13071
13061
|
exports.createReactRouterAdapter = createReactRouterAdapter;
|
|
13072
13062
|
exports.createRouterError = createRouterError;
|
|
13063
|
+
exports.errorUtils = errorUtils;
|
|
13073
13064
|
exports.getAdapterManager = getAdapterManager;
|
|
13074
13065
|
exports.getAnalytics = getAnalytics;
|
|
13075
13066
|
exports.getAppInstanceManager = getAppInstanceManager;
|
|
13076
13067
|
exports.getDynamicRouteManager = getDynamicRouteManager;
|
|
13077
13068
|
exports.getEnvironmentDetector = getEnvironmentDetector;
|
|
13069
|
+
exports.getErrorMessage = getErrorMessage;
|
|
13078
13070
|
exports.getKernel = getKernel;
|
|
13079
13071
|
exports.getRouteCache = getRouteCache;
|
|
13080
13072
|
exports.getRoutePreloader = getRoutePreloader;
|
|
@@ -13085,6 +13077,7 @@
|
|
|
13085
13077
|
exports.getRouterMonitoring = getRouterMonitoring;
|
|
13086
13078
|
exports.getRouterPluginManager = getRouterPluginManager;
|
|
13087
13079
|
exports.getStateManager = getStateManager;
|
|
13080
|
+
exports.getUserFriendlyMessage = getUserFriendlyMessage;
|
|
13088
13081
|
exports.initAnalytics = initAnalytics;
|
|
13089
13082
|
exports.initializeServices = initializeServices;
|
|
13090
13083
|
exports.kernelStartApp = kernelStartApp;
|