@serve.zone/dcrouter 11.0.4 → 11.0.5

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 (118) hide show
  1. package/dist_serve/bundle.js +1 -1
  2. package/package.json +1 -1
  3. package/ts/00_commitinfo_data.ts +1 -1
  4. package/ts_web/00_commitinfo_data.ts +1 -1
  5. package/dist_ts/00_commitinfo_data.d.ts +0 -8
  6. package/dist_ts/00_commitinfo_data.js +0 -9
  7. package/dist_ts/cache/classes.cache.cleaner.d.ts +0 -47
  8. package/dist_ts/cache/classes.cache.cleaner.js +0 -130
  9. package/dist_ts/cache/documents/classes.cached.email.d.ts +0 -125
  10. package/dist_ts/cache/documents/classes.cached.email.js +0 -337
  11. package/dist_ts/cache/documents/classes.cached.ip.reputation.d.ts +0 -119
  12. package/dist_ts/cache/documents/classes.cached.ip.reputation.js +0 -323
  13. package/dist_ts/cache/documents/index.d.ts +0 -2
  14. package/dist_ts/cache/documents/index.js +0 -3
  15. package/dist_ts/cache/index.d.ts +0 -4
  16. package/dist_ts/cache/index.js +0 -7
  17. package/dist_ts/classes.cert-provision-scheduler.d.ts +0 -53
  18. package/dist_ts/classes.cert-provision-scheduler.js +0 -110
  19. package/dist_ts/classes.dcrouter.d.ts +0 -337
  20. package/dist_ts/classes.dcrouter.js +0 -1405
  21. package/dist_ts/classes.storage-cert-manager.d.ts +0 -18
  22. package/dist_ts/classes.storage-cert-manager.js +0 -43
  23. package/dist_ts/config/classes.api-token-manager.d.ts +0 -46
  24. package/dist_ts/config/classes.api-token-manager.js +0 -150
  25. package/dist_ts/config/classes.route-config-manager.d.ts +0 -35
  26. package/dist_ts/config/classes.route-config-manager.js +0 -231
  27. package/dist_ts/config/index.d.ts +0 -3
  28. package/dist_ts/config/index.js +0 -5
  29. package/dist_ts/config/validator.d.ts +0 -104
  30. package/dist_ts/config/validator.js +0 -152
  31. package/dist_ts/errors/base.errors.d.ts +0 -224
  32. package/dist_ts/errors/base.errors.js +0 -320
  33. package/dist_ts/errors/error-handler.d.ts +0 -98
  34. package/dist_ts/errors/error-handler.js +0 -282
  35. package/dist_ts/errors/error.codes.d.ts +0 -115
  36. package/dist_ts/errors/error.codes.js +0 -136
  37. package/dist_ts/errors/index.d.ts +0 -54
  38. package/dist_ts/errors/index.js +0 -136
  39. package/dist_ts/errors/reputation.errors.d.ts +0 -183
  40. package/dist_ts/errors/reputation.errors.js +0 -292
  41. package/dist_ts/index.d.ts +0 -7
  42. package/dist_ts/index.js +0 -11
  43. package/dist_ts/logger.d.ts +0 -21
  44. package/dist_ts/logger.js +0 -81
  45. package/dist_ts/monitoring/classes.metricscache.d.ts +0 -32
  46. package/dist_ts/monitoring/classes.metricscache.js +0 -63
  47. package/dist_ts/monitoring/classes.metricsmanager.d.ts +0 -178
  48. package/dist_ts/monitoring/classes.metricsmanager.js +0 -642
  49. package/dist_ts/monitoring/index.d.ts +0 -1
  50. package/dist_ts/monitoring/index.js +0 -2
  51. package/dist_ts/opsserver/classes.opsserver.d.ts +0 -37
  52. package/dist_ts/opsserver/classes.opsserver.js +0 -85
  53. package/dist_ts/opsserver/handlers/admin.handler.d.ts +0 -31
  54. package/dist_ts/opsserver/handlers/admin.handler.js +0 -180
  55. package/dist_ts/opsserver/handlers/api-token.handler.d.ts +0 -6
  56. package/dist_ts/opsserver/handlers/api-token.handler.js +0 -62
  57. package/dist_ts/opsserver/handlers/certificate.handler.d.ts +0 -32
  58. package/dist_ts/opsserver/handlers/certificate.handler.js +0 -421
  59. package/dist_ts/opsserver/handlers/config.handler.d.ts +0 -7
  60. package/dist_ts/opsserver/handlers/config.handler.js +0 -192
  61. package/dist_ts/opsserver/handlers/email-ops.handler.d.ts +0 -30
  62. package/dist_ts/opsserver/handlers/email-ops.handler.js +0 -227
  63. package/dist_ts/opsserver/handlers/index.d.ts +0 -11
  64. package/dist_ts/opsserver/handlers/index.js +0 -12
  65. package/dist_ts/opsserver/handlers/logs.handler.d.ts +0 -25
  66. package/dist_ts/opsserver/handlers/logs.handler.js +0 -256
  67. package/dist_ts/opsserver/handlers/radius.handler.d.ts +0 -6
  68. package/dist_ts/opsserver/handlers/radius.handler.js +0 -295
  69. package/dist_ts/opsserver/handlers/remoteingress.handler.d.ts +0 -6
  70. package/dist_ts/opsserver/handlers/remoteingress.handler.js +0 -156
  71. package/dist_ts/opsserver/handlers/route-management.handler.d.ts +0 -14
  72. package/dist_ts/opsserver/handlers/route-management.handler.js +0 -117
  73. package/dist_ts/opsserver/handlers/security.handler.d.ts +0 -9
  74. package/dist_ts/opsserver/handlers/security.handler.js +0 -231
  75. package/dist_ts/opsserver/handlers/stats.handler.d.ts +0 -11
  76. package/dist_ts/opsserver/handlers/stats.handler.js +0 -399
  77. package/dist_ts/opsserver/helpers/guards.d.ts +0 -27
  78. package/dist_ts/opsserver/helpers/guards.js +0 -43
  79. package/dist_ts/opsserver/index.d.ts +0 -1
  80. package/dist_ts/opsserver/index.js +0 -2
  81. package/dist_ts/paths.d.ts +0 -26
  82. package/dist_ts/paths.js +0 -45
  83. package/dist_ts/plugins.d.ts +0 -79
  84. package/dist_ts/plugins.js +0 -113
  85. package/dist_ts/radius/classes.accounting.manager.d.ts +0 -218
  86. package/dist_ts/radius/classes.accounting.manager.js +0 -417
  87. package/dist_ts/radius/classes.radius.server.d.ts +0 -171
  88. package/dist_ts/radius/classes.radius.server.js +0 -385
  89. package/dist_ts/radius/classes.vlan.manager.d.ts +0 -128
  90. package/dist_ts/radius/classes.vlan.manager.js +0 -279
  91. package/dist_ts/radius/index.d.ts +0 -13
  92. package/dist_ts/radius/index.js +0 -14
  93. package/dist_ts/remoteingress/classes.remoteingress-manager.d.ts +0 -82
  94. package/dist_ts/remoteingress/classes.remoteingress-manager.js +0 -227
  95. package/dist_ts/remoteingress/classes.tunnel-manager.d.ts +0 -59
  96. package/dist_ts/remoteingress/classes.tunnel-manager.js +0 -165
  97. package/dist_ts/remoteingress/index.d.ts +0 -2
  98. package/dist_ts/remoteingress/index.js +0 -3
  99. package/dist_ts/security/classes.contentscanner.d.ts +0 -164
  100. package/dist_ts/security/classes.contentscanner.js +0 -642
  101. package/dist_ts/security/classes.ipreputationchecker.d.ts +0 -160
  102. package/dist_ts/security/classes.ipreputationchecker.js +0 -537
  103. package/dist_ts/security/classes.securitylogger.d.ts +0 -144
  104. package/dist_ts/security/classes.securitylogger.js +0 -233
  105. package/dist_ts/security/index.d.ts +0 -3
  106. package/dist_ts/security/index.js +0 -4
  107. package/dist_ts/sms/classes.smsservice.d.ts +0 -15
  108. package/dist_ts/sms/classes.smsservice.js +0 -72
  109. package/dist_ts/sms/config/sms.config.d.ts +0 -93
  110. package/dist_ts/sms/config/sms.config.js +0 -2
  111. package/dist_ts/sms/config/sms.schema.d.ts +0 -5
  112. package/dist_ts/sms/config/sms.schema.js +0 -121
  113. package/dist_ts/sms/index.d.ts +0 -1
  114. package/dist_ts/sms/index.js +0 -2
  115. package/dist_ts/storage/classes.storagemanager.d.ts +0 -83
  116. package/dist_ts/storage/classes.storagemanager.js +0 -350
  117. package/dist_ts/storage/index.d.ts +0 -1
  118. package/dist_ts/storage/index.js +0 -3
@@ -1,18 +0,0 @@
1
- import * as plugins from './plugins.js';
2
- import { StorageManager } from './storage/index.js';
3
- /**
4
- * ICertManager implementation backed by StorageManager.
5
- * Persists SmartAcme certificates under a /certs/ key prefix so they
6
- * survive process restarts without re-hitting ACME.
7
- */
8
- export declare class StorageBackedCertManager implements plugins.smartacme.ICertManager {
9
- private storageManager;
10
- private keyPrefix;
11
- constructor(storageManager: StorageManager);
12
- init(): Promise<void>;
13
- retrieveCertificate(domainName: string): Promise<plugins.smartacme.Cert | null>;
14
- storeCertificate(cert: plugins.smartacme.Cert): Promise<void>;
15
- deleteCertificate(domainName: string): Promise<void>;
16
- close(): Promise<void>;
17
- wipe(): Promise<void>;
18
- }
@@ -1,43 +0,0 @@
1
- import * as plugins from './plugins.js';
2
- import { StorageManager } from './storage/index.js';
3
- /**
4
- * ICertManager implementation backed by StorageManager.
5
- * Persists SmartAcme certificates under a /certs/ key prefix so they
6
- * survive process restarts without re-hitting ACME.
7
- */
8
- export class StorageBackedCertManager {
9
- storageManager;
10
- keyPrefix = '/certs/';
11
- constructor(storageManager) {
12
- this.storageManager = storageManager;
13
- }
14
- async init() { }
15
- async retrieveCertificate(domainName) {
16
- const data = await this.storageManager.getJSON(this.keyPrefix + domainName);
17
- if (!data)
18
- return null;
19
- return new plugins.smartacme.Cert(data);
20
- }
21
- async storeCertificate(cert) {
22
- await this.storageManager.setJSON(this.keyPrefix + cert.domainName, {
23
- id: cert.id,
24
- domainName: cert.domainName,
25
- created: cert.created,
26
- privateKey: cert.privateKey,
27
- publicKey: cert.publicKey,
28
- csr: cert.csr,
29
- validUntil: cert.validUntil,
30
- });
31
- }
32
- async deleteCertificate(domainName) {
33
- await this.storageManager.delete(this.keyPrefix + domainName);
34
- }
35
- async close() { }
36
- async wipe() {
37
- const keys = await this.storageManager.list(this.keyPrefix);
38
- for (const key of keys) {
39
- await this.storageManager.delete(key);
40
- }
41
- }
42
- }
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zdG9yYWdlLWNlcnQtbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NsYXNzZXMuc3RvcmFnZS1jZXJ0LW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXBEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sd0JBQXdCO0lBR2Y7SUFGWixTQUFTLEdBQUcsU0FBUyxDQUFDO0lBRTlCLFlBQW9CLGNBQThCO1FBQTlCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtJQUFHLENBQUM7SUFFdEQsS0FBSyxDQUFDLElBQUksS0FBbUIsQ0FBQztJQUU5QixLQUFLLENBQUMsbUJBQW1CLENBQUMsVUFBa0I7UUFDMUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdkIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBNEI7UUFDakQsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbEUsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ1gsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNiLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtTQUM1QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLFVBQWtCO1FBQ3hDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUssS0FBbUIsQ0FBQztJQUUvQixLQUFLLENBQUMsSUFBSTtRQUNSLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVELEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxDQUFDO0lBQ0gsQ0FBQztDQUNGIn0=
@@ -1,46 +0,0 @@
1
- import type { StorageManager } from '../storage/index.js';
2
- import type { IStoredApiToken, IApiTokenInfo, TApiTokenScope } from '../../dist_ts_interfaces/data/route-management.js';
3
- export declare class ApiTokenManager {
4
- private storageManager;
5
- private tokens;
6
- constructor(storageManager: StorageManager);
7
- initialize(): Promise<void>;
8
- /**
9
- * Create a new API token. Returns the raw token value (shown once).
10
- */
11
- createToken(name: string, scopes: TApiTokenScope[], expiresInDays: number | null, createdBy: string): Promise<{
12
- id: string;
13
- rawToken: string;
14
- }>;
15
- /**
16
- * Validate a raw token string. Returns the stored token if valid, null otherwise.
17
- * Also updates lastUsedAt.
18
- */
19
- validateToken(rawToken: string): Promise<IStoredApiToken | null>;
20
- /**
21
- * Check if a token has a specific scope.
22
- */
23
- hasScope(token: IStoredApiToken, scope: TApiTokenScope): boolean;
24
- /**
25
- * List all tokens (safe info only, no hashes).
26
- */
27
- listTokens(): IApiTokenInfo[];
28
- /**
29
- * Revoke (delete) a token.
30
- */
31
- revokeToken(id: string): Promise<boolean>;
32
- /**
33
- * Roll (regenerate) a token's secret while keeping its identity.
34
- * Returns the new raw token value (shown once).
35
- */
36
- rollToken(id: string): Promise<{
37
- id: string;
38
- rawToken: string;
39
- } | null>;
40
- /**
41
- * Enable or disable a token.
42
- */
43
- toggleToken(id: string, enabled: boolean): Promise<boolean>;
44
- private loadTokens;
45
- private persistToken;
46
- }
@@ -1,150 +0,0 @@
1
- import * as plugins from '../plugins.js';
2
- import { logger } from '../logger.js';
3
- const TOKENS_PREFIX = '/config-api/tokens/';
4
- const TOKEN_PREFIX_STR = 'dcr_';
5
- export class ApiTokenManager {
6
- storageManager;
7
- tokens = new Map();
8
- constructor(storageManager) {
9
- this.storageManager = storageManager;
10
- }
11
- async initialize() {
12
- await this.loadTokens();
13
- if (this.tokens.size > 0) {
14
- logger.log('info', `Loaded ${this.tokens.size} API token(s) from storage`);
15
- }
16
- }
17
- // =========================================================================
18
- // Token lifecycle
19
- // =========================================================================
20
- /**
21
- * Create a new API token. Returns the raw token value (shown once).
22
- */
23
- async createToken(name, scopes, expiresInDays, createdBy) {
24
- const id = plugins.uuid.v4();
25
- const randomBytes = plugins.crypto.randomBytes(32);
26
- const rawPayload = `${id}:${randomBytes.toString('base64url')}`;
27
- const rawToken = `${TOKEN_PREFIX_STR}${rawPayload}`;
28
- const tokenHash = plugins.crypto.createHash('sha256').update(rawToken).digest('hex');
29
- const now = Date.now();
30
- const stored = {
31
- id,
32
- name,
33
- tokenHash,
34
- scopes,
35
- createdAt: now,
36
- expiresAt: expiresInDays != null ? now + expiresInDays * 86400000 : null,
37
- lastUsedAt: null,
38
- createdBy,
39
- enabled: true,
40
- };
41
- this.tokens.set(id, stored);
42
- await this.persistToken(stored);
43
- logger.log('info', `API token '${name}' created (id: ${id})`);
44
- return { id, rawToken };
45
- }
46
- /**
47
- * Validate a raw token string. Returns the stored token if valid, null otherwise.
48
- * Also updates lastUsedAt.
49
- */
50
- async validateToken(rawToken) {
51
- if (!rawToken.startsWith(TOKEN_PREFIX_STR))
52
- return null;
53
- const hash = plugins.crypto.createHash('sha256').update(rawToken).digest('hex');
54
- for (const stored of this.tokens.values()) {
55
- if (stored.tokenHash === hash) {
56
- if (!stored.enabled)
57
- return null;
58
- if (stored.expiresAt !== null && stored.expiresAt < Date.now())
59
- return null;
60
- // Update lastUsedAt (fire and forget)
61
- stored.lastUsedAt = Date.now();
62
- this.persistToken(stored).catch(() => { });
63
- return stored;
64
- }
65
- }
66
- return null;
67
- }
68
- /**
69
- * Check if a token has a specific scope.
70
- */
71
- hasScope(token, scope) {
72
- return token.scopes.includes(scope);
73
- }
74
- /**
75
- * List all tokens (safe info only, no hashes).
76
- */
77
- listTokens() {
78
- const result = [];
79
- for (const stored of this.tokens.values()) {
80
- result.push({
81
- id: stored.id,
82
- name: stored.name,
83
- scopes: stored.scopes,
84
- createdAt: stored.createdAt,
85
- expiresAt: stored.expiresAt,
86
- lastUsedAt: stored.lastUsedAt,
87
- enabled: stored.enabled,
88
- });
89
- }
90
- return result;
91
- }
92
- /**
93
- * Revoke (delete) a token.
94
- */
95
- async revokeToken(id) {
96
- if (!this.tokens.has(id))
97
- return false;
98
- const token = this.tokens.get(id);
99
- this.tokens.delete(id);
100
- await this.storageManager.delete(`${TOKENS_PREFIX}${id}.json`);
101
- logger.log('info', `API token '${token.name}' revoked (id: ${id})`);
102
- return true;
103
- }
104
- /**
105
- * Roll (regenerate) a token's secret while keeping its identity.
106
- * Returns the new raw token value (shown once).
107
- */
108
- async rollToken(id) {
109
- const stored = this.tokens.get(id);
110
- if (!stored)
111
- return null;
112
- const randomBytes = plugins.crypto.randomBytes(32);
113
- const rawPayload = `${id}:${randomBytes.toString('base64url')}`;
114
- const rawToken = `${TOKEN_PREFIX_STR}${rawPayload}`;
115
- stored.tokenHash = plugins.crypto.createHash('sha256').update(rawToken).digest('hex');
116
- await this.persistToken(stored);
117
- logger.log('info', `API token '${stored.name}' rolled (id: ${id})`);
118
- return { id, rawToken };
119
- }
120
- /**
121
- * Enable or disable a token.
122
- */
123
- async toggleToken(id, enabled) {
124
- const stored = this.tokens.get(id);
125
- if (!stored)
126
- return false;
127
- stored.enabled = enabled;
128
- await this.persistToken(stored);
129
- logger.log('info', `API token '${stored.name}' ${enabled ? 'enabled' : 'disabled'} (id: ${id})`);
130
- return true;
131
- }
132
- // =========================================================================
133
- // Private
134
- // =========================================================================
135
- async loadTokens() {
136
- const keys = await this.storageManager.list(TOKENS_PREFIX);
137
- for (const key of keys) {
138
- if (!key.endsWith('.json'))
139
- continue;
140
- const stored = await this.storageManager.getJSON(key);
141
- if (stored?.id) {
142
- this.tokens.set(stored.id, stored);
143
- }
144
- }
145
- }
146
- async persistToken(stored) {
147
- await this.storageManager.setJSON(`${TOKENS_PREFIX}${stored.id}.json`, stored);
148
- }
149
- }
150
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5hcGktdG9rZW4tbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2NvbmZpZy9jbGFzc2VzLmFwaS10b2tlbi1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFRdEMsTUFBTSxhQUFhLEdBQUcscUJBQXFCLENBQUM7QUFDNUMsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUM7QUFFaEMsTUFBTSxPQUFPLGVBQWU7SUFHTjtJQUZaLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBMkIsQ0FBQztJQUVwRCxZQUFvQixjQUE4QjtRQUE5QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7SUFBRyxDQUFDO0lBRS9DLEtBQUssQ0FBQyxVQUFVO1FBQ3JCLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksNEJBQTRCLENBQUMsQ0FBQztRQUM3RSxDQUFDO0lBQ0gsQ0FBQztJQUVELDRFQUE0RTtJQUM1RSxrQkFBa0I7SUFDbEIsNEVBQTRFO0lBRTVFOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFdBQVcsQ0FDdEIsSUFBWSxFQUNaLE1BQXdCLEVBQ3hCLGFBQTRCLEVBQzVCLFNBQWlCO1FBRWpCLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDN0IsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkQsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFLElB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
@@ -1,35 +0,0 @@
1
- import * as plugins from '../plugins.js';
2
- import type { StorageManager } from '../storage/index.js';
3
- import type { IMergedRoute, IRouteWarning } from '../../dist_ts_interfaces/data/route-management.js';
4
- export declare class RouteConfigManager {
5
- private storageManager;
6
- private getHardcodedRoutes;
7
- private getSmartProxy;
8
- private storedRoutes;
9
- private overrides;
10
- private warnings;
11
- constructor(storageManager: StorageManager, getHardcodedRoutes: () => plugins.smartproxy.IRouteConfig[], getSmartProxy: () => plugins.smartproxy.SmartProxy | undefined);
12
- /**
13
- * Load persisted routes and overrides, compute warnings, apply to SmartProxy.
14
- */
15
- initialize(): Promise<void>;
16
- getMergedRoutes(): {
17
- routes: IMergedRoute[];
18
- warnings: IRouteWarning[];
19
- };
20
- createRoute(route: plugins.smartproxy.IRouteConfig, createdBy: string, enabled?: boolean): Promise<string>;
21
- updateRoute(id: string, patch: {
22
- route?: Partial<plugins.smartproxy.IRouteConfig>;
23
- enabled?: boolean;
24
- }): Promise<boolean>;
25
- deleteRoute(id: string): Promise<boolean>;
26
- toggleRoute(id: string, enabled: boolean): Promise<boolean>;
27
- setOverride(routeName: string, enabled: boolean, updatedBy: string): Promise<void>;
28
- removeOverride(routeName: string): Promise<boolean>;
29
- private loadStoredRoutes;
30
- private loadOverrides;
31
- private persistRoute;
32
- private computeWarnings;
33
- private logWarnings;
34
- private applyRoutes;
35
- }
@@ -1,231 +0,0 @@
1
- import * as plugins from '../plugins.js';
2
- import { logger } from '../logger.js';
3
- const ROUTES_PREFIX = '/config-api/routes/';
4
- const OVERRIDES_PREFIX = '/config-api/overrides/';
5
- export class RouteConfigManager {
6
- storageManager;
7
- getHardcodedRoutes;
8
- getSmartProxy;
9
- storedRoutes = new Map();
10
- overrides = new Map();
11
- warnings = [];
12
- constructor(storageManager, getHardcodedRoutes, getSmartProxy) {
13
- this.storageManager = storageManager;
14
- this.getHardcodedRoutes = getHardcodedRoutes;
15
- this.getSmartProxy = getSmartProxy;
16
- }
17
- /**
18
- * Load persisted routes and overrides, compute warnings, apply to SmartProxy.
19
- */
20
- async initialize() {
21
- await this.loadStoredRoutes();
22
- await this.loadOverrides();
23
- this.computeWarnings();
24
- this.logWarnings();
25
- await this.applyRoutes();
26
- }
27
- // =========================================================================
28
- // Merged view
29
- // =========================================================================
30
- getMergedRoutes() {
31
- const merged = [];
32
- // Hardcoded routes
33
- for (const route of this.getHardcodedRoutes()) {
34
- const name = route.name || '';
35
- const override = this.overrides.get(name);
36
- merged.push({
37
- route,
38
- source: 'hardcoded',
39
- enabled: override ? override.enabled : true,
40
- overridden: !!override,
41
- });
42
- }
43
- // Programmatic routes
44
- for (const stored of this.storedRoutes.values()) {
45
- merged.push({
46
- route: stored.route,
47
- source: 'programmatic',
48
- enabled: stored.enabled,
49
- overridden: false,
50
- storedRouteId: stored.id,
51
- createdAt: stored.createdAt,
52
- updatedAt: stored.updatedAt,
53
- });
54
- }
55
- return { routes: merged, warnings: [...this.warnings] };
56
- }
57
- // =========================================================================
58
- // Programmatic route CRUD
59
- // =========================================================================
60
- async createRoute(route, createdBy, enabled = true) {
61
- const id = plugins.uuid.v4();
62
- const now = Date.now();
63
- // Ensure route has a name
64
- if (!route.name) {
65
- route.name = `programmatic-${id.slice(0, 8)}`;
66
- }
67
- const stored = {
68
- id,
69
- route,
70
- enabled,
71
- createdAt: now,
72
- updatedAt: now,
73
- createdBy,
74
- };
75
- this.storedRoutes.set(id, stored);
76
- await this.persistRoute(stored);
77
- await this.applyRoutes();
78
- return id;
79
- }
80
- async updateRoute(id, patch) {
81
- const stored = this.storedRoutes.get(id);
82
- if (!stored)
83
- return false;
84
- if (patch.route) {
85
- stored.route = { ...stored.route, ...patch.route };
86
- }
87
- if (patch.enabled !== undefined) {
88
- stored.enabled = patch.enabled;
89
- }
90
- stored.updatedAt = Date.now();
91
- await this.persistRoute(stored);
92
- await this.applyRoutes();
93
- return true;
94
- }
95
- async deleteRoute(id) {
96
- if (!this.storedRoutes.has(id))
97
- return false;
98
- this.storedRoutes.delete(id);
99
- await this.storageManager.delete(`${ROUTES_PREFIX}${id}.json`);
100
- await this.applyRoutes();
101
- return true;
102
- }
103
- async toggleRoute(id, enabled) {
104
- return this.updateRoute(id, { enabled });
105
- }
106
- // =========================================================================
107
- // Hardcoded route overrides
108
- // =========================================================================
109
- async setOverride(routeName, enabled, updatedBy) {
110
- const override = {
111
- routeName,
112
- enabled,
113
- updatedAt: Date.now(),
114
- updatedBy,
115
- };
116
- this.overrides.set(routeName, override);
117
- await this.storageManager.setJSON(`${OVERRIDES_PREFIX}${routeName}.json`, override);
118
- this.computeWarnings();
119
- await this.applyRoutes();
120
- }
121
- async removeOverride(routeName) {
122
- if (!this.overrides.has(routeName))
123
- return false;
124
- this.overrides.delete(routeName);
125
- await this.storageManager.delete(`${OVERRIDES_PREFIX}${routeName}.json`);
126
- this.computeWarnings();
127
- await this.applyRoutes();
128
- return true;
129
- }
130
- // =========================================================================
131
- // Private: persistence
132
- // =========================================================================
133
- async loadStoredRoutes() {
134
- const keys = await this.storageManager.list(ROUTES_PREFIX);
135
- for (const key of keys) {
136
- if (!key.endsWith('.json'))
137
- continue;
138
- const stored = await this.storageManager.getJSON(key);
139
- if (stored?.id) {
140
- this.storedRoutes.set(stored.id, stored);
141
- }
142
- }
143
- if (this.storedRoutes.size > 0) {
144
- logger.log('info', `Loaded ${this.storedRoutes.size} programmatic route(s) from storage`);
145
- }
146
- }
147
- async loadOverrides() {
148
- const keys = await this.storageManager.list(OVERRIDES_PREFIX);
149
- for (const key of keys) {
150
- if (!key.endsWith('.json'))
151
- continue;
152
- const override = await this.storageManager.getJSON(key);
153
- if (override?.routeName) {
154
- this.overrides.set(override.routeName, override);
155
- }
156
- }
157
- if (this.overrides.size > 0) {
158
- logger.log('info', `Loaded ${this.overrides.size} route override(s) from storage`);
159
- }
160
- }
161
- async persistRoute(stored) {
162
- await this.storageManager.setJSON(`${ROUTES_PREFIX}${stored.id}.json`, stored);
163
- }
164
- // =========================================================================
165
- // Private: warnings
166
- // =========================================================================
167
- computeWarnings() {
168
- this.warnings = [];
169
- const hardcodedNames = new Set(this.getHardcodedRoutes().map((r) => r.name || ''));
170
- // Check overrides
171
- for (const [routeName, override] of this.overrides) {
172
- if (!hardcodedNames.has(routeName)) {
173
- this.warnings.push({
174
- type: 'orphaned-override',
175
- routeName,
176
- message: `Orphaned override for route '${routeName}' — hardcoded route no longer exists`,
177
- });
178
- }
179
- else if (!override.enabled) {
180
- this.warnings.push({
181
- type: 'disabled-hardcoded',
182
- routeName,
183
- message: `Route '${routeName}' is disabled via API override`,
184
- });
185
- }
186
- }
187
- // Check disabled programmatic routes
188
- for (const stored of this.storedRoutes.values()) {
189
- if (!stored.enabled) {
190
- const name = stored.route.name || stored.id;
191
- this.warnings.push({
192
- type: 'disabled-programmatic',
193
- routeName: name,
194
- message: `Programmatic route '${name}' (id: ${stored.id}) is disabled`,
195
- });
196
- }
197
- }
198
- }
199
- logWarnings() {
200
- for (const w of this.warnings) {
201
- logger.log('warn', w.message);
202
- }
203
- }
204
- // =========================================================================
205
- // Private: apply merged routes to SmartProxy
206
- // =========================================================================
207
- async applyRoutes() {
208
- const smartProxy = this.getSmartProxy();
209
- if (!smartProxy)
210
- return;
211
- const enabledRoutes = [];
212
- // Add enabled hardcoded routes (respecting overrides)
213
- for (const route of this.getHardcodedRoutes()) {
214
- const name = route.name || '';
215
- const override = this.overrides.get(name);
216
- if (override && !override.enabled) {
217
- continue; // Skip disabled hardcoded route
218
- }
219
- enabledRoutes.push(route);
220
- }
221
- // Add enabled programmatic routes
222
- for (const stored of this.storedRoutes.values()) {
223
- if (stored.enabled) {
224
- enabledRoutes.push(stored.route);
225
- }
226
- }
227
- await smartProxy.updateRoutes(enabledRoutes);
228
- logger.log('info', `Applied ${enabledRoutes.length} routes to SmartProxy (${this.storedRoutes.size} programmatic, ${this.overrides.size} overrides)`);
229
- }
230
- }
231
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yb3V0ZS1jb25maWctbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2NvbmZpZy9jbGFzc2VzLnJvdXRlLWNvbmZpZy1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFTdEMsTUFBTSxhQUFhLEdBQUcscUJBQXFCLENBQUM7QUFDNUMsTUFBTSxnQkFBZ0IsR0FBRyx3QkFBd0IsQ0FBQztBQUVsRCxNQUFNLE9BQU8sa0JBQWtCO0lBTW5CO0lBQ0E7SUFDQTtJQVBGLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJQUMvQyxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQTBCLENBQUM7SUFDOUMsUUFBUSxHQUFvQixFQUFFLENBQUM7SUFFdkMsWUFDVSxjQUE4QixFQUM5QixrQkFBMkQsRUFDM0QsYUFBOEQ7UUFGOUQsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBeUM7UUFDM0Qsa0JBQWEsR0FBYixhQUFhLENBQWlEO0lBQ3JFLENBQUM7SUFFSjs7T0FFRztJQUNJLEtBQUssQ0FBQyxVQUFVO1FBQ3JCLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLGNBQWM7SUFDZCw0RUFBNEU7SUFFckUsZUFBZTtRQUNwQixNQUFNLE1BQU0sR0FBbUIsRUFBRSxDQUFDO1FBRWxDLG1CQUFtQjtRQUNuQixLQUFLLE1B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
@@ -1,3 +0,0 @@
1
- export * from './validator.js';
2
- export { RouteConfigManager } from './classes.route-config-manager.js';
3
- export { ApiTokenManager } from './classes.api-token-manager.js';
@@ -1,5 +0,0 @@
1
- // Export validation tools only
2
- export * from './validator.js';
3
- export { RouteConfigManager } from './classes.route-config-manager.js';
4
- export { ApiTokenManager } from './classes.api-token-manager.js';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jb25maWcvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDIn0=
@@ -1,104 +0,0 @@
1
- /**
2
- * Validation result
3
- */
4
- export interface IValidationResult {
5
- /**
6
- * Whether the validation passed
7
- */
8
- valid: boolean;
9
- /**
10
- * Validation errors if any
11
- */
12
- errors?: string[];
13
- /**
14
- * Validated configuration (may include defaults)
15
- */
16
- config?: any;
17
- }
18
- /**
19
- * Validation schema types
20
- */
21
- export type ValidationSchema = Record<string, {
22
- /**
23
- * Type of the value
24
- */
25
- type: 'string' | 'number' | 'boolean' | 'object' | 'array';
26
- /**
27
- * Whether the field is required
28
- */
29
- required?: boolean;
30
- /**
31
- * Default value if not specified
32
- */
33
- default?: any;
34
- /**
35
- * Minimum value (for numbers)
36
- */
37
- min?: number;
38
- /**
39
- * Maximum value (for numbers)
40
- */
41
- max?: number;
42
- /**
43
- * Minimum length (for strings or arrays)
44
- */
45
- minLength?: number;
46
- /**
47
- * Maximum length (for strings or arrays)
48
- */
49
- maxLength?: number;
50
- /**
51
- * Pattern to match (for strings)
52
- */
53
- pattern?: RegExp;
54
- /**
55
- * Allowed values (for strings, numbers)
56
- */
57
- enum?: any[];
58
- /**
59
- * Nested schema (for objects)
60
- */
61
- schema?: ValidationSchema;
62
- /**
63
- * Item schema (for arrays)
64
- */
65
- items?: {
66
- type: 'string' | 'number' | 'boolean' | 'object';
67
- schema?: ValidationSchema;
68
- };
69
- /**
70
- * Custom validation function
71
- */
72
- validate?: (value: any) => boolean | string;
73
- }>;
74
- /**
75
- * Configuration validator
76
- * Validates configuration objects against schemas and provides default values
77
- */
78
- export declare class ConfigValidator {
79
- /**
80
- * Validate a configuration object against a schema
81
- *
82
- * @param config Configuration object to validate
83
- * @param schema Validation schema
84
- * @returns Validation result
85
- */
86
- static validate<T>(config: T, schema: ValidationSchema): IValidationResult;
87
- /**
88
- * Apply defaults to a configuration object based on a schema
89
- *
90
- * @param config Configuration object to apply defaults to
91
- * @param schema Validation schema with defaults
92
- * @returns Configuration with defaults applied
93
- */
94
- static applyDefaults<T>(config: T, schema: ValidationSchema): T;
95
- /**
96
- * Throw a validation error if the configuration is invalid
97
- *
98
- * @param config Configuration to validate
99
- * @param schema Validation schema
100
- * @returns Validated configuration with defaults
101
- * @throws ValidationError if validation fails
102
- */
103
- static validateOrThrow<T>(config: T, schema: ValidationSchema): T;
104
- }