xray-manager 1.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 (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +798 -0
  3. package/dist/cli.d.ts +11 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +113 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/config.d.ts +49 -0
  8. package/dist/commands/config.d.ts.map +1 -0
  9. package/dist/commands/config.js +295 -0
  10. package/dist/commands/config.js.map +1 -0
  11. package/dist/commands/interactive.d.ts +83 -0
  12. package/dist/commands/interactive.d.ts.map +1 -0
  13. package/dist/commands/interactive.js +362 -0
  14. package/dist/commands/interactive.js.map +1 -0
  15. package/dist/commands/logs.d.ts +43 -0
  16. package/dist/commands/logs.d.ts.map +1 -0
  17. package/dist/commands/logs.js +257 -0
  18. package/dist/commands/logs.js.map +1 -0
  19. package/dist/commands/service.d.ts +43 -0
  20. package/dist/commands/service.d.ts.map +1 -0
  21. package/dist/commands/service.js +177 -0
  22. package/dist/commands/service.js.map +1 -0
  23. package/dist/commands/user.d.ts +43 -0
  24. package/dist/commands/user.d.ts.map +1 -0
  25. package/dist/commands/user.js +212 -0
  26. package/dist/commands/user.js.map +1 -0
  27. package/dist/constants/exit-codes.d.ts +49 -0
  28. package/dist/constants/exit-codes.d.ts.map +1 -0
  29. package/dist/constants/exit-codes.js +100 -0
  30. package/dist/constants/exit-codes.js.map +1 -0
  31. package/dist/constants/paths.d.ts +57 -0
  32. package/dist/constants/paths.d.ts.map +1 -0
  33. package/dist/constants/paths.js +72 -0
  34. package/dist/constants/paths.js.map +1 -0
  35. package/dist/constants/timeouts.d.ts +84 -0
  36. package/dist/constants/timeouts.d.ts.map +1 -0
  37. package/dist/constants/timeouts.js +111 -0
  38. package/dist/constants/timeouts.js.map +1 -0
  39. package/dist/services/config-manager.d.ts +66 -0
  40. package/dist/services/config-manager.d.ts.map +1 -0
  41. package/dist/services/config-manager.js +206 -0
  42. package/dist/services/config-manager.js.map +1 -0
  43. package/dist/services/log-manager.d.ts +113 -0
  44. package/dist/services/log-manager.d.ts.map +1 -0
  45. package/dist/services/log-manager.js +288 -0
  46. package/dist/services/log-manager.js.map +1 -0
  47. package/dist/services/systemd-manager.d.ts +197 -0
  48. package/dist/services/systemd-manager.d.ts.map +1 -0
  49. package/dist/services/systemd-manager.js +458 -0
  50. package/dist/services/systemd-manager.js.map +1 -0
  51. package/dist/services/user-manager.d.ts +63 -0
  52. package/dist/services/user-manager.d.ts.map +1 -0
  53. package/dist/services/user-manager.js +219 -0
  54. package/dist/services/user-manager.js.map +1 -0
  55. package/dist/types/config.d.ts +256 -0
  56. package/dist/types/config.d.ts.map +1 -0
  57. package/dist/types/config.js +7 -0
  58. package/dist/types/config.js.map +1 -0
  59. package/dist/types/service.d.ts +96 -0
  60. package/dist/types/service.d.ts.map +1 -0
  61. package/dist/types/service.js +7 -0
  62. package/dist/types/service.js.map +1 -0
  63. package/dist/types/user.d.ts +114 -0
  64. package/dist/types/user.d.ts.map +1 -0
  65. package/dist/types/user.js +7 -0
  66. package/dist/types/user.js.map +1 -0
  67. package/dist/utils/clipboard.d.ts +21 -0
  68. package/dist/utils/clipboard.d.ts.map +1 -0
  69. package/dist/utils/clipboard.js +45 -0
  70. package/dist/utils/clipboard.js.map +1 -0
  71. package/dist/utils/format.d.ts +93 -0
  72. package/dist/utils/format.d.ts.map +1 -0
  73. package/dist/utils/format.js +242 -0
  74. package/dist/utils/format.js.map +1 -0
  75. package/dist/utils/logger.d.ts +113 -0
  76. package/dist/utils/logger.d.ts.map +1 -0
  77. package/dist/utils/logger.js +260 -0
  78. package/dist/utils/logger.js.map +1 -0
  79. package/dist/utils/preflight.d.ts +57 -0
  80. package/dist/utils/preflight.d.ts.map +1 -0
  81. package/dist/utils/preflight.js +215 -0
  82. package/dist/utils/preflight.js.map +1 -0
  83. package/dist/utils/validator.d.ts +102 -0
  84. package/dist/utils/validator.d.ts.map +1 -0
  85. package/dist/utils/validator.js +238 -0
  86. package/dist/utils/validator.js.map +1 -0
  87. package/dist/utils/which.d.ts +13 -0
  88. package/dist/utils/which.d.ts.map +1 -0
  89. package/dist/utils/which.js +28 -0
  90. package/dist/utils/which.js.map +1 -0
  91. package/package.json +69 -0
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ /**
3
+ * 标准化退出代码
4
+ * @module constants/exit-codes
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ExitCodeDescription = exports.ExitCode = void 0;
8
+ exports.getExitCodeForError = getExitCodeForError;
9
+ exports.gracefulExit = gracefulExit;
10
+ /**
11
+ * CLI 工具退出代码常量
12
+ * 遵循 Unix/Linux 退出代码规范
13
+ */
14
+ exports.ExitCode = {
15
+ /** 成功 */
16
+ SUCCESS: 0,
17
+ /** 通用错误 */
18
+ GENERAL_ERROR: 1,
19
+ /** 参数错误 - 无效的命令行参数或选项 */
20
+ INVALID_ARGUMENT: 2,
21
+ /** 配置错误 - 配置文件错误、缺失或无法解析 */
22
+ CONFIG_ERROR: 3,
23
+ /** 权限错误 - 需要 root/sudo 权限但未提供 */
24
+ PERMISSION_ERROR: 4,
25
+ /** 服务错误 - systemd 服务操作失败 */
26
+ SERVICE_ERROR: 5,
27
+ /** 网络错误 - 网络连接失败或超时 */
28
+ NETWORK_ERROR: 6,
29
+ /** 文件错误 - 文件读写操作失败 */
30
+ FILE_ERROR: 7,
31
+ /** 验证错误 - 输入验证失败(邮箱、UUID 等) */
32
+ VALIDATION_ERROR: 8,
33
+ /** 未找到 - 资源不存在(用户、服务等) */
34
+ NOT_FOUND: 9,
35
+ /** 用户中断 - Ctrl+C 中断程序执行 */
36
+ SIGINT: 130,
37
+ };
38
+ /**
39
+ * 退出代码到描述的映射
40
+ */
41
+ exports.ExitCodeDescription = {
42
+ [exports.ExitCode.SUCCESS]: '成功',
43
+ [exports.ExitCode.GENERAL_ERROR]: '通用错误',
44
+ [exports.ExitCode.INVALID_ARGUMENT]: '参数错误',
45
+ [exports.ExitCode.CONFIG_ERROR]: '配置错误',
46
+ [exports.ExitCode.PERMISSION_ERROR]: '权限不足',
47
+ [exports.ExitCode.SERVICE_ERROR]: '服务操作失败',
48
+ [exports.ExitCode.NETWORK_ERROR]: '网络错误',
49
+ [exports.ExitCode.FILE_ERROR]: '文件错误',
50
+ [exports.ExitCode.VALIDATION_ERROR]: '输入验证失败',
51
+ [exports.ExitCode.NOT_FOUND]: '资源未找到',
52
+ [exports.ExitCode.SIGINT]: '用户中断',
53
+ };
54
+ /**
55
+ * 根据错误类型获取退出代码
56
+ */
57
+ function getExitCodeForError(error) {
58
+ const errorName = error.name.toLowerCase();
59
+ const errorMessage = error.message.toLowerCase();
60
+ // 根据错误名称或消息判断退出代码
61
+ if (errorName.includes('permission') || errorMessage.includes('eacces')) {
62
+ return exports.ExitCode.PERMISSION_ERROR;
63
+ }
64
+ if (errorName.includes('validation') || errorMessage.includes('invalid')) {
65
+ return exports.ExitCode.VALIDATION_ERROR;
66
+ }
67
+ if (errorName.includes('notfound') || errorMessage.includes('not found')) {
68
+ return exports.ExitCode.NOT_FOUND;
69
+ }
70
+ if (errorName.includes('config') || errorMessage.includes('config')) {
71
+ return exports.ExitCode.CONFIG_ERROR;
72
+ }
73
+ if (errorName.includes('service') || errorMessage.includes('systemctl')) {
74
+ return exports.ExitCode.SERVICE_ERROR;
75
+ }
76
+ if (errorName.includes('file') || errorMessage.includes('enoent')) {
77
+ return exports.ExitCode.FILE_ERROR;
78
+ }
79
+ if (errorName.includes('network') || errorMessage.includes('timeout')) {
80
+ return exports.ExitCode.NETWORK_ERROR;
81
+ }
82
+ return exports.ExitCode.GENERAL_ERROR;
83
+ }
84
+ /**
85
+ * 优雅退出(清理资源后退出)
86
+ */
87
+ async function gracefulExit(code, cleanup) {
88
+ try {
89
+ if (cleanup) {
90
+ await cleanup();
91
+ }
92
+ }
93
+ catch (error) {
94
+ console.error('清理资源时出错:', error);
95
+ }
96
+ finally {
97
+ process.exit(code);
98
+ }
99
+ }
100
+ //# sourceMappingURL=exit-codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-codes.js","sourceRoot":"","sources":["../../src/constants/exit-codes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * 路径常量定义
3
+ * @module constants/paths
4
+ */
5
+ /**
6
+ * 默认路径配置
7
+ */
8
+ export declare const DEFAULT_PATHS: {
9
+ /** Xray 配置文件路径 */
10
+ readonly CONFIG_FILE: "/usr/local/etc/xray/config.json";
11
+ /** Xray 配置目录 */
12
+ readonly CONFIG_DIR: "/usr/local/etc/xray";
13
+ /** 配置备份目录 */
14
+ readonly BACKUP_DIR: "/var/backups/xray";
15
+ /** systemd 服务名称 */
16
+ readonly SERVICE_NAME: "xray";
17
+ /** systemd 服务文件路径 */
18
+ readonly SERVICE_FILE: "/etc/systemd/system/xray.service";
19
+ /** Xray 可执行文件路径 */
20
+ readonly XRAY_BINARY: "/usr/local/bin/xray";
21
+ /** 日志目录(如果使用文件日志) */
22
+ readonly LOG_DIR: "/var/log/xray";
23
+ /** 访问日志文件 */
24
+ readonly ACCESS_LOG: "/var/log/xray/access.log";
25
+ /** 错误日志文件 */
26
+ readonly ERROR_LOG: "/var/log/xray/error.log";
27
+ /** 临时文件目录 */
28
+ readonly TEMP_DIR: "/tmp/xray-manager";
29
+ /** 用户配置目录(~/.xray-manager) */
30
+ readonly USER_CONFIG_DIR: string;
31
+ /** 用户配置文件 */
32
+ readonly USER_CONFIG_FILE: string;
33
+ };
34
+ /**
35
+ * 路径验证规则
36
+ */
37
+ export declare const PATH_VALIDATION: {
38
+ /** 配置文件必须以 .json 结尾 */
39
+ readonly CONFIG_FILE_EXTENSION: ".json";
40
+ /** 备份文件命名格式 */
41
+ readonly BACKUP_FILE_PATTERN: RegExp;
42
+ /** 最大路径长度 */
43
+ readonly MAX_PATH_LENGTH: 4096;
44
+ };
45
+ /**
46
+ * 备份文件名生成
47
+ */
48
+ export declare function getBackupFileName(timestamp?: Date): string;
49
+ /**
50
+ * 获取完整备份路径
51
+ */
52
+ export declare function getBackupFilePath(timestamp?: Date): string;
53
+ /**
54
+ * 检查路径是否为备份文件
55
+ */
56
+ export declare function isBackupFile(filename: string): boolean;
57
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/constants/paths.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;GAEG;AACH,eAAO,MAAM,aAAa;IACxB,kBAAkB;;IAGlB,gBAAgB;;IAGhB,aAAa;;IAGb,mBAAmB;;IAGnB,qBAAqB;;IAGrB,mBAAmB;;IAGnB,qBAAqB;;IAGrB,aAAa;;IAGb,aAAa;;IAGb,aAAa;;IAGb,8BAA8B;;IAG9B,aAAa;;CAEL,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,eAAe;IAC1B,uBAAuB;;IAGvB,eAAe;;IAGf,aAAa;;CAEL,CAAC;AAEX;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,GAAE,IAAiB,GAAG,MAAM,CAGtE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,CAAC,EAAE,IAAI,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEtD"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ /**
3
+ * 路径常量定义
4
+ * @module constants/paths
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.PATH_VALIDATION = exports.DEFAULT_PATHS = void 0;
8
+ exports.getBackupFileName = getBackupFileName;
9
+ exports.getBackupFilePath = getBackupFilePath;
10
+ exports.isBackupFile = isBackupFile;
11
+ const os_1 = require("os");
12
+ const path_1 = require("path");
13
+ /**
14
+ * 默认路径配置
15
+ */
16
+ exports.DEFAULT_PATHS = {
17
+ /** Xray 配置文件路径 */
18
+ CONFIG_FILE: '/usr/local/etc/xray/config.json',
19
+ /** Xray 配置目录 */
20
+ CONFIG_DIR: '/usr/local/etc/xray',
21
+ /** 配置备份目录 */
22
+ BACKUP_DIR: '/var/backups/xray',
23
+ /** systemd 服务名称 */
24
+ SERVICE_NAME: 'xray',
25
+ /** systemd 服务文件路径 */
26
+ SERVICE_FILE: '/etc/systemd/system/xray.service',
27
+ /** Xray 可执行文件路径 */
28
+ XRAY_BINARY: '/usr/local/bin/xray',
29
+ /** 日志目录(如果使用文件日志) */
30
+ LOG_DIR: '/var/log/xray',
31
+ /** 访问日志文件 */
32
+ ACCESS_LOG: '/var/log/xray/access.log',
33
+ /** 错误日志文件 */
34
+ ERROR_LOG: '/var/log/xray/error.log',
35
+ /** 临时文件目录 */
36
+ TEMP_DIR: '/tmp/xray-manager',
37
+ /** 用户配置目录(~/.xray-manager) */
38
+ USER_CONFIG_DIR: (0, path_1.join)((0, os_1.homedir)(), '.xray-manager'),
39
+ /** 用户配置文件 */
40
+ USER_CONFIG_FILE: (0, path_1.join)((0, os_1.homedir)(), '.xray-manager', 'config.json'),
41
+ };
42
+ /**
43
+ * 路径验证规则
44
+ */
45
+ exports.PATH_VALIDATION = {
46
+ /** 配置文件必须以 .json 结尾 */
47
+ CONFIG_FILE_EXTENSION: '.json',
48
+ /** 备份文件命名格式 */
49
+ BACKUP_FILE_PATTERN: /^config\.\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}\.\d{3}Z\.json$/,
50
+ /** 最大路径长度 */
51
+ MAX_PATH_LENGTH: 4096,
52
+ };
53
+ /**
54
+ * 备份文件名生成
55
+ */
56
+ function getBackupFileName(timestamp = new Date()) {
57
+ const isoString = timestamp.toISOString().replace(/:/g, '-');
58
+ return `config.${isoString}.json`;
59
+ }
60
+ /**
61
+ * 获取完整备份路径
62
+ */
63
+ function getBackupFilePath(timestamp) {
64
+ return (0, path_1.join)(exports.DEFAULT_PATHS.BACKUP_DIR, getBackupFileName(timestamp));
65
+ }
66
+ /**
67
+ * 检查路径是否为备份文件
68
+ */
69
+ function isBackupFile(filename) {
70
+ return exports.PATH_VALIDATION.BACKUP_FILE_PATTERN.test(filename);
71
+ }
72
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/constants/paths.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AA+DH,8CAGC;AAKD,8CAEC;AAKD,oCAEC;AA9ED,2BAA6B;AAC7B,+BAA4B;AAE5B;;GAEG;AACU,QAAA,aAAa,GAAG;IAC3B,kBAAkB;IAClB,WAAW,EAAE,iCAAiC;IAE9C,gBAAgB;IAChB,UAAU,EAAE,qBAAqB;IAEjC,aAAa;IACb,UAAU,EAAE,mBAAmB;IAE/B,mBAAmB;IACnB,YAAY,EAAE,MAAM;IAEpB,qBAAqB;IACrB,YAAY,EAAE,kCAAkC;IAEhD,mBAAmB;IACnB,WAAW,EAAE,qBAAqB;IAElC,qBAAqB;IACrB,OAAO,EAAE,eAAe;IAExB,aAAa;IACb,UAAU,EAAE,0BAA0B;IAEtC,aAAa;IACb,SAAS,EAAE,yBAAyB;IAEpC,aAAa;IACb,QAAQ,EAAE,mBAAmB;IAE7B,8BAA8B;IAC9B,eAAe,EAAE,IAAA,WAAI,EAAC,IAAA,YAAO,GAAE,EAAE,eAAe,CAAC;IAEjD,aAAa;IACb,gBAAgB,EAAE,IAAA,WAAI,EAAC,IAAA,YAAO,GAAE,EAAE,eAAe,EAAE,aAAa,CAAC;CACzD,CAAC;AAEX;;GAEG;AACU,QAAA,eAAe,GAAG;IAC7B,uBAAuB;IACvB,qBAAqB,EAAE,OAAO;IAE9B,eAAe;IACf,mBAAmB,EAAE,6DAA6D;IAElF,aAAa;IACb,eAAe,EAAE,IAAI;CACb,CAAC;AAEX;;GAEG;AACH,SAAgB,iBAAiB,CAAC,YAAkB,IAAI,IAAI,EAAE;IAC5D,MAAM,SAAS,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC7D,OAAO,UAAU,SAAS,OAAO,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,SAAgB;IAChD,OAAO,IAAA,WAAI,EAAC,qBAAa,CAAC,UAAU,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,QAAgB;IAC3C,OAAO,uBAAe,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * 超时时间常量定义
3
+ * @module constants/timeouts
4
+ */
5
+ /**
6
+ * 超时配置(单位:毫秒)
7
+ */
8
+ export declare const TIMEOUTS: {
9
+ /** systemctl 命令默认超时 */
10
+ readonly SYSTEMCTL_DEFAULT: 30000;
11
+ /** 服务启动超时 */
12
+ readonly SERVICE_START: 15000;
13
+ /** 服务停止超时(优雅关闭) */
14
+ readonly SERVICE_STOP: 10000;
15
+ /** 服务重启超时 */
16
+ readonly SERVICE_RESTART: 25000;
17
+ /** 服务状态查询超时 */
18
+ readonly SERVICE_STATUS: 5000;
19
+ /** 配置文件读写超时 */
20
+ readonly CONFIG_IO: 5000;
21
+ /** 配置备份操作超时 */
22
+ readonly CONFIG_BACKUP: 10000;
23
+ /** 日志查询超时 */
24
+ readonly LOG_QUERY: 10000;
25
+ /** 网络操作超时(下载、检查更新) */
26
+ readonly NETWORK: 30000;
27
+ /** 用户输入超时(交互式菜单) */
28
+ readonly USER_INPUT: 60000;
29
+ /** 文件系统操作超时 */
30
+ readonly FILESYSTEM: 10000;
31
+ /** 优雅关闭等待时间 */
32
+ readonly GRACEFUL_SHUTDOWN: 10000;
33
+ /** 进程杀死前等待时间 */
34
+ readonly KILL_WAIT: 2000;
35
+ /** 菜单刷新间隔 */
36
+ readonly MENU_REFRESH: 1000;
37
+ /** 状态轮询间隔 */
38
+ readonly STATUS_POLL: 500;
39
+ };
40
+ /**
41
+ * 性能要求(用于监控和测试)
42
+ */
43
+ export declare const PERFORMANCE_TARGETS: {
44
+ /** 菜单启动时间目标 */
45
+ readonly MENU_STARTUP: 500;
46
+ /** 菜单导航响应时间目标 */
47
+ readonly MENU_NAVIGATION: 100;
48
+ /** 按键响应时间目标 */
49
+ readonly KEY_RESPONSE: 50;
50
+ /** 服务重启中断时间目标 */
51
+ readonly SERVICE_DOWNTIME: 10000;
52
+ };
53
+ /**
54
+ * 重试配置
55
+ */
56
+ export declare const RETRY_CONFIG: {
57
+ /** 默认重试次数 */
58
+ readonly DEFAULT_ATTEMPTS: 3;
59
+ /** 重试间隔(毫秒) */
60
+ readonly RETRY_DELAY: 1000;
61
+ /** 指数退避基数 */
62
+ readonly BACKOFF_MULTIPLIER: 2;
63
+ /** 最大重试间隔 */
64
+ readonly MAX_RETRY_DELAY: 10000;
65
+ };
66
+ /**
67
+ * 计算指数退避延迟
68
+ * @param attempt 当前尝试次数(从 0 开始)
69
+ * @returns 延迟时间(毫秒)
70
+ */
71
+ export declare function getBackoffDelay(attempt: number): number;
72
+ /**
73
+ * 睡眠函数(用于延迟)
74
+ * @param ms 毫秒数
75
+ */
76
+ export declare function sleep(ms: number): Promise<void>;
77
+ /**
78
+ * 带超时的 Promise
79
+ * @param promise 原始 Promise
80
+ * @param timeoutMs 超时时间(毫秒)
81
+ * @param errorMessage 超时错误消息
82
+ */
83
+ export declare function withTimeout<T>(promise: Promise<T>, timeoutMs: number, errorMessage?: string): Promise<T>;
84
+ //# sourceMappingURL=timeouts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeouts.d.ts","sourceRoot":"","sources":["../../src/constants/timeouts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,eAAO,MAAM,QAAQ;IACnB,uBAAuB;;IAGvB,aAAa;;IAGb,mBAAmB;;IAGnB,aAAa;;IAGb,eAAe;;IAGf,eAAe;;IAGf,eAAe;;IAGf,aAAa;;IAGb,sBAAsB;;IAGtB,oBAAoB;;IAGpB,eAAe;;IAGf,eAAe;;IAGf,gBAAgB;;IAGhB,aAAa;;IAGb,aAAa;;CAEL,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,mBAAmB;IAC9B,eAAe;;IAGf,iBAAiB;;IAGjB,eAAe;;IAGf,iBAAiB;;CAET,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,YAAY;IACvB,aAAa;;IAGb,eAAe;;IAGf,aAAa;;IAGb,aAAa;;CAEL,CAAC;AAEX;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,CAAC,EACjC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,SAAS,EAAE,MAAM,EACjB,YAAY,SAAS,GACpB,OAAO,CAAC,CAAC,CAAC,CAiBZ"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ /**
3
+ * 超时时间常量定义
4
+ * @module constants/timeouts
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.RETRY_CONFIG = exports.PERFORMANCE_TARGETS = exports.TIMEOUTS = void 0;
8
+ exports.getBackoffDelay = getBackoffDelay;
9
+ exports.sleep = sleep;
10
+ exports.withTimeout = withTimeout;
11
+ /**
12
+ * 超时配置(单位:毫秒)
13
+ */
14
+ exports.TIMEOUTS = {
15
+ /** systemctl 命令默认超时 */
16
+ SYSTEMCTL_DEFAULT: 30000, // 30 秒
17
+ /** 服务启动超时 */
18
+ SERVICE_START: 15000, // 15 秒
19
+ /** 服务停止超时(优雅关闭) */
20
+ SERVICE_STOP: 10000, // 10 秒
21
+ /** 服务重启超时 */
22
+ SERVICE_RESTART: 25000, // 25 秒
23
+ /** 服务状态查询超时 */
24
+ SERVICE_STATUS: 5000, // 5 秒
25
+ /** 配置文件读写超时 */
26
+ CONFIG_IO: 5000, // 5 秒
27
+ /** 配置备份操作超时 */
28
+ CONFIG_BACKUP: 10000, // 10 秒
29
+ /** 日志查询超时 */
30
+ LOG_QUERY: 10000, // 10 秒
31
+ /** 网络操作超时(下载、检查更新) */
32
+ NETWORK: 30000, // 30 秒
33
+ /** 用户输入超时(交互式菜单) */
34
+ USER_INPUT: 60000, // 60 秒
35
+ /** 文件系统操作超时 */
36
+ FILESYSTEM: 10000, // 10 秒
37
+ /** 优雅关闭等待时间 */
38
+ GRACEFUL_SHUTDOWN: 10000, // 10 秒
39
+ /** 进程杀死前等待时间 */
40
+ KILL_WAIT: 2000, // 2 秒
41
+ /** 菜单刷新间隔 */
42
+ MENU_REFRESH: 1000, // 1 秒
43
+ /** 状态轮询间隔 */
44
+ STATUS_POLL: 500, // 500 毫秒
45
+ };
46
+ /**
47
+ * 性能要求(用于监控和测试)
48
+ */
49
+ exports.PERFORMANCE_TARGETS = {
50
+ /** 菜单启动时间目标 */
51
+ MENU_STARTUP: 500, // 500ms (SC-003)
52
+ /** 菜单导航响应时间目标 */
53
+ MENU_NAVIGATION: 100, // 100ms (SC-002)
54
+ /** 按键响应时间目标 */
55
+ KEY_RESPONSE: 50, // 50ms (SC-002)
56
+ /** 服务重启中断时间目标 */
57
+ SERVICE_DOWNTIME: 10000, // 10s (FR-016)
58
+ };
59
+ /**
60
+ * 重试配置
61
+ */
62
+ exports.RETRY_CONFIG = {
63
+ /** 默认重试次数 */
64
+ DEFAULT_ATTEMPTS: 3,
65
+ /** 重试间隔(毫秒) */
66
+ RETRY_DELAY: 1000, // 1 秒
67
+ /** 指数退避基数 */
68
+ BACKOFF_MULTIPLIER: 2,
69
+ /** 最大重试间隔 */
70
+ MAX_RETRY_DELAY: 10000, // 10 秒
71
+ };
72
+ /**
73
+ * 计算指数退避延迟
74
+ * @param attempt 当前尝试次数(从 0 开始)
75
+ * @returns 延迟时间(毫秒)
76
+ */
77
+ function getBackoffDelay(attempt) {
78
+ const delay = exports.RETRY_CONFIG.RETRY_DELAY * Math.pow(exports.RETRY_CONFIG.BACKOFF_MULTIPLIER, attempt);
79
+ return Math.min(delay, exports.RETRY_CONFIG.MAX_RETRY_DELAY);
80
+ }
81
+ /**
82
+ * 睡眠函数(用于延迟)
83
+ * @param ms 毫秒数
84
+ */
85
+ function sleep(ms) {
86
+ return new Promise((resolve) => setTimeout(resolve, ms));
87
+ }
88
+ /**
89
+ * 带超时的 Promise
90
+ * @param promise 原始 Promise
91
+ * @param timeoutMs 超时时间(毫秒)
92
+ * @param errorMessage 超时错误消息
93
+ */
94
+ async function withTimeout(promise, timeoutMs, errorMessage = '操作超时') {
95
+ let timeoutId;
96
+ const timeoutPromise = new Promise((_, reject) => {
97
+ timeoutId = setTimeout(() => {
98
+ reject(new Error(`${errorMessage} (${timeoutMs}ms)`));
99
+ }, timeoutMs);
100
+ });
101
+ try {
102
+ const result = await Promise.race([promise, timeoutPromise]);
103
+ clearTimeout(timeoutId);
104
+ return result;
105
+ }
106
+ catch (error) {
107
+ clearTimeout(timeoutId);
108
+ throw error;
109
+ }
110
+ }
111
+ //# sourceMappingURL=timeouts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeouts.js","sourceRoot":"","sources":["../../src/constants/timeouts.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AA2FH,0CAGC;AAMD,sBAEC;AAQD,kCAqBC;AAjID;;GAEG;AACU,QAAA,QAAQ,GAAG;IACtB,uBAAuB;IACvB,iBAAiB,EAAE,KAAK,EAAE,OAAO;IAEjC,aAAa;IACb,aAAa,EAAE,KAAK,EAAE,OAAO;IAE7B,mBAAmB;IACnB,YAAY,EAAE,KAAK,EAAE,OAAO;IAE5B,aAAa;IACb,eAAe,EAAE,KAAK,EAAE,OAAO;IAE/B,eAAe;IACf,cAAc,EAAE,IAAI,EAAE,MAAM;IAE5B,eAAe;IACf,SAAS,EAAE,IAAI,EAAE,MAAM;IAEvB,eAAe;IACf,aAAa,EAAE,KAAK,EAAE,OAAO;IAE7B,aAAa;IACb,SAAS,EAAE,KAAK,EAAE,OAAO;IAEzB,sBAAsB;IACtB,OAAO,EAAE,KAAK,EAAE,OAAO;IAEvB,oBAAoB;IACpB,UAAU,EAAE,KAAK,EAAE,OAAO;IAE1B,eAAe;IACf,UAAU,EAAE,KAAK,EAAE,OAAO;IAE1B,eAAe;IACf,iBAAiB,EAAE,KAAK,EAAE,OAAO;IAEjC,gBAAgB;IAChB,SAAS,EAAE,IAAI,EAAE,MAAM;IAEvB,aAAa;IACb,YAAY,EAAE,IAAI,EAAE,MAAM;IAE1B,aAAa;IACb,WAAW,EAAE,GAAG,EAAE,SAAS;CACnB,CAAC;AAEX;;GAEG;AACU,QAAA,mBAAmB,GAAG;IACjC,eAAe;IACf,YAAY,EAAE,GAAG,EAAE,iBAAiB;IAEpC,iBAAiB;IACjB,eAAe,EAAE,GAAG,EAAE,iBAAiB;IAEvC,eAAe;IACf,YAAY,EAAE,EAAE,EAAE,gBAAgB;IAElC,iBAAiB;IACjB,gBAAgB,EAAE,KAAK,EAAE,eAAe;CAChC,CAAC;AAEX;;GAEG;AACU,QAAA,YAAY,GAAG;IAC1B,aAAa;IACb,gBAAgB,EAAE,CAAC;IAEnB,eAAe;IACf,WAAW,EAAE,IAAI,EAAE,MAAM;IAEzB,aAAa;IACb,kBAAkB,EAAE,CAAC;IAErB,aAAa;IACb,eAAe,EAAE,KAAK,EAAE,OAAO;CACvB,CAAC;AAEX;;;;GAIG;AACH,SAAgB,eAAe,CAAC,OAAe;IAC7C,MAAM,KAAK,GAAG,oBAAY,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,oBAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAC5F,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,oBAAY,CAAC,eAAe,CAAC,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,SAAgB,KAAK,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,WAAW,CAC/B,OAAmB,EACnB,SAAiB,EACjB,YAAY,GAAG,MAAM;IAErB,IAAI,SAAyB,CAAC;IAE9B,MAAM,cAAc,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QACtD,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAC1B,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,YAAY,KAAK,SAAS,KAAK,CAAC,CAAC,CAAC;QACxD,CAAC,EAAE,SAAS,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;QAC7D,YAAY,CAAC,SAAU,CAAC,CAAC;QACzB,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,YAAY,CAAC,SAAU,CAAC,CAAC;QACzB,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * ConfigManager - Xray Configuration File Management
3
+ *
4
+ * Provides safe interface to read, write, validate, and backup Xray config
5
+ *
6
+ * @module services/config-manager
7
+ */
8
+ import type { XrayConfig } from '../types/config';
9
+ /**
10
+ * ConfigManager - Safe configuration file operations
11
+ */
12
+ export declare class ConfigManager {
13
+ private configPath;
14
+ private backupDir;
15
+ /**
16
+ * Create a new ConfigManager
17
+ *
18
+ * @param configPath - Path to config file (default: /usr/local/etc/xray/config.json)
19
+ */
20
+ constructor(configPath?: string);
21
+ /**
22
+ * Read and parse config file
23
+ *
24
+ * @returns Parsed configuration object
25
+ */
26
+ readConfig(): Promise<XrayConfig>;
27
+ /**
28
+ * Write config to file with secure permissions
29
+ *
30
+ * @param config - Configuration object to write
31
+ */
32
+ writeConfig(config: XrayConfig): Promise<void>;
33
+ /**
34
+ * Validate configuration structure
35
+ *
36
+ * @param config - Configuration to validate
37
+ * @throws Error if validation fails
38
+ */
39
+ validateConfig(config: XrayConfig): void;
40
+ /**
41
+ * Backup configuration file
42
+ *
43
+ * @returns Path to backup file
44
+ */
45
+ backupConfig(): Promise<string>;
46
+ /**
47
+ * List available backups
48
+ *
49
+ * @returns Array of backup file paths
50
+ */
51
+ listBackups(): Promise<string[]>;
52
+ /**
53
+ * Restore configuration from backup
54
+ *
55
+ * @param backupPath - Path to backup file
56
+ */
57
+ restoreConfig(backupPath: string): Promise<void>;
58
+ /**
59
+ * Modify a configuration item
60
+ *
61
+ * @param path - Dot-separated path to config item (e.g., "log.loglevel")
62
+ * @param value - New value
63
+ */
64
+ modifyConfigItem(path: string, value: any): Promise<void>;
65
+ }
66
+ //# sourceMappingURL=config-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/services/config-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;IAE1B;;;;OAIG;gBACS,UAAU,CAAC,EAAE,MAAM;IAK/B;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC;IAiBvC;;;;OAIG;IACG,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBpD;;;;;OAKG;IACH,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAgCxC;;;;OAIG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAyBrC;;;;OAIG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAmBtC;;;;OAIG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBtD;;;;;OAKG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;CAqBhE"}