xray-manager 1.8.4 → 2.0.0

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 (324) hide show
  1. package/README.md +102 -42
  2. package/dist/cli.mjs +8587 -0
  3. package/dist/cli.mjs.map +7 -0
  4. package/package.json +13 -5
  5. package/dist/cli.d.ts +0 -11
  6. package/dist/cli.d.ts.map +0 -1
  7. package/dist/cli.js +0 -134
  8. package/dist/cli.js.map +0 -1
  9. package/dist/commands/clash.d.ts +0 -20
  10. package/dist/commands/clash.d.ts.map +0 -1
  11. package/dist/commands/clash.js +0 -156
  12. package/dist/commands/clash.js.map +0 -1
  13. package/dist/commands/config.d.ts +0 -56
  14. package/dist/commands/config.d.ts.map +0 -1
  15. package/dist/commands/config.js +0 -461
  16. package/dist/commands/config.js.map +0 -1
  17. package/dist/commands/interactive.d.ts +0 -55
  18. package/dist/commands/interactive.d.ts.map +0 -1
  19. package/dist/commands/interactive.js +0 -418
  20. package/dist/commands/interactive.js.map +0 -1
  21. package/dist/commands/logs.d.ts +0 -62
  22. package/dist/commands/logs.d.ts.map +0 -1
  23. package/dist/commands/logs.js +0 -389
  24. package/dist/commands/logs.js.map +0 -1
  25. package/dist/commands/quota.d.ts +0 -54
  26. package/dist/commands/quota.d.ts.map +0 -1
  27. package/dist/commands/quota.js +0 -661
  28. package/dist/commands/quota.js.map +0 -1
  29. package/dist/commands/review.d.ts +0 -8
  30. package/dist/commands/review.d.ts.map +0 -1
  31. package/dist/commands/review.js +0 -79
  32. package/dist/commands/review.js.map +0 -1
  33. package/dist/commands/service.d.ts +0 -43
  34. package/dist/commands/service.d.ts.map +0 -1
  35. package/dist/commands/service.js +0 -202
  36. package/dist/commands/service.js.map +0 -1
  37. package/dist/commands/user.d.ts +0 -49
  38. package/dist/commands/user.d.ts.map +0 -1
  39. package/dist/commands/user.js +0 -371
  40. package/dist/commands/user.js.map +0 -1
  41. package/dist/components/dashboard-widget.d.ts +0 -21
  42. package/dist/components/dashboard-widget.d.ts.map +0 -1
  43. package/dist/components/dashboard-widget.js +0 -234
  44. package/dist/components/dashboard-widget.js.map +0 -1
  45. package/dist/components/progress-bar.d.ts +0 -67
  46. package/dist/components/progress-bar.d.ts.map +0 -1
  47. package/dist/components/progress-bar.js +0 -138
  48. package/dist/components/progress-bar.js.map +0 -1
  49. package/dist/components/user-table.d.ts +0 -8
  50. package/dist/components/user-table.d.ts.map +0 -1
  51. package/dist/components/user-table.js +0 -91
  52. package/dist/components/user-table.js.map +0 -1
  53. package/dist/config/i18n.d.ts +0 -136
  54. package/dist/config/i18n.d.ts.map +0 -1
  55. package/dist/config/i18n.js +0 -323
  56. package/dist/config/i18n.js.map +0 -1
  57. package/dist/constants/error-codes.d.ts +0 -344
  58. package/dist/constants/error-codes.d.ts.map +0 -1
  59. package/dist/constants/error-codes.js +0 -462
  60. package/dist/constants/error-codes.js.map +0 -1
  61. package/dist/constants/exit-codes.d.ts +0 -49
  62. package/dist/constants/exit-codes.d.ts.map +0 -1
  63. package/dist/constants/exit-codes.js +0 -100
  64. package/dist/constants/exit-codes.js.map +0 -1
  65. package/dist/constants/paths.d.ts +0 -63
  66. package/dist/constants/paths.d.ts.map +0 -1
  67. package/dist/constants/paths.js +0 -78
  68. package/dist/constants/paths.js.map +0 -1
  69. package/dist/constants/quota.d.ts +0 -126
  70. package/dist/constants/quota.d.ts.map +0 -1
  71. package/dist/constants/quota.js +0 -135
  72. package/dist/constants/quota.js.map +0 -1
  73. package/dist/constants/review.d.ts +0 -14
  74. package/dist/constants/review.d.ts.map +0 -1
  75. package/dist/constants/review.js +0 -33
  76. package/dist/constants/review.js.map +0 -1
  77. package/dist/constants/supported-distros.d.ts +0 -17
  78. package/dist/constants/supported-distros.d.ts.map +0 -1
  79. package/dist/constants/supported-distros.js +0 -68
  80. package/dist/constants/supported-distros.js.map +0 -1
  81. package/dist/constants/theme.d.ts +0 -34
  82. package/dist/constants/theme.d.ts.map +0 -1
  83. package/dist/constants/theme.js +0 -52
  84. package/dist/constants/theme.js.map +0 -1
  85. package/dist/constants/timeouts.d.ts +0 -84
  86. package/dist/constants/timeouts.d.ts.map +0 -1
  87. package/dist/constants/timeouts.js +0 -111
  88. package/dist/constants/timeouts.js.map +0 -1
  89. package/dist/constants/ui-symbols.d.ts +0 -47
  90. package/dist/constants/ui-symbols.d.ts.map +0 -1
  91. package/dist/constants/ui-symbols.js +0 -48
  92. package/dist/constants/ui-symbols.js.map +0 -1
  93. package/dist/services/clash-config.d.ts +0 -16
  94. package/dist/services/clash-config.d.ts.map +0 -1
  95. package/dist/services/clash-config.js +0 -107
  96. package/dist/services/clash-config.js.map +0 -1
  97. package/dist/services/config-manager.d.ts +0 -90
  98. package/dist/services/config-manager.d.ts.map +0 -1
  99. package/dist/services/config-manager.js +0 -307
  100. package/dist/services/config-manager.js.map +0 -1
  101. package/dist/services/layout-manager.d.ts +0 -94
  102. package/dist/services/layout-manager.d.ts.map +0 -1
  103. package/dist/services/layout-manager.js +0 -192
  104. package/dist/services/layout-manager.js.map +0 -1
  105. package/dist/services/log-manager.d.ts +0 -157
  106. package/dist/services/log-manager.d.ts.map +0 -1
  107. package/dist/services/log-manager.js +0 -397
  108. package/dist/services/log-manager.js.map +0 -1
  109. package/dist/services/navigation-manager.d.ts +0 -23
  110. package/dist/services/navigation-manager.d.ts.map +0 -1
  111. package/dist/services/navigation-manager.js +0 -39
  112. package/dist/services/navigation-manager.js.map +0 -1
  113. package/dist/services/platform-detector.d.ts +0 -10
  114. package/dist/services/platform-detector.d.ts.map +0 -1
  115. package/dist/services/platform-detector.js +0 -106
  116. package/dist/services/platform-detector.js.map +0 -1
  117. package/dist/services/public-ip-manager.d.ts +0 -78
  118. package/dist/services/public-ip-manager.d.ts.map +0 -1
  119. package/dist/services/public-ip-manager.js +0 -296
  120. package/dist/services/public-ip-manager.js.map +0 -1
  121. package/dist/services/quota-enforcer.d.ts +0 -86
  122. package/dist/services/quota-enforcer.d.ts.map +0 -1
  123. package/dist/services/quota-enforcer.js +0 -151
  124. package/dist/services/quota-enforcer.js.map +0 -1
  125. package/dist/services/quota-manager.d.ts +0 -101
  126. package/dist/services/quota-manager.d.ts.map +0 -1
  127. package/dist/services/quota-manager.js +0 -257
  128. package/dist/services/quota-manager.js.map +0 -1
  129. package/dist/services/review/areas/community.d.ts +0 -9
  130. package/dist/services/review/areas/community.d.ts.map +0 -1
  131. package/dist/services/review/areas/community.js +0 -59
  132. package/dist/services/review/areas/community.js.map +0 -1
  133. package/dist/services/review/areas/contribution.d.ts +0 -9
  134. package/dist/services/review/areas/contribution.d.ts.map +0 -1
  135. package/dist/services/review/areas/contribution.js +0 -107
  136. package/dist/services/review/areas/contribution.js.map +0 -1
  137. package/dist/services/review/areas/documentation.d.ts +0 -9
  138. package/dist/services/review/areas/documentation.d.ts.map +0 -1
  139. package/dist/services/review/areas/documentation.js +0 -110
  140. package/dist/services/review/areas/documentation.js.map +0 -1
  141. package/dist/services/review/areas/license.d.ts +0 -9
  142. package/dist/services/review/areas/license.d.ts.map +0 -1
  143. package/dist/services/review/areas/license.js +0 -86
  144. package/dist/services/review/areas/license.js.map +0 -1
  145. package/dist/services/review/areas/quality.d.ts +0 -9
  146. package/dist/services/review/areas/quality.d.ts.map +0 -1
  147. package/dist/services/review/areas/quality.js +0 -84
  148. package/dist/services/review/areas/quality.js.map +0 -1
  149. package/dist/services/review/areas/security.d.ts +0 -9
  150. package/dist/services/review/areas/security.d.ts.map +0 -1
  151. package/dist/services/review/areas/security.js +0 -64
  152. package/dist/services/review/areas/security.js.map +0 -1
  153. package/dist/services/review/evidence.d.ts +0 -10
  154. package/dist/services/review/evidence.d.ts.map +0 -1
  155. package/dist/services/review/evidence.js +0 -40
  156. package/dist/services/review/evidence.js.map +0 -1
  157. package/dist/services/review/recommendations-filter.d.ts +0 -12
  158. package/dist/services/review/recommendations-filter.d.ts.map +0 -1
  159. package/dist/services/review/recommendations-filter.js +0 -20
  160. package/dist/services/review/recommendations-filter.js.map +0 -1
  161. package/dist/services/review/repo-scanner.d.ts +0 -8
  162. package/dist/services/review/repo-scanner.d.ts.map +0 -1
  163. package/dist/services/review/repo-scanner.js +0 -15
  164. package/dist/services/review/repo-scanner.js.map +0 -1
  165. package/dist/services/review/report-renderer.d.ts +0 -15
  166. package/dist/services/review/report-renderer.d.ts.map +0 -1
  167. package/dist/services/review/report-renderer.js +0 -120
  168. package/dist/services/review/report-renderer.js.map +0 -1
  169. package/dist/services/review/review-engine.d.ts +0 -15
  170. package/dist/services/review/review-engine.d.ts.map +0 -1
  171. package/dist/services/review/review-engine.js +0 -61
  172. package/dist/services/review/review-engine.js.map +0 -1
  173. package/dist/services/review/summary-builder.d.ts +0 -8
  174. package/dist/services/review/summary-builder.d.ts.map +0 -1
  175. package/dist/services/review/summary-builder.js +0 -26
  176. package/dist/services/review/summary-builder.js.map +0 -1
  177. package/dist/services/screen-manager.d.ts +0 -13
  178. package/dist/services/screen-manager.d.ts.map +0 -1
  179. package/dist/services/screen-manager.js +0 -42
  180. package/dist/services/screen-manager.js.map +0 -1
  181. package/dist/services/stats-config-manager.d.ts +0 -110
  182. package/dist/services/stats-config-manager.d.ts.map +0 -1
  183. package/dist/services/stats-config-manager.js +0 -443
  184. package/dist/services/stats-config-manager.js.map +0 -1
  185. package/dist/services/systemd-manager.d.ts +0 -197
  186. package/dist/services/systemd-manager.d.ts.map +0 -1
  187. package/dist/services/systemd-manager.js +0 -458
  188. package/dist/services/systemd-manager.js.map +0 -1
  189. package/dist/services/traffic-manager.d.ts +0 -106
  190. package/dist/services/traffic-manager.d.ts.map +0 -1
  191. package/dist/services/traffic-manager.js +0 -368
  192. package/dist/services/traffic-manager.js.map +0 -1
  193. package/dist/services/user-manager.d.ts +0 -90
  194. package/dist/services/user-manager.d.ts.map +0 -1
  195. package/dist/services/user-manager.js +0 -347
  196. package/dist/services/user-manager.js.map +0 -1
  197. package/dist/services/user-metadata-manager.d.ts +0 -85
  198. package/dist/services/user-metadata-manager.d.ts.map +0 -1
  199. package/dist/services/user-metadata-manager.js +0 -181
  200. package/dist/services/user-metadata-manager.js.map +0 -1
  201. package/dist/types/config.d.ts +0 -340
  202. package/dist/types/config.d.ts.map +0 -1
  203. package/dist/types/config.js +0 -7
  204. package/dist/types/config.js.map +0 -1
  205. package/dist/types/layout.d.ts +0 -119
  206. package/dist/types/layout.d.ts.map +0 -1
  207. package/dist/types/layout.js +0 -142
  208. package/dist/types/layout.js.map +0 -1
  209. package/dist/types/platform.d.ts +0 -72
  210. package/dist/types/platform.d.ts.map +0 -1
  211. package/dist/types/platform.js +0 -38
  212. package/dist/types/platform.js.map +0 -1
  213. package/dist/types/quota.d.ts +0 -158
  214. package/dist/types/quota.d.ts.map +0 -1
  215. package/dist/types/quota.js +0 -26
  216. package/dist/types/quota.js.map +0 -1
  217. package/dist/types/review.d.ts +0 -62
  218. package/dist/types/review.d.ts.map +0 -1
  219. package/dist/types/review.js +0 -8
  220. package/dist/types/review.js.map +0 -1
  221. package/dist/types/server-config.d.ts +0 -53
  222. package/dist/types/server-config.d.ts.map +0 -1
  223. package/dist/types/server-config.js +0 -19
  224. package/dist/types/server-config.js.map +0 -1
  225. package/dist/types/service.d.ts +0 -96
  226. package/dist/types/service.d.ts.map +0 -1
  227. package/dist/types/service.js +0 -7
  228. package/dist/types/service.js.map +0 -1
  229. package/dist/types/terminal.d.ts +0 -35
  230. package/dist/types/terminal.d.ts.map +0 -1
  231. package/dist/types/terminal.js +0 -20
  232. package/dist/types/terminal.js.map +0 -1
  233. package/dist/types/ui-components.d.ts +0 -53
  234. package/dist/types/ui-components.d.ts.map +0 -1
  235. package/dist/types/ui-components.js +0 -3
  236. package/dist/types/ui-components.js.map +0 -1
  237. package/dist/types/user-metadata.d.ts +0 -43
  238. package/dist/types/user-metadata.d.ts.map +0 -1
  239. package/dist/types/user-metadata.js +0 -17
  240. package/dist/types/user-metadata.js.map +0 -1
  241. package/dist/types/user.d.ts +0 -134
  242. package/dist/types/user.d.ts.map +0 -1
  243. package/dist/types/user.js +0 -7
  244. package/dist/types/user.js.map +0 -1
  245. package/dist/utils/clipboard.d.ts +0 -21
  246. package/dist/utils/clipboard.d.ts.map +0 -1
  247. package/dist/utils/clipboard.js +0 -45
  248. package/dist/utils/clipboard.js.map +0 -1
  249. package/dist/utils/error-formatter.d.ts +0 -60
  250. package/dist/utils/error-formatter.d.ts.map +0 -1
  251. package/dist/utils/error-formatter.js +0 -244
  252. package/dist/utils/error-formatter.js.map +0 -1
  253. package/dist/utils/errors.d.ts +0 -92
  254. package/dist/utils/errors.d.ts.map +0 -1
  255. package/dist/utils/errors.js +0 -143
  256. package/dist/utils/errors.js.map +0 -1
  257. package/dist/utils/firewall.d.ts +0 -14
  258. package/dist/utils/firewall.d.ts.map +0 -1
  259. package/dist/utils/firewall.js +0 -78
  260. package/dist/utils/firewall.js.map +0 -1
  261. package/dist/utils/format.d.ts +0 -93
  262. package/dist/utils/format.d.ts.map +0 -1
  263. package/dist/utils/format.js +0 -240
  264. package/dist/utils/format.js.map +0 -1
  265. package/dist/utils/icons.d.ts +0 -53
  266. package/dist/utils/icons.d.ts.map +0 -1
  267. package/dist/utils/icons.js +0 -143
  268. package/dist/utils/icons.js.map +0 -1
  269. package/dist/utils/layout.d.ts +0 -142
  270. package/dist/utils/layout.d.ts.map +0 -1
  271. package/dist/utils/layout.js +0 -381
  272. package/dist/utils/layout.js.map +0 -1
  273. package/dist/utils/logger.d.ts +0 -160
  274. package/dist/utils/logger.d.ts.map +0 -1
  275. package/dist/utils/logger.js +0 -351
  276. package/dist/utils/logger.js.map +0 -1
  277. package/dist/utils/network.d.ts +0 -39
  278. package/dist/utils/network.d.ts.map +0 -1
  279. package/dist/utils/network.js +0 -227
  280. package/dist/utils/network.js.map +0 -1
  281. package/dist/utils/os-detection.d.ts +0 -10
  282. package/dist/utils/os-detection.d.ts.map +0 -1
  283. package/dist/utils/os-detection.js +0 -86
  284. package/dist/utils/os-detection.js.map +0 -1
  285. package/dist/utils/preflight.d.ts +0 -57
  286. package/dist/utils/preflight.d.ts.map +0 -1
  287. package/dist/utils/preflight.js +0 -215
  288. package/dist/utils/preflight.js.map +0 -1
  289. package/dist/utils/repo-scan.d.ts +0 -54
  290. package/dist/utils/repo-scan.d.ts.map +0 -1
  291. package/dist/utils/repo-scan.js +0 -165
  292. package/dist/utils/repo-scan.js.map +0 -1
  293. package/dist/utils/report-output.d.ts +0 -13
  294. package/dist/utils/report-output.d.ts.map +0 -1
  295. package/dist/utils/report-output.js +0 -33
  296. package/dist/utils/report-output.js.map +0 -1
  297. package/dist/utils/review-id.d.ts +0 -8
  298. package/dist/utils/review-id.d.ts.map +0 -1
  299. package/dist/utils/review-id.js +0 -17
  300. package/dist/utils/review-id.js.map +0 -1
  301. package/dist/utils/splash.d.ts +0 -21
  302. package/dist/utils/splash.d.ts.map +0 -1
  303. package/dist/utils/splash.js +0 -179
  304. package/dist/utils/splash.js.map +0 -1
  305. package/dist/utils/terminal.d.ts +0 -32
  306. package/dist/utils/terminal.d.ts.map +0 -1
  307. package/dist/utils/terminal.js +0 -93
  308. package/dist/utils/terminal.js.map +0 -1
  309. package/dist/utils/traffic-formatter.d.ts +0 -45
  310. package/dist/utils/traffic-formatter.d.ts.map +0 -1
  311. package/dist/utils/traffic-formatter.js +0 -131
  312. package/dist/utils/traffic-formatter.js.map +0 -1
  313. package/dist/utils/validator.d.ts +0 -102
  314. package/dist/utils/validator.d.ts.map +0 -1
  315. package/dist/utils/validator.js +0 -238
  316. package/dist/utils/validator.js.map +0 -1
  317. package/dist/utils/vless-link.d.ts +0 -27
  318. package/dist/utils/vless-link.d.ts.map +0 -1
  319. package/dist/utils/vless-link.js +0 -69
  320. package/dist/utils/vless-link.js.map +0 -1
  321. package/dist/utils/which.d.ts +0 -13
  322. package/dist/utils/which.d.ts.map +0 -1
  323. package/dist/utils/which.js +0 -28
  324. package/dist/utils/which.js.map +0 -1
@@ -1,151 +0,0 @@
1
- "use strict";
2
- /**
3
- * Quota Enforcer Service
4
- *
5
- * Monitors user traffic and enforces quota limits by disabling users
6
- * who exceed their allocated quota.
7
- *
8
- * @module services/quota-enforcer
9
- */
10
- Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.QuotaEnforcer = void 0;
12
- const quota_manager_1 = require("./quota-manager");
13
- const traffic_manager_1 = require("./traffic-manager");
14
- const traffic_formatter_1 = require("../utils/traffic-formatter");
15
- /**
16
- * QuotaEnforcer class
17
- *
18
- * Checks all users against their quotas and disables those who exceed limits.
19
- */
20
- class QuotaEnforcer {
21
- constructor(_configPath, _serviceName) {
22
- this.quotaManager = new quota_manager_1.QuotaManager();
23
- this.trafficManager = new traffic_manager_1.TrafficManager();
24
- }
25
- /**
26
- * Check and enforce quotas for all users
27
- *
28
- * @param autoDisable - Whether to automatically disable users who exceed quota
29
- * @returns Enforcement summary
30
- */
31
- async enforceQuotas(autoDisable = true) {
32
- const results = [];
33
- let normalCount = 0;
34
- let warningCount = 0;
35
- let exceededCount = 0;
36
- let newlyDisabledCount = 0;
37
- // Get all data
38
- const [quotas, usages] = await Promise.all([
39
- this.quotaManager.getAllQuotas(),
40
- this.trafficManager.getAllUsage(),
41
- ]);
42
- // Check each user with a quota
43
- for (const [email, quota] of Object.entries(quotas)) {
44
- // Skip unlimited quotas
45
- if (quota.quotaBytes < 0) {
46
- continue;
47
- }
48
- // Get current usage
49
- const usage = usages.find((u) => u.email === email);
50
- const usedBytes = usage?.total || quota.usedBytes || 0;
51
- // Calculate percentage and alert level
52
- const usagePercent = (0, traffic_formatter_1.calculateUsagePercent)(usedBytes, quota.quotaBytes);
53
- const alertLevel = (0, traffic_formatter_1.getAlertLevel)(usagePercent);
54
- const result = {
55
- email,
56
- usedBytes,
57
- quotaBytes: quota.quotaBytes,
58
- usagePercent,
59
- alertLevel,
60
- wasDisabled: false,
61
- previousStatus: quota.status,
62
- };
63
- // Count by alert level
64
- switch (alertLevel) {
65
- case 'normal':
66
- normalCount++;
67
- break;
68
- case 'warning':
69
- warningCount++;
70
- break;
71
- case 'exceeded':
72
- exceededCount++;
73
- // Auto-disable if enabled and user is not already disabled
74
- if (autoDisable && quota.status === 'active') {
75
- await this.quotaManager.setStatus(email, 'exceeded');
76
- result.wasDisabled = true;
77
- newlyDisabledCount++;
78
- }
79
- break;
80
- }
81
- results.push(result);
82
- }
83
- return {
84
- totalChecked: results.length,
85
- normalCount,
86
- warningCount,
87
- exceededCount,
88
- newlyDisabledCount,
89
- results,
90
- timestamp: new Date().toISOString(),
91
- };
92
- }
93
- /**
94
- * Check quota for a single user
95
- *
96
- * @param email - User email
97
- * @param autoDisable - Whether to automatically disable if exceeded
98
- * @returns Enforcement result or null if user has no quota
99
- */
100
- async checkUser(email, autoDisable = true) {
101
- const quota = await this.quotaManager.getQuota(email);
102
- // No quota or unlimited
103
- if (quota.quotaBytes < 0) {
104
- return null;
105
- }
106
- // Get current usage
107
- const usage = await this.trafficManager.getUsage(email);
108
- const usedBytes = usage?.total || quota.usedBytes || 0;
109
- // Calculate percentage and alert level
110
- const usagePercent = (0, traffic_formatter_1.calculateUsagePercent)(usedBytes, quota.quotaBytes);
111
- const alertLevel = (0, traffic_formatter_1.getAlertLevel)(usagePercent);
112
- const result = {
113
- email,
114
- usedBytes,
115
- quotaBytes: quota.quotaBytes,
116
- usagePercent,
117
- alertLevel,
118
- wasDisabled: false,
119
- previousStatus: quota.status,
120
- };
121
- // Auto-disable if exceeded and enabled
122
- if (autoDisable && alertLevel === 'exceeded' && quota.status === 'active') {
123
- await this.quotaManager.setStatus(email, 'exceeded');
124
- result.wasDisabled = true;
125
- }
126
- return result;
127
- }
128
- /**
129
- * Get users who need attention (warning or exceeded)
130
- *
131
- * @returns Array of users needing attention
132
- */
133
- async getUsersNeedingAttention() {
134
- const summary = await this.enforceQuotas(false); // Don't auto-disable, just check
135
- return summary.results.filter((r) => r.alertLevel !== 'normal');
136
- }
137
- /**
138
- * Re-enable a disabled user
139
- *
140
- * @param email - User email
141
- * @param resetUsage - Whether to also reset usage counter
142
- */
143
- async reenableUser(email, resetUsage = false) {
144
- await this.quotaManager.setStatus(email, 'active');
145
- if (resetUsage) {
146
- await this.quotaManager.resetUsage(email);
147
- }
148
- }
149
- }
150
- exports.QuotaEnforcer = QuotaEnforcer;
151
- //# sourceMappingURL=quota-enforcer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"quota-enforcer.js","sourceRoot":"","sources":["../../src/services/quota-enforcer.ts"],"names":[],"mappings":"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"}
@@ -1,101 +0,0 @@
1
- /**
2
- * QuotaManager - 配额配置管理服务
3
- *
4
- * 管理用户流量配额的配置和持久化
5
- *
6
- * @module services/quota-manager
7
- */
8
- import type { TrafficQuota, QuotaConfig, SetQuotaParams, AlertLevel } from '../types/quota';
9
- /**
10
- * QuotaManager - 管理用户流量配额
11
- */
12
- export declare class QuotaManager {
13
- private configPath;
14
- /**
15
- * 创建 QuotaManager 实例
16
- *
17
- * @param configPath - 配额配置文件路径(默认 /usr/local/etc/xray/quota.json)
18
- */
19
- constructor(configPath?: string);
20
- /**
21
- * 读取配额配置文件
22
- *
23
- * @returns 配额配置
24
- */
25
- readConfig(): Promise<QuotaConfig>;
26
- /**
27
- * 写入配额配置文件
28
- *
29
- * @param config - 配额配置
30
- */
31
- writeConfig(config: QuotaConfig): Promise<void>;
32
- /**
33
- * 获取用户配额
34
- *
35
- * @param email - 用户邮箱
36
- * @returns 配额配置,不存在时返回默认值
37
- */
38
- getQuota(email: string): Promise<TrafficQuota>;
39
- /**
40
- * 设置用户配额
41
- *
42
- * @param params - 配额设置参数
43
- * @throws Error 如果参数无效
44
- */
45
- setQuota(params: SetQuotaParams): Promise<void>;
46
- /**
47
- * 重置用户已用流量
48
- *
49
- * @param email - 用户邮箱
50
- */
51
- resetUsage(email: string): Promise<void>;
52
- /**
53
- * 更新用户已用流量
54
- *
55
- * @param email - 用户邮箱
56
- * @param usedBytes - 已用字节数
57
- * @throws Error 如果参数无效
58
- */
59
- updateUsage(email: string, usedBytes: number): Promise<void>;
60
- /**
61
- * 获取所有用户配额
62
- *
63
- * @returns 用户配额映射
64
- */
65
- getAllQuotas(): Promise<Record<string, TrafficQuota>>;
66
- /**
67
- * 删除用户配额记录
68
- *
69
- * @param email - 用户邮箱
70
- */
71
- deleteQuota(email: string): Promise<void>;
72
- /**
73
- * 设置用户状态
74
- *
75
- * @param email - 用户邮箱
76
- * @param status - 新状态
77
- */
78
- setStatus(email: string, status: TrafficQuota['status']): Promise<void>;
79
- /**
80
- * 计算警告级别
81
- *
82
- * @param usedBytes - 已用字节数
83
- * @param quotaBytes - 配额字节数(-1 表示无限制)
84
- * @returns 警告级别
85
- */
86
- calculateAlertLevel(usedBytes: number, quotaBytes: number): AlertLevel;
87
- /**
88
- * 获取 API 端口
89
- *
90
- * @returns API 端口号
91
- */
92
- getApiPort(): Promise<number>;
93
- /**
94
- * 设置 API 端口
95
- *
96
- * @param port - API 端口号
97
- * @throws Error 如果端口号无效
98
- */
99
- setApiPort(port: number): Promise<void>;
100
- }
101
- //# sourceMappingURL=quota-manager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"quota-manager.d.ts","sourceRoot":"","sources":["../../src/services/quota-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AA6B5F;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;OAIG;gBACS,UAAU,GAAE,MAA0B;IAIlD;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IAyBxC;;;;OAIG;IACG,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBrD;;;;;OAKG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAKpD;;;;;OAKG;IACG,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BrD;;;;OAIG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9C;;;;;;OAMG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBlE;;;;OAIG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAK3D;;;;OAIG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/C;;;;;OAKG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAW7E;;;;;;OAMG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU;IAgBtE;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAKnC;;;;;OAKG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAS9C"}
@@ -1,257 +0,0 @@
1
- "use strict";
2
- /**
3
- * QuotaManager - 配额配置管理服务
4
- *
5
- * 管理用户流量配额的配置和持久化
6
- *
7
- * @module services/quota-manager
8
- */
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.QuotaManager = void 0;
11
- const promises_1 = require("fs/promises");
12
- const fs_1 = require("fs");
13
- const path_1 = require("path");
14
- const quota_1 = require("../types/quota");
15
- const quota_2 = require("../constants/quota");
16
- const errors_1 = require("../utils/errors");
17
- const error_codes_1 = require("../constants/error-codes");
18
- /**
19
- * 验证邮箱格式
20
- */
21
- function isValidEmail(email) {
22
- return email.length > 0 && email.includes('@') && email.length <= 254;
23
- }
24
- /**
25
- * 验证配额值
26
- * @param bytes - 配额字节数
27
- * @returns true 如果有效(-1 表示无限制,或者 >= 0)
28
- */
29
- function isValidQuotaBytes(bytes) {
30
- return bytes === -1 || (Number.isFinite(bytes) && bytes >= 0);
31
- }
32
- /**
33
- * 验证端口号
34
- */
35
- function isValidPort(port) {
36
- return Number.isInteger(port) && port >= 1 && port <= 65535;
37
- }
38
- /**
39
- * QuotaManager - 管理用户流量配额
40
- */
41
- class QuotaManager {
42
- /**
43
- * 创建 QuotaManager 实例
44
- *
45
- * @param configPath - 配额配置文件路径(默认 /usr/local/etc/xray/quota.json)
46
- */
47
- constructor(configPath = quota_2.QUOTA_CONFIG_PATH) {
48
- this.configPath = configPath;
49
- }
50
- /**
51
- * 读取配额配置文件
52
- *
53
- * @returns 配额配置
54
- */
55
- async readConfig() {
56
- try {
57
- if (!(0, fs_1.existsSync)(this.configPath)) {
58
- return { ...quota_1.DEFAULT_QUOTA_CONFIG };
59
- }
60
- const content = await (0, promises_1.readFile)(this.configPath, 'utf-8');
61
- const config = JSON.parse(content);
62
- // 确保配置结构完整
63
- return {
64
- ...quota_1.DEFAULT_QUOTA_CONFIG,
65
- ...config,
66
- users: config.users || {},
67
- };
68
- }
69
- catch (error) {
70
- if (error.code === 'EACCES') {
71
- throw new errors_1.QuotaError(error_codes_1.QuotaErrors.QUOTA_CONFIG_NOT_FOUND, this.configPath);
72
- }
73
- else if (error instanceof SyntaxError) {
74
- throw new errors_1.QuotaError(error_codes_1.QuotaErrors.QUOTA_CONFIG_NOT_FOUND, error.message);
75
- }
76
- throw error;
77
- }
78
- }
79
- /**
80
- * 写入配额配置文件
81
- *
82
- * @param config - 配额配置
83
- */
84
- async writeConfig(config) {
85
- try {
86
- // 确保目录存在
87
- const dir = (0, path_1.dirname)(this.configPath);
88
- if (!(0, fs_1.existsSync)(dir)) {
89
- await (0, promises_1.mkdir)(dir, { recursive: true });
90
- }
91
- // 写入配置
92
- const content = JSON.stringify(config, null, 2);
93
- await (0, promises_1.writeFile)(this.configPath, content, 'utf-8');
94
- // 设置安全权限
95
- await (0, promises_1.chmod)(this.configPath, 0o600);
96
- }
97
- catch (error) {
98
- if (error.code === 'EACCES') {
99
- throw new errors_1.QuotaError(error_codes_1.QuotaErrors.TRAFFIC_UPDATE_FAILED, this.configPath);
100
- }
101
- throw error;
102
- }
103
- }
104
- /**
105
- * 获取用户配额
106
- *
107
- * @param email - 用户邮箱
108
- * @returns 配额配置,不存在时返回默认值
109
- */
110
- async getQuota(email) {
111
- const config = await this.readConfig();
112
- return config.users[email] || { ...quota_1.DEFAULT_QUOTA };
113
- }
114
- /**
115
- * 设置用户配额
116
- *
117
- * @param params - 配额设置参数
118
- * @throws Error 如果参数无效
119
- */
120
- async setQuota(params) {
121
- // 验证邮箱
122
- if (!isValidEmail(params.email)) {
123
- throw new errors_1.ValidationError(error_codes_1.ValidationErrors.INVALID_FORMAT, params.email);
124
- }
125
- // 验证配额值
126
- if (!isValidQuotaBytes(params.quotaBytes)) {
127
- throw new errors_1.QuotaError(error_codes_1.QuotaErrors.INVALID_QUOTA_VALUE, String(params.quotaBytes));
128
- }
129
- const config = await this.readConfig();
130
- const existingQuota = config.users[params.email];
131
- const now = new Date().toISOString();
132
- config.users[params.email] = {
133
- quotaBytes: params.quotaBytes,
134
- quotaType: params.quotaType,
135
- usedBytes: existingQuota?.usedBytes || 0,
136
- lastReset: existingQuota?.lastReset || now,
137
- status: existingQuota?.status || 'active',
138
- };
139
- await this.writeConfig(config);
140
- }
141
- /**
142
- * 重置用户已用流量
143
- *
144
- * @param email - 用户邮箱
145
- */
146
- async resetUsage(email) {
147
- const config = await this.readConfig();
148
- if (!config.users[email]) {
149
- throw new errors_1.QuotaError(error_codes_1.QuotaErrors.USER_QUOTA_NOT_FOUND, email);
150
- }
151
- config.users[email].usedBytes = 0;
152
- config.users[email].lastReset = new Date().toISOString();
153
- config.users[email].status = 'active';
154
- await this.writeConfig(config);
155
- }
156
- /**
157
- * 更新用户已用流量
158
- *
159
- * @param email - 用户邮箱
160
- * @param usedBytes - 已用字节数
161
- * @throws Error 如果参数无效
162
- */
163
- async updateUsage(email, usedBytes) {
164
- // 验证已用字节数
165
- if (!Number.isFinite(usedBytes) || usedBytes < 0) {
166
- throw new errors_1.ValidationError(error_codes_1.ValidationErrors.VALUE_OUT_OF_RANGE, String(usedBytes));
167
- }
168
- const config = await this.readConfig();
169
- if (!config.users[email]) {
170
- // 如果用户没有配额记录,创建默认记录
171
- config.users[email] = { ...quota_1.DEFAULT_QUOTA };
172
- }
173
- config.users[email].usedBytes = usedBytes;
174
- await this.writeConfig(config);
175
- }
176
- /**
177
- * 获取所有用户配额
178
- *
179
- * @returns 用户配额映射
180
- */
181
- async getAllQuotas() {
182
- const config = await this.readConfig();
183
- return config.users;
184
- }
185
- /**
186
- * 删除用户配额记录
187
- *
188
- * @param email - 用户邮箱
189
- */
190
- async deleteQuota(email) {
191
- const config = await this.readConfig();
192
- if (!config.users[email]) {
193
- return; // 不存在则静默返回
194
- }
195
- delete config.users[email];
196
- await this.writeConfig(config);
197
- }
198
- /**
199
- * 设置用户状态
200
- *
201
- * @param email - 用户邮箱
202
- * @param status - 新状态
203
- */
204
- async setStatus(email, status) {
205
- const config = await this.readConfig();
206
- if (!config.users[email]) {
207
- throw new errors_1.QuotaError(error_codes_1.QuotaErrors.USER_QUOTA_NOT_FOUND, email);
208
- }
209
- config.users[email].status = status;
210
- await this.writeConfig(config);
211
- }
212
- /**
213
- * 计算警告级别
214
- *
215
- * @param usedBytes - 已用字节数
216
- * @param quotaBytes - 配额字节数(-1 表示无限制)
217
- * @returns 警告级别
218
- */
219
- calculateAlertLevel(usedBytes, quotaBytes) {
220
- if (quotaBytes < 0) {
221
- return 'normal'; // 无限制
222
- }
223
- const percent = (usedBytes / quotaBytes) * 100;
224
- if (percent >= quota_2.EXCEEDED_THRESHOLD) {
225
- return 'exceeded';
226
- }
227
- if (percent >= quota_2.WARNING_THRESHOLD) {
228
- return 'warning';
229
- }
230
- return 'normal';
231
- }
232
- /**
233
- * 获取 API 端口
234
- *
235
- * @returns API 端口号
236
- */
237
- async getApiPort() {
238
- const config = await this.readConfig();
239
- return config.apiPort;
240
- }
241
- /**
242
- * 设置 API 端口
243
- *
244
- * @param port - API 端口号
245
- * @throws Error 如果端口号无效
246
- */
247
- async setApiPort(port) {
248
- if (!isValidPort(port)) {
249
- throw new errors_1.NetworkError(error_codes_1.NetworkErrors.INVALID_PORT, String(port));
250
- }
251
- const config = await this.readConfig();
252
- config.apiPort = port;
253
- await this.writeConfig(config);
254
- }
255
- }
256
- exports.QuotaManager = QuotaManager;
257
- //# sourceMappingURL=quota-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"quota-manager.js","sourceRoot":"","sources":["../../src/services/quota-manager.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- /**
2
- * Community area evaluation
3
- *
4
- * @module services/review/areas/community
5
- */
6
- import { type AreaEvaluation } from '../review-engine';
7
- import type { RepoScanResult } from '../../../utils/repo-scan';
8
- export declare function evaluateCommunity(scan: RepoScanResult): AreaEvaluation;
9
- //# sourceMappingURL=community.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"community.d.ts","sourceRoot":"","sources":["../../../../src/services/review/areas/community.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,cAAc,CAkDtE"}
@@ -1,59 +0,0 @@
1
- "use strict";
2
- /**
3
- * Community area evaluation
4
- *
5
- * @module services/review/areas/community
6
- */
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.evaluateCommunity = evaluateCommunity;
9
- const evidence_1 = require("../evidence");
10
- function evaluateCommunity(scan) {
11
- const findings = [];
12
- const recommendations = [];
13
- if (!scan.signals.hasMaintainers) {
14
- recommendations.push({
15
- areaId: 'community',
16
- title: 'Document maintainers and support cadence',
17
- details: 'Provide a MAINTAINERS file or similar guidance on support expectations.',
18
- priority: 'medium',
19
- timeHorizon: 'long-term',
20
- riskIfIgnored: 'Users may not know where to seek support or how active maintenance is.',
21
- evidence: [(0, evidence_1.missingEvidence)('MAINTAINERS.md missing')],
22
- });
23
- }
24
- else if (scan.files.maintainers) {
25
- findings.push({
26
- areaId: 'community',
27
- title: 'Maintainers guidance present',
28
- details: 'Maintainers or support expectations are documented.',
29
- evidence: [(0, evidence_1.fileEvidence)(scan.repoPath, scan.files.maintainers)],
30
- });
31
- }
32
- if (!scan.signals.hasRoadmap) {
33
- recommendations.push({
34
- areaId: 'community',
35
- title: 'Publish a lightweight roadmap',
36
- details: 'Add a ROADMAP file to communicate future direction and release cadence.',
37
- priority: 'low',
38
- timeHorizon: 'long-term',
39
- riskIfIgnored: 'Community members may not know what is planned or prioritized.',
40
- evidence: [(0, evidence_1.missingEvidence)('ROADMAP.md missing')],
41
- });
42
- }
43
- else if (scan.files.roadmap) {
44
- findings.push({
45
- areaId: 'community',
46
- title: 'Roadmap present',
47
- details: 'A roadmap exists to communicate future plans.',
48
- evidence: [(0, evidence_1.fileEvidence)(scan.repoPath, scan.files.roadmap)],
49
- });
50
- }
51
- const status = recommendations.length > 0 ? 'needs-improvement' : 'good';
52
- return {
53
- areaId: 'community',
54
- status,
55
- findings,
56
- recommendations,
57
- };
58
- }
59
- //# sourceMappingURL=community.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"community.js","sourceRoot":"","sources":["../../../../src/services/review/areas/community.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAMH,8CAkDC;AApDD,0CAA4D;AAE5D,SAAgB,iBAAiB,CAAC,IAAoB;IACpD,MAAM,QAAQ,GAA+B,EAAE,CAAC;IAChD,MAAM,eAAe,GAAsC,EAAE,CAAC;IAE9D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QACjC,eAAe,CAAC,IAAI,CAAC;YACnB,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,0CAA0C;YACjD,OAAO,EAAE,yEAAyE;YAClF,QAAQ,EAAE,QAAQ;YAClB,WAAW,EAAE,WAAW;YACxB,aAAa,EAAE,wEAAwE;YACvF,QAAQ,EAAE,CAAC,IAAA,0BAAe,EAAC,wBAAwB,CAAC,CAAC;SACtD,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAClC,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,8BAA8B;YACrC,OAAO,EAAE,qDAAqD;YAC9D,QAAQ,EAAE,CAAC,IAAA,uBAAY,EAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;SAChE,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC7B,eAAe,CAAC,IAAI,CAAC;YACnB,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,+BAA+B;YACtC,OAAO,EAAE,yEAAyE;YAClF,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,WAAW;YACxB,aAAa,EAAE,gEAAgE;YAC/E,QAAQ,EAAE,CAAC,IAAA,0BAAe,EAAC,oBAAoB,CAAC,CAAC;SAClD,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,iBAAiB;YACxB,OAAO,EAAE,+CAA+C;YACxD,QAAQ,EAAE,CAAC,IAAA,uBAAY,EAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;SAC5D,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,MAAM,CAAC;IAEzE,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,MAAM;QACN,QAAQ;QACR,eAAe;KAChB,CAAC;AACJ,CAAC"}
@@ -1,9 +0,0 @@
1
- /**
2
- * Contribution area evaluation
3
- *
4
- * @module services/review/areas/contribution
5
- */
6
- import { type AreaEvaluation } from '../review-engine';
7
- import type { RepoScanResult } from '../../../utils/repo-scan';
8
- export declare function evaluateContribution(scan: RepoScanResult): AreaEvaluation;
9
- //# sourceMappingURL=contribution.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"contribution.d.ts","sourceRoot":"","sources":["../../../../src/services/review/areas/contribution.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,cAAc,GAAG,cAAc,CAmGzE"}