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.
- package/README.md +102 -42
- package/dist/cli.mjs +8587 -0
- package/dist/cli.mjs.map +7 -0
- package/package.json +13 -5
- package/dist/cli.d.ts +0 -11
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -134
- package/dist/cli.js.map +0 -1
- package/dist/commands/clash.d.ts +0 -20
- package/dist/commands/clash.d.ts.map +0 -1
- package/dist/commands/clash.js +0 -156
- package/dist/commands/clash.js.map +0 -1
- package/dist/commands/config.d.ts +0 -56
- package/dist/commands/config.d.ts.map +0 -1
- package/dist/commands/config.js +0 -461
- package/dist/commands/config.js.map +0 -1
- package/dist/commands/interactive.d.ts +0 -55
- package/dist/commands/interactive.d.ts.map +0 -1
- package/dist/commands/interactive.js +0 -418
- package/dist/commands/interactive.js.map +0 -1
- package/dist/commands/logs.d.ts +0 -62
- package/dist/commands/logs.d.ts.map +0 -1
- package/dist/commands/logs.js +0 -389
- package/dist/commands/logs.js.map +0 -1
- package/dist/commands/quota.d.ts +0 -54
- package/dist/commands/quota.d.ts.map +0 -1
- package/dist/commands/quota.js +0 -661
- package/dist/commands/quota.js.map +0 -1
- package/dist/commands/review.d.ts +0 -8
- package/dist/commands/review.d.ts.map +0 -1
- package/dist/commands/review.js +0 -79
- package/dist/commands/review.js.map +0 -1
- package/dist/commands/service.d.ts +0 -43
- package/dist/commands/service.d.ts.map +0 -1
- package/dist/commands/service.js +0 -202
- package/dist/commands/service.js.map +0 -1
- package/dist/commands/user.d.ts +0 -49
- package/dist/commands/user.d.ts.map +0 -1
- package/dist/commands/user.js +0 -371
- package/dist/commands/user.js.map +0 -1
- package/dist/components/dashboard-widget.d.ts +0 -21
- package/dist/components/dashboard-widget.d.ts.map +0 -1
- package/dist/components/dashboard-widget.js +0 -234
- package/dist/components/dashboard-widget.js.map +0 -1
- package/dist/components/progress-bar.d.ts +0 -67
- package/dist/components/progress-bar.d.ts.map +0 -1
- package/dist/components/progress-bar.js +0 -138
- package/dist/components/progress-bar.js.map +0 -1
- package/dist/components/user-table.d.ts +0 -8
- package/dist/components/user-table.d.ts.map +0 -1
- package/dist/components/user-table.js +0 -91
- package/dist/components/user-table.js.map +0 -1
- package/dist/config/i18n.d.ts +0 -136
- package/dist/config/i18n.d.ts.map +0 -1
- package/dist/config/i18n.js +0 -323
- package/dist/config/i18n.js.map +0 -1
- package/dist/constants/error-codes.d.ts +0 -344
- package/dist/constants/error-codes.d.ts.map +0 -1
- package/dist/constants/error-codes.js +0 -462
- package/dist/constants/error-codes.js.map +0 -1
- package/dist/constants/exit-codes.d.ts +0 -49
- package/dist/constants/exit-codes.d.ts.map +0 -1
- package/dist/constants/exit-codes.js +0 -100
- package/dist/constants/exit-codes.js.map +0 -1
- package/dist/constants/paths.d.ts +0 -63
- package/dist/constants/paths.d.ts.map +0 -1
- package/dist/constants/paths.js +0 -78
- package/dist/constants/paths.js.map +0 -1
- package/dist/constants/quota.d.ts +0 -126
- package/dist/constants/quota.d.ts.map +0 -1
- package/dist/constants/quota.js +0 -135
- package/dist/constants/quota.js.map +0 -1
- package/dist/constants/review.d.ts +0 -14
- package/dist/constants/review.d.ts.map +0 -1
- package/dist/constants/review.js +0 -33
- package/dist/constants/review.js.map +0 -1
- package/dist/constants/supported-distros.d.ts +0 -17
- package/dist/constants/supported-distros.d.ts.map +0 -1
- package/dist/constants/supported-distros.js +0 -68
- package/dist/constants/supported-distros.js.map +0 -1
- package/dist/constants/theme.d.ts +0 -34
- package/dist/constants/theme.d.ts.map +0 -1
- package/dist/constants/theme.js +0 -52
- package/dist/constants/theme.js.map +0 -1
- package/dist/constants/timeouts.d.ts +0 -84
- package/dist/constants/timeouts.d.ts.map +0 -1
- package/dist/constants/timeouts.js +0 -111
- package/dist/constants/timeouts.js.map +0 -1
- package/dist/constants/ui-symbols.d.ts +0 -47
- package/dist/constants/ui-symbols.d.ts.map +0 -1
- package/dist/constants/ui-symbols.js +0 -48
- package/dist/constants/ui-symbols.js.map +0 -1
- package/dist/services/clash-config.d.ts +0 -16
- package/dist/services/clash-config.d.ts.map +0 -1
- package/dist/services/clash-config.js +0 -107
- package/dist/services/clash-config.js.map +0 -1
- package/dist/services/config-manager.d.ts +0 -90
- package/dist/services/config-manager.d.ts.map +0 -1
- package/dist/services/config-manager.js +0 -307
- package/dist/services/config-manager.js.map +0 -1
- package/dist/services/layout-manager.d.ts +0 -94
- package/dist/services/layout-manager.d.ts.map +0 -1
- package/dist/services/layout-manager.js +0 -192
- package/dist/services/layout-manager.js.map +0 -1
- package/dist/services/log-manager.d.ts +0 -157
- package/dist/services/log-manager.d.ts.map +0 -1
- package/dist/services/log-manager.js +0 -397
- package/dist/services/log-manager.js.map +0 -1
- package/dist/services/navigation-manager.d.ts +0 -23
- package/dist/services/navigation-manager.d.ts.map +0 -1
- package/dist/services/navigation-manager.js +0 -39
- package/dist/services/navigation-manager.js.map +0 -1
- package/dist/services/platform-detector.d.ts +0 -10
- package/dist/services/platform-detector.d.ts.map +0 -1
- package/dist/services/platform-detector.js +0 -106
- package/dist/services/platform-detector.js.map +0 -1
- package/dist/services/public-ip-manager.d.ts +0 -78
- package/dist/services/public-ip-manager.d.ts.map +0 -1
- package/dist/services/public-ip-manager.js +0 -296
- package/dist/services/public-ip-manager.js.map +0 -1
- package/dist/services/quota-enforcer.d.ts +0 -86
- package/dist/services/quota-enforcer.d.ts.map +0 -1
- package/dist/services/quota-enforcer.js +0 -151
- package/dist/services/quota-enforcer.js.map +0 -1
- package/dist/services/quota-manager.d.ts +0 -101
- package/dist/services/quota-manager.d.ts.map +0 -1
- package/dist/services/quota-manager.js +0 -257
- package/dist/services/quota-manager.js.map +0 -1
- package/dist/services/review/areas/community.d.ts +0 -9
- package/dist/services/review/areas/community.d.ts.map +0 -1
- package/dist/services/review/areas/community.js +0 -59
- package/dist/services/review/areas/community.js.map +0 -1
- package/dist/services/review/areas/contribution.d.ts +0 -9
- package/dist/services/review/areas/contribution.d.ts.map +0 -1
- package/dist/services/review/areas/contribution.js +0 -107
- package/dist/services/review/areas/contribution.js.map +0 -1
- package/dist/services/review/areas/documentation.d.ts +0 -9
- package/dist/services/review/areas/documentation.d.ts.map +0 -1
- package/dist/services/review/areas/documentation.js +0 -110
- package/dist/services/review/areas/documentation.js.map +0 -1
- package/dist/services/review/areas/license.d.ts +0 -9
- package/dist/services/review/areas/license.d.ts.map +0 -1
- package/dist/services/review/areas/license.js +0 -86
- package/dist/services/review/areas/license.js.map +0 -1
- package/dist/services/review/areas/quality.d.ts +0 -9
- package/dist/services/review/areas/quality.d.ts.map +0 -1
- package/dist/services/review/areas/quality.js +0 -84
- package/dist/services/review/areas/quality.js.map +0 -1
- package/dist/services/review/areas/security.d.ts +0 -9
- package/dist/services/review/areas/security.d.ts.map +0 -1
- package/dist/services/review/areas/security.js +0 -64
- package/dist/services/review/areas/security.js.map +0 -1
- package/dist/services/review/evidence.d.ts +0 -10
- package/dist/services/review/evidence.d.ts.map +0 -1
- package/dist/services/review/evidence.js +0 -40
- package/dist/services/review/evidence.js.map +0 -1
- package/dist/services/review/recommendations-filter.d.ts +0 -12
- package/dist/services/review/recommendations-filter.d.ts.map +0 -1
- package/dist/services/review/recommendations-filter.js +0 -20
- package/dist/services/review/recommendations-filter.js.map +0 -1
- package/dist/services/review/repo-scanner.d.ts +0 -8
- package/dist/services/review/repo-scanner.d.ts.map +0 -1
- package/dist/services/review/repo-scanner.js +0 -15
- package/dist/services/review/repo-scanner.js.map +0 -1
- package/dist/services/review/report-renderer.d.ts +0 -15
- package/dist/services/review/report-renderer.d.ts.map +0 -1
- package/dist/services/review/report-renderer.js +0 -120
- package/dist/services/review/report-renderer.js.map +0 -1
- package/dist/services/review/review-engine.d.ts +0 -15
- package/dist/services/review/review-engine.d.ts.map +0 -1
- package/dist/services/review/review-engine.js +0 -61
- package/dist/services/review/review-engine.js.map +0 -1
- package/dist/services/review/summary-builder.d.ts +0 -8
- package/dist/services/review/summary-builder.d.ts.map +0 -1
- package/dist/services/review/summary-builder.js +0 -26
- package/dist/services/review/summary-builder.js.map +0 -1
- package/dist/services/screen-manager.d.ts +0 -13
- package/dist/services/screen-manager.d.ts.map +0 -1
- package/dist/services/screen-manager.js +0 -42
- package/dist/services/screen-manager.js.map +0 -1
- package/dist/services/stats-config-manager.d.ts +0 -110
- package/dist/services/stats-config-manager.d.ts.map +0 -1
- package/dist/services/stats-config-manager.js +0 -443
- package/dist/services/stats-config-manager.js.map +0 -1
- package/dist/services/systemd-manager.d.ts +0 -197
- package/dist/services/systemd-manager.d.ts.map +0 -1
- package/dist/services/systemd-manager.js +0 -458
- package/dist/services/systemd-manager.js.map +0 -1
- package/dist/services/traffic-manager.d.ts +0 -106
- package/dist/services/traffic-manager.d.ts.map +0 -1
- package/dist/services/traffic-manager.js +0 -368
- package/dist/services/traffic-manager.js.map +0 -1
- package/dist/services/user-manager.d.ts +0 -90
- package/dist/services/user-manager.d.ts.map +0 -1
- package/dist/services/user-manager.js +0 -347
- package/dist/services/user-manager.js.map +0 -1
- package/dist/services/user-metadata-manager.d.ts +0 -85
- package/dist/services/user-metadata-manager.d.ts.map +0 -1
- package/dist/services/user-metadata-manager.js +0 -181
- package/dist/services/user-metadata-manager.js.map +0 -1
- package/dist/types/config.d.ts +0 -340
- package/dist/types/config.d.ts.map +0 -1
- package/dist/types/config.js +0 -7
- package/dist/types/config.js.map +0 -1
- package/dist/types/layout.d.ts +0 -119
- package/dist/types/layout.d.ts.map +0 -1
- package/dist/types/layout.js +0 -142
- package/dist/types/layout.js.map +0 -1
- package/dist/types/platform.d.ts +0 -72
- package/dist/types/platform.d.ts.map +0 -1
- package/dist/types/platform.js +0 -38
- package/dist/types/platform.js.map +0 -1
- package/dist/types/quota.d.ts +0 -158
- package/dist/types/quota.d.ts.map +0 -1
- package/dist/types/quota.js +0 -26
- package/dist/types/quota.js.map +0 -1
- package/dist/types/review.d.ts +0 -62
- package/dist/types/review.d.ts.map +0 -1
- package/dist/types/review.js +0 -8
- package/dist/types/review.js.map +0 -1
- package/dist/types/server-config.d.ts +0 -53
- package/dist/types/server-config.d.ts.map +0 -1
- package/dist/types/server-config.js +0 -19
- package/dist/types/server-config.js.map +0 -1
- package/dist/types/service.d.ts +0 -96
- package/dist/types/service.d.ts.map +0 -1
- package/dist/types/service.js +0 -7
- package/dist/types/service.js.map +0 -1
- package/dist/types/terminal.d.ts +0 -35
- package/dist/types/terminal.d.ts.map +0 -1
- package/dist/types/terminal.js +0 -20
- package/dist/types/terminal.js.map +0 -1
- package/dist/types/ui-components.d.ts +0 -53
- package/dist/types/ui-components.d.ts.map +0 -1
- package/dist/types/ui-components.js +0 -3
- package/dist/types/ui-components.js.map +0 -1
- package/dist/types/user-metadata.d.ts +0 -43
- package/dist/types/user-metadata.d.ts.map +0 -1
- package/dist/types/user-metadata.js +0 -17
- package/dist/types/user-metadata.js.map +0 -1
- package/dist/types/user.d.ts +0 -134
- package/dist/types/user.d.ts.map +0 -1
- package/dist/types/user.js +0 -7
- package/dist/types/user.js.map +0 -1
- package/dist/utils/clipboard.d.ts +0 -21
- package/dist/utils/clipboard.d.ts.map +0 -1
- package/dist/utils/clipboard.js +0 -45
- package/dist/utils/clipboard.js.map +0 -1
- package/dist/utils/error-formatter.d.ts +0 -60
- package/dist/utils/error-formatter.d.ts.map +0 -1
- package/dist/utils/error-formatter.js +0 -244
- package/dist/utils/error-formatter.js.map +0 -1
- package/dist/utils/errors.d.ts +0 -92
- package/dist/utils/errors.d.ts.map +0 -1
- package/dist/utils/errors.js +0 -143
- package/dist/utils/errors.js.map +0 -1
- package/dist/utils/firewall.d.ts +0 -14
- package/dist/utils/firewall.d.ts.map +0 -1
- package/dist/utils/firewall.js +0 -78
- package/dist/utils/firewall.js.map +0 -1
- package/dist/utils/format.d.ts +0 -93
- package/dist/utils/format.d.ts.map +0 -1
- package/dist/utils/format.js +0 -240
- package/dist/utils/format.js.map +0 -1
- package/dist/utils/icons.d.ts +0 -53
- package/dist/utils/icons.d.ts.map +0 -1
- package/dist/utils/icons.js +0 -143
- package/dist/utils/icons.js.map +0 -1
- package/dist/utils/layout.d.ts +0 -142
- package/dist/utils/layout.d.ts.map +0 -1
- package/dist/utils/layout.js +0 -381
- package/dist/utils/layout.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -160
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -351
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/network.d.ts +0 -39
- package/dist/utils/network.d.ts.map +0 -1
- package/dist/utils/network.js +0 -227
- package/dist/utils/network.js.map +0 -1
- package/dist/utils/os-detection.d.ts +0 -10
- package/dist/utils/os-detection.d.ts.map +0 -1
- package/dist/utils/os-detection.js +0 -86
- package/dist/utils/os-detection.js.map +0 -1
- package/dist/utils/preflight.d.ts +0 -57
- package/dist/utils/preflight.d.ts.map +0 -1
- package/dist/utils/preflight.js +0 -215
- package/dist/utils/preflight.js.map +0 -1
- package/dist/utils/repo-scan.d.ts +0 -54
- package/dist/utils/repo-scan.d.ts.map +0 -1
- package/dist/utils/repo-scan.js +0 -165
- package/dist/utils/repo-scan.js.map +0 -1
- package/dist/utils/report-output.d.ts +0 -13
- package/dist/utils/report-output.d.ts.map +0 -1
- package/dist/utils/report-output.js +0 -33
- package/dist/utils/report-output.js.map +0 -1
- package/dist/utils/review-id.d.ts +0 -8
- package/dist/utils/review-id.d.ts.map +0 -1
- package/dist/utils/review-id.js +0 -17
- package/dist/utils/review-id.js.map +0 -1
- package/dist/utils/splash.d.ts +0 -21
- package/dist/utils/splash.d.ts.map +0 -1
- package/dist/utils/splash.js +0 -179
- package/dist/utils/splash.js.map +0 -1
- package/dist/utils/terminal.d.ts +0 -32
- package/dist/utils/terminal.d.ts.map +0 -1
- package/dist/utils/terminal.js +0 -93
- package/dist/utils/terminal.js.map +0 -1
- package/dist/utils/traffic-formatter.d.ts +0 -45
- package/dist/utils/traffic-formatter.d.ts.map +0 -1
- package/dist/utils/traffic-formatter.js +0 -131
- package/dist/utils/traffic-formatter.js.map +0 -1
- package/dist/utils/validator.d.ts +0 -102
- package/dist/utils/validator.d.ts.map +0 -1
- package/dist/utils/validator.js +0 -238
- package/dist/utils/validator.js.map +0 -1
- package/dist/utils/vless-link.d.ts +0 -27
- package/dist/utils/vless-link.d.ts.map +0 -1
- package/dist/utils/vless-link.js +0 -69
- package/dist/utils/vless-link.js.map +0 -1
- package/dist/utils/which.d.ts +0 -13
- package/dist/utils/which.d.ts.map +0 -1
- package/dist/utils/which.js +0 -28
- package/dist/utils/which.js.map +0 -1
|
@@ -1,347 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* UserManager - User Management with Auto UUID Generation
|
|
4
|
-
*
|
|
5
|
-
* Provides safe user management with automatic service restart
|
|
6
|
-
*
|
|
7
|
-
* @module services/user-manager
|
|
8
|
-
*/
|
|
9
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.UserManager = void 0;
|
|
11
|
-
const crypto_1 = require("crypto");
|
|
12
|
-
const url_1 = require("url");
|
|
13
|
-
const config_manager_1 = require("./config-manager");
|
|
14
|
-
const systemd_manager_1 = require("./systemd-manager");
|
|
15
|
-
const public_ip_manager_1 = require("./public-ip-manager");
|
|
16
|
-
const user_metadata_manager_1 = require("./user-metadata-manager");
|
|
17
|
-
const validator_1 = require("../utils/validator");
|
|
18
|
-
const errors_1 = require("../utils/errors");
|
|
19
|
-
const error_codes_1 = require("../constants/error-codes");
|
|
20
|
-
const errors_2 = require("../utils/errors");
|
|
21
|
-
/**
|
|
22
|
-
* Generate X25519 public key from private key
|
|
23
|
-
*
|
|
24
|
-
* @param privateKeyBase64 - Base64URL encoded private key (32 bytes)
|
|
25
|
-
* @returns Base64URL encoded public key
|
|
26
|
-
*/
|
|
27
|
-
function generatePublicKeyFromPrivate(privateKeyBase64) {
|
|
28
|
-
try {
|
|
29
|
-
// Decode the raw private key (32 bytes)
|
|
30
|
-
const privateKeyBuffer = Buffer.from(privateKeyBase64, 'base64url');
|
|
31
|
-
// X25519 PKCS#8 DER header (for 32-byte raw key)
|
|
32
|
-
const pkcs8Header = Buffer.from([
|
|
33
|
-
0x30, 0x2e, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x6e, 0x04, 0x22, 0x04,
|
|
34
|
-
0x20,
|
|
35
|
-
]);
|
|
36
|
-
const privateKeyDer = Buffer.concat([pkcs8Header, privateKeyBuffer]);
|
|
37
|
-
const privateKey = (0, crypto_1.createPrivateKey)({
|
|
38
|
-
key: privateKeyDer,
|
|
39
|
-
format: 'der',
|
|
40
|
-
type: 'pkcs8',
|
|
41
|
-
});
|
|
42
|
-
const publicKey = (0, crypto_1.createPublicKey)(privateKey);
|
|
43
|
-
const publicKeySpki = publicKey.export({ type: 'spki', format: 'der' });
|
|
44
|
-
// Extract the raw public key (last 32 bytes of SPKI)
|
|
45
|
-
const publicKeyRaw = publicKeySpki.slice(-32);
|
|
46
|
-
return publicKeyRaw.toString('base64url');
|
|
47
|
-
}
|
|
48
|
-
catch {
|
|
49
|
-
throw new errors_1.UserError(error_codes_1.UserErrors.KEY_GENERATION_FAILED);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* UserManager - Manage Xray users
|
|
54
|
-
*/
|
|
55
|
-
class UserManager {
|
|
56
|
-
/**
|
|
57
|
-
* Create a new UserManager
|
|
58
|
-
*
|
|
59
|
-
* @param configPath - Optional config file path
|
|
60
|
-
* @param serviceName - Service name (default: xray)
|
|
61
|
-
*/
|
|
62
|
-
constructor(configPath, serviceName = 'xray') {
|
|
63
|
-
this.configManager = new config_manager_1.ConfigManager(configPath);
|
|
64
|
-
this.systemdManager = new systemd_manager_1.SystemdManager(serviceName);
|
|
65
|
-
this.publicIpManager = new public_ip_manager_1.PublicIpManager();
|
|
66
|
-
this.metadataManager = new user_metadata_manager_1.UserMetadataManager();
|
|
67
|
-
this.serviceName = serviceName;
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Generate a new UUID v4 using crypto.randomUUID()
|
|
71
|
-
*
|
|
72
|
-
* @returns UUID string
|
|
73
|
-
*/
|
|
74
|
-
generateUuid() {
|
|
75
|
-
return (0, crypto_1.randomUUID)();
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Validate email address
|
|
79
|
-
*
|
|
80
|
-
* @param email - Email to validate
|
|
81
|
-
* @throws Error if email is invalid
|
|
82
|
-
*/
|
|
83
|
-
validateEmail(email) {
|
|
84
|
-
if (!(0, validator_1.isValidEmail)(email)) {
|
|
85
|
-
throw new errors_1.UserError(error_codes_1.UserErrors.INVALID_EMAIL, email);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* List all users from config
|
|
90
|
-
*
|
|
91
|
-
* @returns Array of users
|
|
92
|
-
*/
|
|
93
|
-
async listUsers() {
|
|
94
|
-
const config = await this.configManager.readConfig();
|
|
95
|
-
const allMetadata = await this.metadataManager.getAllMetadata();
|
|
96
|
-
const users = [];
|
|
97
|
-
// Extract users from all inbounds
|
|
98
|
-
for (const inbound of config.inbounds || []) {
|
|
99
|
-
if (inbound.settings?.clients) {
|
|
100
|
-
for (const client of inbound.settings.clients) {
|
|
101
|
-
const metadata = allMetadata[client.id];
|
|
102
|
-
users.push({
|
|
103
|
-
id: client.id,
|
|
104
|
-
email: client.email || '',
|
|
105
|
-
level: client.level || 0,
|
|
106
|
-
flow: client.flow,
|
|
107
|
-
createdAt: metadata?.createdAt || new Date().toISOString(),
|
|
108
|
-
status: metadata?.status || 'active',
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
return users;
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Add a new user with auto-generated UUID
|
|
117
|
-
*
|
|
118
|
-
* @param params - User creation parameters
|
|
119
|
-
* @returns Created user
|
|
120
|
-
*/
|
|
121
|
-
async addUser(params) {
|
|
122
|
-
// Validate email
|
|
123
|
-
this.validateEmail(params.email);
|
|
124
|
-
// Check for duplicate email
|
|
125
|
-
const existingUsers = await this.listUsers();
|
|
126
|
-
const duplicate = existingUsers.find((u) => u.email === params.email);
|
|
127
|
-
if (duplicate) {
|
|
128
|
-
throw new errors_1.UserError(error_codes_1.UserErrors.EMAIL_EXISTS, params.email);
|
|
129
|
-
}
|
|
130
|
-
// Backup config before modification
|
|
131
|
-
await this.configManager.backupConfig();
|
|
132
|
-
// Generate UUID
|
|
133
|
-
const id = this.generateUuid();
|
|
134
|
-
const now = new Date().toISOString();
|
|
135
|
-
// Create user object
|
|
136
|
-
const newUser = {
|
|
137
|
-
id,
|
|
138
|
-
email: params.email,
|
|
139
|
-
level: params.level ?? 0,
|
|
140
|
-
flow: params.flow,
|
|
141
|
-
createdAt: now,
|
|
142
|
-
status: 'active',
|
|
143
|
-
};
|
|
144
|
-
// Read config
|
|
145
|
-
const config = await this.configManager.readConfig();
|
|
146
|
-
// Find first VLESS or VMess inbound and add user
|
|
147
|
-
let added = false;
|
|
148
|
-
for (const inbound of config.inbounds || []) {
|
|
149
|
-
if (inbound.protocol === 'vless' || inbound.protocol === 'vmess') {
|
|
150
|
-
if (!inbound.settings) {
|
|
151
|
-
inbound.settings = { clients: [] };
|
|
152
|
-
}
|
|
153
|
-
if (!inbound.settings.clients) {
|
|
154
|
-
inbound.settings.clients = [];
|
|
155
|
-
}
|
|
156
|
-
// Determine flow value: use provided, or default for VLESS + REALITY
|
|
157
|
-
let flowValue = params.flow;
|
|
158
|
-
if (!flowValue && inbound.protocol === 'vless') {
|
|
159
|
-
// For VLESS with REALITY or TLS, default to xtls-rprx-vision
|
|
160
|
-
const security = inbound.streamSettings?.security;
|
|
161
|
-
if (security === 'reality' || security === 'tls') {
|
|
162
|
-
flowValue = 'xtls-rprx-vision';
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
inbound.settings.clients.push({
|
|
166
|
-
id,
|
|
167
|
-
email: params.email,
|
|
168
|
-
level: params.level,
|
|
169
|
-
flow: flowValue,
|
|
170
|
-
});
|
|
171
|
-
added = true;
|
|
172
|
-
break;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
if (!added) {
|
|
176
|
-
throw new errors_2.ConfigError(error_codes_1.ConfigErrors.CONFIG_INVALID_STRUCTURE, '未找到 VLESS/VMess inbound');
|
|
177
|
-
}
|
|
178
|
-
// Write config
|
|
179
|
-
await this.configManager.writeConfig(config);
|
|
180
|
-
// Create user metadata
|
|
181
|
-
await this.metadataManager.createUser(id);
|
|
182
|
-
// Restart service
|
|
183
|
-
await this.systemdManager.restart();
|
|
184
|
-
return newUser;
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* Delete user by ID
|
|
188
|
-
*
|
|
189
|
-
* @param userId - User ID (UUID) to delete
|
|
190
|
-
*/
|
|
191
|
-
async deleteUser(userId) {
|
|
192
|
-
// Backup config before modification
|
|
193
|
-
await this.configManager.backupConfig();
|
|
194
|
-
// Read config
|
|
195
|
-
const config = await this.configManager.readConfig();
|
|
196
|
-
// Find and remove user
|
|
197
|
-
let found = false;
|
|
198
|
-
for (const inbound of config.inbounds || []) {
|
|
199
|
-
if (inbound.settings?.clients) {
|
|
200
|
-
const index = inbound.settings.clients.findIndex((c) => c.id === userId);
|
|
201
|
-
if (index !== -1) {
|
|
202
|
-
inbound.settings.clients.splice(index, 1);
|
|
203
|
-
found = true;
|
|
204
|
-
break;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
if (!found) {
|
|
209
|
-
throw new errors_1.UserError(error_codes_1.UserErrors.USER_NOT_FOUND, userId);
|
|
210
|
-
}
|
|
211
|
-
// Write config
|
|
212
|
-
await this.configManager.writeConfig(config);
|
|
213
|
-
// Delete user metadata
|
|
214
|
-
await this.metadataManager.deleteMetadata(userId);
|
|
215
|
-
// Restart service
|
|
216
|
-
await this.systemdManager.restart();
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* Get share information for a user
|
|
220
|
-
*
|
|
221
|
-
* @param userId - User ID (UUID)
|
|
222
|
-
* @returns Share information including VLESS link
|
|
223
|
-
*/
|
|
224
|
-
async getShareInfo(userId) {
|
|
225
|
-
const config = await this.configManager.readConfig();
|
|
226
|
-
const metadata = await this.metadataManager.getMetadata(userId);
|
|
227
|
-
// Find user and inbound settings
|
|
228
|
-
let user;
|
|
229
|
-
let inboundPort;
|
|
230
|
-
let inboundProtocol;
|
|
231
|
-
let streamSettings;
|
|
232
|
-
for (const inbound of config.inbounds || []) {
|
|
233
|
-
if (inbound.settings?.clients) {
|
|
234
|
-
const client = inbound.settings.clients.find((c) => c.id === userId);
|
|
235
|
-
if (client) {
|
|
236
|
-
user = {
|
|
237
|
-
id: client.id,
|
|
238
|
-
email: client.email || '',
|
|
239
|
-
level: client.level || 0,
|
|
240
|
-
flow: client.flow,
|
|
241
|
-
createdAt: metadata?.createdAt || new Date().toISOString(),
|
|
242
|
-
status: metadata?.status || 'active',
|
|
243
|
-
};
|
|
244
|
-
inboundPort = inbound.port;
|
|
245
|
-
inboundProtocol = inbound.protocol;
|
|
246
|
-
streamSettings = inbound.streamSettings;
|
|
247
|
-
break;
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
if (!user) {
|
|
252
|
-
throw new errors_1.UserError(error_codes_1.UserErrors.USER_NOT_FOUND, userId);
|
|
253
|
-
}
|
|
254
|
-
// Get public IP (from cache or detect)
|
|
255
|
-
let serverAddress;
|
|
256
|
-
try {
|
|
257
|
-
serverAddress = await this.publicIpManager.getPublicIp();
|
|
258
|
-
}
|
|
259
|
-
catch {
|
|
260
|
-
// If detection fails, throw error - caller should handle manual input
|
|
261
|
-
throw new errors_1.NetworkError(error_codes_1.NetworkErrors.PUBLIC_IP_FAILED);
|
|
262
|
-
}
|
|
263
|
-
// Build VLESS link based on security type
|
|
264
|
-
const port = inboundPort || 443;
|
|
265
|
-
const encryption = 'none';
|
|
266
|
-
const security = streamSettings?.security || 'tls';
|
|
267
|
-
const network = streamSettings?.network || 'tcp';
|
|
268
|
-
const flow = user.flow || 'xtls-rprx-vision';
|
|
269
|
-
const name = encodeURIComponent(user.email);
|
|
270
|
-
let vlessLink;
|
|
271
|
-
let publicKey;
|
|
272
|
-
let shortId;
|
|
273
|
-
let serverName;
|
|
274
|
-
if (security === 'reality' && streamSettings?.realitySettings) {
|
|
275
|
-
const reality = streamSettings.realitySettings;
|
|
276
|
-
// Generate public key from private key
|
|
277
|
-
publicKey = generatePublicKeyFromPrivate(reality.privateKey);
|
|
278
|
-
serverName = reality.serverNames[0] || 'www.microsoft.com';
|
|
279
|
-
shortId = reality.shortIds[0] || '';
|
|
280
|
-
// Build REALITY link
|
|
281
|
-
// Format: vless://UUID@server:port?encryption=none&security=reality&type=tcp&flow=xtls-rprx-vision&pbk=PUBLIC_KEY&fp=chrome&sni=SNI&sid=SHORT_ID#name
|
|
282
|
-
const params = new url_1.URLSearchParams({
|
|
283
|
-
encryption,
|
|
284
|
-
security: 'reality',
|
|
285
|
-
type: network,
|
|
286
|
-
flow,
|
|
287
|
-
pbk: publicKey,
|
|
288
|
-
fp: 'chrome',
|
|
289
|
-
sni: serverName,
|
|
290
|
-
sid: shortId,
|
|
291
|
-
spx: '/',
|
|
292
|
-
});
|
|
293
|
-
vlessLink = `vless://${user.id}@${serverAddress}:${port}?${params.toString()}#${name}`;
|
|
294
|
-
}
|
|
295
|
-
else {
|
|
296
|
-
// Build standard TLS link
|
|
297
|
-
vlessLink = `vless://${user.id}@${serverAddress}:${port}?encryption=${encryption}&security=${security}&type=${network}&flow=${flow}#${name}`;
|
|
298
|
-
}
|
|
299
|
-
return {
|
|
300
|
-
user,
|
|
301
|
-
shareLink: vlessLink,
|
|
302
|
-
serverAddress,
|
|
303
|
-
serverPort: port,
|
|
304
|
-
protocol: inboundProtocol || 'vless',
|
|
305
|
-
security,
|
|
306
|
-
serverName,
|
|
307
|
-
publicKey,
|
|
308
|
-
shortId,
|
|
309
|
-
qrCode: vlessLink,
|
|
310
|
-
};
|
|
311
|
-
}
|
|
312
|
-
/**
|
|
313
|
-
* Check if public IP needs manual input
|
|
314
|
-
*
|
|
315
|
-
* @returns true if manual input is needed
|
|
316
|
-
*/
|
|
317
|
-
async needsPublicIpInput() {
|
|
318
|
-
return this.publicIpManager.needsManualInput();
|
|
319
|
-
}
|
|
320
|
-
/**
|
|
321
|
-
* Set public IP manually
|
|
322
|
-
*
|
|
323
|
-
* @param ip - Public IP address
|
|
324
|
-
*/
|
|
325
|
-
async setPublicIp(ip) {
|
|
326
|
-
await this.publicIpManager.setPublicIp(ip);
|
|
327
|
-
}
|
|
328
|
-
/**
|
|
329
|
-
* Get current public IP (from cache)
|
|
330
|
-
*
|
|
331
|
-
* @returns Public IP or null if not set
|
|
332
|
-
*/
|
|
333
|
-
async getPublicIp() {
|
|
334
|
-
const config = await this.publicIpManager.getConfig();
|
|
335
|
-
return config?.publicIp || null;
|
|
336
|
-
}
|
|
337
|
-
/**
|
|
338
|
-
* Get metadata manager for external access
|
|
339
|
-
*
|
|
340
|
-
* @returns UserMetadataManager instance
|
|
341
|
-
*/
|
|
342
|
-
getMetadataManager() {
|
|
343
|
-
return this.metadataManager;
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
exports.UserManager = UserManager;
|
|
347
|
-
//# sourceMappingURL=user-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"user-manager.js","sourceRoot":"","sources":["../../src/services/user-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* UserMetadataManager - User Metadata Persistence Service
|
|
3
|
-
*
|
|
4
|
-
* Manages user creation time, status, and other metadata
|
|
5
|
-
*
|
|
6
|
-
* @module services/user-metadata-manager
|
|
7
|
-
*/
|
|
8
|
-
import type { UserMeta, UserStatus } from '../types/user-metadata';
|
|
9
|
-
/**
|
|
10
|
-
* UserMetadataManager - Manage user metadata persistence
|
|
11
|
-
*/
|
|
12
|
-
export declare class UserMetadataManager {
|
|
13
|
-
private metadataPath;
|
|
14
|
-
private cache;
|
|
15
|
-
/**
|
|
16
|
-
* Create a new UserMetadataManager
|
|
17
|
-
*
|
|
18
|
-
* @param metadataPath - Path to metadata file
|
|
19
|
-
*/
|
|
20
|
-
constructor(metadataPath?: string);
|
|
21
|
-
/**
|
|
22
|
-
* Load metadata from file
|
|
23
|
-
*
|
|
24
|
-
* @returns UserMetadataStore
|
|
25
|
-
*/
|
|
26
|
-
private loadMetadata;
|
|
27
|
-
/**
|
|
28
|
-
* Save metadata to file
|
|
29
|
-
*
|
|
30
|
-
* @param store - UserMetadataStore to save
|
|
31
|
-
*/
|
|
32
|
-
private saveMetadata;
|
|
33
|
-
/**
|
|
34
|
-
* Get metadata for a specific user
|
|
35
|
-
*
|
|
36
|
-
* @param userId - User UUID
|
|
37
|
-
* @returns UserMeta or null if not found
|
|
38
|
-
*/
|
|
39
|
-
getMetadata(userId: string): Promise<UserMeta | null>;
|
|
40
|
-
/**
|
|
41
|
-
* Set metadata for a user (create or update)
|
|
42
|
-
*
|
|
43
|
-
* @param userId - User UUID
|
|
44
|
-
* @param metadata - Partial metadata to set/update
|
|
45
|
-
*/
|
|
46
|
-
setMetadata(userId: string, metadata: Partial<UserMeta>): Promise<void>;
|
|
47
|
-
/**
|
|
48
|
-
* Create metadata for a new user
|
|
49
|
-
*
|
|
50
|
-
* @param userId - User UUID
|
|
51
|
-
* @returns Created UserMeta
|
|
52
|
-
*/
|
|
53
|
-
createUser(userId: string): Promise<UserMeta>;
|
|
54
|
-
/**
|
|
55
|
-
* Update user status
|
|
56
|
-
*
|
|
57
|
-
* @param userId - User UUID
|
|
58
|
-
* @param status - New status
|
|
59
|
-
*/
|
|
60
|
-
updateStatus(userId: string, status: UserStatus): Promise<void>;
|
|
61
|
-
/**
|
|
62
|
-
* Delete user metadata
|
|
63
|
-
*
|
|
64
|
-
* @param userId - User UUID
|
|
65
|
-
*/
|
|
66
|
-
deleteMetadata(userId: string): Promise<void>;
|
|
67
|
-
/**
|
|
68
|
-
* Get all user metadata
|
|
69
|
-
*
|
|
70
|
-
* @returns Record of userId to UserMeta
|
|
71
|
-
*/
|
|
72
|
-
getAllMetadata(): Promise<Record<string, UserMeta>>;
|
|
73
|
-
/**
|
|
74
|
-
* Get users by status
|
|
75
|
-
*
|
|
76
|
-
* @param status - Status to filter by
|
|
77
|
-
* @returns Array of [userId, metadata] pairs
|
|
78
|
-
*/
|
|
79
|
-
getUsersByStatus(status: UserStatus): Promise<Array<[string, UserMeta]>>;
|
|
80
|
-
/**
|
|
81
|
-
* Clear cache (force reload from file on next access)
|
|
82
|
-
*/
|
|
83
|
-
clearCache(): void;
|
|
84
|
-
}
|
|
85
|
-
//# sourceMappingURL=user-metadata-manager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"user-metadata-manager.d.ts","sourceRoot":"","sources":["../../src/services/user-metadata-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAqB,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAUtF;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,KAAK,CAAkC;IAE/C;;;;OAIG;gBACS,YAAY,CAAC,EAAE,MAAM;IAIjC;;;;OAIG;YACW,YAAY;IAmB1B;;;;OAIG;YACW,YAAY;IAS1B;;;;;OAKG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAK3D;;;;;OAKG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB7E;;;;;OAKG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAyBnD;;;;;OAKG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAarE;;;;OAIG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASnD;;;;OAIG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAKzD;;;;;OAKG;IACG,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAK9E;;OAEG;IACH,UAAU,IAAI,IAAI;CAGnB"}
|
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* UserMetadataManager - User Metadata Persistence Service
|
|
4
|
-
*
|
|
5
|
-
* Manages user creation time, status, and other metadata
|
|
6
|
-
*
|
|
7
|
-
* @module services/user-metadata-manager
|
|
8
|
-
*/
|
|
9
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.UserMetadataManager = void 0;
|
|
11
|
-
const promises_1 = require("fs/promises");
|
|
12
|
-
const fs_1 = require("fs");
|
|
13
|
-
const path_1 = require("path");
|
|
14
|
-
const paths_1 = require("../constants/paths");
|
|
15
|
-
/**
|
|
16
|
-
* Validate UUID v4 format
|
|
17
|
-
*/
|
|
18
|
-
function isValidUuid(uuid) {
|
|
19
|
-
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
20
|
-
return uuidRegex.test(uuid);
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* UserMetadataManager - Manage user metadata persistence
|
|
24
|
-
*/
|
|
25
|
-
class UserMetadataManager {
|
|
26
|
-
/**
|
|
27
|
-
* Create a new UserMetadataManager
|
|
28
|
-
*
|
|
29
|
-
* @param metadataPath - Path to metadata file
|
|
30
|
-
*/
|
|
31
|
-
constructor(metadataPath) {
|
|
32
|
-
this.cache = null;
|
|
33
|
-
this.metadataPath = metadataPath || paths_1.DEFAULT_PATHS.USER_METADATA_FILE;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Load metadata from file
|
|
37
|
-
*
|
|
38
|
-
* @returns UserMetadataStore
|
|
39
|
-
*/
|
|
40
|
-
async loadMetadata() {
|
|
41
|
-
if (this.cache) {
|
|
42
|
-
return this.cache;
|
|
43
|
-
}
|
|
44
|
-
try {
|
|
45
|
-
if (!(0, fs_1.existsSync)(this.metadataPath)) {
|
|
46
|
-
this.cache = { users: {} };
|
|
47
|
-
return this.cache;
|
|
48
|
-
}
|
|
49
|
-
const content = await (0, promises_1.readFile)(this.metadataPath, 'utf-8');
|
|
50
|
-
this.cache = JSON.parse(content);
|
|
51
|
-
return this.cache;
|
|
52
|
-
}
|
|
53
|
-
catch {
|
|
54
|
-
this.cache = { users: {} };
|
|
55
|
-
return this.cache;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Save metadata to file
|
|
60
|
-
*
|
|
61
|
-
* @param store - UserMetadataStore to save
|
|
62
|
-
*/
|
|
63
|
-
async saveMetadata(store) {
|
|
64
|
-
const dir = (0, path_1.dirname)(this.metadataPath);
|
|
65
|
-
if (!(0, fs_1.existsSync)(dir)) {
|
|
66
|
-
await (0, promises_1.mkdir)(dir, { recursive: true });
|
|
67
|
-
}
|
|
68
|
-
await (0, promises_1.writeFile)(this.metadataPath, JSON.stringify(store, null, 2), 'utf-8');
|
|
69
|
-
this.cache = store;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Get metadata for a specific user
|
|
73
|
-
*
|
|
74
|
-
* @param userId - User UUID
|
|
75
|
-
* @returns UserMeta or null if not found
|
|
76
|
-
*/
|
|
77
|
-
async getMetadata(userId) {
|
|
78
|
-
const store = await this.loadMetadata();
|
|
79
|
-
return store.users[userId] || null;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Set metadata for a user (create or update)
|
|
83
|
-
*
|
|
84
|
-
* @param userId - User UUID
|
|
85
|
-
* @param metadata - Partial metadata to set/update
|
|
86
|
-
*/
|
|
87
|
-
async setMetadata(userId, metadata) {
|
|
88
|
-
if (!isValidUuid(userId)) {
|
|
89
|
-
throw new Error(`Invalid UUID format: ${userId}`);
|
|
90
|
-
}
|
|
91
|
-
const store = await this.loadMetadata();
|
|
92
|
-
const existing = store.users[userId] || {
|
|
93
|
-
createdAt: new Date().toISOString(),
|
|
94
|
-
status: 'active',
|
|
95
|
-
};
|
|
96
|
-
store.users[userId] = {
|
|
97
|
-
...existing,
|
|
98
|
-
...metadata,
|
|
99
|
-
};
|
|
100
|
-
await this.saveMetadata(store);
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Create metadata for a new user
|
|
104
|
-
*
|
|
105
|
-
* @param userId - User UUID
|
|
106
|
-
* @returns Created UserMeta
|
|
107
|
-
*/
|
|
108
|
-
async createUser(userId) {
|
|
109
|
-
if (!isValidUuid(userId)) {
|
|
110
|
-
throw new Error(`Invalid UUID format: ${userId}`);
|
|
111
|
-
}
|
|
112
|
-
const store = await this.loadMetadata();
|
|
113
|
-
// Don't overwrite existing metadata
|
|
114
|
-
if (store.users[userId]) {
|
|
115
|
-
return store.users[userId];
|
|
116
|
-
}
|
|
117
|
-
const now = new Date().toISOString();
|
|
118
|
-
const metadata = {
|
|
119
|
-
createdAt: now,
|
|
120
|
-
status: 'active',
|
|
121
|
-
statusChangedAt: now,
|
|
122
|
-
};
|
|
123
|
-
store.users[userId] = metadata;
|
|
124
|
-
await this.saveMetadata(store);
|
|
125
|
-
return metadata;
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Update user status
|
|
129
|
-
*
|
|
130
|
-
* @param userId - User UUID
|
|
131
|
-
* @param status - New status
|
|
132
|
-
*/
|
|
133
|
-
async updateStatus(userId, status) {
|
|
134
|
-
const store = await this.loadMetadata();
|
|
135
|
-
if (!store.users[userId]) {
|
|
136
|
-
throw new Error(`User metadata not found: ${userId}`);
|
|
137
|
-
}
|
|
138
|
-
store.users[userId].status = status;
|
|
139
|
-
store.users[userId].statusChangedAt = new Date().toISOString();
|
|
140
|
-
await this.saveMetadata(store);
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Delete user metadata
|
|
144
|
-
*
|
|
145
|
-
* @param userId - User UUID
|
|
146
|
-
*/
|
|
147
|
-
async deleteMetadata(userId) {
|
|
148
|
-
const store = await this.loadMetadata();
|
|
149
|
-
if (store.users[userId]) {
|
|
150
|
-
delete store.users[userId];
|
|
151
|
-
await this.saveMetadata(store);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Get all user metadata
|
|
156
|
-
*
|
|
157
|
-
* @returns Record of userId to UserMeta
|
|
158
|
-
*/
|
|
159
|
-
async getAllMetadata() {
|
|
160
|
-
const store = await this.loadMetadata();
|
|
161
|
-
return { ...store.users };
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Get users by status
|
|
165
|
-
*
|
|
166
|
-
* @param status - Status to filter by
|
|
167
|
-
* @returns Array of [userId, metadata] pairs
|
|
168
|
-
*/
|
|
169
|
-
async getUsersByStatus(status) {
|
|
170
|
-
const store = await this.loadMetadata();
|
|
171
|
-
return Object.entries(store.users).filter(([_, meta]) => meta.status === status);
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Clear cache (force reload from file on next access)
|
|
175
|
-
*/
|
|
176
|
-
clearCache() {
|
|
177
|
-
this.cache = null;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
exports.UserMetadataManager = UserMetadataManager;
|
|
181
|
-
//# sourceMappingURL=user-metadata-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"user-metadata-manager.js","sourceRoot":"","sources":["../../src/services/user-metadata-manager.ts"],"names":[],"mappings":"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"}
|