@vlian/framework 1.2.25 → 1.2.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/dist/analytics.umd.js +208 -2395
  2. package/dist/analytics.umd.js.map +1 -1
  3. package/dist/core/Test.cjs +2 -2
  4. package/dist/core/Test.cjs.map +1 -1
  5. package/dist/core/Test.js +1 -1
  6. package/dist/core/Test.js.map +1 -1
  7. package/dist/core/config/ConfigLoader.cjs +7 -7
  8. package/dist/core/config/ConfigLoader.cjs.map +1 -1
  9. package/dist/core/config/ConfigLoader.js +1 -1
  10. package/dist/core/config/ConfigLoader.js.map +1 -1
  11. package/dist/core/error/ErrorBoundary.cjs +6 -6
  12. package/dist/core/error/ErrorBoundary.cjs.map +1 -1
  13. package/dist/core/error/ErrorBoundary.d.ts +1 -1
  14. package/dist/core/error/ErrorBoundary.js +2 -2
  15. package/dist/core/error/ErrorBoundary.js.map +1 -1
  16. package/dist/core/error/ErrorHandler.cjs +19 -19
  17. package/dist/core/error/ErrorHandler.cjs.map +1 -1
  18. package/dist/core/error/ErrorHandler.d.ts +2 -2
  19. package/dist/core/error/ErrorHandler.js +2 -2
  20. package/dist/core/error/ErrorHandler.js.map +1 -1
  21. package/dist/core/event/AppEventBus.cjs +5 -5
  22. package/dist/core/event/AppEventBus.cjs.map +1 -1
  23. package/dist/core/event/AppEventBus.js +1 -1
  24. package/dist/core/event/AppEventBus.js.map +1 -1
  25. package/dist/core/initialization/InitializationErrorThrower.cjs.map +1 -1
  26. package/dist/core/initialization/InitializationErrorThrower.js.map +1 -1
  27. package/dist/core/initialization/initialization.cjs +3 -3
  28. package/dist/core/initialization/initialization.cjs.map +1 -1
  29. package/dist/core/initialization/initialization.d.ts +1 -1
  30. package/dist/core/initialization/initialization.js +1 -1
  31. package/dist/core/initialization/initialization.js.map +1 -1
  32. package/dist/core/initialization/initializationErrorState.cjs +2 -2
  33. package/dist/core/initialization/initializationErrorState.cjs.map +1 -1
  34. package/dist/core/initialization/initializationErrorState.d.ts +1 -1
  35. package/dist/core/initialization/initializationErrorState.js +1 -1
  36. package/dist/core/initialization/initializationErrorState.js.map +1 -1
  37. package/dist/core/kernel/defaultAdapters.cjs +14 -13
  38. package/dist/core/kernel/defaultAdapters.cjs.map +1 -1
  39. package/dist/core/kernel/defaultAdapters.js +2 -1
  40. package/dist/core/kernel/defaultAdapters.js.map +1 -1
  41. package/dist/core/kernel/types.d.ts +1 -1
  42. package/dist/core/kernel/types.js.map +1 -1
  43. package/dist/core/router/RouterManager.cjs +9 -9
  44. package/dist/core/router/RouterManager.cjs.map +1 -1
  45. package/dist/core/router/RouterManager.js +1 -1
  46. package/dist/core/router/RouterManager.js.map +1 -1
  47. package/dist/core/router/adapter/AdapterManager.cjs +10 -10
  48. package/dist/core/router/adapter/AdapterManager.cjs.map +1 -1
  49. package/dist/core/router/adapter/AdapterManager.js +1 -1
  50. package/dist/core/router/adapter/AdapterManager.js.map +1 -1
  51. package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs +4 -4
  52. package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs.map +1 -1
  53. package/dist/core/router/adapter/react-router/ReactRouterAdapter.js +1 -1
  54. package/dist/core/router/adapter/react-router/ReactRouterAdapter.js.map +1 -1
  55. package/dist/core/router/dynamic/DynamicRouteManager.cjs +8 -8
  56. package/dist/core/router/dynamic/DynamicRouteManager.cjs.map +1 -1
  57. package/dist/core/router/dynamic/DynamicRouteManager.js +1 -1
  58. package/dist/core/router/dynamic/DynamicRouteManager.js.map +1 -1
  59. package/dist/core/router/errors/RouterError.cjs +4 -4
  60. package/dist/core/router/errors/RouterError.cjs.map +1 -1
  61. package/dist/core/router/errors/RouterError.d.ts +1 -1
  62. package/dist/core/router/errors/RouterError.js +1 -1
  63. package/dist/core/router/errors/RouterError.js.map +1 -1
  64. package/dist/core/router/lifecycle/RouterLifecycleManager.cjs +8 -8
  65. package/dist/core/router/lifecycle/RouterLifecycleManager.cjs.map +1 -1
  66. package/dist/core/router/lifecycle/RouterLifecycleManager.js +1 -1
  67. package/dist/core/router/lifecycle/RouterLifecycleManager.js.map +1 -1
  68. package/dist/core/router/middleware/RouterMiddlewareManager.cjs +11 -11
  69. package/dist/core/router/middleware/RouterMiddlewareManager.cjs.map +1 -1
  70. package/dist/core/router/middleware/RouterMiddlewareManager.js +1 -1
  71. package/dist/core/router/middleware/RouterMiddlewareManager.js.map +1 -1
  72. package/dist/core/router/middleware/auth.cjs +4 -4
  73. package/dist/core/router/middleware/auth.cjs.map +1 -1
  74. package/dist/core/router/middleware/auth.js +1 -1
  75. package/dist/core/router/middleware/auth.js.map +1 -1
  76. package/dist/core/router/monitoring/RouterMonitoring.cjs +2 -2
  77. package/dist/core/router/monitoring/RouterMonitoring.cjs.map +1 -1
  78. package/dist/core/router/monitoring/RouterMonitoring.js +2 -2
  79. package/dist/core/router/monitoring/RouterMonitoring.js.map +1 -1
  80. package/dist/core/router/navigation/RouterNavigation.cjs +7 -7
  81. package/dist/core/router/navigation/RouterNavigation.cjs.map +1 -1
  82. package/dist/core/router/navigation/RouterNavigation.js +1 -1
  83. package/dist/core/router/navigation/RouterNavigation.js.map +1 -1
  84. package/dist/core/router/performance/RouteCache.cjs +7 -7
  85. package/dist/core/router/performance/RouteCache.cjs.map +1 -1
  86. package/dist/core/router/performance/RouteCache.js +1 -1
  87. package/dist/core/router/performance/RouteCache.js.map +1 -1
  88. package/dist/core/router/performance/RoutePreloader.cjs +6 -6
  89. package/dist/core/router/performance/RoutePreloader.cjs.map +1 -1
  90. package/dist/core/router/performance/RoutePreloader.js +1 -1
  91. package/dist/core/router/performance/RoutePreloader.js.map +1 -1
  92. package/dist/core/router/plugin/RouterPluginManager.cjs +8 -8
  93. package/dist/core/router/plugin/RouterPluginManager.cjs.map +1 -1
  94. package/dist/core/router/plugin/RouterPluginManager.js +1 -1
  95. package/dist/core/router/plugin/RouterPluginManager.js.map +1 -1
  96. package/dist/core/router/utils/adapters/react-router/transform.cjs +6 -2
  97. package/dist/core/router/utils/adapters/react-router/transform.cjs.map +1 -1
  98. package/dist/core/router/utils/adapters/react-router/transform.js +5 -1
  99. package/dist/core/router/utils/adapters/react-router/transform.js.map +1 -1
  100. package/dist/core/router/utils/transform.cjs +13 -12
  101. package/dist/core/router/utils/transform.cjs.map +1 -1
  102. package/dist/core/router/utils/transform.js +2 -1
  103. package/dist/core/router/utils/transform.js.map +1 -1
  104. package/dist/core/router/validation/RouterConfigValidator.cjs +2 -2
  105. package/dist/core/router/validation/RouterConfigValidator.cjs.map +1 -1
  106. package/dist/core/router/validation/RouterConfigValidator.js +1 -1
  107. package/dist/core/router/validation/RouterConfigValidator.js.map +1 -1
  108. package/dist/core/router/version/RouteVersionManager.cjs +6 -6
  109. package/dist/core/router/version/RouteVersionManager.cjs.map +1 -1
  110. package/dist/core/router/version/RouteVersionManager.js +1 -1
  111. package/dist/core/router/version/RouteVersionManager.js.map +1 -1
  112. package/dist/core/splash/SplashScreen.cjs +4 -4
  113. package/dist/core/splash/SplashScreen.cjs.map +1 -1
  114. package/dist/core/splash/SplashScreen.js +1 -1
  115. package/dist/core/splash/SplashScreen.js.map +1 -1
  116. package/dist/core/startup/initializeServices.cjs +15 -15
  117. package/dist/core/startup/initializeServices.cjs.map +1 -1
  118. package/dist/core/startup/initializeServices.d.ts +2 -2
  119. package/dist/core/startup/initializeServices.js +3 -3
  120. package/dist/core/startup/initializeServices.js.map +1 -1
  121. package/dist/core/startup/performanceTracker.cjs.map +1 -1
  122. package/dist/core/startup/performanceTracker.d.ts +1 -1
  123. package/dist/core/startup/performanceTracker.js.map +1 -1
  124. package/dist/core/startup/renderApp.cjs +3 -3
  125. package/dist/core/startup/renderApp.cjs.map +1 -1
  126. package/dist/core/startup/renderApp.d.ts +1 -1
  127. package/dist/core/startup/renderApp.js +2 -2
  128. package/dist/core/startup/renderApp.js.map +1 -1
  129. package/dist/core/startup/startApp.cjs +24 -24
  130. package/dist/core/startup/startApp.cjs.map +1 -1
  131. package/dist/core/startup/startApp.js +5 -5
  132. package/dist/core/startup/startApp.js.map +1 -1
  133. package/dist/core/types.d.ts +3 -3
  134. package/dist/core/types.js.map +1 -1
  135. package/dist/index.cjs +15 -2
  136. package/dist/index.cjs.map +1 -1
  137. package/dist/index.d.ts +6 -4
  138. package/dist/index.js +5 -4
  139. package/dist/index.js.map +1 -1
  140. package/dist/index.umd.js +2150 -23125
  141. package/dist/index.umd.js.map +1 -1
  142. package/dist/kernel/constants.cjs +67 -0
  143. package/dist/kernel/constants.cjs.map +1 -0
  144. package/dist/kernel/constants.d.ts +5 -0
  145. package/dist/kernel/constants.js +43 -0
  146. package/dist/kernel/constants.js.map +1 -0
  147. package/dist/kernel/index.cjs +40 -0
  148. package/dist/kernel/index.cjs.map +1 -0
  149. package/dist/kernel/index.d.ts +3 -0
  150. package/dist/kernel/index.js +4 -0
  151. package/dist/kernel/index.js.map +1 -0
  152. package/dist/kernel/kernel.cjs +296 -0
  153. package/dist/kernel/kernel.cjs.map +1 -0
  154. package/dist/kernel/kernel.d.ts +40 -0
  155. package/dist/kernel/kernel.js +272 -0
  156. package/dist/kernel/kernel.js.map +1 -0
  157. package/dist/kernel/manager/cacheManager.cjs +46 -0
  158. package/dist/kernel/manager/cacheManager.cjs.map +1 -0
  159. package/dist/kernel/manager/cacheManager.d.ts +6 -0
  160. package/dist/kernel/manager/cacheManager.js +36 -0
  161. package/dist/kernel/manager/cacheManager.js.map +1 -0
  162. package/dist/kernel/manager/i18nManager.cjs +68 -0
  163. package/dist/kernel/manager/i18nManager.cjs.map +1 -0
  164. package/dist/kernel/manager/i18nManager.d.ts +8 -0
  165. package/dist/kernel/manager/i18nManager.js +58 -0
  166. package/dist/kernel/manager/i18nManager.js.map +1 -0
  167. package/dist/kernel/manager/index.cjs +30 -0
  168. package/dist/kernel/manager/index.cjs.map +1 -0
  169. package/dist/kernel/manager/index.d.ts +4 -0
  170. package/dist/kernel/manager/index.js +6 -0
  171. package/dist/kernel/manager/index.js.map +1 -0
  172. package/dist/kernel/manager/loggerManager.cjs +70 -0
  173. package/dist/kernel/manager/loggerManager.cjs.map +1 -0
  174. package/dist/kernel/manager/loggerManager.d.ts +14 -0
  175. package/dist/kernel/manager/loggerManager.js +60 -0
  176. package/dist/kernel/manager/loggerManager.js.map +1 -0
  177. package/dist/kernel/manager/persistence.cjs +93 -0
  178. package/dist/kernel/manager/persistence.cjs.map +1 -0
  179. package/dist/kernel/manager/persistence.d.ts +3 -0
  180. package/dist/kernel/manager/persistence.js +75 -0
  181. package/dist/kernel/manager/persistence.js.map +1 -0
  182. package/dist/kernel/manager/themeManager.cjs +85 -0
  183. package/dist/kernel/manager/themeManager.cjs.map +1 -0
  184. package/dist/kernel/manager/themeManager.d.ts +9 -0
  185. package/dist/kernel/manager/themeManager.js +75 -0
  186. package/dist/kernel/manager/themeManager.js.map +1 -0
  187. package/dist/kernel/types.cjs +6 -0
  188. package/dist/kernel/types.cjs.map +1 -0
  189. package/dist/kernel/types.d.ts +72 -0
  190. package/dist/kernel/types.js +3 -0
  191. package/dist/kernel/types.js.map +1 -0
  192. package/dist/library/storage/encryption.cjs +12 -13
  193. package/dist/library/storage/encryption.cjs.map +1 -1
  194. package/dist/library/storage/encryption.js +1 -2
  195. package/dist/library/storage/encryption.js.map +1 -1
  196. package/dist/request/adapter.d.ts +1 -0
  197. package/dist/request/core.d.ts +1 -0
  198. package/dist/request/index.d.ts +1 -42
  199. package/dist/request/plugin/csrfPlugin.d.ts +2 -2
  200. package/dist/request/plugin/queue.d.ts +2 -2
  201. package/dist/request/plugin.d.ts +1 -0
  202. package/dist/request/runtime.d.ts +1 -0
  203. package/dist/request/types.d.ts +1 -394
  204. package/dist/request/utils.d.ts +1 -0
  205. package/dist/state.umd.js +1 -1
  206. package/dist/utils/csrf.cjs +13 -152
  207. package/dist/utils/csrf.cjs.map +1 -1
  208. package/dist/utils/csrf.d.ts +1 -72
  209. package/dist/utils/csrf.js +1 -142
  210. package/dist/utils/csrf.js.map +1 -1
  211. package/dist/utils/errors/ErrorCodes.cjs +6 -76
  212. package/dist/utils/errors/ErrorCodes.cjs.map +1 -1
  213. package/dist/utils/errors/ErrorCodes.d.ts +1 -45
  214. package/dist/utils/errors/ErrorCodes.js +1 -84
  215. package/dist/utils/errors/ErrorCodes.js.map +1 -1
  216. package/dist/utils/errors.cjs +53 -326
  217. package/dist/utils/errors.cjs.map +1 -1
  218. package/dist/utils/errors.d.ts +19 -172
  219. package/dist/utils/errors.js +16 -352
  220. package/dist/utils/errors.js.map +1 -1
  221. package/dist/utils/logger.cjs +5 -374
  222. package/dist/utils/logger.cjs.map +1 -1
  223. package/dist/utils/logger.d.ts +2 -189
  224. package/dist/utils/logger.js +1 -379
  225. package/dist/utils/logger.js.map +1 -1
  226. package/dist/utils/logger.types.cjs +3 -12
  227. package/dist/utils/logger.types.cjs.map +1 -1
  228. package/dist/utils/logger.types.d.ts +2 -57
  229. package/dist/utils/logger.types.js +1 -10
  230. package/dist/utils/logger.types.js.map +1 -1
  231. package/dist/utils/monitoring.cjs +11 -302
  232. package/dist/utils/monitoring.cjs.map +1 -1
  233. package/dist/utils/monitoring.d.ts +1 -163
  234. package/dist/utils/monitoring.js +1 -294
  235. package/dist/utils/monitoring.js.map +1 -1
  236. package/dist/utils/performance.cjs +5 -352
  237. package/dist/utils/performance.cjs.map +1 -1
  238. package/dist/utils/performance.d.ts +2 -246
  239. package/dist/utils/performance.js +1 -354
  240. package/dist/utils/performance.js.map +1 -1
  241. package/dist/utils/resourceLoader.cjs +5 -303
  242. package/dist/utils/resourceLoader.cjs.map +1 -1
  243. package/dist/utils/resourceLoader.d.ts +2 -130
  244. package/dist/utils/resourceLoader.js +1 -305
  245. package/dist/utils/resourceLoader.js.map +1 -1
  246. package/dist/utils/runtimeSecurity.cjs +2 -140
  247. package/dist/utils/runtimeSecurity.cjs.map +1 -1
  248. package/dist/utils/runtimeSecurity.d.ts +2 -104
  249. package/dist/utils/runtimeSecurity.js +1 -141
  250. package/dist/utils/runtimeSecurity.js.map +1 -1
  251. package/dist/utils/security.cjs +3 -314
  252. package/dist/utils/security.cjs.map +1 -1
  253. package/dist/utils/security.d.ts +2 -80
  254. package/dist/utils/security.js +1 -311
  255. package/dist/utils/security.js.map +1 -1
  256. package/dist/utils/traceId.cjs +10 -111
  257. package/dist/utils/traceId.cjs.map +1 -1
  258. package/dist/utils/traceId.d.ts +1 -63
  259. package/dist/utils/traceId.js +1 -116
  260. package/dist/utils/traceId.js.map +1 -1
  261. package/dist/utils/validation.cjs +3 -173
  262. package/dist/utils/validation.cjs.map +1 -1
  263. package/dist/utils/validation.d.ts +2 -110
  264. package/dist/utils/validation.js +1 -175
  265. package/dist/utils/validation.js.map +1 -1
  266. package/package.json +15 -24
  267. package/dist/lazy/index.cjs +0 -104
  268. package/dist/lazy/index.cjs.map +0 -1
  269. package/dist/lazy/index.d.ts +0 -19
  270. package/dist/lazy/index.js +0 -24
  271. package/dist/lazy/index.js.map +0 -1
  272. package/dist/request/adapter/RequestAdapter.cjs +0 -78
  273. package/dist/request/adapter/RequestAdapter.cjs.map +0 -1
  274. package/dist/request/adapter/axiosAdapter.cjs +0 -164
  275. package/dist/request/adapter/axiosAdapter.cjs.map +0 -1
  276. package/dist/request/adapter/fetchAdapter.cjs +0 -134
  277. package/dist/request/adapter/fetchAdapter.cjs.map +0 -1
  278. package/dist/request/adapter/index.cjs +0 -80
  279. package/dist/request/adapter/index.cjs.map +0 -1
  280. package/dist/request/adapter/kyAdapter.cjs +0 -191
  281. package/dist/request/adapter/kyAdapter.cjs.map +0 -1
  282. package/dist/request/adapter/undiciAdapter.cjs +0 -213
  283. package/dist/request/adapter/undiciAdapter.cjs.map +0 -1
  284. package/dist/request/core/RequestClient.cjs +0 -558
  285. package/dist/request/core/RequestClient.cjs.map +0 -1
  286. package/dist/request/core/index.cjs +0 -15
  287. package/dist/request/core/index.cjs.map +0 -1
  288. package/dist/request/index.cjs +0 -149
  289. package/dist/request/index.cjs.map +0 -1
  290. package/dist/request/plugin/RequestPlugin.cjs +0 -218
  291. package/dist/request/plugin/RequestPlugin.cjs.map +0 -1
  292. package/dist/request/plugin/cache.cjs +0 -269
  293. package/dist/request/plugin/cache.cjs.map +0 -1
  294. package/dist/request/plugin/csrfPlugin.cjs +0 -40
  295. package/dist/request/plugin/csrfPlugin.cjs.map +0 -1
  296. package/dist/request/plugin/index.cjs +0 -53
  297. package/dist/request/plugin/index.cjs.map +0 -1
  298. package/dist/request/plugin/monitoring.cjs +0 -216
  299. package/dist/request/plugin/monitoring.cjs.map +0 -1
  300. package/dist/request/plugin/queue.cjs +0 -140
  301. package/dist/request/plugin/queue.cjs.map +0 -1
  302. package/dist/request/plugin/retry.cjs +0 -98
  303. package/dist/request/plugin/retry.cjs.map +0 -1
  304. package/dist/request/plugin/validation.cjs +0 -121
  305. package/dist/request/plugin/validation.cjs.map +0 -1
  306. package/dist/request/runtime/RequestContext.cjs +0 -77
  307. package/dist/request/runtime/RequestContext.cjs.map +0 -1
  308. package/dist/request/runtime/index.cjs +0 -32
  309. package/dist/request/runtime/index.cjs.map +0 -1
  310. package/dist/request/types.cjs +0 -112
  311. package/dist/request/types.cjs.map +0 -1
  312. package/dist/request/utils/RequestQueueManager.cjs +0 -168
  313. package/dist/request/utils/RequestQueueManager.cjs.map +0 -1
  314. package/dist/request/utils/dependencyCheck.cjs +0 -237
  315. package/dist/request/utils/dependencyCheck.cjs.map +0 -1
  316. package/dist/request/utils/index.cjs +0 -30
  317. package/dist/request/utils/index.cjs.map +0 -1
  318. package/dist/request.umd.js +0 -5392
  319. package/dist/request.umd.js.map +0 -1
@@ -8,14 +8,13 @@ Object.defineProperty(exports, "EncryptionUtils", {
8
8
  return EncryptionUtils;
9
9
  }
10
10
  });
11
- const _security = require("../../utils/security");
12
- const _errors = require("../../utils/errors");
11
+ const _utils = require("@vlian/utils");
13
12
  let EncryptionUtils = class EncryptionUtils {
14
13
  /**
15
14
  * 生成加密密钥
16
15
  */ static async generateKey() {
17
16
  if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {
18
- throw new _errors.StorageError('加密功能需要浏览器支持 Web Crypto API');
17
+ throw new _utils.StorageError('加密功能需要浏览器支持 Web Crypto API');
19
18
  }
20
19
  try {
21
20
  return await window.crypto.subtle.generateKey({
@@ -26,14 +25,14 @@ let EncryptionUtils = class EncryptionUtils {
26
25
  'decrypt'
27
26
  ]);
28
27
  } catch (error) {
29
- throw new _errors.StorageError('生成加密密钥失败', error instanceof Error ? error : undefined);
28
+ throw new _utils.StorageError('生成加密密钥失败', error instanceof Error ? error : undefined);
30
29
  }
31
30
  }
32
31
  /**
33
32
  * 使用 PBKDF2 派生密钥
34
33
  */ static async deriveKey(password, salt, iterations = 100000) {
35
34
  if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {
36
- throw new _errors.StorageError('加密功能需要浏览器支持 Web Crypto API');
35
+ throw new _utils.StorageError('加密功能需要浏览器支持 Web Crypto API');
37
36
  }
38
37
  try {
39
38
  // 导入密码
@@ -58,7 +57,7 @@ let EncryptionUtils = class EncryptionUtils {
58
57
  'decrypt'
59
58
  ]);
60
59
  } catch (error) {
61
- throw new _errors.StorageError('密钥派生失败', error instanceof Error ? error : undefined);
60
+ throw new _utils.StorageError('密钥派生失败', error instanceof Error ? error : undefined);
62
61
  }
63
62
  }
64
63
  /**
@@ -68,7 +67,7 @@ let EncryptionUtils = class EncryptionUtils {
68
67
  * 建议在生产环境中使用固定的 salt 或从安全存储中获取。
69
68
  */ static async importKey(keyString, salt) {
70
69
  if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {
71
- throw new _errors.StorageError('加密功能需要浏览器支持 Web Crypto API');
70
+ throw new _utils.StorageError('加密功能需要浏览器支持 Web Crypto API');
72
71
  }
73
72
  try {
74
73
  // 如果没有提供 salt,尝试从 sessionStorage 获取或生成一个固定的
@@ -90,14 +89,14 @@ let EncryptionUtils = class EncryptionUtils {
90
89
  // 使用 PBKDF2 派生密钥
91
90
  return await this.deriveKey(keyString, keySalt);
92
91
  } catch (error) {
93
- throw new _errors.StorageError('导入加密密钥失败', error instanceof Error ? error : undefined);
92
+ throw new _utils.StorageError('导入加密密钥失败', error instanceof Error ? error : undefined);
94
93
  }
95
94
  }
96
95
  /**
97
96
  * 加密数据
98
97
  */ static async encrypt(data, key) {
99
98
  if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {
100
- throw new _errors.StorageError('加密功能需要浏览器支持 Web Crypto API');
99
+ throw new _utils.StorageError('加密功能需要浏览器支持 Web Crypto API');
101
100
  }
102
101
  try {
103
102
  const encoder = new TextEncoder();
@@ -115,14 +114,14 @@ let EncryptionUtils = class EncryptionUtils {
115
114
  // 转换为 Base64
116
115
  return btoa(String.fromCharCode(...combined));
117
116
  } catch (error) {
118
- throw new _errors.StorageError('加密数据失败', error instanceof Error ? error : undefined);
117
+ throw new _utils.StorageError('加密数据失败', error instanceof Error ? error : undefined);
119
118
  }
120
119
  }
121
120
  /**
122
121
  * 解密数据
123
122
  */ static async decrypt(encryptedData, key) {
124
123
  if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {
125
- throw new _errors.StorageError('解密功能需要浏览器支持 Web Crypto API');
124
+ throw new _utils.StorageError('解密功能需要浏览器支持 Web Crypto API');
126
125
  }
127
126
  try {
128
127
  // 从 Base64 解码
@@ -137,13 +136,13 @@ let EncryptionUtils = class EncryptionUtils {
137
136
  const decoder = new TextDecoder();
138
137
  return decoder.decode(decrypted);
139
138
  } catch (error) {
140
- throw new _errors.StorageError('解密数据失败', error instanceof Error ? error : undefined);
139
+ throw new _utils.StorageError('解密数据失败', error instanceof Error ? error : undefined);
141
140
  }
142
141
  }
143
142
  /**
144
143
  * 检查字段是否需要加密
145
144
  */ static shouldEncrypt(key) {
146
- return _security.SecurityUtils.isSensitiveField(key);
145
+ return _utils.SecurityUtils.isSensitiveField(key);
147
146
  }
148
147
  };
149
148
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/library/storage/encryption.ts"],"sourcesContent":["import { SecurityUtils } from '../../utils/security';\nimport { StorageError } from '../../utils/errors';\n\n/**\n * 加密配置\n */\nexport interface EncryptionConfig {\n /**\n * 是否启用加密\n */\n enabled: boolean;\n /**\n * 加密密钥(可选,如果不提供则使用默认密钥)\n */\n key?: string;\n}\n\n/**\n * 加密工具类\n */\nexport class EncryptionUtils {\n\n /**\n * 生成加密密钥\n */\n static async generateKey(): Promise<CryptoKey> {\n if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {\n throw new StorageError('加密功能需要浏览器支持 Web Crypto API');\n }\n\n try {\n return await window.crypto.subtle.generateKey(\n {\n name: 'AES-GCM',\n length: 256,\n },\n true,\n ['encrypt', 'decrypt']\n );\n } catch (error) {\n throw new StorageError('生成加密密钥失败', error instanceof Error ? error : undefined);\n }\n }\n\n /**\n * 使用 PBKDF2 派生密钥\n */\n static async deriveKey(\n password: string,\n salt: Uint8Array,\n iterations: number = 100000\n ): Promise<CryptoKey> {\n if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {\n throw new StorageError('加密功能需要浏览器支持 Web Crypto API');\n }\n\n try {\n // 导入密码\n const encoder = new TextEncoder();\n const passwordKey = await window.crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits', 'deriveKey']\n );\n\n // 使用 PBKDF2 派生密钥\n // 确保 salt 是 BufferSource 类型(使用类型断言)\n const saltBuffer: BufferSource = (salt instanceof Uint8Array \n ? salt \n : new Uint8Array(salt)) as BufferSource;\n return await window.crypto.subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt: saltBuffer,\n iterations: iterations,\n hash: 'SHA-256',\n },\n passwordKey,\n {\n name: 'AES-GCM',\n length: 256,\n },\n false,\n ['encrypt', 'decrypt']\n );\n } catch (error) {\n throw new StorageError('密钥派生失败', error instanceof Error ? error : undefined);\n }\n }\n\n /**\n * 从字符串导入密钥(使用 PBKDF2 派生)\n * \n * 注意:如果没有提供 salt,每次调用都会生成新的 salt,导致密钥不一致。\n * 建议在生产环境中使用固定的 salt 或从安全存储中获取。\n */\n static async importKey(keyString: string, salt?: Uint8Array): Promise<CryptoKey> {\n if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {\n throw new StorageError('加密功能需要浏览器支持 Web Crypto API');\n }\n\n try {\n // 如果没有提供 salt,尝试从 sessionStorage 获取或生成一个固定的\n let keySalt = salt;\n \n if (!keySalt) {\n // 尝试从 sessionStorage 获取固定的 salt(用于当前会话)\n const saltKey = '__encryption_salt__';\n const storedSalt = sessionStorage.getItem(saltKey);\n \n if (storedSalt) {\n // 从存储中恢复 salt\n const saltArray = Uint8Array.from(JSON.parse(storedSalt));\n keySalt = saltArray;\n } else {\n // 生成新的 salt 并存储(用于当前会话)\n keySalt = window.crypto.getRandomValues(new Uint8Array(16));\n sessionStorage.setItem(saltKey, JSON.stringify(Array.from(keySalt)));\n }\n }\n \n // 使用 PBKDF2 派生密钥\n return await this.deriveKey(keyString, keySalt);\n } catch (error) {\n throw new StorageError('导入加密密钥失败', error instanceof Error ? error : undefined);\n }\n }\n\n /**\n * 加密数据\n */\n static async encrypt(data: string, key: CryptoKey): Promise<string> {\n if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {\n throw new StorageError('加密功能需要浏览器支持 Web Crypto API');\n }\n\n try {\n const encoder = new TextEncoder();\n const dataBuffer = encoder.encode(data);\n\n // 生成随机 IV\n const iv = window.crypto.getRandomValues(new Uint8Array(12));\n\n const encrypted = await window.crypto.subtle.encrypt(\n {\n name: 'AES-GCM',\n iv: iv,\n },\n key,\n dataBuffer\n );\n\n // 将 IV 和加密数据组合\n const combined = new Uint8Array(iv.length + encrypted.byteLength);\n combined.set(iv);\n combined.set(new Uint8Array(encrypted), iv.length);\n\n // 转换为 Base64\n return btoa(String.fromCharCode(...combined));\n } catch (error) {\n throw new StorageError('加密数据失败', error instanceof Error ? error : undefined);\n }\n }\n\n /**\n * 解密数据\n */\n static async decrypt(encryptedData: string, key: CryptoKey): Promise<string> {\n if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {\n throw new StorageError('解密功能需要浏览器支持 Web Crypto API');\n }\n\n try {\n // 从 Base64 解码\n const combined = Uint8Array.from(atob(encryptedData), (c) => c.charCodeAt(0));\n\n // 提取 IV 和加密数据\n const iv = combined.slice(0, 12);\n const encrypted = combined.slice(12);\n\n const decrypted = await window.crypto.subtle.decrypt(\n {\n name: 'AES-GCM',\n iv: iv,\n },\n key,\n encrypted\n );\n\n const decoder = new TextDecoder();\n return decoder.decode(decrypted);\n } catch (error) {\n throw new StorageError('解密数据失败', error instanceof Error ? error : undefined);\n }\n }\n\n /**\n * 检查字段是否需要加密\n */\n static shouldEncrypt(key: string): boolean {\n return SecurityUtils.isSensitiveField(key);\n }\n}\n"],"names":["EncryptionUtils","generateKey","window","crypto","subtle","StorageError","name","length","error","Error","undefined","deriveKey","password","salt","iterations","encoder","TextEncoder","passwordKey","importKey","encode","saltBuffer","Uint8Array","hash","keyString","keySalt","saltKey","storedSalt","sessionStorage","getItem","saltArray","from","JSON","parse","getRandomValues","setItem","stringify","Array","encrypt","data","key","dataBuffer","iv","encrypted","combined","byteLength","set","btoa","String","fromCharCode","decrypt","encryptedData","atob","c","charCodeAt","slice","decrypted","decoder","TextDecoder","decode","shouldEncrypt","SecurityUtils","isSensitiveField"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/library/storage/encryption.ts"],"sourcesContent":["import { SecurityUtils, StorageError } from '@vlian/utils';\n\n/**\n * 加密配置\n */\nexport interface EncryptionConfig {\n /**\n * 是否启用加密\n */\n enabled: boolean;\n /**\n * 加密密钥(可选,如果不提供则使用默认密钥)\n */\n key?: string;\n}\n\n/**\n * 加密工具类\n */\nexport class EncryptionUtils {\n\n /**\n * 生成加密密钥\n */\n static async generateKey(): Promise<CryptoKey> {\n if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {\n throw new StorageError('加密功能需要浏览器支持 Web Crypto API');\n }\n\n try {\n return await window.crypto.subtle.generateKey(\n {\n name: 'AES-GCM',\n length: 256,\n },\n true,\n ['encrypt', 'decrypt']\n );\n } catch (error) {\n throw new StorageError('生成加密密钥失败', error instanceof Error ? error : undefined);\n }\n }\n\n /**\n * 使用 PBKDF2 派生密钥\n */\n static async deriveKey(\n password: string,\n salt: Uint8Array,\n iterations: number = 100000\n ): Promise<CryptoKey> {\n if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {\n throw new StorageError('加密功能需要浏览器支持 Web Crypto API');\n }\n\n try {\n // 导入密码\n const encoder = new TextEncoder();\n const passwordKey = await window.crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits', 'deriveKey']\n );\n\n // 使用 PBKDF2 派生密钥\n // 确保 salt 是 BufferSource 类型(使用类型断言)\n const saltBuffer: BufferSource = (salt instanceof Uint8Array \n ? salt \n : new Uint8Array(salt)) as BufferSource;\n return await window.crypto.subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt: saltBuffer,\n iterations: iterations,\n hash: 'SHA-256',\n },\n passwordKey,\n {\n name: 'AES-GCM',\n length: 256,\n },\n false,\n ['encrypt', 'decrypt']\n );\n } catch (error) {\n throw new StorageError('密钥派生失败', error instanceof Error ? error : undefined);\n }\n }\n\n /**\n * 从字符串导入密钥(使用 PBKDF2 派生)\n * \n * 注意:如果没有提供 salt,每次调用都会生成新的 salt,导致密钥不一致。\n * 建议在生产环境中使用固定的 salt 或从安全存储中获取。\n */\n static async importKey(keyString: string, salt?: Uint8Array): Promise<CryptoKey> {\n if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {\n throw new StorageError('加密功能需要浏览器支持 Web Crypto API');\n }\n\n try {\n // 如果没有提供 salt,尝试从 sessionStorage 获取或生成一个固定的\n let keySalt = salt;\n \n if (!keySalt) {\n // 尝试从 sessionStorage 获取固定的 salt(用于当前会话)\n const saltKey = '__encryption_salt__';\n const storedSalt = sessionStorage.getItem(saltKey);\n \n if (storedSalt) {\n // 从存储中恢复 salt\n const saltArray = Uint8Array.from(JSON.parse(storedSalt));\n keySalt = saltArray;\n } else {\n // 生成新的 salt 并存储(用于当前会话)\n keySalt = window.crypto.getRandomValues(new Uint8Array(16));\n sessionStorage.setItem(saltKey, JSON.stringify(Array.from(keySalt)));\n }\n }\n \n // 使用 PBKDF2 派生密钥\n return await this.deriveKey(keyString, keySalt);\n } catch (error) {\n throw new StorageError('导入加密密钥失败', error instanceof Error ? error : undefined);\n }\n }\n\n /**\n * 加密数据\n */\n static async encrypt(data: string, key: CryptoKey): Promise<string> {\n if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {\n throw new StorageError('加密功能需要浏览器支持 Web Crypto API');\n }\n\n try {\n const encoder = new TextEncoder();\n const dataBuffer = encoder.encode(data);\n\n // 生成随机 IV\n const iv = window.crypto.getRandomValues(new Uint8Array(12));\n\n const encrypted = await window.crypto.subtle.encrypt(\n {\n name: 'AES-GCM',\n iv: iv,\n },\n key,\n dataBuffer\n );\n\n // 将 IV 和加密数据组合\n const combined = new Uint8Array(iv.length + encrypted.byteLength);\n combined.set(iv);\n combined.set(new Uint8Array(encrypted), iv.length);\n\n // 转换为 Base64\n return btoa(String.fromCharCode(...combined));\n } catch (error) {\n throw new StorageError('加密数据失败', error instanceof Error ? error : undefined);\n }\n }\n\n /**\n * 解密数据\n */\n static async decrypt(encryptedData: string, key: CryptoKey): Promise<string> {\n if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {\n throw new StorageError('解密功能需要浏览器支持 Web Crypto API');\n }\n\n try {\n // 从 Base64 解码\n const combined = Uint8Array.from(atob(encryptedData), (c) => c.charCodeAt(0));\n\n // 提取 IV 和加密数据\n const iv = combined.slice(0, 12);\n const encrypted = combined.slice(12);\n\n const decrypted = await window.crypto.subtle.decrypt(\n {\n name: 'AES-GCM',\n iv: iv,\n },\n key,\n encrypted\n );\n\n const decoder = new TextDecoder();\n return decoder.decode(decrypted);\n } catch (error) {\n throw new StorageError('解密数据失败', error instanceof Error ? error : undefined);\n }\n }\n\n /**\n * 检查字段是否需要加密\n */\n static shouldEncrypt(key: string): boolean {\n return SecurityUtils.isSensitiveField(key);\n }\n}\n"],"names":["EncryptionUtils","generateKey","window","crypto","subtle","StorageError","name","length","error","Error","undefined","deriveKey","password","salt","iterations","encoder","TextEncoder","passwordKey","importKey","encode","saltBuffer","Uint8Array","hash","keyString","keySalt","saltKey","storedSalt","sessionStorage","getItem","saltArray","from","JSON","parse","getRandomValues","setItem","stringify","Array","encrypt","data","key","dataBuffer","iv","encrypted","combined","byteLength","set","btoa","String","fromCharCode","decrypt","encryptedData","atob","c","charCodeAt","slice","decrypted","decoder","TextDecoder","decode","shouldEncrypt","SecurityUtils","isSensitiveField"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
- import { SecurityUtils } from "../../utils/security";
2
- import { StorageError } from "../../utils/errors";
1
+ import { SecurityUtils, StorageError } from "@vlian/utils";
3
2
  /**
4
3
  * 加密工具类
5
4
  */ export class EncryptionUtils {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/library/storage/encryption.ts"],"sourcesContent":["import { SecurityUtils } from '../../utils/security';\nimport { StorageError } from '../../utils/errors';\n\n/**\n * 加密配置\n */\nexport interface EncryptionConfig {\n /**\n * 是否启用加密\n */\n enabled: boolean;\n /**\n * 加密密钥(可选,如果不提供则使用默认密钥)\n */\n key?: string;\n}\n\n/**\n * 加密工具类\n */\nexport class EncryptionUtils {\n\n /**\n * 生成加密密钥\n */\n static async generateKey(): Promise<CryptoKey> {\n if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {\n throw new StorageError('加密功能需要浏览器支持 Web Crypto API');\n }\n\n try {\n return await window.crypto.subtle.generateKey(\n {\n name: 'AES-GCM',\n length: 256,\n },\n true,\n ['encrypt', 'decrypt']\n );\n } catch (error) {\n throw new StorageError('生成加密密钥失败', error instanceof Error ? error : undefined);\n }\n }\n\n /**\n * 使用 PBKDF2 派生密钥\n */\n static async deriveKey(\n password: string,\n salt: Uint8Array,\n iterations: number = 100000\n ): Promise<CryptoKey> {\n if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {\n throw new StorageError('加密功能需要浏览器支持 Web Crypto API');\n }\n\n try {\n // 导入密码\n const encoder = new TextEncoder();\n const passwordKey = await window.crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits', 'deriveKey']\n );\n\n // 使用 PBKDF2 派生密钥\n // 确保 salt 是 BufferSource 类型(使用类型断言)\n const saltBuffer: BufferSource = (salt instanceof Uint8Array \n ? salt \n : new Uint8Array(salt)) as BufferSource;\n return await window.crypto.subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt: saltBuffer,\n iterations: iterations,\n hash: 'SHA-256',\n },\n passwordKey,\n {\n name: 'AES-GCM',\n length: 256,\n },\n false,\n ['encrypt', 'decrypt']\n );\n } catch (error) {\n throw new StorageError('密钥派生失败', error instanceof Error ? error : undefined);\n }\n }\n\n /**\n * 从字符串导入密钥(使用 PBKDF2 派生)\n * \n * 注意:如果没有提供 salt,每次调用都会生成新的 salt,导致密钥不一致。\n * 建议在生产环境中使用固定的 salt 或从安全存储中获取。\n */\n static async importKey(keyString: string, salt?: Uint8Array): Promise<CryptoKey> {\n if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {\n throw new StorageError('加密功能需要浏览器支持 Web Crypto API');\n }\n\n try {\n // 如果没有提供 salt,尝试从 sessionStorage 获取或生成一个固定的\n let keySalt = salt;\n \n if (!keySalt) {\n // 尝试从 sessionStorage 获取固定的 salt(用于当前会话)\n const saltKey = '__encryption_salt__';\n const storedSalt = sessionStorage.getItem(saltKey);\n \n if (storedSalt) {\n // 从存储中恢复 salt\n const saltArray = Uint8Array.from(JSON.parse(storedSalt));\n keySalt = saltArray;\n } else {\n // 生成新的 salt 并存储(用于当前会话)\n keySalt = window.crypto.getRandomValues(new Uint8Array(16));\n sessionStorage.setItem(saltKey, JSON.stringify(Array.from(keySalt)));\n }\n }\n \n // 使用 PBKDF2 派生密钥\n return await this.deriveKey(keyString, keySalt);\n } catch (error) {\n throw new StorageError('导入加密密钥失败', error instanceof Error ? error : undefined);\n }\n }\n\n /**\n * 加密数据\n */\n static async encrypt(data: string, key: CryptoKey): Promise<string> {\n if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {\n throw new StorageError('加密功能需要浏览器支持 Web Crypto API');\n }\n\n try {\n const encoder = new TextEncoder();\n const dataBuffer = encoder.encode(data);\n\n // 生成随机 IV\n const iv = window.crypto.getRandomValues(new Uint8Array(12));\n\n const encrypted = await window.crypto.subtle.encrypt(\n {\n name: 'AES-GCM',\n iv: iv,\n },\n key,\n dataBuffer\n );\n\n // 将 IV 和加密数据组合\n const combined = new Uint8Array(iv.length + encrypted.byteLength);\n combined.set(iv);\n combined.set(new Uint8Array(encrypted), iv.length);\n\n // 转换为 Base64\n return btoa(String.fromCharCode(...combined));\n } catch (error) {\n throw new StorageError('加密数据失败', error instanceof Error ? error : undefined);\n }\n }\n\n /**\n * 解密数据\n */\n static async decrypt(encryptedData: string, key: CryptoKey): Promise<string> {\n if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {\n throw new StorageError('解密功能需要浏览器支持 Web Crypto API');\n }\n\n try {\n // 从 Base64 解码\n const combined = Uint8Array.from(atob(encryptedData), (c) => c.charCodeAt(0));\n\n // 提取 IV 和加密数据\n const iv = combined.slice(0, 12);\n const encrypted = combined.slice(12);\n\n const decrypted = await window.crypto.subtle.decrypt(\n {\n name: 'AES-GCM',\n iv: iv,\n },\n key,\n encrypted\n );\n\n const decoder = new TextDecoder();\n return decoder.decode(decrypted);\n } catch (error) {\n throw new StorageError('解密数据失败', error instanceof Error ? error : undefined);\n }\n }\n\n /**\n * 检查字段是否需要加密\n */\n static shouldEncrypt(key: string): boolean {\n return SecurityUtils.isSensitiveField(key);\n }\n}\n"],"names":["SecurityUtils","StorageError","EncryptionUtils","generateKey","window","crypto","subtle","name","length","error","Error","undefined","deriveKey","password","salt","iterations","encoder","TextEncoder","passwordKey","importKey","encode","saltBuffer","Uint8Array","hash","keyString","keySalt","saltKey","storedSalt","sessionStorage","getItem","saltArray","from","JSON","parse","getRandomValues","setItem","stringify","Array","encrypt","data","key","dataBuffer","iv","encrypted","combined","byteLength","set","btoa","String","fromCharCode","decrypt","encryptedData","atob","c","charCodeAt","slice","decrypted","decoder","TextDecoder","decode","shouldEncrypt","isSensitiveField"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/library/storage/encryption.ts"],"sourcesContent":["import { SecurityUtils, StorageError } from '@vlian/utils';\n\n/**\n * 加密配置\n */\nexport interface EncryptionConfig {\n /**\n * 是否启用加密\n */\n enabled: boolean;\n /**\n * 加密密钥(可选,如果不提供则使用默认密钥)\n */\n key?: string;\n}\n\n/**\n * 加密工具类\n */\nexport class EncryptionUtils {\n\n /**\n * 生成加密密钥\n */\n static async generateKey(): Promise<CryptoKey> {\n if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {\n throw new StorageError('加密功能需要浏览器支持 Web Crypto API');\n }\n\n try {\n return await window.crypto.subtle.generateKey(\n {\n name: 'AES-GCM',\n length: 256,\n },\n true,\n ['encrypt', 'decrypt']\n );\n } catch (error) {\n throw new StorageError('生成加密密钥失败', error instanceof Error ? error : undefined);\n }\n }\n\n /**\n * 使用 PBKDF2 派生密钥\n */\n static async deriveKey(\n password: string,\n salt: Uint8Array,\n iterations: number = 100000\n ): Promise<CryptoKey> {\n if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {\n throw new StorageError('加密功能需要浏览器支持 Web Crypto API');\n }\n\n try {\n // 导入密码\n const encoder = new TextEncoder();\n const passwordKey = await window.crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits', 'deriveKey']\n );\n\n // 使用 PBKDF2 派生密钥\n // 确保 salt 是 BufferSource 类型(使用类型断言)\n const saltBuffer: BufferSource = (salt instanceof Uint8Array \n ? salt \n : new Uint8Array(salt)) as BufferSource;\n return await window.crypto.subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt: saltBuffer,\n iterations: iterations,\n hash: 'SHA-256',\n },\n passwordKey,\n {\n name: 'AES-GCM',\n length: 256,\n },\n false,\n ['encrypt', 'decrypt']\n );\n } catch (error) {\n throw new StorageError('密钥派生失败', error instanceof Error ? error : undefined);\n }\n }\n\n /**\n * 从字符串导入密钥(使用 PBKDF2 派生)\n * \n * 注意:如果没有提供 salt,每次调用都会生成新的 salt,导致密钥不一致。\n * 建议在生产环境中使用固定的 salt 或从安全存储中获取。\n */\n static async importKey(keyString: string, salt?: Uint8Array): Promise<CryptoKey> {\n if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {\n throw new StorageError('加密功能需要浏览器支持 Web Crypto API');\n }\n\n try {\n // 如果没有提供 salt,尝试从 sessionStorage 获取或生成一个固定的\n let keySalt = salt;\n \n if (!keySalt) {\n // 尝试从 sessionStorage 获取固定的 salt(用于当前会话)\n const saltKey = '__encryption_salt__';\n const storedSalt = sessionStorage.getItem(saltKey);\n \n if (storedSalt) {\n // 从存储中恢复 salt\n const saltArray = Uint8Array.from(JSON.parse(storedSalt));\n keySalt = saltArray;\n } else {\n // 生成新的 salt 并存储(用于当前会话)\n keySalt = window.crypto.getRandomValues(new Uint8Array(16));\n sessionStorage.setItem(saltKey, JSON.stringify(Array.from(keySalt)));\n }\n }\n \n // 使用 PBKDF2 派生密钥\n return await this.deriveKey(keyString, keySalt);\n } catch (error) {\n throw new StorageError('导入加密密钥失败', error instanceof Error ? error : undefined);\n }\n }\n\n /**\n * 加密数据\n */\n static async encrypt(data: string, key: CryptoKey): Promise<string> {\n if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {\n throw new StorageError('加密功能需要浏览器支持 Web Crypto API');\n }\n\n try {\n const encoder = new TextEncoder();\n const dataBuffer = encoder.encode(data);\n\n // 生成随机 IV\n const iv = window.crypto.getRandomValues(new Uint8Array(12));\n\n const encrypted = await window.crypto.subtle.encrypt(\n {\n name: 'AES-GCM',\n iv: iv,\n },\n key,\n dataBuffer\n );\n\n // 将 IV 和加密数据组合\n const combined = new Uint8Array(iv.length + encrypted.byteLength);\n combined.set(iv);\n combined.set(new Uint8Array(encrypted), iv.length);\n\n // 转换为 Base64\n return btoa(String.fromCharCode(...combined));\n } catch (error) {\n throw new StorageError('加密数据失败', error instanceof Error ? error : undefined);\n }\n }\n\n /**\n * 解密数据\n */\n static async decrypt(encryptedData: string, key: CryptoKey): Promise<string> {\n if (typeof window === 'undefined' || !window.crypto || !window.crypto.subtle) {\n throw new StorageError('解密功能需要浏览器支持 Web Crypto API');\n }\n\n try {\n // 从 Base64 解码\n const combined = Uint8Array.from(atob(encryptedData), (c) => c.charCodeAt(0));\n\n // 提取 IV 和加密数据\n const iv = combined.slice(0, 12);\n const encrypted = combined.slice(12);\n\n const decrypted = await window.crypto.subtle.decrypt(\n {\n name: 'AES-GCM',\n iv: iv,\n },\n key,\n encrypted\n );\n\n const decoder = new TextDecoder();\n return decoder.decode(decrypted);\n } catch (error) {\n throw new StorageError('解密数据失败', error instanceof Error ? error : undefined);\n }\n }\n\n /**\n * 检查字段是否需要加密\n */\n static shouldEncrypt(key: string): boolean {\n return SecurityUtils.isSensitiveField(key);\n }\n}\n"],"names":["SecurityUtils","StorageError","EncryptionUtils","generateKey","window","crypto","subtle","name","length","error","Error","undefined","deriveKey","password","salt","iterations","encoder","TextEncoder","passwordKey","importKey","encode","saltBuffer","Uint8Array","hash","keyString","keySalt","saltKey","storedSalt","sessionStorage","getItem","saltArray","from","JSON","parse","getRandomValues","setItem","stringify","Array","encrypt","data","key","dataBuffer","iv","encrypted","combined","byteLength","set","btoa","String","fromCharCode","decrypt","encryptedData","atob","c","charCodeAt","slice","decrypted","decoder","TextDecoder","decode","shouldEncrypt","isSensitiveField"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from '@vlian/request/adapter';
@@ -0,0 +1 @@
1
+ export * from '@vlian/request/core';
@@ -1,42 +1 @@
1
- /**
2
- * 请求库主入口
3
- *
4
- * 提供企业级、可扩展、类型安全的 HTTP 请求能力
5
- */
6
- export type { RequestOptions, Response, RequestContext, RequestHeaders, RequestQuery, RequestBody, HttpMethod, RetryConfig, CacheConfig, ValidationConfig, AdapterCapabilities, } from './types';
7
- export { RequestError, RequestErrorType, RequestErrorCode, } from './types';
8
- export { RequestClient } from './core/RequestClient';
9
- export type { RequestClientConfig } from './types';
10
- export type { RequestAdapter, AdapterFactory } from './adapter/RequestAdapter';
11
- export { adapterRegistry } from './adapter/RequestAdapter';
12
- export { fetchAdapter, kyAdapter, axiosAdapter } from './adapter';
13
- export declare function undiciAdapter(): Promise<import("./adapter").RequestAdapter>;
14
- export type { RequestPlugin } from './plugin/RequestPlugin';
15
- export { PluginManager, PluginLifecycleStage, PluginPriority } from './plugin/RequestPlugin';
16
- export { createCachePlugin, createRetryPlugin, createValidationPlugin, createMonitoringPlugin, createQueuePlugin, } from './plugin';
17
- export type { CachePluginConfig, RetryPluginConfig, ValidationPluginConfig, MonitoringPluginConfig, MonitoringEvent, MonitoringReporter, QueuePluginConfig, QueueTriggerCondition, } from './plugin';
18
- export { MonitoringEventType } from './plugin';
19
- export { createRequestContext, updateRequestContext, completeRequestContext, failRequestContext, cancelRequestContext, } from './runtime/RequestContext';
20
- /**
21
- * 创建请求客户端实例
22
- *
23
- * @param config - 请求客户端配置
24
- * @returns 请求客户端实例
25
- *
26
- * @example
27
- * ```typescript
28
- * import { createRequestClient } from '@vlian/framework/request';
29
- *
30
- * const client = createRequestClient({
31
- * baseURL: 'https://api.example.com',
32
- * defaultTimeout: 5000,
33
- * plugins: [
34
- * createCachePlugin(),
35
- * createRetryPlugin(),
36
- * ],
37
- * });
38
- *
39
- * const response = await client.get<User>('/user/1');
40
- * ```
41
- */
42
- export declare function createRequestClient(config?: import('./types').RequestClientConfig): Promise<import(".").RequestClient>;
1
+ export * from '@vlian/request';
@@ -8,8 +8,8 @@ import type { RequestPlugin } from './RequestPlugin';
8
8
  *
9
9
  * @example
10
10
  * ```typescript
11
- * import { createRequestClient } from '@vlian/framework/request';
12
- * import { createCSRFPlugin } from '@vlian/framework/request/plugin';
11
+ * import { createRequestClient } from '@vlian/request';
12
+ * import { createCSRFPlugin } from '@vlian/request/plugin';
13
13
  *
14
14
  * const client = await createRequestClient({
15
15
  * plugins: [
@@ -69,8 +69,8 @@ export interface QueuePluginConfig {
69
69
  *
70
70
  * @example
71
71
  * ```typescript
72
- * import { createRequestClient } from '@vlian/framework/request';
73
- * import { createQueuePlugin } from '@vlian/framework/request/plugin';
72
+ * import { createRequestClient } from '@vlian/request';
73
+ * import { createQueuePlugin } from '@vlian/request/plugin';
74
74
  *
75
75
  * const client = await createRequestClient({
76
76
  * plugins: [
@@ -0,0 +1 @@
1
+ export * from '@vlian/request/plugin';
@@ -0,0 +1 @@
1
+ export * from '@vlian/request/runtime';