@serve.zone/dcrouter 13.7.0 → 13.8.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 (45) hide show
  1. package/dist_serve/bundle.js +707 -563
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/acme/index.d.ts +1 -0
  4. package/dist_ts/acme/index.js +2 -0
  5. package/dist_ts/acme/manager.acme-config.d.ts +48 -0
  6. package/dist_ts/acme/manager.acme-config.js +156 -0
  7. package/dist_ts/classes.dcrouter.d.ts +2 -0
  8. package/dist_ts/classes.dcrouter.js +58 -20
  9. package/dist_ts/db/documents/classes.acme-config.doc.d.ts +22 -0
  10. package/dist_ts/db/documents/classes.acme-config.doc.js +121 -0
  11. package/dist_ts/db/documents/index.d.ts +1 -0
  12. package/dist_ts/db/documents/index.js +3 -1
  13. package/dist_ts/opsserver/classes.opsserver.d.ts +1 -0
  14. package/dist_ts/opsserver/classes.opsserver.js +3 -1
  15. package/dist_ts/opsserver/handlers/acme-config.handler.d.ts +16 -0
  16. package/dist_ts/opsserver/handlers/acme-config.handler.js +77 -0
  17. package/dist_ts/opsserver/handlers/index.d.ts +1 -0
  18. package/dist_ts/opsserver/handlers/index.js +2 -1
  19. package/dist_ts_interfaces/data/acme-config.d.ts +25 -0
  20. package/dist_ts_interfaces/data/acme-config.js +2 -0
  21. package/dist_ts_interfaces/data/index.d.ts +1 -0
  22. package/dist_ts_interfaces/data/index.js +2 -1
  23. package/dist_ts_interfaces/data/route-management.d.ts +1 -1
  24. package/dist_ts_interfaces/requests/acme-config.d.ts +42 -0
  25. package/dist_ts_interfaces/requests/acme-config.js +2 -0
  26. package/dist_ts_interfaces/requests/index.d.ts +1 -0
  27. package/dist_ts_interfaces/requests/index.js +2 -1
  28. package/dist_ts_web/00_commitinfo_data.js +1 -1
  29. package/dist_ts_web/appstate.d.ts +15 -0
  30. package/dist_ts_web/appstate.js +60 -1
  31. package/dist_ts_web/elements/domains/ops-view-certificates.d.ts +3 -0
  32. package/dist_ts_web/elements/domains/ops-view-certificates.js +208 -4
  33. package/package.json +1 -1
  34. package/ts/00_commitinfo_data.ts +1 -1
  35. package/ts/acme/index.ts +1 -0
  36. package/ts/acme/manager.acme-config.ts +182 -0
  37. package/ts/classes.dcrouter.ts +72 -25
  38. package/ts/db/documents/classes.acme-config.doc.ts +49 -0
  39. package/ts/db/documents/index.ts +3 -0
  40. package/ts/opsserver/classes.opsserver.ts +2 -0
  41. package/ts/opsserver/handlers/acme-config.handler.ts +94 -0
  42. package/ts/opsserver/handlers/index.ts +2 -1
  43. package/ts_web/00_commitinfo_data.ts +1 -1
  44. package/ts_web/appstate.ts +88 -0
  45. package/ts_web/elements/domains/ops-view-certificates.ts +205 -2
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/dcrouter',
6
- version: '13.7.0',
6
+ version: '13.8.0',
7
7
  description: 'A multifaceted routing service handling mail and SMS delivery functions.'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxzQkFBc0I7SUFDNUIsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLDBFQUEwRTtDQUN4RixDQUFBIn0=
@@ -0,0 +1 @@
1
+ export * from './manager.acme-config.js';
@@ -0,0 +1,2 @@
1
+ export * from './manager.acme-config.js';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9hY21lL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsMEJBQTBCLENBQUMifQ==
@@ -0,0 +1,48 @@
1
+ import type { IDcRouterOptions } from '../classes.dcrouter.js';
2
+ import type { IAcmeConfig } from '../../dist_ts_interfaces/data/acme-config.js';
3
+ /**
4
+ * AcmeConfigManager — owns the singleton ACME configuration in the DB.
5
+ *
6
+ * Lifecycle:
7
+ * - `start()` — loads from the DB; if empty, seeds from legacy constructor
8
+ * fields (`tls.contactEmail`, `smartProxyConfig.acme.*`) on first boot.
9
+ * - `getConfig()` — returns the in-memory cached `IAcmeConfig` (or null)
10
+ * - `updateConfig(args, updatedBy)` — upserts and refreshes the cache
11
+ *
12
+ * Reload semantics: updates take effect on the next dcrouter restart because
13
+ * `SmartAcme` is instantiated once in `setupSmartProxy()`. `renewThresholdDays`
14
+ * applies immediately to the next renewal check. See
15
+ * `ts_web/elements/domains/ops-view-certificates.ts` for the UI warning.
16
+ */
17
+ export declare class AcmeConfigManager {
18
+ private options;
19
+ private cached;
20
+ constructor(options: IDcRouterOptions);
21
+ start(): Promise<void>;
22
+ stop(): Promise<void>;
23
+ /**
24
+ * Returns the current ACME config, or null if not configured.
25
+ * In-memory — does not hit the DB.
26
+ */
27
+ getConfig(): IAcmeConfig | null;
28
+ /**
29
+ * True if there is an enabled ACME config. Used by `setupSmartProxy()` to
30
+ * decide whether to instantiate SmartAcme.
31
+ */
32
+ hasEnabledConfig(): boolean;
33
+ /**
34
+ * Upsert the ACME config. All fields are optional; missing fields are
35
+ * preserved from the existing row (or defaulted if there is no row yet).
36
+ */
37
+ updateConfig(args: Partial<Omit<IAcmeConfig, 'updatedAt' | 'updatedBy'>>, updatedBy: string): Promise<IAcmeConfig>;
38
+ /**
39
+ * Build a seed object from the legacy constructor fields. Returns null
40
+ * if the user has not provided any of them.
41
+ *
42
+ * Supports BOTH `tls.contactEmail` (short form) and `smartProxyConfig.acme`
43
+ * (full form). `smartProxyConfig.acme` wins when both are present.
44
+ */
45
+ private deriveSeedFromOptions;
46
+ private createSeedDoc;
47
+ private toPlain;
48
+ }
@@ -0,0 +1,156 @@
1
+ import { logger } from '../logger.js';
2
+ import { AcmeConfigDoc } from '../db/documents/index.js';
3
+ /**
4
+ * AcmeConfigManager — owns the singleton ACME configuration in the DB.
5
+ *
6
+ * Lifecycle:
7
+ * - `start()` — loads from the DB; if empty, seeds from legacy constructor
8
+ * fields (`tls.contactEmail`, `smartProxyConfig.acme.*`) on first boot.
9
+ * - `getConfig()` — returns the in-memory cached `IAcmeConfig` (or null)
10
+ * - `updateConfig(args, updatedBy)` — upserts and refreshes the cache
11
+ *
12
+ * Reload semantics: updates take effect on the next dcrouter restart because
13
+ * `SmartAcme` is instantiated once in `setupSmartProxy()`. `renewThresholdDays`
14
+ * applies immediately to the next renewal check. See
15
+ * `ts_web/elements/domains/ops-view-certificates.ts` for the UI warning.
16
+ */
17
+ export class AcmeConfigManager {
18
+ options;
19
+ cached = null;
20
+ constructor(options) {
21
+ this.options = options;
22
+ }
23
+ async start() {
24
+ logger.log('info', 'AcmeConfigManager: starting');
25
+ let doc = await AcmeConfigDoc.load();
26
+ if (!doc) {
27
+ // First-boot path: seed from legacy constructor fields if present.
28
+ const seed = this.deriveSeedFromOptions();
29
+ if (seed) {
30
+ doc = await this.createSeedDoc(seed);
31
+ logger.log('info', `AcmeConfigManager: seeded from constructor legacy fields (accountEmail=${seed.accountEmail}, useProduction=${seed.useProduction})`);
32
+ }
33
+ else {
34
+ logger.log('info', 'AcmeConfigManager: no AcmeConfig in DB and no legacy constructor fields — ACME disabled until configured via Domains > Certificates > Settings.');
35
+ }
36
+ }
37
+ else if (this.deriveSeedFromOptions()) {
38
+ logger.log('warn', 'AcmeConfigManager: ignoring constructor tls.contactEmail / smartProxyConfig.acme — DB already has AcmeConfigDoc. Manage via Domains > Certificates > Settings.');
39
+ }
40
+ this.cached = doc ? this.toPlain(doc) : null;
41
+ if (this.cached) {
42
+ logger.log('info', `AcmeConfigManager: loaded ACME config (accountEmail=${this.cached.accountEmail}, enabled=${this.cached.enabled}, useProduction=${this.cached.useProduction})`);
43
+ }
44
+ }
45
+ async stop() {
46
+ this.cached = null;
47
+ }
48
+ /**
49
+ * Returns the current ACME config, or null if not configured.
50
+ * In-memory — does not hit the DB.
51
+ */
52
+ getConfig() {
53
+ return this.cached;
54
+ }
55
+ /**
56
+ * True if there is an enabled ACME config. Used by `setupSmartProxy()` to
57
+ * decide whether to instantiate SmartAcme.
58
+ */
59
+ hasEnabledConfig() {
60
+ return this.cached !== null && this.cached.enabled;
61
+ }
62
+ /**
63
+ * Upsert the ACME config. All fields are optional; missing fields are
64
+ * preserved from the existing row (or defaulted if there is no row yet).
65
+ */
66
+ async updateConfig(args, updatedBy) {
67
+ let doc = await AcmeConfigDoc.load();
68
+ const now = Date.now();
69
+ if (!doc) {
70
+ doc = new AcmeConfigDoc();
71
+ doc.configId = 'acme-config';
72
+ doc.accountEmail = args.accountEmail ?? '';
73
+ doc.enabled = args.enabled ?? true;
74
+ doc.useProduction = args.useProduction ?? true;
75
+ doc.autoRenew = args.autoRenew ?? true;
76
+ doc.renewThresholdDays = args.renewThresholdDays ?? 30;
77
+ }
78
+ else {
79
+ if (args.accountEmail !== undefined)
80
+ doc.accountEmail = args.accountEmail;
81
+ if (args.enabled !== undefined)
82
+ doc.enabled = args.enabled;
83
+ if (args.useProduction !== undefined)
84
+ doc.useProduction = args.useProduction;
85
+ if (args.autoRenew !== undefined)
86
+ doc.autoRenew = args.autoRenew;
87
+ if (args.renewThresholdDays !== undefined)
88
+ doc.renewThresholdDays = args.renewThresholdDays;
89
+ }
90
+ doc.updatedAt = now;
91
+ doc.updatedBy = updatedBy;
92
+ await doc.save();
93
+ this.cached = this.toPlain(doc);
94
+ return this.cached;
95
+ }
96
+ // ==========================================================================
97
+ // Internal helpers
98
+ // ==========================================================================
99
+ /**
100
+ * Build a seed object from the legacy constructor fields. Returns null
101
+ * if the user has not provided any of them.
102
+ *
103
+ * Supports BOTH `tls.contactEmail` (short form) and `smartProxyConfig.acme`
104
+ * (full form). `smartProxyConfig.acme` wins when both are present.
105
+ */
106
+ deriveSeedFromOptions() {
107
+ const acme = this.options.smartProxyConfig?.acme;
108
+ const tls = this.options.tls;
109
+ // Prefer the explicit smartProxyConfig.acme block if present.
110
+ if (acme?.accountEmail) {
111
+ return {
112
+ accountEmail: acme.accountEmail,
113
+ enabled: acme.enabled !== false,
114
+ useProduction: acme.useProduction !== false,
115
+ autoRenew: acme.autoRenew !== false,
116
+ renewThresholdDays: acme.renewThresholdDays ?? 30,
117
+ };
118
+ }
119
+ // Fall back to the short tls.contactEmail form.
120
+ if (tls?.contactEmail) {
121
+ return {
122
+ accountEmail: tls.contactEmail,
123
+ enabled: true,
124
+ useProduction: true,
125
+ autoRenew: true,
126
+ renewThresholdDays: 30,
127
+ };
128
+ }
129
+ return null;
130
+ }
131
+ async createSeedDoc(seed) {
132
+ const doc = new AcmeConfigDoc();
133
+ doc.configId = 'acme-config';
134
+ doc.accountEmail = seed.accountEmail;
135
+ doc.enabled = seed.enabled;
136
+ doc.useProduction = seed.useProduction;
137
+ doc.autoRenew = seed.autoRenew;
138
+ doc.renewThresholdDays = seed.renewThresholdDays;
139
+ doc.updatedAt = Date.now();
140
+ doc.updatedBy = 'seed';
141
+ await doc.save();
142
+ return doc;
143
+ }
144
+ toPlain(doc) {
145
+ return {
146
+ accountEmail: doc.accountEmail,
147
+ enabled: doc.enabled,
148
+ useProduction: doc.useProduction,
149
+ autoRenew: doc.autoRenew,
150
+ renewThresholdDays: doc.renewThresholdDays,
151
+ updatedAt: doc.updatedAt,
152
+ updatedBy: doc.updatedBy,
153
+ };
154
+ }
155
+ }
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlci5hY21lLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2FjbWUvbWFuYWdlci5hY21lLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUl6RDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQUdSO0lBRlosTUFBTSxHQUF1QixJQUFJLENBQUM7SUFFMUMsWUFBb0IsT0FBeUI7UUFBekIsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7SUFBRyxDQUFDO0lBRTFDLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLDZCQUE2QixDQUFDLENBQUM7UUFDbEQsSUFBSSxHQUFHLEdBQUcsTUFBTSxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFckMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1QsbUVBQW1FO1lBQ25FLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQzFDLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ1QsR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDckMsTUFBTSxDQUFDLEdBQUcsQ0FDUixNQUFNLEVBQ04sMEVBQTBFLElBQUksQ0FBQyxZQUFZLG1CQUFtQixJQUFJLENBQUMsYUFBYSxHQUFHLENBQ3BJLENBQUM7WUFDSixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxDQUFDLEdBQUcsQ0FDUixNQUFNLEVBQ04saUpBQWlKLENBQ2xKLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLEVBQUUsQ0FBQztZQUN4QyxNQUFNLENBQUMs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
@@ -11,6 +11,7 @@ import { VpnManager } from './vpn/index.js';
11
11
  import { RouteConfigManager, ApiTokenManager, ReferenceResolver, TargetProfileManager } from './config/index.js';
12
12
  import { type IHttp3Config } from './http3/index.js';
13
13
  import { DnsManager } from './dns/manager.dns.js';
14
+ import { AcmeConfigManager } from './acme/manager.acme-config.js';
14
15
  export interface IDcRouterOptions {
15
16
  /** Base directory for all dcrouter data. Defaults to ~/.serve.zone/dcrouter */
16
17
  baseDir?: string;
@@ -220,6 +221,7 @@ export declare class DcRouter {
220
221
  referenceResolver?: ReferenceResolver;
221
222
  targetProfileManager?: TargetProfileManager;
222
223
  dnsManager?: DnsManager;
224
+ acmeConfigManager?: AcmeConfigManager;
223
225
  detectedPublicIp: string | null;
224
226
  private dnsLogWindowSecond;
225
227
  private dnsLogWindowCount;