@serve.zone/dcrouter 11.13.0 → 11.14.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 (201) hide show
  1. package/dist_serve/bundle.js +2 -2
  2. package/package.json +1 -1
  3. package/readme.md +107 -3
  4. package/ts/00_commitinfo_data.ts +1 -1
  5. package/ts_web/00_commitinfo_data.ts +1 -1
  6. package/ts_web/readme.md +17 -0
  7. package/ts_web/router.ts +1 -1
  8. package/dist_ts/00_commitinfo_data.d.ts +0 -8
  9. package/dist_ts/00_commitinfo_data.js +0 -9
  10. package/dist_ts/cache/classes.cache.cleaner.d.ts +0 -47
  11. package/dist_ts/cache/classes.cache.cleaner.js +0 -130
  12. package/dist_ts/cache/classes.cached.document.d.ts +0 -76
  13. package/dist_ts/cache/classes.cached.document.js +0 -100
  14. package/dist_ts/cache/classes.cachedb.d.ts +0 -60
  15. package/dist_ts/cache/classes.cachedb.js +0 -126
  16. package/dist_ts/cache/documents/classes.cached.email.d.ts +0 -125
  17. package/dist_ts/cache/documents/classes.cached.email.js +0 -337
  18. package/dist_ts/cache/documents/classes.cached.ip.reputation.d.ts +0 -119
  19. package/dist_ts/cache/documents/classes.cached.ip.reputation.js +0 -323
  20. package/dist_ts/cache/documents/index.d.ts +0 -2
  21. package/dist_ts/cache/documents/index.js +0 -3
  22. package/dist_ts/cache/index.d.ts +0 -4
  23. package/dist_ts/cache/index.js +0 -7
  24. package/dist_ts/classes.cert-provision-scheduler.d.ts +0 -54
  25. package/dist_ts/classes.cert-provision-scheduler.js +0 -118
  26. package/dist_ts/classes.dcrouter.d.ts +0 -386
  27. package/dist_ts/classes.dcrouter.js +0 -1682
  28. package/dist_ts/classes.storage-cert-manager.d.ts +0 -18
  29. package/dist_ts/classes.storage-cert-manager.js +0 -43
  30. package/dist_ts/config/classes.api-token-manager.d.ts +0 -46
  31. package/dist_ts/config/classes.api-token-manager.js +0 -150
  32. package/dist_ts/config/classes.route-config-manager.d.ts +0 -38
  33. package/dist_ts/config/classes.route-config-manager.js +0 -256
  34. package/dist_ts/config/index.d.ts +0 -3
  35. package/dist_ts/config/index.js +0 -5
  36. package/dist_ts/config/validator.d.ts +0 -104
  37. package/dist_ts/config/validator.js +0 -152
  38. package/dist_ts/errors/base.errors.d.ts +0 -224
  39. package/dist_ts/errors/base.errors.js +0 -320
  40. package/dist_ts/errors/error-handler.d.ts +0 -98
  41. package/dist_ts/errors/error-handler.js +0 -282
  42. package/dist_ts/errors/error.codes.d.ts +0 -115
  43. package/dist_ts/errors/error.codes.js +0 -136
  44. package/dist_ts/errors/index.d.ts +0 -54
  45. package/dist_ts/errors/index.js +0 -136
  46. package/dist_ts/errors/reputation.errors.d.ts +0 -183
  47. package/dist_ts/errors/reputation.errors.js +0 -292
  48. package/dist_ts/http3/http3-route-augmentation.d.ts +0 -50
  49. package/dist_ts/http3/http3-route-augmentation.js +0 -98
  50. package/dist_ts/http3/index.d.ts +0 -1
  51. package/dist_ts/http3/index.js +0 -2
  52. package/dist_ts/index.d.ts +0 -8
  53. package/dist_ts/index.js +0 -29
  54. package/dist_ts/logger.d.ts +0 -21
  55. package/dist_ts/logger.js +0 -81
  56. package/dist_ts/monitoring/classes.metricscache.d.ts +0 -32
  57. package/dist_ts/monitoring/classes.metricscache.js +0 -63
  58. package/dist_ts/monitoring/classes.metricsmanager.d.ts +0 -184
  59. package/dist_ts/monitoring/classes.metricsmanager.js +0 -744
  60. package/dist_ts/monitoring/index.d.ts +0 -1
  61. package/dist_ts/monitoring/index.js +0 -2
  62. package/dist_ts/opsserver/classes.opsserver.d.ts +0 -38
  63. package/dist_ts/opsserver/classes.opsserver.js +0 -87
  64. package/dist_ts/opsserver/handlers/admin.handler.d.ts +0 -31
  65. package/dist_ts/opsserver/handlers/admin.handler.js +0 -180
  66. package/dist_ts/opsserver/handlers/api-token.handler.d.ts +0 -6
  67. package/dist_ts/opsserver/handlers/api-token.handler.js +0 -62
  68. package/dist_ts/opsserver/handlers/certificate.handler.d.ts +0 -32
  69. package/dist_ts/opsserver/handlers/certificate.handler.js +0 -421
  70. package/dist_ts/opsserver/handlers/config.handler.d.ts +0 -7
  71. package/dist_ts/opsserver/handlers/config.handler.js +0 -192
  72. package/dist_ts/opsserver/handlers/email-ops.handler.d.ts +0 -30
  73. package/dist_ts/opsserver/handlers/email-ops.handler.js +0 -227
  74. package/dist_ts/opsserver/handlers/index.d.ts +0 -12
  75. package/dist_ts/opsserver/handlers/index.js +0 -13
  76. package/dist_ts/opsserver/handlers/logs.handler.d.ts +0 -25
  77. package/dist_ts/opsserver/handlers/logs.handler.js +0 -256
  78. package/dist_ts/opsserver/handlers/radius.handler.d.ts +0 -6
  79. package/dist_ts/opsserver/handlers/radius.handler.js +0 -295
  80. package/dist_ts/opsserver/handlers/remoteingress.handler.d.ts +0 -6
  81. package/dist_ts/opsserver/handlers/remoteingress.handler.js +0 -156
  82. package/dist_ts/opsserver/handlers/route-management.handler.d.ts +0 -14
  83. package/dist_ts/opsserver/handlers/route-management.handler.js +0 -117
  84. package/dist_ts/opsserver/handlers/security.handler.d.ts +0 -9
  85. package/dist_ts/opsserver/handlers/security.handler.js +0 -233
  86. package/dist_ts/opsserver/handlers/stats.handler.d.ts +0 -11
  87. package/dist_ts/opsserver/handlers/stats.handler.js +0 -403
  88. package/dist_ts/opsserver/handlers/vpn.handler.d.ts +0 -6
  89. package/dist_ts/opsserver/handlers/vpn.handler.js +0 -199
  90. package/dist_ts/opsserver/helpers/guards.d.ts +0 -27
  91. package/dist_ts/opsserver/helpers/guards.js +0 -43
  92. package/dist_ts/opsserver/index.d.ts +0 -1
  93. package/dist_ts/opsserver/index.js +0 -2
  94. package/dist_ts/paths.d.ts +0 -26
  95. package/dist_ts/paths.js +0 -45
  96. package/dist_ts/plugins.d.ts +0 -81
  97. package/dist_ts/plugins.js +0 -115
  98. package/dist_ts/radius/classes.accounting.manager.d.ts +0 -231
  99. package/dist_ts/radius/classes.accounting.manager.js +0 -462
  100. package/dist_ts/radius/classes.radius.server.d.ts +0 -171
  101. package/dist_ts/radius/classes.radius.server.js +0 -386
  102. package/dist_ts/radius/classes.vlan.manager.d.ts +0 -128
  103. package/dist_ts/radius/classes.vlan.manager.js +0 -279
  104. package/dist_ts/radius/index.d.ts +0 -13
  105. package/dist_ts/radius/index.js +0 -14
  106. package/dist_ts/remoteingress/classes.remoteingress-manager.d.ts +0 -94
  107. package/dist_ts/remoteingress/classes.remoteingress-manager.js +0 -271
  108. package/dist_ts/remoteingress/classes.tunnel-manager.d.ts +0 -59
  109. package/dist_ts/remoteingress/classes.tunnel-manager.js +0 -165
  110. package/dist_ts/remoteingress/index.d.ts +0 -2
  111. package/dist_ts/remoteingress/index.js +0 -3
  112. package/dist_ts/security/classes.contentscanner.d.ts +0 -164
  113. package/dist_ts/security/classes.contentscanner.js +0 -642
  114. package/dist_ts/security/classes.ipreputationchecker.d.ts +0 -160
  115. package/dist_ts/security/classes.ipreputationchecker.js +0 -537
  116. package/dist_ts/security/classes.securitylogger.d.ts +0 -144
  117. package/dist_ts/security/classes.securitylogger.js +0 -235
  118. package/dist_ts/security/index.d.ts +0 -3
  119. package/dist_ts/security/index.js +0 -4
  120. package/dist_ts/sms/classes.smsservice.d.ts +0 -15
  121. package/dist_ts/sms/classes.smsservice.js +0 -72
  122. package/dist_ts/sms/config/sms.config.d.ts +0 -93
  123. package/dist_ts/sms/config/sms.config.js +0 -2
  124. package/dist_ts/sms/config/sms.schema.d.ts +0 -5
  125. package/dist_ts/sms/config/sms.schema.js +0 -121
  126. package/dist_ts/sms/index.d.ts +0 -1
  127. package/dist_ts/sms/index.js +0 -2
  128. package/dist_ts/storage/classes.storagemanager.d.ts +0 -83
  129. package/dist_ts/storage/classes.storagemanager.js +0 -348
  130. package/dist_ts/storage/index.d.ts +0 -1
  131. package/dist_ts/storage/index.js +0 -3
  132. package/dist_ts/vpn/classes.vpn-manager.d.ts +0 -113
  133. package/dist_ts/vpn/classes.vpn-manager.js +0 -297
  134. package/dist_ts/vpn/index.d.ts +0 -1
  135. package/dist_ts/vpn/index.js +0 -2
  136. package/dist_ts_apiclient/classes.apitoken.d.ts +0 -41
  137. package/dist_ts_apiclient/classes.apitoken.js +0 -115
  138. package/dist_ts_apiclient/classes.certificate.d.ts +0 -57
  139. package/dist_ts_apiclient/classes.certificate.js +0 -69
  140. package/dist_ts_apiclient/classes.config.d.ts +0 -7
  141. package/dist_ts_apiclient/classes.config.js +0 -11
  142. package/dist_ts_apiclient/classes.dcrouterapiclient.d.ts +0 -41
  143. package/dist_ts_apiclient/classes.dcrouterapiclient.js +0 -81
  144. package/dist_ts_apiclient/classes.email.d.ts +0 -30
  145. package/dist_ts_apiclient/classes.email.js +0 -52
  146. package/dist_ts_apiclient/classes.logs.d.ts +0 -21
  147. package/dist_ts_apiclient/classes.logs.js +0 -14
  148. package/dist_ts_apiclient/classes.radius.d.ts +0 -59
  149. package/dist_ts_apiclient/classes.radius.js +0 -95
  150. package/dist_ts_apiclient/classes.remoteingress.d.ts +0 -54
  151. package/dist_ts_apiclient/classes.remoteingress.js +0 -136
  152. package/dist_ts_apiclient/classes.route.d.ts +0 -42
  153. package/dist_ts_apiclient/classes.route.js +0 -154
  154. package/dist_ts_apiclient/classes.stats.d.ts +0 -47
  155. package/dist_ts_apiclient/classes.stats.js +0 -38
  156. package/dist_ts_apiclient/index.d.ts +0 -10
  157. package/dist_ts_apiclient/index.js +0 -14
  158. package/dist_ts_apiclient/plugins.d.ts +0 -3
  159. package/dist_ts_apiclient/plugins.js +0 -5
  160. package/dist_ts_web/00_commitinfo_data.d.ts +0 -8
  161. package/dist_ts_web/00_commitinfo_data.js +0 -9
  162. package/dist_ts_web/appstate.d.ts +0 -238
  163. package/dist_ts_web/appstate.js +0 -1174
  164. package/dist_ts_web/elements/index.d.ts +0 -13
  165. package/dist_ts_web/elements/index.js +0 -14
  166. package/dist_ts_web/elements/ops-dashboard.d.ts +0 -23
  167. package/dist_ts_web/elements/ops-dashboard.js +0 -323
  168. package/dist_ts_web/elements/ops-view-apitokens.d.ts +0 -13
  169. package/dist_ts_web/elements/ops-view-apitokens.js +0 -371
  170. package/dist_ts_web/elements/ops-view-certificates.d.ts +0 -22
  171. package/dist_ts_web/elements/ops-view-certificates.js +0 -528
  172. package/dist_ts_web/elements/ops-view-config.d.ts +0 -19
  173. package/dist_ts_web/elements/ops-view-config.js +0 -339
  174. package/dist_ts_web/elements/ops-view-emails.d.ts +0 -21
  175. package/dist_ts_web/elements/ops-view-emails.js +0 -165
  176. package/dist_ts_web/elements/ops-view-logs.d.ts +0 -13
  177. package/dist_ts_web/elements/ops-view-logs.js +0 -159
  178. package/dist_ts_web/elements/ops-view-network.d.ts +0 -71
  179. package/dist_ts_web/elements/ops-view-network.js +0 -764
  180. package/dist_ts_web/elements/ops-view-overview.d.ts +0 -22
  181. package/dist_ts_web/elements/ops-view-overview.js +0 -456
  182. package/dist_ts_web/elements/ops-view-remoteingress.d.ts +0 -20
  183. package/dist_ts_web/elements/ops-view-remoteingress.js +0 -494
  184. package/dist_ts_web/elements/ops-view-routes.d.ts +0 -12
  185. package/dist_ts_web/elements/ops-view-routes.js +0 -404
  186. package/dist_ts_web/elements/ops-view-security.d.ts +0 -21
  187. package/dist_ts_web/elements/ops-view-security.js +0 -574
  188. package/dist_ts_web/elements/ops-view-vpn.d.ts +0 -14
  189. package/dist_ts_web/elements/ops-view-vpn.js +0 -369
  190. package/dist_ts_web/elements/shared/css.d.ts +0 -1
  191. package/dist_ts_web/elements/shared/css.js +0 -10
  192. package/dist_ts_web/elements/shared/index.d.ts +0 -2
  193. package/dist_ts_web/elements/shared/index.js +0 -3
  194. package/dist_ts_web/elements/shared/ops-sectionheading.d.ts +0 -5
  195. package/dist_ts_web/elements/shared/ops-sectionheading.js +0 -82
  196. package/dist_ts_web/index.d.ts +0 -1
  197. package/dist_ts_web/index.js +0 -10
  198. package/dist_ts_web/plugins.d.ts +0 -6
  199. package/dist_ts_web/plugins.js +0 -11
  200. package/dist_ts_web/router.d.ts +0 -19
  201. package/dist_ts_web/router.js +0 -91
@@ -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,38 +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
- import { type IHttp3Config } from '../http3/index.js';
5
- export declare class RouteConfigManager {
6
- private storageManager;
7
- private getHardcodedRoutes;
8
- private getSmartProxy;
9
- private getHttp3Config?;
10
- private getVpnSubnet?;
11
- private storedRoutes;
12
- private overrides;
13
- private warnings;
14
- constructor(storageManager: StorageManager, getHardcodedRoutes: () => plugins.smartproxy.IRouteConfig[], getSmartProxy: () => plugins.smartproxy.SmartProxy | undefined, getHttp3Config?: (() => IHttp3Config | undefined) | undefined, getVpnSubnet?: (() => string | undefined) | undefined);
15
- /**
16
- * Load persisted routes and overrides, compute warnings, apply to SmartProxy.
17
- */
18
- initialize(): Promise<void>;
19
- getMergedRoutes(): {
20
- routes: IMergedRoute[];
21
- warnings: IRouteWarning[];
22
- };
23
- createRoute(route: plugins.smartproxy.IRouteConfig, createdBy: string, enabled?: boolean): Promise<string>;
24
- updateRoute(id: string, patch: {
25
- route?: Partial<plugins.smartproxy.IRouteConfig>;
26
- enabled?: boolean;
27
- }): Promise<boolean>;
28
- deleteRoute(id: string): Promise<boolean>;
29
- toggleRoute(id: string, enabled: boolean): Promise<boolean>;
30
- setOverride(routeName: string, enabled: boolean, updatedBy: string): Promise<void>;
31
- removeOverride(routeName: string): Promise<boolean>;
32
- private loadStoredRoutes;
33
- private loadOverrides;
34
- private persistRoute;
35
- private computeWarnings;
36
- private logWarnings;
37
- private applyRoutes;
38
- }
@@ -1,256 +0,0 @@
1
- import * as plugins from '../plugins.js';
2
- import { logger } from '../logger.js';
3
- import { augmentRouteWithHttp3 } from '../http3/index.js';
4
- const ROUTES_PREFIX = '/config-api/routes/';
5
- const OVERRIDES_PREFIX = '/config-api/overrides/';
6
- export class RouteConfigManager {
7
- storageManager;
8
- getHardcodedRoutes;
9
- getSmartProxy;
10
- getHttp3Config;
11
- getVpnSubnet;
12
- storedRoutes = new Map();
13
- overrides = new Map();
14
- warnings = [];
15
- constructor(storageManager, getHardcodedRoutes, getSmartProxy, getHttp3Config, getVpnSubnet) {
16
- this.storageManager = storageManager;
17
- this.getHardcodedRoutes = getHardcodedRoutes;
18
- this.getSmartProxy = getSmartProxy;
19
- this.getHttp3Config = getHttp3Config;
20
- this.getVpnSubnet = getVpnSubnet;
21
- }
22
- /**
23
- * Load persisted routes and overrides, compute warnings, apply to SmartProxy.
24
- */
25
- async initialize() {
26
- await this.loadStoredRoutes();
27
- await this.loadOverrides();
28
- this.computeWarnings();
29
- this.logWarnings();
30
- await this.applyRoutes();
31
- }
32
- // =========================================================================
33
- // Merged view
34
- // =========================================================================
35
- getMergedRoutes() {
36
- const merged = [];
37
- // Hardcoded routes
38
- for (const route of this.getHardcodedRoutes()) {
39
- const name = route.name || '';
40
- const override = this.overrides.get(name);
41
- merged.push({
42
- route,
43
- source: 'hardcoded',
44
- enabled: override ? override.enabled : true,
45
- overridden: !!override,
46
- });
47
- }
48
- // Programmatic routes
49
- for (const stored of this.storedRoutes.values()) {
50
- merged.push({
51
- route: stored.route,
52
- source: 'programmatic',
53
- enabled: stored.enabled,
54
- overridden: false,
55
- storedRouteId: stored.id,
56
- createdAt: stored.createdAt,
57
- updatedAt: stored.updatedAt,
58
- });
59
- }
60
- return { routes: merged, warnings: [...this.warnings] };
61
- }
62
- // =========================================================================
63
- // Programmatic route CRUD
64
- // =========================================================================
65
- async createRoute(route, createdBy, enabled = true) {
66
- const id = plugins.uuid.v4();
67
- const now = Date.now();
68
- // Ensure route has a name
69
- if (!route.name) {
70
- route.name = `programmatic-${id.slice(0, 8)}`;
71
- }
72
- const stored = {
73
- id,
74
- route,
75
- enabled,
76
- createdAt: now,
77
- updatedAt: now,
78
- createdBy,
79
- };
80
- this.storedRoutes.set(id, stored);
81
- await this.persistRoute(stored);
82
- await this.applyRoutes();
83
- return id;
84
- }
85
- async updateRoute(id, patch) {
86
- const stored = this.storedRoutes.get(id);
87
- if (!stored)
88
- return false;
89
- if (patch.route) {
90
- stored.route = { ...stored.route, ...patch.route };
91
- }
92
- if (patch.enabled !== undefined) {
93
- stored.enabled = patch.enabled;
94
- }
95
- stored.updatedAt = Date.now();
96
- await this.persistRoute(stored);
97
- await this.applyRoutes();
98
- return true;
99
- }
100
- async deleteRoute(id) {
101
- if (!this.storedRoutes.has(id))
102
- return false;
103
- this.storedRoutes.delete(id);
104
- await this.storageManager.delete(`${ROUTES_PREFIX}${id}.json`);
105
- await this.applyRoutes();
106
- return true;
107
- }
108
- async toggleRoute(id, enabled) {
109
- return this.updateRoute(id, { enabled });
110
- }
111
- // =========================================================================
112
- // Hardcoded route overrides
113
- // =========================================================================
114
- async setOverride(routeName, enabled, updatedBy) {
115
- const override = {
116
- routeName,
117
- enabled,
118
- updatedAt: Date.now(),
119
- updatedBy,
120
- };
121
- this.overrides.set(routeName, override);
122
- await this.storageManager.setJSON(`${OVERRIDES_PREFIX}${routeName}.json`, override);
123
- this.computeWarnings();
124
- await this.applyRoutes();
125
- }
126
- async removeOverride(routeName) {
127
- if (!this.overrides.has(routeName))
128
- return false;
129
- this.overrides.delete(routeName);
130
- await this.storageManager.delete(`${OVERRIDES_PREFIX}${routeName}.json`);
131
- this.computeWarnings();
132
- await this.applyRoutes();
133
- return true;
134
- }
135
- // =========================================================================
136
- // Private: persistence
137
- // =========================================================================
138
- async loadStoredRoutes() {
139
- const keys = await this.storageManager.list(ROUTES_PREFIX);
140
- for (const key of keys) {
141
- if (!key.endsWith('.json'))
142
- continue;
143
- const stored = await this.storageManager.getJSON(key);
144
- if (stored?.id) {
145
- this.storedRoutes.set(stored.id, stored);
146
- }
147
- }
148
- if (this.storedRoutes.size > 0) {
149
- logger.log('info', `Loaded ${this.storedRoutes.size} programmatic route(s) from storage`);
150
- }
151
- }
152
- async loadOverrides() {
153
- const keys = await this.storageManager.list(OVERRIDES_PREFIX);
154
- for (const key of keys) {
155
- if (!key.endsWith('.json'))
156
- continue;
157
- const override = await this.storageManager.getJSON(key);
158
- if (override?.routeName) {
159
- this.overrides.set(override.routeName, override);
160
- }
161
- }
162
- if (this.overrides.size > 0) {
163
- logger.log('info', `Loaded ${this.overrides.size} route override(s) from storage`);
164
- }
165
- }
166
- async persistRoute(stored) {
167
- await this.storageManager.setJSON(`${ROUTES_PREFIX}${stored.id}.json`, stored);
168
- }
169
- // =========================================================================
170
- // Private: warnings
171
- // =========================================================================
172
- computeWarnings() {
173
- this.warnings = [];
174
- const hardcodedNames = new Set(this.getHardcodedRoutes().map((r) => r.name || ''));
175
- // Check overrides
176
- for (const [routeName, override] of this.overrides) {
177
- if (!hardcodedNames.has(routeName)) {
178
- this.warnings.push({
179
- type: 'orphaned-override',
180
- routeName,
181
- message: `Orphaned override for route '${routeName}' — hardcoded route no longer exists`,
182
- });
183
- }
184
- else if (!override.enabled) {
185
- this.warnings.push({
186
- type: 'disabled-hardcoded',
187
- routeName,
188
- message: `Route '${routeName}' is disabled via API override`,
189
- });
190
- }
191
- }
192
- // Check disabled programmatic routes
193
- for (const stored of this.storedRoutes.values()) {
194
- if (!stored.enabled) {
195
- const name = stored.route.name || stored.id;
196
- this.warnings.push({
197
- type: 'disabled-programmatic',
198
- routeName: name,
199
- message: `Programmatic route '${name}' (id: ${stored.id}) is disabled`,
200
- });
201
- }
202
- }
203
- }
204
- logWarnings() {
205
- for (const w of this.warnings) {
206
- logger.log('warn', w.message);
207
- }
208
- }
209
- // =========================================================================
210
- // Private: apply merged routes to SmartProxy
211
- // =========================================================================
212
- async applyRoutes() {
213
- const smartProxy = this.getSmartProxy();
214
- if (!smartProxy)
215
- return;
216
- const enabledRoutes = [];
217
- // Add enabled hardcoded routes (respecting overrides)
218
- for (const route of this.getHardcodedRoutes()) {
219
- const name = route.name || '';
220
- const override = this.overrides.get(name);
221
- if (override && !override.enabled) {
222
- continue; // Skip disabled hardcoded route
223
- }
224
- enabledRoutes.push(route);
225
- }
226
- // Add enabled programmatic routes (with HTTP/3 augmentation if enabled)
227
- const http3Config = this.getHttp3Config?.();
228
- const vpnSubnet = this.getVpnSubnet?.();
229
- for (const stored of this.storedRoutes.values()) {
230
- if (stored.enabled) {
231
- let route = stored.route;
232
- if (http3Config && http3Config.enabled !== false) {
233
- route = augmentRouteWithHttp3(route, { enabled: true, ...http3Config });
234
- }
235
- // Inject VPN security for programmatic routes with vpn.required
236
- if (vpnSubnet) {
237
- const dcRoute = route;
238
- if (dcRoute.vpn?.required) {
239
- const existing = route.security?.ipAllowList || [];
240
- route = {
241
- ...route,
242
- security: {
243
- ...route.security,
244
- ipAllowList: [...existing, vpnSubnet],
245
- },
246
- };
247
- }
248
- }
249
- enabledRoutes.push(route);
250
- }
251
- }
252
- await smartProxy.updateRoutes(enabledRoutes);
253
- logger.log('info', `Applied ${enabledRoutes.length} routes to SmartProxy (${this.storedRoutes.size} programmatic, ${this.overrides.size} overrides)`);
254
- }
255
- }
256
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yb3V0ZS1jb25maWctbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2NvbmZpZy9jbGFzc2VzLnJvdXRlLWNvbmZpZy1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFTdEMsT0FBTyxFQUFxQixxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTdFLE1BQU0sYUFBYSxHQUFHLHFCQUFxQixDQUFDO0FBQzVDLE1BQU0sZ0JBQWdCLEdBQUcsd0JBQXdCLENBQUM7QUFFbEQsTUFBTSxPQUFPLGtCQUFrQjtJQU1uQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBVEYsWUFBWSxHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO0lBQy9DLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBMEIsQ0FBQztJQUM5QyxRQUFRLEdBQW9CLEVBQUUsQ0FBQztJQUV2QyxZQUNVLGNBQThCLEVBQzlCLGtCQUEyRCxFQUMzRCxhQUE4RCxFQUM5RCxjQUErQyxFQUMvQyxZQUF1QztRQUp2QyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUF5QztRQUMzRCxrQkFBYSxHQUFiLGFBQWEsQ0FBaUQ7UUFDOUQsbUJBQWMsR0FBZCxjQUFjLENBQWlDO1FBQy9DLGlCQUFZLEdBQVosWUFBWSxDQUEyQjtJQUM5QyxDQUFDO0lBRUo7O09BRUc7SUFDSSxLQUFLLENBQUMsVUFBVTtRQUNyQixNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzlCLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsTUFBTSxJQUFJ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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=