@vlian/framework 1.2.59 → 1.2.61
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/index.cjs +1 -22
- package/dist/analytics.umd.js +1 -1
- package/dist/components/LocaleSwitch.cjs +1 -116
- package/dist/components/ThemeSwitch.cjs +1 -115
- package/dist/components/index.cjs +1 -20
- package/dist/components/persistence.cjs +1 -58
- package/dist/core/Test.cjs +1 -64
- package/dist/core/app/AppContext.cjs +1 -348
- package/dist/core/app/AppContext.types.cjs +1 -4
- package/dist/core/app/BasicLayout.cjs +1 -122
- package/dist/core/app/DefaultApp.cjs +1 -150
- package/dist/core/app/index.cjs +1 -41
- package/dist/core/config/AppConfig.cjs +1 -139
- package/dist/core/config/ConfigLoader.cjs +1 -323
- package/dist/core/config/ConfigValidator.cjs +2 -133
- package/dist/core/config/index.cjs +1 -28
- package/dist/core/dev/DevTools.cjs +1 -226
- package/dist/core/error/ErrorBoundary.cjs +1 -401
- package/dist/core/error/ErrorHandler.cjs +1 -275
- package/dist/core/error/index.cjs +1 -34
- package/dist/core/event/AppEventBus.cjs +1 -444
- package/dist/core/event/frameworkEvents.cjs +1 -141
- package/dist/core/event/hooks.cjs +1 -69
- package/dist/core/event/index.cjs +1 -41
- package/dist/core/event/types.cjs +1 -62
- package/dist/core/event/useEventBus.cjs +1 -25
- package/dist/core/index.cjs +1 -140
- package/dist/core/initialization/InitializationErrorThrower.cjs +1 -75
- package/dist/core/initialization/index.cjs +1 -26
- package/dist/core/initialization/initialization.cjs +1 -64
- package/dist/core/initialization/initializationErrorState.cjs +1 -66
- package/dist/core/kernel/defaultAdapters.cjs +1 -184
- package/dist/core/kernel/errors.cjs +1 -69
- package/dist/core/kernel/index.cjs +1 -20
- package/dist/core/kernel/startKernel.cjs +1 -200
- package/dist/core/kernel/types.cjs +1 -4
- package/dist/core/middleware.cjs +1 -73
- package/dist/core/plugin/PluginEventBus.cjs +1 -298
- package/dist/core/plugin/PluginSandbox.cjs +1 -137
- package/dist/core/plugin.cjs +1 -494
- package/dist/core/router/RouterManager.cjs +1 -286
- package/dist/core/router/adapter/AdapterManager.cjs +1 -235
- package/dist/core/router/adapter/index.cjs +1 -22
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs +1 -128
- package/dist/core/router/adapter/react-router/index.cjs +1 -20
- package/dist/core/router/adapter/types.cjs +1 -6
- package/dist/core/router/dev/RouterDevTools.cjs +1 -260
- package/dist/core/router/dev/index.cjs +1 -20
- package/dist/core/router/dynamic/DynamicRouteManager.cjs +1 -193
- package/dist/core/router/dynamic/index.cjs +1 -20
- package/dist/core/router/errors/RouterError.cjs +1 -61
- package/dist/core/router/errors/index.cjs +1 -20
- package/dist/core/router/index.cjs +1 -36
- package/dist/core/router/lifecycle/RouterLifecycleManager.cjs +1 -144
- package/dist/core/router/lifecycle/index.cjs +1 -20
- package/dist/core/router/middleware/RouterMiddlewareManager.cjs +1 -193
- package/dist/core/router/middleware/auth.cjs +1 -66
- package/dist/core/router/middleware/index.cjs +1 -22
- package/dist/core/router/middleware/types.cjs +1 -6
- package/dist/core/router/monitoring/RouterMonitoring.cjs +1 -227
- package/dist/core/router/monitoring/index.cjs +1 -20
- package/dist/core/router/navigation/RouterNavigation.cjs +1 -239
- package/dist/core/router/navigation/index.cjs +1 -20
- package/dist/core/router/performance/RouteCache.cjs +1 -305
- package/dist/core/router/performance/RoutePreloader.cjs +1 -292
- package/dist/core/router/performance/index.cjs +1 -21
- package/dist/core/router/plugin/RouterPluginManager.cjs +1 -262
- package/dist/core/router/plugin/index.cjs +1 -21
- package/dist/core/router/plugin/types.cjs +1 -39
- package/dist/core/router/types.cjs +1 -4
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.cjs +1 -129
- package/dist/core/router/utils/adapters/react-router/transform.cjs +1 -250
- package/dist/core/router/utils/transform.cjs +1 -780
- package/dist/core/router/validation/RouterConfigValidator.cjs +2 -83
- package/dist/core/router/validation/index.cjs +1 -21
- package/dist/core/router/validation/schema.cjs +1 -159
- package/dist/core/router/version/RouteVersionManager.cjs +1 -205
- package/dist/core/router/version/index.cjs +1 -20
- package/dist/core/splash/SplashScreen.cjs +1 -341
- package/dist/core/splash/index.cjs +1 -22
- package/dist/core/splash/splashScreenUtils.cjs +1 -38
- package/dist/core/startup/AppInstance.cjs +1 -239
- package/dist/core/startup/environment.cjs +1 -169
- package/dist/core/startup/index.cjs +1 -23
- package/dist/core/startup/initializeServices.cjs +1 -226
- package/dist/core/startup/performanceTracker.cjs +1 -179
- package/dist/core/startup/renderApp.cjs +1 -314
- package/dist/core/startup/startApp.cjs +1 -317
- package/dist/core/types.cjs +1 -4
- package/dist/index.cjs +1 -52
- package/dist/index.umd.cjs +1 -27
- package/dist/index.umd.js +1 -1
- package/dist/kernel/constants.cjs +1 -65
- package/dist/kernel/index.cjs +1 -38
- package/dist/kernel/kernel.cjs +1 -295
- package/dist/kernel/manager/cacheManager.cjs +1 -46
- package/dist/kernel/manager/i18n/I18nManager.cjs +1 -91
- package/dist/kernel/manager/i18n/i18n.persistence.cjs +1 -60
- package/dist/kernel/manager/i18n/i18n.schema.cjs +1 -86
- package/dist/kernel/manager/i18n/index.cjs +1 -11
- package/dist/kernel/manager/i18nManager.cjs +1 -11
- package/dist/kernel/manager/index.cjs +1 -28
- package/dist/kernel/manager/logger/LoggerManager.cjs +1 -107
- package/dist/kernel/manager/logger/index.cjs +1 -11
- package/dist/kernel/manager/logger/logger.persistence.cjs +1 -62
- package/dist/kernel/manager/logger/logger.schema.cjs +1 -74
- package/dist/kernel/manager/loggerManager.cjs +1 -11
- package/dist/kernel/manager/theme/ThemeManager.cjs +1 -84
- package/dist/kernel/manager/theme/index.cjs +1 -11
- package/dist/kernel/manager/theme/theme.dom.cjs +1 -61
- package/dist/kernel/manager/theme/theme.persistence.cjs +1 -57
- package/dist/kernel/manager/theme/theme.schema.cjs +1 -122
- package/dist/kernel/manager/themeManager.cjs +1 -11
- package/dist/kernel/types.cjs +1 -4
- package/dist/library/index.cjs +1 -19
- package/dist/library/locale/index.cjs +1 -39
- package/dist/library/locale/langs/en-us/index.cjs +1 -32
- package/dist/library/locale/langs/zh-cn/index.cjs +1 -32
- package/dist/library/locale/types.cjs +1 -4
- package/dist/library/storage/cache.cjs +1 -243
- package/dist/library/storage/encryption.cjs +1 -147
- package/dist/library/storage/index.cjs +1 -124
- package/dist/state/StateManager.cjs +1 -166
- package/dist/state/adapters/AdapterFactory.cjs +1 -89
- package/dist/state/adapters/DefaultAdapter.cjs +1 -75
- package/dist/state/adapters/ReduxAdapter.cjs +1 -443
- package/dist/state/adapters/ZustandAdapter.cjs +1 -69
- package/dist/state/adapters/index.cjs +1 -44
- package/dist/state/adapters/types.cjs +1 -20
- package/dist/state/core/DerivedStateInstance.cjs +1 -174
- package/dist/state/core/StateInstance.cjs +1 -170
- package/dist/state/core/StateRegistry.cjs +1 -110
- package/dist/state/core/StateScope.cjs +1 -137
- package/dist/state/core/index.cjs +1 -30
- package/dist/state/index.cjs +1 -30
- package/dist/state/types.cjs +1 -12
- package/dist/state.umd.js +1 -1
- package/dist/types.cjs +1 -4
- package/dist/utils/analytics.cjs +1 -217
- package/dist/utils/configSecurity.cjs +3 -182
- package/dist/utils/csrf.cjs +1 -18
- package/dist/utils/errors/ErrorCodes.cjs +1 -25
- package/dist/utils/errors.cjs +1 -111
- package/dist/utils/index.cjs +1 -135
- package/dist/utils/logger.cjs +1 -25
- package/dist/utils/logger.types.cjs +1 -11
- package/dist/utils/monitoring.cjs +1 -18
- package/dist/utils/performance.cjs +1 -22
- package/dist/utils/resourceLoader.cjs +1 -22
- package/dist/utils/runtimeSecurity.cjs +1 -11
- package/dist/utils/security.cjs +1 -19
- package/dist/utils/traceId.cjs +1 -37
- package/dist/utils/validation.cjs +1 -19
- package/package.json +12 -3
|
@@ -1,147 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "EncryptionUtils", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return EncryptionUtils;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _utils = require("@vlian/utils");
|
|
12
|
-
let EncryptionUtils = class EncryptionUtils {
|
|
13
|
-
/**
|
|
14
|
-
* 生成加密密钥
|
|
15
|
-
*/ static async generateKey() {
|
|
16
|
-
if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {
|
|
17
|
-
throw new _utils.StorageError('加密功能需要浏览器支持 Web Crypto API');
|
|
18
|
-
}
|
|
19
|
-
try {
|
|
20
|
-
return await window.crypto.subtle.generateKey({
|
|
21
|
-
name: 'AES-GCM',
|
|
22
|
-
length: 256
|
|
23
|
-
}, true, [
|
|
24
|
-
'encrypt',
|
|
25
|
-
'decrypt'
|
|
26
|
-
]);
|
|
27
|
-
} catch (error) {
|
|
28
|
-
throw new _utils.StorageError('生成加密密钥失败', error instanceof Error ? error : undefined);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* 使用 PBKDF2 派生密钥
|
|
33
|
-
*/ static async deriveKey(password, salt, iterations = 100000) {
|
|
34
|
-
if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {
|
|
35
|
-
throw new _utils.StorageError('加密功能需要浏览器支持 Web Crypto API');
|
|
36
|
-
}
|
|
37
|
-
try {
|
|
38
|
-
// 导入密码
|
|
39
|
-
const encoder = new TextEncoder();
|
|
40
|
-
const passwordKey = await window.crypto.subtle.importKey('raw', encoder.encode(password), 'PBKDF2', false, [
|
|
41
|
-
'deriveBits',
|
|
42
|
-
'deriveKey'
|
|
43
|
-
]);
|
|
44
|
-
// 使用 PBKDF2 派生密钥
|
|
45
|
-
// 确保 salt 是 BufferSource 类型(使用类型断言)
|
|
46
|
-
const saltBuffer = salt instanceof Uint8Array ? salt : new Uint8Array(salt);
|
|
47
|
-
return await window.crypto.subtle.deriveKey({
|
|
48
|
-
name: 'PBKDF2',
|
|
49
|
-
salt: saltBuffer,
|
|
50
|
-
iterations: iterations,
|
|
51
|
-
hash: 'SHA-256'
|
|
52
|
-
}, passwordKey, {
|
|
53
|
-
name: 'AES-GCM',
|
|
54
|
-
length: 256
|
|
55
|
-
}, false, [
|
|
56
|
-
'encrypt',
|
|
57
|
-
'decrypt'
|
|
58
|
-
]);
|
|
59
|
-
} catch (error) {
|
|
60
|
-
throw new _utils.StorageError('密钥派生失败', error instanceof Error ? error : undefined);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* 从字符串导入密钥(使用 PBKDF2 派生)
|
|
65
|
-
*
|
|
66
|
-
* 注意:如果没有提供 salt,每次调用都会生成新的 salt,导致密钥不一致。
|
|
67
|
-
* 建议在生产环境中使用固定的 salt 或从安全存储中获取。
|
|
68
|
-
*/ static async importKey(keyString, salt) {
|
|
69
|
-
if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {
|
|
70
|
-
throw new _utils.StorageError('加密功能需要浏览器支持 Web Crypto API');
|
|
71
|
-
}
|
|
72
|
-
try {
|
|
73
|
-
// 如果没有提供 salt,尝试从 sessionStorage 获取或生成一个固定的
|
|
74
|
-
let keySalt = salt;
|
|
75
|
-
if (!keySalt) {
|
|
76
|
-
// 尝试从 sessionStorage 获取固定的 salt(用于当前会话)
|
|
77
|
-
const saltKey = '__encryption_salt__';
|
|
78
|
-
const storedSalt = sessionStorage.getItem(saltKey);
|
|
79
|
-
if (storedSalt) {
|
|
80
|
-
// 从存储中恢复 salt
|
|
81
|
-
const saltArray = Uint8Array.from(JSON.parse(storedSalt));
|
|
82
|
-
keySalt = saltArray;
|
|
83
|
-
} else {
|
|
84
|
-
// 生成新的 salt 并存储(用于当前会话)
|
|
85
|
-
keySalt = window.crypto.getRandomValues(new Uint8Array(16));
|
|
86
|
-
sessionStorage.setItem(saltKey, JSON.stringify(Array.from(keySalt)));
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
// 使用 PBKDF2 派生密钥
|
|
90
|
-
return await this.deriveKey(keyString, keySalt);
|
|
91
|
-
} catch (error) {
|
|
92
|
-
throw new _utils.StorageError('导入加密密钥失败', error instanceof Error ? error : undefined);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* 加密数据
|
|
97
|
-
*/ static async encrypt(data, key) {
|
|
98
|
-
if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {
|
|
99
|
-
throw new _utils.StorageError('加密功能需要浏览器支持 Web Crypto API');
|
|
100
|
-
}
|
|
101
|
-
try {
|
|
102
|
-
const encoder = new TextEncoder();
|
|
103
|
-
const dataBuffer = encoder.encode(data);
|
|
104
|
-
// 生成随机 IV
|
|
105
|
-
const iv = window.crypto.getRandomValues(new Uint8Array(12));
|
|
106
|
-
const encrypted = await window.crypto.subtle.encrypt({
|
|
107
|
-
name: 'AES-GCM',
|
|
108
|
-
iv: iv
|
|
109
|
-
}, key, dataBuffer);
|
|
110
|
-
// 将 IV 和加密数据组合
|
|
111
|
-
const combined = new Uint8Array(iv.length + encrypted.byteLength);
|
|
112
|
-
combined.set(iv);
|
|
113
|
-
combined.set(new Uint8Array(encrypted), iv.length);
|
|
114
|
-
// 转换为 Base64
|
|
115
|
-
return btoa(String.fromCharCode(...combined));
|
|
116
|
-
} catch (error) {
|
|
117
|
-
throw new _utils.StorageError('加密数据失败', error instanceof Error ? error : undefined);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* 解密数据
|
|
122
|
-
*/ static async decrypt(encryptedData, key) {
|
|
123
|
-
if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {
|
|
124
|
-
throw new _utils.StorageError('解密功能需要浏览器支持 Web Crypto API');
|
|
125
|
-
}
|
|
126
|
-
try {
|
|
127
|
-
// 从 Base64 解码
|
|
128
|
-
const combined = Uint8Array.from(atob(encryptedData), (c)=>c.charCodeAt(0));
|
|
129
|
-
// 提取 IV 和加密数据
|
|
130
|
-
const iv = combined.slice(0, 12);
|
|
131
|
-
const encrypted = combined.slice(12);
|
|
132
|
-
const decrypted = await window.crypto.subtle.decrypt({
|
|
133
|
-
name: 'AES-GCM',
|
|
134
|
-
iv: iv
|
|
135
|
-
}, key, encrypted);
|
|
136
|
-
const decoder = new TextDecoder();
|
|
137
|
-
return decoder.decode(decrypted);
|
|
138
|
-
} catch (error) {
|
|
139
|
-
throw new _utils.StorageError('解密数据失败', error instanceof Error ? error : undefined);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* 检查字段是否需要加密
|
|
144
|
-
*/ static shouldEncrypt(key) {
|
|
145
|
-
return _utils.SecurityUtils.isSensitiveField(key);
|
|
146
|
-
}
|
|
147
|
-
};
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"EncryptionUtils",{enumerable:true,get:function(){return EncryptionUtils}});const _utils=require("@vlian/utils");let EncryptionUtils=class EncryptionUtils{static async generateKey(){if(typeof window==="undefined"||!window.crypto||!window.crypto.subtle){throw new _utils.StorageError("加密功能需要浏览器支持 Web Crypto API")}try{return await window.crypto.subtle.generateKey({name:"AES-GCM",length:256},true,["encrypt","decrypt"])}catch(error){throw new _utils.StorageError("生成加密密钥失败",error instanceof Error?error:undefined)}}static async deriveKey(password,salt,iterations=1e5){if(typeof window==="undefined"||!window.crypto||!window.crypto.subtle){throw new _utils.StorageError("加密功能需要浏览器支持 Web Crypto API")}try{const encoder=new TextEncoder;const passwordKey=await window.crypto.subtle.importKey("raw",encoder.encode(password),"PBKDF2",false,["deriveBits","deriveKey"]);const saltBuffer=salt instanceof Uint8Array?salt:new Uint8Array(salt);return await window.crypto.subtle.deriveKey({name:"PBKDF2",salt:saltBuffer,iterations:iterations,hash:"SHA-256"},passwordKey,{name:"AES-GCM",length:256},false,["encrypt","decrypt"])}catch(error){throw new _utils.StorageError("密钥派生失败",error instanceof Error?error:undefined)}}static async importKey(keyString,salt){if(typeof window==="undefined"||!window.crypto||!window.crypto.subtle){throw new _utils.StorageError("加密功能需要浏览器支持 Web Crypto API")}try{let keySalt=salt;if(!keySalt){const saltKey="__encryption_salt__";const storedSalt=sessionStorage.getItem(saltKey);if(storedSalt){const saltArray=Uint8Array.from(JSON.parse(storedSalt));keySalt=saltArray}else{keySalt=window.crypto.getRandomValues(new Uint8Array(16));sessionStorage.setItem(saltKey,JSON.stringify(Array.from(keySalt)))}}return await this.deriveKey(keyString,keySalt)}catch(error){throw new _utils.StorageError("导入加密密钥失败",error instanceof Error?error:undefined)}}static async encrypt(data,key){if(typeof window==="undefined"||!window.crypto||!window.crypto.subtle){throw new _utils.StorageError("加密功能需要浏览器支持 Web Crypto API")}try{const encoder=new TextEncoder;const dataBuffer=encoder.encode(data);const iv=window.crypto.getRandomValues(new Uint8Array(12));const encrypted=await window.crypto.subtle.encrypt({name:"AES-GCM",iv:iv},key,dataBuffer);const combined=new Uint8Array(iv.length+encrypted.byteLength);combined.set(iv);combined.set(new Uint8Array(encrypted),iv.length);return btoa(String.fromCharCode(...combined))}catch(error){throw new _utils.StorageError("加密数据失败",error instanceof Error?error:undefined)}}static async decrypt(encryptedData,key){if(typeof window==="undefined"||!window.crypto||!window.crypto.subtle){throw new _utils.StorageError("解密功能需要浏览器支持 Web Crypto API")}try{const combined=Uint8Array.from(atob(encryptedData),c=>c.charCodeAt(0));const iv=combined.slice(0,12);const encrypted=combined.slice(12);const decrypted=await window.crypto.subtle.decrypt({name:"AES-GCM",iv:iv},key,encrypted);const decoder=new TextDecoder;return decoder.decode(decrypted)}catch(error){throw new _utils.StorageError("解密数据失败",error instanceof Error?error:undefined)}}static shouldEncrypt(key){return _utils.SecurityUtils.isSensitiveField(key)}};
|
|
@@ -1,124 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
function _export(target, all) {
|
|
6
|
-
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
-
enumerable: true,
|
|
8
|
-
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
-
});
|
|
10
|
-
}
|
|
11
|
-
_export(exports, {
|
|
12
|
-
get EncryptionUtils () {
|
|
13
|
-
return _encryption.EncryptionUtils;
|
|
14
|
-
},
|
|
15
|
-
get MultiLevelCache () {
|
|
16
|
-
return _cache.MultiLevelCache;
|
|
17
|
-
},
|
|
18
|
-
get storage () {
|
|
19
|
-
return storage;
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
const _utils = require("@vlian/utils");
|
|
23
|
-
const _cache = require("./cache");
|
|
24
|
-
const _encryption = require("./encryption");
|
|
25
|
-
function _define_property(obj, key, value) {
|
|
26
|
-
if (key in obj) {
|
|
27
|
-
Object.defineProperty(obj, key, {
|
|
28
|
-
value: value,
|
|
29
|
-
enumerable: true,
|
|
30
|
-
configurable: true,
|
|
31
|
-
writable: true
|
|
32
|
-
});
|
|
33
|
-
} else {
|
|
34
|
-
obj[key] = value;
|
|
35
|
-
}
|
|
36
|
-
return obj;
|
|
37
|
-
}
|
|
38
|
-
let Storage = class Storage {
|
|
39
|
-
get local() {
|
|
40
|
-
return this._local;
|
|
41
|
-
}
|
|
42
|
-
get session() {
|
|
43
|
-
return this._session;
|
|
44
|
-
}
|
|
45
|
-
get indexedDB() {
|
|
46
|
-
return this._indexedDB;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* 获取本地存储缓存
|
|
50
|
-
*/ get localCache() {
|
|
51
|
-
return this._localCache;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* 获取会话存储缓存
|
|
55
|
-
*/ get sessionCache() {
|
|
56
|
-
return this._sessionCache;
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* 获取单例实例
|
|
60
|
-
*
|
|
61
|
-
* @returns Singleton 实例
|
|
62
|
-
*/ static getInstance() {
|
|
63
|
-
if (!Storage.instance) {
|
|
64
|
-
Storage.instance = new Storage();
|
|
65
|
-
}
|
|
66
|
-
return Storage.instance;
|
|
67
|
-
}
|
|
68
|
-
initialize(options) {
|
|
69
|
-
const local = (0, _utils.createStorage)({
|
|
70
|
-
type: 'local',
|
|
71
|
-
prefix: options?.prefix || 'vlian',
|
|
72
|
-
defaultExpire: options?.defaultExpire || 24 * 60 * 60 * 1000
|
|
73
|
-
});
|
|
74
|
-
const session = (0, _utils.createStorage)({
|
|
75
|
-
type: 'session',
|
|
76
|
-
prefix: options?.prefix || 'vlian',
|
|
77
|
-
defaultExpire: options?.defaultExpire || 24 * 60 * 60 * 1000
|
|
78
|
-
});
|
|
79
|
-
const indexedDB = (0, _utils.createStorage)({
|
|
80
|
-
type: 'indexedDB',
|
|
81
|
-
prefix: options?.prefix || 'vlian',
|
|
82
|
-
defaultExpire: options?.defaultExpire || 24 * 60 * 60 * 1000,
|
|
83
|
-
dbName: options?.tableName
|
|
84
|
-
});
|
|
85
|
-
this._local = local;
|
|
86
|
-
this._session = session;
|
|
87
|
-
this._indexedDB = indexedDB;
|
|
88
|
-
// 初始化缓存
|
|
89
|
-
this.cacheEnabled = options?.cache?.enabled ?? false;
|
|
90
|
-
if (this.cacheEnabled) {
|
|
91
|
-
this._localCache = new _cache.MultiLevelCache(local, {
|
|
92
|
-
defaultTTL: options?.cache?.defaultTTL,
|
|
93
|
-
maxSize: options?.cache?.maxSize
|
|
94
|
-
});
|
|
95
|
-
this._sessionCache = new _cache.MultiLevelCache(session, {
|
|
96
|
-
defaultTTL: options?.cache?.defaultTTL,
|
|
97
|
-
maxSize: options?.cache?.maxSize
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* 清理过期缓存
|
|
103
|
-
*/ async cleanupCache() {
|
|
104
|
-
if (this._localCache) {
|
|
105
|
-
await this._localCache.cleanup();
|
|
106
|
-
}
|
|
107
|
-
if (this._sessionCache) {
|
|
108
|
-
await this._sessionCache.cleanup();
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* 私有构造函数,防止外部直接实例化
|
|
113
|
-
*/ constructor(){
|
|
114
|
-
_define_property(this, "_local", void 0);
|
|
115
|
-
_define_property(this, "_session", void 0);
|
|
116
|
-
_define_property(this, "_indexedDB", void 0);
|
|
117
|
-
_define_property(this, "_localCache", void 0);
|
|
118
|
-
_define_property(this, "_sessionCache", void 0);
|
|
119
|
-
_define_property(this, "cacheEnabled", false);
|
|
120
|
-
// 私有构造函数
|
|
121
|
-
}
|
|
122
|
-
};
|
|
123
|
-
_define_property(Storage, "instance", null);
|
|
124
|
-
const storage = Storage.getInstance();
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get EncryptionUtils(){return _encryption.EncryptionUtils},get MultiLevelCache(){return _cache.MultiLevelCache},get storage(){return storage}});const _utils=require("@vlian/utils");const _cache=require("./cache");const _encryption=require("./encryption");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let Storage=class Storage{get local(){return this._local}get session(){return this._session}get indexedDB(){return this._indexedDB}get localCache(){return this._localCache}get sessionCache(){return this._sessionCache}static getInstance(){if(!Storage.instance){Storage.instance=new Storage}return Storage.instance}initialize(options){const local=(0,_utils.createStorage)({type:"local",prefix:options?.prefix||"vlian",defaultExpire:options?.defaultExpire||24*60*60*1e3});const session=(0,_utils.createStorage)({type:"session",prefix:options?.prefix||"vlian",defaultExpire:options?.defaultExpire||24*60*60*1e3});const indexedDB=(0,_utils.createStorage)({type:"indexedDB",prefix:options?.prefix||"vlian",defaultExpire:options?.defaultExpire||24*60*60*1e3,dbName:options?.tableName});this._local=local;this._session=session;this._indexedDB=indexedDB;this.cacheEnabled=options?.cache?.enabled??false;if(this.cacheEnabled){this._localCache=new _cache.MultiLevelCache(local,{defaultTTL:options?.cache?.defaultTTL,maxSize:options?.cache?.maxSize});this._sessionCache=new _cache.MultiLevelCache(session,{defaultTTL:options?.cache?.defaultTTL,maxSize:options?.cache?.maxSize})}}async cleanupCache(){if(this._localCache){await this._localCache.cleanup()}if(this._sessionCache){await this._sessionCache.cleanup()}}constructor(){_define_property(this,"_local",void 0);_define_property(this,"_session",void 0);_define_property(this,"_indexedDB",void 0);_define_property(this,"_localCache",void 0);_define_property(this,"_sessionCache",void 0);_define_property(this,"cacheEnabled",false)}};_define_property(Storage,"instance",null);const storage=Storage.getInstance();
|
|
@@ -1,166 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* 状态管理器主类
|
|
3
|
-
*
|
|
4
|
-
* 这是状态管理器的核心入口,提供统一的状态管理 API
|
|
5
|
-
*/ "use strict";
|
|
6
|
-
Object.defineProperty(exports, "__esModule", {
|
|
7
|
-
value: true
|
|
8
|
-
});
|
|
9
|
-
Object.defineProperty(exports, "StateManager", {
|
|
10
|
-
enumerable: true,
|
|
11
|
-
get: function() {
|
|
12
|
-
return StateManager;
|
|
13
|
-
}
|
|
14
|
-
});
|
|
15
|
-
const _AdapterFactory = require("./adapters/AdapterFactory");
|
|
16
|
-
const _StateRegistry = require("./core/StateRegistry");
|
|
17
|
-
const _DerivedStateInstance = require("./core/DerivedStateInstance");
|
|
18
|
-
function _define_property(obj, key, value) {
|
|
19
|
-
if (key in obj) {
|
|
20
|
-
Object.defineProperty(obj, key, {
|
|
21
|
-
value: value,
|
|
22
|
-
enumerable: true,
|
|
23
|
-
configurable: true,
|
|
24
|
-
writable: true
|
|
25
|
-
});
|
|
26
|
-
} else {
|
|
27
|
-
obj[key] = value;
|
|
28
|
-
}
|
|
29
|
-
return obj;
|
|
30
|
-
}
|
|
31
|
-
let StateManager = class StateManager {
|
|
32
|
-
/**
|
|
33
|
-
* 创建状态实例
|
|
34
|
-
*/ createState(initialValue, options) {
|
|
35
|
-
if (this.destroyed) {
|
|
36
|
-
throw new Error('StateManager has been destroyed');
|
|
37
|
-
}
|
|
38
|
-
// 合并默认作用域
|
|
39
|
-
const mergedOptions = {
|
|
40
|
-
...options,
|
|
41
|
-
scope: options?.scope ?? this.defaultScope,
|
|
42
|
-
devMode: options?.devMode ?? this.devMode
|
|
43
|
-
};
|
|
44
|
-
// 使用适配器创建状态实例
|
|
45
|
-
const instance = this.adapter.createInstance(initialValue, mergedOptions);
|
|
46
|
-
// 如果启用了注册表,注册实例
|
|
47
|
-
if (this.registry) {
|
|
48
|
-
// 类型转换:注册表接受 IStateInstance<unknown>,但实际类型是 IStateInstance<T>
|
|
49
|
-
this.registry.register(instance);
|
|
50
|
-
}
|
|
51
|
-
return instance;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* 创建派生状态
|
|
55
|
-
*/ createDerivedState(config, options) {
|
|
56
|
-
if (this.destroyed) {
|
|
57
|
-
throw new Error('StateManager has been destroyed');
|
|
58
|
-
}
|
|
59
|
-
const mergedOptions = {
|
|
60
|
-
...options,
|
|
61
|
-
scope: options?.scope ?? this.defaultScope
|
|
62
|
-
};
|
|
63
|
-
const instance = new _DerivedStateInstance.DerivedStateInstance(config, mergedOptions);
|
|
64
|
-
// 如果启用了注册表,注册实例
|
|
65
|
-
if (this.registry) {
|
|
66
|
-
this.registry.register(instance);
|
|
67
|
-
}
|
|
68
|
-
return instance;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* 获取状态实例(如果启用了注册表)
|
|
72
|
-
*/ getState(id) {
|
|
73
|
-
if (!this.registry) {
|
|
74
|
-
throw new Error('Registry is not enabled. Enable it in StateManagerOptions.');
|
|
75
|
-
}
|
|
76
|
-
return this.registry.getInstance(id);
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* 根据作用域获取所有状态实例
|
|
80
|
-
*/ getStatesByScope(scope) {
|
|
81
|
-
if (!this.registry) {
|
|
82
|
-
throw new Error('Registry is not enabled. Enable it in StateManagerOptions.');
|
|
83
|
-
}
|
|
84
|
-
return this.registry.getInstancesByScope(scope);
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* 获取所有状态实例
|
|
88
|
-
*/ getAllStates() {
|
|
89
|
-
if (!this.registry) {
|
|
90
|
-
throw new Error('Registry is not enabled. Enable it in StateManagerOptions.');
|
|
91
|
-
}
|
|
92
|
-
return this.registry.getAllInstances();
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* 销毁指定作用域的所有状态实例
|
|
96
|
-
*/ destroyScope(scope) {
|
|
97
|
-
if (!this.registry) {
|
|
98
|
-
throw new Error('Registry is not enabled. Enable it in StateManagerOptions.');
|
|
99
|
-
}
|
|
100
|
-
this.registry.destroyScope(scope);
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* 销毁状态管理器
|
|
104
|
-
*/ destroy() {
|
|
105
|
-
if (this.destroyed) {
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
this.destroyed = true;
|
|
109
|
-
// 销毁注册表中的所有实例
|
|
110
|
-
if (this.registry) {
|
|
111
|
-
this.registry.destroyAll();
|
|
112
|
-
}
|
|
113
|
-
// 销毁适配器
|
|
114
|
-
this.adapter.destroy();
|
|
115
|
-
if (this.devMode) {
|
|
116
|
-
console.debug('[StateManager] Destroyed');
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* 检查状态管理器是否已销毁
|
|
121
|
-
*/ isDestroyed() {
|
|
122
|
-
return this.destroyed;
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* 获取当前使用的适配器
|
|
126
|
-
*/ getAdapter() {
|
|
127
|
-
return this.adapter;
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* 获取注册表(如果启用)
|
|
131
|
-
*/ getRegistry() {
|
|
132
|
-
return this.registry;
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* 构造函数
|
|
136
|
-
*
|
|
137
|
-
* @param options - 状态管理器配置选项
|
|
138
|
-
*/ constructor(options = {}){
|
|
139
|
-
/**
|
|
140
|
-
* 默认适配器
|
|
141
|
-
*/ _define_property(this, "adapter", void 0);
|
|
142
|
-
/**
|
|
143
|
-
* 状态注册表(如果启用)
|
|
144
|
-
*/ _define_property(this, "registry", void 0);
|
|
145
|
-
/**
|
|
146
|
-
* 默认作用域
|
|
147
|
-
*/ _define_property(this, "defaultScope", void 0);
|
|
148
|
-
/**
|
|
149
|
-
* 是否启用开发模式
|
|
150
|
-
*/ _define_property(this, "devMode", void 0);
|
|
151
|
-
/**
|
|
152
|
-
* 是否已销毁
|
|
153
|
-
*/ _define_property(this, "destroyed", false);
|
|
154
|
-
this.adapter = options.defaultAdapter ?? _AdapterFactory.AdapterFactory.getDefaultAdapter();
|
|
155
|
-
this.defaultScope = options.defaultScope;
|
|
156
|
-
this.devMode = options.devMode ?? false;
|
|
157
|
-
this.registry = options.enableRegistry !== false ? new _StateRegistry.StateRegistry() : null;
|
|
158
|
-
if (this.devMode) {
|
|
159
|
-
console.debug('[StateManager] Initialized', {
|
|
160
|
-
adapter: this.adapter.getName(),
|
|
161
|
-
registryEnabled: !!this.registry,
|
|
162
|
-
defaultScope: this.defaultScope
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
};
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"StateManager",{enumerable:true,get:function(){return StateManager}});const _AdapterFactory=require("./adapters/AdapterFactory");const _StateRegistry=require("./core/StateRegistry");const _DerivedStateInstance=require("./core/DerivedStateInstance");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let StateManager=class StateManager{createState(initialValue,options){if(this.destroyed){throw new Error("StateManager has been destroyed")}const mergedOptions={...options,scope:options?.scope??this.defaultScope,devMode:options?.devMode??this.devMode};const instance=this.adapter.createInstance(initialValue,mergedOptions);if(this.registry){this.registry.register(instance)}return instance}createDerivedState(config,options){if(this.destroyed){throw new Error("StateManager has been destroyed")}const mergedOptions={...options,scope:options?.scope??this.defaultScope};const instance=new _DerivedStateInstance.DerivedStateInstance(config,mergedOptions);if(this.registry){this.registry.register(instance)}return instance}getState(id){if(!this.registry){throw new Error("Registry is not enabled. Enable it in StateManagerOptions.")}return this.registry.getInstance(id)}getStatesByScope(scope){if(!this.registry){throw new Error("Registry is not enabled. Enable it in StateManagerOptions.")}return this.registry.getInstancesByScope(scope)}getAllStates(){if(!this.registry){throw new Error("Registry is not enabled. Enable it in StateManagerOptions.")}return this.registry.getAllInstances()}destroyScope(scope){if(!this.registry){throw new Error("Registry is not enabled. Enable it in StateManagerOptions.")}this.registry.destroyScope(scope)}destroy(){if(this.destroyed){return}this.destroyed=true;if(this.registry){this.registry.destroyAll()}this.adapter.destroy();if(this.devMode){console.debug("[StateManager] Destroyed")}}isDestroyed(){return this.destroyed}getAdapter(){return this.adapter}getRegistry(){return this.registry}constructor(options={}){_define_property(this,"adapter",void 0);_define_property(this,"registry",void 0);_define_property(this,"defaultScope",void 0);_define_property(this,"devMode",void 0);_define_property(this,"destroyed",false);this.adapter=options.defaultAdapter??_AdapterFactory.AdapterFactory.getDefaultAdapter();this.defaultScope=options.defaultScope;this.devMode=options.devMode??false;this.registry=options.enableRegistry!==false?new _StateRegistry.StateRegistry:null;if(this.devMode){console.debug("[StateManager] Initialized",{adapter:this.adapter.getName(),registryEnabled:!!this.registry,defaultScope:this.defaultScope})}}};
|
|
@@ -1,89 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* 状态适配器工厂
|
|
3
|
-
*/ "use strict";
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
Object.defineProperty(exports, "AdapterFactory", {
|
|
8
|
-
enumerable: true,
|
|
9
|
-
get: function() {
|
|
10
|
-
return AdapterFactory;
|
|
11
|
-
}
|
|
12
|
-
});
|
|
13
|
-
const _DefaultAdapter = require("./DefaultAdapter");
|
|
14
|
-
function _define_property(obj, key, value) {
|
|
15
|
-
if (key in obj) {
|
|
16
|
-
Object.defineProperty(obj, key, {
|
|
17
|
-
value: value,
|
|
18
|
-
enumerable: true,
|
|
19
|
-
configurable: true,
|
|
20
|
-
writable: true
|
|
21
|
-
});
|
|
22
|
-
} else {
|
|
23
|
-
obj[key] = value;
|
|
24
|
-
}
|
|
25
|
-
return obj;
|
|
26
|
-
}
|
|
27
|
-
let AdapterFactory = class AdapterFactory {
|
|
28
|
-
/**
|
|
29
|
-
* 获取默认适配器
|
|
30
|
-
*/ static getDefaultAdapter() {
|
|
31
|
-
if (!this.defaultAdapter) {
|
|
32
|
-
this.defaultAdapter = new _DefaultAdapter.DefaultAdapter();
|
|
33
|
-
}
|
|
34
|
-
return this.defaultAdapter;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* 创建适配器实例
|
|
38
|
-
*
|
|
39
|
-
* @param adapterName - 适配器名称,如果不提供则使用默认适配器
|
|
40
|
-
* @returns 适配器实例
|
|
41
|
-
*/ static createAdapter(adapterName) {
|
|
42
|
-
if (!adapterName) {
|
|
43
|
-
return this.getDefaultAdapter();
|
|
44
|
-
}
|
|
45
|
-
const factory = this.customAdapters.get(adapterName);
|
|
46
|
-
if (!factory) {
|
|
47
|
-
throw new Error(`Adapter "${adapterName}" not found. Available adapters: ${Array.from(this.customAdapters.keys()).join(', ')}`);
|
|
48
|
-
}
|
|
49
|
-
return factory();
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* 注册自定义适配器
|
|
53
|
-
*
|
|
54
|
-
* @param name - 适配器名称
|
|
55
|
-
* @param factory - 适配器工厂函数
|
|
56
|
-
*/ static registerAdapter(name, factory) {
|
|
57
|
-
if (this.customAdapters.has(name)) {
|
|
58
|
-
console.warn(`[AdapterFactory] Adapter "${name}" already registered, replacing...`);
|
|
59
|
-
}
|
|
60
|
-
this.customAdapters.set(name, factory);
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* 注销适配器
|
|
64
|
-
*
|
|
65
|
-
* @param name - 适配器名称
|
|
66
|
-
*/ static unregisterAdapter(name) {
|
|
67
|
-
this.customAdapters.delete(name);
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* 获取所有已注册的适配器名称
|
|
71
|
-
*/ static getRegisteredAdapters() {
|
|
72
|
-
return Array.from(this.customAdapters.keys());
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* 重置工厂(主要用于测试)
|
|
76
|
-
*/ static reset() {
|
|
77
|
-
if (this.defaultAdapter) {
|
|
78
|
-
this.defaultAdapter.destroy();
|
|
79
|
-
this.defaultAdapter = null;
|
|
80
|
-
}
|
|
81
|
-
this.customAdapters.clear();
|
|
82
|
-
}
|
|
83
|
-
};
|
|
84
|
-
/**
|
|
85
|
-
* 默认适配器实例
|
|
86
|
-
*/ _define_property(AdapterFactory, "defaultAdapter", null);
|
|
87
|
-
/**
|
|
88
|
-
* 自定义适配器映射
|
|
89
|
-
*/ _define_property(AdapterFactory, "customAdapters", new Map());
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"AdapterFactory",{enumerable:true,get:function(){return AdapterFactory}});const _DefaultAdapter=require("./DefaultAdapter");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let AdapterFactory=class AdapterFactory{static getDefaultAdapter(){if(!this.defaultAdapter){this.defaultAdapter=new _DefaultAdapter.DefaultAdapter}return this.defaultAdapter}static createAdapter(adapterName){if(!adapterName){return this.getDefaultAdapter()}const factory=this.customAdapters.get(adapterName);if(!factory){throw new Error(`Adapter "${adapterName}" not found. Available adapters: ${Array.from(this.customAdapters.keys()).join(", ")}`)}return factory()}static registerAdapter(name,factory){if(this.customAdapters.has(name)){console.warn(`[AdapterFactory] Adapter "${name}" already registered, replacing...`)}this.customAdapters.set(name,factory)}static unregisterAdapter(name){this.customAdapters.delete(name)}static getRegisteredAdapters(){return Array.from(this.customAdapters.keys())}static reset(){if(this.defaultAdapter){this.defaultAdapter.destroy();this.defaultAdapter=null}this.customAdapters.clear()}};_define_property(AdapterFactory,"defaultAdapter",null);_define_property(AdapterFactory,"customAdapters",new Map);
|
|
@@ -1,75 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* 默认状态适配器
|
|
3
|
-
*
|
|
4
|
-
* 这是 Secra Framework 内置的默认状态适配器实现
|
|
5
|
-
* 不依赖任何外部状态管理库,提供基础的状态管理能力
|
|
6
|
-
*/ "use strict";
|
|
7
|
-
Object.defineProperty(exports, "__esModule", {
|
|
8
|
-
value: true
|
|
9
|
-
});
|
|
10
|
-
Object.defineProperty(exports, "DefaultAdapter", {
|
|
11
|
-
enumerable: true,
|
|
12
|
-
get: function() {
|
|
13
|
-
return DefaultAdapter;
|
|
14
|
-
}
|
|
15
|
-
});
|
|
16
|
-
const _StateInstance = require("../core/StateInstance");
|
|
17
|
-
function _define_property(obj, key, value) {
|
|
18
|
-
if (key in obj) {
|
|
19
|
-
Object.defineProperty(obj, key, {
|
|
20
|
-
value: value,
|
|
21
|
-
enumerable: true,
|
|
22
|
-
configurable: true,
|
|
23
|
-
writable: true
|
|
24
|
-
});
|
|
25
|
-
} else {
|
|
26
|
-
obj[key] = value;
|
|
27
|
-
}
|
|
28
|
-
return obj;
|
|
29
|
-
}
|
|
30
|
-
let DefaultAdapter = class DefaultAdapter {
|
|
31
|
-
/**
|
|
32
|
-
* 创建状态实例
|
|
33
|
-
*/ createInstance(initialValue, options) {
|
|
34
|
-
if (this.destroyed) {
|
|
35
|
-
throw new Error('Adapter has been destroyed');
|
|
36
|
-
}
|
|
37
|
-
const instance = new _StateInstance.StateInstance(initialValue, {
|
|
38
|
-
id: options?.id,
|
|
39
|
-
scope: options?.scope,
|
|
40
|
-
devMode: options?.devMode,
|
|
41
|
-
middleware: options?.middleware
|
|
42
|
-
});
|
|
43
|
-
this.instances.add(instance);
|
|
44
|
-
return instance;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* 销毁适配器
|
|
48
|
-
*/ destroy() {
|
|
49
|
-
if (this.destroyed) {
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
// 销毁所有创建的状态实例
|
|
53
|
-
for (const instance of this.instances){
|
|
54
|
-
instance.destroy();
|
|
55
|
-
}
|
|
56
|
-
this.instances.clear();
|
|
57
|
-
this.destroyed = true;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* 获取适配器名称
|
|
61
|
-
*/ getName() {
|
|
62
|
-
return this.name;
|
|
63
|
-
}
|
|
64
|
-
constructor(){
|
|
65
|
-
/**
|
|
66
|
-
* 适配器名称
|
|
67
|
-
*/ _define_property(this, "name", 'DefaultAdapter');
|
|
68
|
-
/**
|
|
69
|
-
* 是否已销毁
|
|
70
|
-
*/ _define_property(this, "destroyed", false);
|
|
71
|
-
/**
|
|
72
|
-
* 创建的状态实例集合(用于销毁时清理)
|
|
73
|
-
*/ _define_property(this, "instances", new Set());
|
|
74
|
-
}
|
|
75
|
-
};
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"DefaultAdapter",{enumerable:true,get:function(){return DefaultAdapter}});const _StateInstance=require("../core/StateInstance");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let DefaultAdapter=class DefaultAdapter{createInstance(initialValue,options){if(this.destroyed){throw new Error("Adapter has been destroyed")}const instance=new _StateInstance.StateInstance(initialValue,{id:options?.id,scope:options?.scope,devMode:options?.devMode,middleware:options?.middleware});this.instances.add(instance);return instance}destroy(){if(this.destroyed){return}for(const instance of this.instances){instance.destroy()}this.instances.clear();this.destroyed=true}getName(){return this.name}constructor(){_define_property(this,"name","DefaultAdapter");_define_property(this,"destroyed",false);_define_property(this,"instances",new Set)}};
|