@serve.zone/dcrouter 16.3.0 → 16.4.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.
@@ -2,6 +2,7 @@ import { DeesElement, type TemplateResult } from '@design.estate/dees-element';
2
2
  import * as appstate from '../../appstate.js';
3
3
  import { type TRouteOwnerFilter } from './route-view-filters.js';
4
4
  export declare class OpsViewSpecialForwards extends DeesElement {
5
+ accessor embedded: boolean;
5
6
  accessor ownerFilter: TRouteOwnerFilter;
6
7
  accessor routeState: appstate.IRouteManagementState;
7
8
  accessor profilesTargetsState: appstate.IProfilesTargetsState;
@@ -9,6 +10,6 @@ export declare class OpsViewSpecialForwards extends DeesElement {
9
10
  static styles: import("@design.estate/dees-element").CSSResult[];
10
11
  render(): TemplateResult;
11
12
  private refreshData;
12
- private showForwardDialog;
13
+ private getHeaderActions;
13
14
  private confirmDelete;
14
15
  }
@@ -33,41 +33,21 @@ var __runInitializers = (this && this.__runInitializers) || function (thisArg, i
33
33
  return useValue ? value : void 0;
34
34
  };
35
35
  import { DeesElement, css, cssManager, customElement, html, property, state, } from '@design.estate/dees-element';
36
+ import {} from '@design.estate/dees-catalog';
36
37
  import * as appstate from '../../appstate.js';
37
38
  import * as interfaces from '../../../dist_ts_interfaces/index.js';
38
39
  import { viewHostCss } from '../shared/css.js';
39
40
  import { getRouteOwner, routeMatchesOwner, } from './route-view-filters.js';
40
- const managedRouteKind = 'letsencrypt-http01-forward';
41
- function getDropdownKey(value) {
42
- return typeof value === 'string'
43
- ? value
44
- : value && typeof value === 'object' && 'key' in value
45
- ? String(value.key)
46
- : '';
47
- }
48
- function getDomains(route) {
49
- const domains = route.route.match.domains;
50
- if (!domains)
51
- return [];
52
- return Array.isArray(domains) ? domains : [domains];
53
- }
54
- function getTarget(route) {
55
- const target = route.route.action.targets?.[0];
56
- if (!target || typeof target.port !== 'number')
57
- return undefined;
58
- const host = typeof target.host === 'string'
59
- ? target.host
60
- : Array.isArray(target.host)
61
- ? target.host[0]
62
- : undefined;
63
- return host ? { host, port: target.port } : undefined;
64
- }
41
+ import { getSpecialForwardDomains, getSpecialForwardTarget, letsEncryptHttp01ManagedRouteKind, showLetsEncryptHttp01ForwardDialog, } from './special-forward-dialog.js';
65
42
  let OpsViewSpecialForwards = (() => {
66
43
  let _classDecorators = [customElement('ops-view-special-forwards')];
67
44
  let _classDescriptor;
68
45
  let _classExtraInitializers = [];
69
46
  let _classThis;
70
47
  let _classSuper = DeesElement;
48
+ let _embedded_decorators;
49
+ let _embedded_initializers = [];
50
+ let _embedded_extraInitializers = [];
71
51
  let _ownerFilter_decorators;
72
52
  let _ownerFilter_initializers = [];
73
53
  let _ownerFilter_extraInitializers = [];
@@ -81,9 +61,11 @@ let OpsViewSpecialForwards = (() => {
81
61
  static { _classThis = this; }
82
62
  static {
83
63
  const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
64
+ _embedded_decorators = [property({ type: Boolean, reflect: true })];
84
65
  _ownerFilter_decorators = [property({ type: String })];
85
66
  _routeState_decorators = [state()];
86
67
  _profilesTargetsState_decorators = [state()];
68
+ __esDecorate(this, null, _embedded_decorators, { kind: "accessor", name: "embedded", static: false, private: false, access: { has: obj => "embedded" in obj, get: obj => obj.embedded, set: (obj, value) => { obj.embedded = value; } }, metadata: _metadata }, _embedded_initializers, _embedded_extraInitializers);
87
69
  __esDecorate(this, null, _ownerFilter_decorators, { kind: "accessor", name: "ownerFilter", static: false, private: false, access: { has: obj => "ownerFilter" in obj, get: obj => obj.ownerFilter, set: (obj, value) => { obj.ownerFilter = value; } }, metadata: _metadata }, _ownerFilter_initializers, _ownerFilter_extraInitializers);
88
70
  __esDecorate(this, null, _routeState_decorators, { kind: "accessor", name: "routeState", static: false, private: false, access: { has: obj => "routeState" in obj, get: obj => obj.routeState, set: (obj, value) => { obj.routeState = value; } }, metadata: _metadata }, _routeState_initializers, _routeState_extraInitializers);
89
71
  __esDecorate(this, null, _profilesTargetsState_decorators, { kind: "accessor", name: "profilesTargetsState", static: false, private: false, access: { has: obj => "profilesTargetsState" in obj, get: obj => obj.profilesTargetsState, set: (obj, value) => { obj.profilesTargetsState = value; } }, metadata: _metadata }, _profilesTargetsState_initializers, _profilesTargetsState_extraInitializers);
@@ -91,7 +73,10 @@ let OpsViewSpecialForwards = (() => {
91
73
  OpsViewSpecialForwards = _classThis = _classDescriptor.value;
92
74
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
93
75
  }
94
- #ownerFilter_accessor_storage = __runInitializers(this, _ownerFilter_initializers, 'all');
76
+ #embedded_accessor_storage = __runInitializers(this, _embedded_initializers, false);
77
+ get embedded() { return this.#embedded_accessor_storage; }
78
+ set embedded(value) { this.#embedded_accessor_storage = value; }
79
+ #ownerFilter_accessor_storage = (__runInitializers(this, _embedded_extraInitializers), __runInitializers(this, _ownerFilter_initializers, 'all'));
95
80
  get ownerFilter() { return this.#ownerFilter_accessor_storage; }
96
81
  set ownerFilter(value) { this.#ownerFilter_accessor_storage = value; }
97
82
  #routeState_accessor_storage = (__runInitializers(this, _ownerFilter_extraInitializers), __runInitializers(this, _routeState_initializers, appstate.routeManagementStatePart.getState()));
@@ -117,6 +102,12 @@ let OpsViewSpecialForwards = (() => {
117
102
  display: block;
118
103
  }
119
104
 
105
+ :host([embedded]) {
106
+ margin: 0;
107
+ max-width: none;
108
+ padding: 0;
109
+ }
110
+
120
111
  .specialForwardsContainer {
121
112
  display: flex;
122
113
  flex-direction: column;
@@ -146,11 +137,61 @@ let OpsViewSpecialForwards = (() => {
146
137
  ];
147
138
  render() {
148
139
  const forwards = this.routeState.mergedRoutes.filter((route) => {
149
- return route.metadata?.managedRouteKind === managedRouteKind
140
+ return route.metadata?.managedRouteKind === letsEncryptHttp01ManagedRouteKind
150
141
  && routeMatchesOwner(route, this.ownerFilter);
151
142
  });
143
+ const enabledCount = forwards.filter((route) => route.enabled).length;
144
+ const disabledCount = forwards.length - enabledCount;
145
+ const readOnlyCount = forwards.filter((route) => getRouteOwner(route) !== 'operator').length;
146
+ const statsTiles = [
147
+ {
148
+ id: 'matchingSpecialForwards',
149
+ title: 'Matching',
150
+ type: 'number',
151
+ value: forwards.length,
152
+ icon: 'lucide:route',
153
+ description: 'HTTP-01 forwards in this owner scope',
154
+ color: '#3b82f6',
155
+ },
156
+ {
157
+ id: 'enabledSpecialForwards',
158
+ title: 'Enabled',
159
+ type: 'number',
160
+ value: enabledCount,
161
+ icon: 'lucide:circleCheck',
162
+ description: 'Currently forwarding challenges',
163
+ color: '#22c55e',
164
+ },
165
+ {
166
+ id: 'disabledSpecialForwards',
167
+ title: 'Disabled',
168
+ type: 'number',
169
+ value: disabledCount,
170
+ icon: 'lucide:circlePause',
171
+ description: 'Configured but inactive',
172
+ color: disabledCount > 0 ? '#f59e0b' : '#6b7280',
173
+ },
174
+ {
175
+ id: 'readOnlySpecialForwards',
176
+ title: 'Read-only',
177
+ type: 'number',
178
+ value: readOnlyCount,
179
+ icon: 'lucide:lockKeyhole',
180
+ description: 'Managed by gateway clients or system',
181
+ color: '#8b5cf6',
182
+ },
183
+ ];
152
184
  return html `
185
+ ${this.embedded ? '' : html `<dees-heading level="3">Special Forwards</dees-heading>`}
153
186
  <div class="specialForwardsContainer">
187
+ ${this.embedded
188
+ ? ''
189
+ : html `
190
+ <dees-statsgrid
191
+ .tiles=${statsTiles}
192
+ .gridActions=${this.getHeaderActions()}
193
+ ></dees-statsgrid>
194
+ `}
154
195
  <div class="explanation">
155
196
  <strong>Let's Encrypt HTTP-01 Forward</strong> exposes only
156
197
  <code>/.well-known/acme-challenge/*</code> on public port 80. DCRouter manages the
@@ -167,7 +208,7 @@ let OpsViewSpecialForwards = (() => {
167
208
  .data=${forwards}
168
209
  .showColumnFilters=${true}
169
210
  .displayFunction=${(route) => {
170
- const target = getTarget(route);
211
+ const target = getSpecialForwardTarget(route);
171
212
  const owner = getRouteOwner(route);
172
213
  return {
173
214
  Status: route.enabled ? 'Enabled' : 'Disabled',
@@ -178,7 +219,7 @@ let OpsViewSpecialForwards = (() => {
178
219
  ? 'Gateway Client'
179
220
  : 'System',
180
221
  Name: route.route.name || route.id,
181
- Domains: getDomains(route).join(', '),
222
+ Domains: getSpecialForwardDomains(route).join(', '),
182
223
  Path: route.route.match.path || '-',
183
224
  Target: route.metadata?.networkTargetName
184
225
  || (target ? `${target.host}:${target.port}` : '-'),
@@ -186,22 +227,6 @@ let OpsViewSpecialForwards = (() => {
186
227
  };
187
228
  }}
188
229
  .dataActions=${[
189
- ...(this.ownerFilter === 'all' || this.ownerFilter === 'operator'
190
- ? [
191
- {
192
- name: 'Add HTTP-01 Forward',
193
- iconName: 'lucide:plus',
194
- type: ['header'],
195
- actionFunc: async () => this.showForwardDialog(),
196
- },
197
- ]
198
- : []),
199
- {
200
- name: 'Refresh',
201
- iconName: 'lucide:refreshCw',
202
- type: ['header'],
203
- actionFunc: async () => this.refreshData(),
204
- },
205
230
  {
206
231
  name: 'Edit',
207
232
  iconName: 'lucide:pencil',
@@ -210,7 +235,10 @@ let OpsViewSpecialForwards = (() => {
210
235
  return getRouteOwner(route) === 'operator';
211
236
  },
212
237
  actionFunc: async (actionData) => {
213
- await this.showForwardDialog(actionData.item);
238
+ await showLetsEncryptHttp01ForwardDialog({
239
+ existing: actionData.item,
240
+ targets: this.profilesTargetsState.targets,
241
+ });
214
242
  },
215
243
  },
216
244
  {
@@ -247,135 +275,29 @@ let OpsViewSpecialForwards = (() => {
247
275
  appstate.profilesTargetsStatePart.dispatchAction(appstate.fetchProfilesAndTargetsAction, null),
248
276
  ]);
249
277
  }
250
- async showForwardDialog(existing) {
251
- const { DeesModal } = await import('@design.estate/dees-catalog');
252
- const target = existing ? getTarget(existing) : undefined;
253
- const targetOptions = [
254
- { key: '', option: '(none — inline target)' },
255
- ...this.profilesTargetsState.targets.map((networkTarget) => ({
256
- key: networkTarget.id,
257
- option: `${networkTarget.name} (${Array.isArray(networkTarget.host) ? networkTarget.host.join(', ') : networkTarget.host}:${networkTarget.port})`,
258
- })),
278
+ getHeaderActions() {
279
+ return [
280
+ ...(this.ownerFilter === 'all' || this.ownerFilter === 'operator'
281
+ ? [{
282
+ name: 'Add User Special Forward',
283
+ iconName: 'lucide:plus',
284
+ action: async () => showLetsEncryptHttp01ForwardDialog({
285
+ targets: this.profilesTargetsState.targets,
286
+ }),
287
+ }]
288
+ : []),
289
+ {
290
+ name: 'Refresh',
291
+ iconName: 'lucide:refreshCw',
292
+ action: async () => this.refreshData(),
293
+ },
259
294
  ];
260
- const selectedTarget = targetOptions.find((option) => {
261
- return option.key === (existing?.metadata?.networkTargetRef || '');
262
- }) || targetOptions[0];
263
- await DeesModal.createAndShow({
264
- heading: existing
265
- ? `Edit HTTP-01 Forward: ${existing.route.name || existing.id}`
266
- : 'Add Let\'s Encrypt HTTP-01 Forward',
267
- content: html `
268
- <dees-form>
269
- <dees-input-text
270
- .key=${'name'}
271
- .label=${'Name'}
272
- .value=${existing?.route.name || ''}
273
- .required=${true}
274
- ></dees-input-text>
275
- <dees-input-list
276
- .key=${'domains'}
277
- .label=${'Domains'}
278
- .description=${'Exact public hostnames; HTTP-01 does not support wildcards'}
279
- .placeholder=${'Add domain...'}
280
- .value=${existing ? getDomains(existing) : []}
281
- ></dees-input-list>
282
- <dees-input-dropdown
283
- .key=${'networkTargetRef'}
284
- .label=${'Network Target'}
285
- .options=${targetOptions}
286
- .selectedOption=${selectedTarget}
287
- ></dees-input-dropdown>
288
- <dees-input-text
289
- .key=${'targetHost'}
290
- .label=${'Inline Target Host'}
291
- .description=${'Used only when no Network Target is selected'}
292
- .value=${target?.host || ''}
293
- ></dees-input-text>
294
- <dees-input-text
295
- .key=${'targetPort'}
296
- .label=${'Inline Target Port'}
297
- .description=${'Usually port 80 on the ACME responder'}
298
- .value=${target ? String(target.port) : '80'}
299
- ></dees-input-text>
300
- <dees-input-checkbox
301
- .key=${'remoteIngressEnabled'}
302
- .label=${'Enable Remote Ingress'}
303
- .value=${existing?.route.remoteIngress?.enabled === true}
304
- ></dees-input-checkbox>
305
- <dees-input-list
306
- .key=${'remoteIngressEdgeFilter'}
307
- .label=${'Remote Ingress Edge Filter'}
308
- .description=${'Optional edge IDs or tags; leave empty for all edges'}
309
- .placeholder=${'Add edge ID or tag...'}
310
- .value=${existing?.route.remoteIngress?.edgeFilter || []}
311
- ></dees-input-list>
312
- </dees-form>
313
- `,
314
- menuOptions: [
315
- {
316
- name: 'Cancel',
317
- iconName: 'lucide:x',
318
- action: async (modalArg) => modalArg.destroy(),
319
- },
320
- {
321
- name: existing ? 'Save' : 'Create',
322
- iconName: existing ? 'lucide:check' : 'lucide:plus',
323
- action: async (modalArg) => {
324
- const form = modalArg.shadowRoot?.querySelector('.content')?.querySelector('dees-form');
325
- if (!form)
326
- return;
327
- const data = await form.collectFormData();
328
- const name = String(data.name || '').trim();
329
- const domains = Array.isArray(data.domains)
330
- ? data.domains.map((domain) => String(domain).trim()).filter(Boolean)
331
- : [];
332
- const networkTargetRef = getDropdownKey(data.networkTargetRef).trim();
333
- const targetHost = String(data.targetHost || '').trim();
334
- const targetPort = Number.parseInt(String(data.targetPort || ''), 10);
335
- if (!name || domains.length === 0) {
336
- alert('Name and at least one domain are required.');
337
- return;
338
- }
339
- if (!networkTargetRef
340
- && (!targetHost || !Number.isInteger(targetPort) || targetPort < 1 || targetPort > 65535)) {
341
- alert('A valid inline target host and port are required.');
342
- return;
343
- }
344
- const edgeFilter = Array.isArray(data.remoteIngressEdgeFilter)
345
- ? data.remoteIngressEdgeFilter.map((entry) => String(entry).trim()).filter(Boolean)
346
- : [];
347
- const config = {
348
- name,
349
- domains,
350
- ...(networkTargetRef
351
- ? { networkTargetRef }
352
- : { target: { host: targetHost, port: targetPort } }),
353
- ...(data.remoteIngressEnabled
354
- ? {
355
- remoteIngress: {
356
- enabled: true,
357
- ...(edgeFilter.length ? { edgeFilter } : {}),
358
- },
359
- }
360
- : {}),
361
- };
362
- if (existing) {
363
- await appstate.routeManagementStatePart.dispatchAction(appstate.updateLetsEncryptHttp01ForwardAction, { id: existing.id, config, enabled: existing.enabled });
364
- }
365
- else {
366
- await appstate.routeManagementStatePart.dispatchAction(appstate.createLetsEncryptHttp01ForwardAction, { config });
367
- }
368
- await modalArg.destroy();
369
- },
370
- },
371
- ],
372
- });
373
295
  }
374
296
  async confirmDelete(route) {
375
297
  const { DeesModal } = await import('@design.estate/dees-catalog');
376
298
  await DeesModal.createAndShow({
377
299
  heading: `Delete Special Forward: ${route.route.name || route.id}`,
378
- content: html `<p>This removes the managed HTTP-01 route for ${getDomains(route).join(', ')}.</p>`,
300
+ content: html `<p>This removes the managed HTTP-01 route for ${getSpecialForwardDomains(route).join(', ')}.</p>`,
379
301
  menuOptions: [
380
302
  {
381
303
  name: 'Cancel',
@@ -400,4 +322,4 @@ let OpsViewSpecialForwards = (() => {
400
322
  return OpsViewSpecialForwards = _classThis;
401
323
  })();
402
324
  export { OpsViewSpecialForwards };
403
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctc3BlY2lhbC1mb3J3YXJkcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzX3dlYi9lbGVtZW50cy9uZXR3b3JrL29wcy12aWV3LXNwZWNpYWwtZm9yd2FyZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sRUFDTCxXQUFXLEVBQ1gsR0FBRyxFQUNILFVBQVUsRUFDVixhQUFhLEVBQ2IsSUFBSSxFQUNKLFFBQVEsRUFDUixLQUFLLEdBRU4sTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0NBQXNDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxhQUFhLEVBQ2IsaUJBQWlCLEdBRWxCLE1BQU0seUJBQXlCLENBQUM7QUFFakMsTUFBTSxnQkFBZ0IsR0FBRyw0QkFBcUMsQ0FBQztBQUUvRCxTQUFTLGNBQWMsQ0FBQyxLQUFjO0lBQ3BDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUTtRQUM5QixDQUFDLENBQUMsS0FBSztRQUNQLENBQUMsQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssSUFBSSxLQUFLO1lBQ3BELENBQUMsQ0FBQyxNQUFNLENBQUUsS0FBMEIsQ0FBQyxHQUFHLENBQUM7WUFDekMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNYLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxLQUFtQztJQUNyRCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7SUFDMUMsSUFBSSxDQUFDLE9BQU87UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN4QixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMs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
325
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctc3BlY2lhbC1mb3J3YXJkcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzX3dlYi9lbGVtZW50cy9uZXR3b3JrL29wcy12aWV3LXNwZWNpYWwtZm9yd2FyZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sRUFDTCxXQUFXLEVBQ1gsR0FBRyxFQUNILFVBQVUsRUFDVixhQUFhLEVBQ2IsSUFBSSxFQUNKLFFBQVEsRUFDUixLQUFLLEdBRU4sTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQW1CLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssVUFBVSxNQUFNLHNDQUFzQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsYUFBYSxFQUNiLGlCQUFpQixHQUVsQixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsdUJBQXVCLEVBQ3ZCLGlDQUFpQyxFQUNqQyxrQ0FBa0MsR0FDbkMsTUFBTSw2QkFBNkIsQ0FBQztJQUd4QixzQkFBc0I7NEJBRGxDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQzs7OztzQkFDQyxXQUFXOzs7Ozs7Ozs7Ozs7O3NDQUFuQixTQUFRLFdBQVc7Ozs7b0NBQ3BELFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO3VDQUcxQyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7c0NBRzFCLEtBQUssRUFBRTtnREFHUCxLQUFLLEVBQUU7WUFSUiw2S0FBUyxRQUFRLDZCQUFSLFFBQVEsMkZBQVM7WUFHMUIsc0xBQVMsV0FBVyw2QkFBWCxXQUFXLGlHQUE0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
@@ -0,0 +1,11 @@
1
+ import * as interfaces from '../../../dist_ts_interfaces/index.js';
2
+ export declare const letsEncryptHttp01ManagedRouteKind: "letsencrypt-http01-forward";
3
+ export declare function getSpecialForwardDomains(route: interfaces.data.IMergedRoute): string[];
4
+ export declare function getSpecialForwardTarget(route: interfaces.data.IMergedRoute): {
5
+ host: string;
6
+ port: number;
7
+ } | undefined;
8
+ export declare function showLetsEncryptHttp01ForwardDialog(options: {
9
+ existing?: interfaces.data.IMergedRoute;
10
+ targets: interfaces.data.INetworkTarget[];
11
+ }): Promise<void>;
@@ -0,0 +1,154 @@
1
+ import { html } from '@design.estate/dees-element';
2
+ import * as appstate from '../../appstate.js';
3
+ import * as interfaces from '../../../dist_ts_interfaces/index.js';
4
+ export const letsEncryptHttp01ManagedRouteKind = 'letsencrypt-http01-forward';
5
+ export function getSpecialForwardDomains(route) {
6
+ const domains = route.route.match.domains;
7
+ if (!domains)
8
+ return [];
9
+ return Array.isArray(domains) ? domains : [domains];
10
+ }
11
+ export function getSpecialForwardTarget(route) {
12
+ const target = route.route.action.targets?.[0];
13
+ if (!target || typeof target.port !== 'number')
14
+ return undefined;
15
+ const host = typeof target.host === 'string'
16
+ ? target.host
17
+ : Array.isArray(target.host)
18
+ ? target.host[0]
19
+ : undefined;
20
+ return host ? { host, port: target.port } : undefined;
21
+ }
22
+ function getDropdownKey(value) {
23
+ return typeof value === 'string'
24
+ ? value
25
+ : value && typeof value === 'object' && 'key' in value
26
+ ? String(value.key)
27
+ : '';
28
+ }
29
+ export async function showLetsEncryptHttp01ForwardDialog(options) {
30
+ const { DeesModal } = await import('@design.estate/dees-catalog');
31
+ const { existing, targets } = options;
32
+ const target = existing ? getSpecialForwardTarget(existing) : undefined;
33
+ const targetOptions = [
34
+ { key: '', option: '(none — inline target)' },
35
+ ...targets.map((networkTarget) => ({
36
+ key: networkTarget.id,
37
+ option: `${networkTarget.name} (${Array.isArray(networkTarget.host) ? networkTarget.host.join(', ') : networkTarget.host}:${networkTarget.port})`,
38
+ })),
39
+ ];
40
+ const selectedTarget = targetOptions.find((option) => {
41
+ return option.key === (existing?.metadata?.networkTargetRef || '');
42
+ }) || targetOptions[0];
43
+ await DeesModal.createAndShow({
44
+ heading: existing
45
+ ? `Edit User HTTP-01 Forward: ${existing.route.name || existing.id}`
46
+ : 'Add User Let\'s Encrypt HTTP-01 Forward',
47
+ content: html `
48
+ <dees-form>
49
+ <dees-input-text
50
+ .key=${'name'}
51
+ .label=${'Name'}
52
+ .value=${existing?.route.name || ''}
53
+ .required=${true}
54
+ ></dees-input-text>
55
+ <dees-input-list
56
+ .key=${'domains'}
57
+ .label=${'Domains'}
58
+ .description=${'Exact public hostnames; HTTP-01 does not support wildcards'}
59
+ .placeholder=${'Add domain...'}
60
+ .value=${existing ? getSpecialForwardDomains(existing) : []}
61
+ ></dees-input-list>
62
+ <dees-input-dropdown
63
+ .key=${'networkTargetRef'}
64
+ .label=${'Network Target'}
65
+ .options=${targetOptions}
66
+ .selectedOption=${selectedTarget}
67
+ ></dees-input-dropdown>
68
+ <dees-input-text
69
+ .key=${'targetHost'}
70
+ .label=${'Inline Target Host'}
71
+ .description=${'Used only when no Network Target is selected'}
72
+ .value=${target?.host || ''}
73
+ ></dees-input-text>
74
+ <dees-input-text
75
+ .key=${'targetPort'}
76
+ .label=${'Inline Target Port'}
77
+ .description=${'Usually port 80 on the ACME responder'}
78
+ .value=${target ? String(target.port) : '80'}
79
+ ></dees-input-text>
80
+ <dees-input-checkbox
81
+ .key=${'remoteIngressEnabled'}
82
+ .label=${'Enable Remote Ingress'}
83
+ .value=${existing?.route.remoteIngress?.enabled === true}
84
+ ></dees-input-checkbox>
85
+ <dees-input-list
86
+ .key=${'remoteIngressEdgeFilter'}
87
+ .label=${'Remote Ingress Edge Filter'}
88
+ .description=${'Optional edge IDs or tags; leave empty for all edges'}
89
+ .placeholder=${'Add edge ID or tag...'}
90
+ .value=${existing?.route.remoteIngress?.edgeFilter || []}
91
+ ></dees-input-list>
92
+ </dees-form>
93
+ `,
94
+ menuOptions: [
95
+ {
96
+ name: 'Cancel',
97
+ iconName: 'lucide:x',
98
+ action: async (modalArg) => modalArg.destroy(),
99
+ },
100
+ {
101
+ name: existing ? 'Save' : 'Create',
102
+ iconName: existing ? 'lucide:check' : 'lucide:plus',
103
+ action: async (modalArg) => {
104
+ const form = modalArg.shadowRoot?.querySelector('.content')?.querySelector('dees-form');
105
+ if (!form)
106
+ return;
107
+ const data = await form.collectFormData();
108
+ const name = String(data.name || '').trim();
109
+ const domains = Array.isArray(data.domains)
110
+ ? data.domains.map((domain) => String(domain).trim()).filter(Boolean)
111
+ : [];
112
+ const networkTargetRef = getDropdownKey(data.networkTargetRef).trim();
113
+ const targetHost = String(data.targetHost || '').trim();
114
+ const targetPort = Number.parseInt(String(data.targetPort || ''), 10);
115
+ if (!name || domains.length === 0) {
116
+ alert('Name and at least one domain are required.');
117
+ return;
118
+ }
119
+ if (!networkTargetRef
120
+ && (!targetHost || !Number.isInteger(targetPort) || targetPort < 1 || targetPort > 65535)) {
121
+ alert('A valid inline target host and port are required.');
122
+ return;
123
+ }
124
+ const edgeFilter = Array.isArray(data.remoteIngressEdgeFilter)
125
+ ? data.remoteIngressEdgeFilter.map((entry) => String(entry).trim()).filter(Boolean)
126
+ : [];
127
+ const config = {
128
+ name,
129
+ domains,
130
+ ...(networkTargetRef
131
+ ? { networkTargetRef }
132
+ : { target: { host: targetHost, port: targetPort } }),
133
+ ...(data.remoteIngressEnabled
134
+ ? {
135
+ remoteIngress: {
136
+ enabled: true,
137
+ ...(edgeFilter.length ? { edgeFilter } : {}),
138
+ },
139
+ }
140
+ : {}),
141
+ };
142
+ if (existing) {
143
+ await appstate.routeManagementStatePart.dispatchAction(appstate.updateLetsEncryptHttp01ForwardAction, { id: existing.id, config, enabled: existing.enabled });
144
+ }
145
+ else {
146
+ await appstate.routeManagementStatePart.dispatchAction(appstate.createLetsEncryptHttp01ForwardAction, { config });
147
+ }
148
+ await modalArg.destroy();
149
+ },
150
+ },
151
+ ],
152
+ });
153
+ }
154
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlY2lhbC1mb3J3YXJkLWRpYWxvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzX3dlYi9lbGVtZW50cy9uZXR3b3JrL3NwZWNpYWwtZm9yd2FyZC1kaWFsb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVuRSxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBRyw0QkFBcUMsQ0FBQztBQUV2RixNQUFNLFVBQVUsd0JBQXdCLENBQ3RDLEtBQW1DO0lBRW5DLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztJQUMxQyxJQUFJLENBQUMsT0FBTztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3hCLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLEtBQW1DO0lBRW5DLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9DLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNqRSxNQUFNLElBQUksR0FBRyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUTtRQUMxQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUk7UUFDYixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lB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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@serve.zone/dcrouter",
3
3
  "private": false,
4
- "version": "16.3.0",
4
+ "version": "16.4.0",
5
5
  "description": "A multifaceted routing service handling mail and SMS delivery functions.",
6
6
  "type": "module",
7
7
  "bin": {
@@ -30,7 +30,7 @@
30
30
  "@api.global/typedserver": "^8.5.3",
31
31
  "@api.global/typedsocket": "^4.1.4",
32
32
  "@apiclient.xyz/cloudflare": "^7.1.0",
33
- "@design.estate/dees-catalog": "^3.96.1",
33
+ "@design.estate/dees-catalog": "^3.96.3",
34
34
  "@design.estate/dees-element": "^2.2.4",
35
35
  "@idp.global/sdk": "^1.4.0",
36
36
  "@push.rocks/lik": "^6.4.1",
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/dcrouter',
6
- version: '16.3.0',
6
+ version: '16.4.0',
7
7
  description: 'A multifaceted routing service handling mail and SMS delivery functions.'
8
8
  }
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/dcrouter',
6
- version: '16.3.0',
6
+ version: '16.4.0',
7
7
  description: 'A multifaceted routing service handling mail and SMS delivery functions.'
8
8
  }