@serve.zone/dcrouter 6.6.1 → 6.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.
- package/dist_serve/bundle.js +2382 -2363
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/opsserver/handlers/remoteingress.handler.js +25 -9
- package/dist_ts/remoteingress/classes.remoteingress-manager.d.ts +11 -2
- package/dist_ts/remoteingress/classes.remoteingress-manager.js +31 -7
- package/dist_ts_interfaces/data/remoteingress.d.ts +8 -0
- package/dist_ts_interfaces/requests/remoteingress.d.ts +2 -0
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/dist_ts_web/appstate.d.ts +13 -1
- package/dist_ts_web/appstate.js +45 -1
- package/dist_ts_web/elements/ops-view-remoteingress.js +132 -26
- package/package.json +1 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/opsserver/handlers/remoteingress.handler.ts +24 -7
- package/ts/remoteingress/classes.remoteingress-manager.ts +29 -5
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/appstate.ts +65 -1
- package/ts_web/elements/ops-view-remoteingress.ts +138 -26
|
@@ -149,6 +149,17 @@ let OpsViewRemoteIngress = (() => {
|
|
|
149
149
|
background: ${cssManager.bdTheme('#eff6ff', '#172554')};
|
|
150
150
|
color: ${cssManager.bdTheme('#1e40af', '#60a5fa')};
|
|
151
151
|
}
|
|
152
|
+
|
|
153
|
+
.portBadge.manual {
|
|
154
|
+
background: ${cssManager.bdTheme('#eff6ff', '#172554')};
|
|
155
|
+
color: ${cssManager.bdTheme('#1e40af', '#60a5fa')};
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.portBadge.derived {
|
|
159
|
+
background: ${cssManager.bdTheme('#ecfdf5', '#022c22')};
|
|
160
|
+
color: ${cssManager.bdTheme('#047857', '#34d399')};
|
|
161
|
+
border: 1px dashed ${cssManager.bdTheme('#6ee7b7', '#065f46')};
|
|
162
|
+
}
|
|
152
163
|
`,
|
|
153
164
|
];
|
|
154
165
|
render() {
|
|
@@ -219,7 +230,7 @@ let OpsViewRemoteIngress = (() => {
|
|
|
219
230
|
name: edge.name,
|
|
220
231
|
status: this.getEdgeStatusHtml(edge),
|
|
221
232
|
publicIp: this.getEdgePublicIp(edge.id),
|
|
222
|
-
ports: this.getPortsHtml(edge
|
|
233
|
+
ports: this.getPortsHtml(edge),
|
|
223
234
|
tunnels: this.getEdgeTunnelCount(edge.id),
|
|
224
235
|
lastHeartbeat: this.getLastHeartbeat(edge.id),
|
|
225
236
|
})}
|
|
@@ -230,47 +241,137 @@ let OpsViewRemoteIngress = (() => {
|
|
|
230
241
|
type: ['header'],
|
|
231
242
|
actionFunc: async () => {
|
|
232
243
|
const { DeesModal } = await import('@design.estate/dees-catalog');
|
|
233
|
-
const
|
|
244
|
+
const modal = await DeesModal.createAndShow({
|
|
234
245
|
heading: 'Create Edge Node',
|
|
235
246
|
content: html `
|
|
236
247
|
<dees-form>
|
|
237
248
|
<dees-input-text .key=${'name'} .label=${'Name'} .required=${true}></dees-input-text>
|
|
238
|
-
<dees-input-text .key=${'listenPorts'} .label=${'
|
|
249
|
+
<dees-input-text .key=${'listenPorts'} .label=${'Additional Manual Ports (comma-separated, optional)'}></dees-input-text>
|
|
250
|
+
<dees-input-checkbox .key=${'autoDerivePorts'} .label=${'Auto-derive ports from routes'} .value=${true}></dees-input-checkbox>
|
|
239
251
|
<dees-input-text .key=${'tags'} .label=${'Tags (comma-separated, optional)'}></dees-input-text>
|
|
240
252
|
</dees-form>
|
|
241
253
|
`,
|
|
242
|
-
menuOptions: [
|
|
254
|
+
menuOptions: [
|
|
255
|
+
{
|
|
256
|
+
name: 'Cancel',
|
|
257
|
+
iconName: 'lucide:x',
|
|
258
|
+
action: async (modalArg) => await modalArg.destroy(),
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
name: 'Create',
|
|
262
|
+
iconName: 'lucide:plus',
|
|
263
|
+
action: async (modalArg) => {
|
|
264
|
+
const form = modalArg.shadowRoot?.querySelector('.content')?.querySelector('dees-form');
|
|
265
|
+
if (!form)
|
|
266
|
+
return;
|
|
267
|
+
const formData = await form.collectFormData();
|
|
268
|
+
const name = formData.name;
|
|
269
|
+
if (!name)
|
|
270
|
+
return;
|
|
271
|
+
const portsStr = formData.listenPorts?.trim();
|
|
272
|
+
const listenPorts = portsStr
|
|
273
|
+
? portsStr.split(',').map((p) => parseInt(p.trim(), 10)).filter((p) => !isNaN(p))
|
|
274
|
+
: undefined;
|
|
275
|
+
const autoDerivePorts = formData.autoDerivePorts !== false;
|
|
276
|
+
const tags = formData.tags
|
|
277
|
+
? formData.tags.split(',').map((t) => t.trim()).filter(Boolean)
|
|
278
|
+
: undefined;
|
|
279
|
+
await appstate.remoteIngressStatePart.dispatchAction(appstate.createRemoteIngressAction, { name, listenPorts, autoDerivePorts, tags });
|
|
280
|
+
await modalArg.destroy();
|
|
281
|
+
},
|
|
282
|
+
},
|
|
283
|
+
],
|
|
284
|
+
});
|
|
285
|
+
},
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
name: 'Enable',
|
|
289
|
+
iconName: 'lucide:play',
|
|
290
|
+
type: ['inRow', 'contextmenu'],
|
|
291
|
+
actionRelevancyCheckFunc: (actionData) => !actionData.item.enabled,
|
|
292
|
+
actionFunc: async (actionData) => {
|
|
293
|
+
const edge = actionData.item;
|
|
294
|
+
await appstate.remoteIngressStatePart.dispatchAction(appstate.toggleRemoteIngressAction, { id: edge.id, enabled: true });
|
|
295
|
+
},
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
name: 'Disable',
|
|
299
|
+
iconName: 'lucide:pause',
|
|
300
|
+
type: ['inRow', 'contextmenu'],
|
|
301
|
+
actionRelevancyCheckFunc: (actionData) => actionData.item.enabled,
|
|
302
|
+
actionFunc: async (actionData) => {
|
|
303
|
+
const edge = actionData.item;
|
|
304
|
+
await appstate.remoteIngressStatePart.dispatchAction(appstate.toggleRemoteIngressAction, { id: edge.id, enabled: false });
|
|
305
|
+
},
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
name: 'Edit',
|
|
309
|
+
iconName: 'lucide:pencil',
|
|
310
|
+
type: ['inRow', 'contextmenu'],
|
|
311
|
+
actionFunc: async (actionData) => {
|
|
312
|
+
const edge = actionData.item;
|
|
313
|
+
const { DeesModal } = await import('@design.estate/dees-catalog');
|
|
314
|
+
await DeesModal.createAndShow({
|
|
315
|
+
heading: `Edit Edge: ${edge.name}`,
|
|
316
|
+
content: html `
|
|
317
|
+
<dees-form>
|
|
318
|
+
<dees-input-text .key=${'name'} .label=${'Name'} .value=${edge.name}></dees-input-text>
|
|
319
|
+
<dees-input-text .key=${'listenPorts'} .label=${'Manual Ports (comma-separated)'} .value=${(edge.listenPorts || []).join(', ')}></dees-input-text>
|
|
320
|
+
<dees-input-checkbox .key=${'autoDerivePorts'} .label=${'Auto-derive ports from routes'} .value=${edge.autoDerivePorts !== false}></dees-input-checkbox>
|
|
321
|
+
<dees-input-text .key=${'tags'} .label=${'Tags (comma-separated)'} .value=${(edge.tags || []).join(', ')}></dees-input-text>
|
|
322
|
+
</dees-form>
|
|
323
|
+
`,
|
|
324
|
+
menuOptions: [
|
|
325
|
+
{
|
|
326
|
+
name: 'Cancel',
|
|
327
|
+
iconName: 'lucide:x',
|
|
328
|
+
action: async (modalArg) => await modalArg.destroy(),
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
name: 'Save',
|
|
332
|
+
iconName: 'lucide:check',
|
|
333
|
+
action: async (modalArg) => {
|
|
334
|
+
const form = modalArg.shadowRoot?.querySelector('.content')?.querySelector('dees-form');
|
|
335
|
+
if (!form)
|
|
336
|
+
return;
|
|
337
|
+
const formData = await form.collectFormData();
|
|
338
|
+
const portsStr = formData.listenPorts?.trim();
|
|
339
|
+
const listenPorts = portsStr
|
|
340
|
+
? portsStr.split(',').map((p) => parseInt(p.trim(), 10)).filter((p) => !isNaN(p))
|
|
341
|
+
: [];
|
|
342
|
+
const autoDerivePorts = formData.autoDerivePorts !== false;
|
|
343
|
+
const tags = formData.tags
|
|
344
|
+
? formData.tags.split(',').map((t) => t.trim()).filter(Boolean)
|
|
345
|
+
: [];
|
|
346
|
+
await appstate.remoteIngressStatePart.dispatchAction(appstate.updateRemoteIngressAction, {
|
|
347
|
+
id: edge.id,
|
|
348
|
+
name: formData.name || edge.name,
|
|
349
|
+
listenPorts,
|
|
350
|
+
autoDerivePorts,
|
|
351
|
+
tags,
|
|
352
|
+
});
|
|
353
|
+
await modalArg.destroy();
|
|
354
|
+
},
|
|
355
|
+
},
|
|
356
|
+
],
|
|
243
357
|
});
|
|
244
|
-
if (result) {
|
|
245
|
-
const formData = result;
|
|
246
|
-
const ports = (formData.name ? formData.listenPorts : '443')
|
|
247
|
-
.split(',')
|
|
248
|
-
.map((p) => parseInt(p.trim(), 10))
|
|
249
|
-
.filter((p) => !isNaN(p));
|
|
250
|
-
const tags = formData.tags
|
|
251
|
-
? formData.tags.split(',').map((t) => t.trim()).filter(Boolean)
|
|
252
|
-
: undefined;
|
|
253
|
-
await appstate.remoteIngressStatePart.dispatchAction(appstate.createRemoteIngressAction, {
|
|
254
|
-
name: formData.name,
|
|
255
|
-
listenPorts: ports,
|
|
256
|
-
tags,
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
358
|
},
|
|
260
359
|
},
|
|
261
360
|
{
|
|
262
361
|
name: 'Regenerate Secret',
|
|
263
362
|
iconName: 'lucide:key',
|
|
264
|
-
type: ['
|
|
265
|
-
|
|
363
|
+
type: ['inRow', 'contextmenu'],
|
|
364
|
+
actionFunc: async (actionData) => {
|
|
365
|
+
const edge = actionData.item;
|
|
266
366
|
await appstate.remoteIngressStatePart.dispatchAction(appstate.regenerateRemoteIngressSecretAction, edge.id);
|
|
267
367
|
},
|
|
268
368
|
},
|
|
269
369
|
{
|
|
270
370
|
name: 'Delete',
|
|
271
371
|
iconName: 'lucide:trash2',
|
|
272
|
-
type: ['
|
|
273
|
-
|
|
372
|
+
type: ['inRow', 'contextmenu'],
|
|
373
|
+
actionFunc: async (actionData) => {
|
|
374
|
+
const edge = actionData.item;
|
|
274
375
|
await appstate.remoteIngressStatePart.dispatchAction(appstate.deleteRemoteIngressAction, edge.id);
|
|
275
376
|
},
|
|
276
377
|
},
|
|
@@ -296,8 +397,13 @@ let OpsViewRemoteIngress = (() => {
|
|
|
296
397
|
const status = this.getEdgeStatus(edgeId);
|
|
297
398
|
return status?.publicIp || '-';
|
|
298
399
|
}
|
|
299
|
-
getPortsHtml(
|
|
300
|
-
|
|
400
|
+
getPortsHtml(edge) {
|
|
401
|
+
const manualPorts = edge.manualPorts || [];
|
|
402
|
+
const derivedPorts = edge.derivedPorts || [];
|
|
403
|
+
if (manualPorts.length === 0 && derivedPorts.length === 0) {
|
|
404
|
+
return html `<span style="color: var(--text-muted, #6b7280); font-size: 12px;">none</span>`;
|
|
405
|
+
}
|
|
406
|
+
return html `<div class="portsDisplay">${manualPorts.map(p => html `<span class="portBadge manual">${p}</span>`)}${derivedPorts.map(p => html `<span class="portBadge derived">${p}</span>`)}${derivedPorts.length > 0 ? html `<span style="font-size: 11px; color: var(--text-muted, #6b7280); align-self: center;">(auto)</span>` : ''}</div>`;
|
|
301
407
|
}
|
|
302
408
|
getEdgeTunnelCount(edgeId) {
|
|
303
409
|
const status = this.getEdgeStatus(edgeId);
|
|
@@ -321,4 +427,4 @@ let OpsViewRemoteIngress = (() => {
|
|
|
321
427
|
return OpsViewRemoteIngress = _classThis;
|
|
322
428
|
})();
|
|
323
429
|
export { OpsViewRemoteIngress };
|
|
324
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctcmVtb3RlaW5ncmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3dlYi9lbGVtZW50cy9vcHMtdmlldy1yZW1vdGVpbmdyZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLElBQUksRUFDSixhQUFhLEVBRWIsR0FBRyxFQUNILEtBQUssRUFDTCxVQUFVLEdBQ1gsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEtBQUssUUFBUSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sS0FBSyxVQUFVLE1BQU0sbUNBQW1DLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBbUIsTUFBTSw2QkFBNkIsQ0FBQztJQVNqRCxvQkFBb0I7NEJBRGhDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQzs7OztzQkFDRSxXQUFXOzs7O29DQUFuQixTQUFRLFdBQVc7Ozs7bUNBQ2xELEtBQUssRUFBRTtZQUNSLDBLQUFTLE9BQU8sNkJBQVAsT0FBTyx5RkFBNEU7WUFGOUYsNktBbVJDOzs7O1FBalJDLDJFQUFpRCxRQUFRLENBQUMsc0JBQXNCLENBQUMsUUFBUSxFQUFFLEVBQUM7UUFBNUYsSUFBUyxPQUFPLDZDQUE0RTtRQUE1RixJQUFTLE9BQU8sbURBQTRFO1FBRTVGO1lBQ0UsS0FBSyxFQUFFLENBQUM7O1lBQ1IsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDdkUsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUM7WUFDMUIsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNoQztRQUVELEtB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
|
|
430
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctcmVtb3RlaW5ncmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3dlYi9lbGVtZW50cy9vcHMtdmlldy1yZW1vdGVpbmdyZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLElBQUksRUFDSixhQUFhLEVBRWIsR0FBRyxFQUNILEtBQUssRUFDTCxVQUFVLEdBQ1gsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEtBQUssUUFBUSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sS0FBSyxVQUFVLE1BQU0sbUNBQW1DLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBbUIsTUFBTSw2QkFBNkIsQ0FBQztJQVNqRCxvQkFBb0I7NEJBRGhDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQzs7OztzQkFDRSxXQUFXOzs7O29DQUFuQixTQUFRLFdBQVc7Ozs7bUNBQ2xELEtBQUssRUFBRTtZQUNSLDBLQUFTLE9BQU8sNkJBQVAsT0FBTyx5RkFBNEU7WUFGOUYsNktBbVlDOzs7O1FBallDLDJFQUFpRCxRQUFRLENBQUMsc0JBQXNCLENBQUMsUUFBUSxFQUFFLEVBQUM7UUFBNUYsSUFBUyxPQUFPLDZDQUE0RTtRQUE1RixJQUFTLE9BQU8sbURBQTRFO1FBRTVGO1lBQ0UsS0FBSyxFQUFFLENBQUM7O1lBQ1IsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDdkUsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUM7WUFDMUIsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNoQztRQUVELEtB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
|
package/package.json
CHANGED
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -20,12 +20,17 @@ export class RemoteIngressHandler {
|
|
|
20
20
|
if (!manager) {
|
|
21
21
|
return { edges: [] };
|
|
22
22
|
}
|
|
23
|
-
// Return edges without secrets, enriched with effective listen ports
|
|
24
|
-
const edges = manager.getAllEdges().map((e) =>
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
23
|
+
// Return edges without secrets, enriched with effective listen ports and breakdown
|
|
24
|
+
const edges = manager.getAllEdges().map((e) => {
|
|
25
|
+
const breakdown = manager.getPortBreakdown(e);
|
|
26
|
+
return {
|
|
27
|
+
...e,
|
|
28
|
+
secret: '********', // Never expose secrets via API
|
|
29
|
+
effectiveListenPorts: manager.getEffectiveListenPorts(e),
|
|
30
|
+
manualPorts: breakdown.manual,
|
|
31
|
+
derivedPorts: breakdown.derived,
|
|
32
|
+
};
|
|
33
|
+
});
|
|
29
34
|
return { edges };
|
|
30
35
|
},
|
|
31
36
|
),
|
|
@@ -50,6 +55,7 @@ export class RemoteIngressHandler {
|
|
|
50
55
|
dataArg.name,
|
|
51
56
|
dataArg.listenPorts || [],
|
|
52
57
|
dataArg.tags,
|
|
58
|
+
dataArg.autoDerivePorts ?? true,
|
|
53
59
|
);
|
|
54
60
|
|
|
55
61
|
// Sync allowed edges with the hub
|
|
@@ -102,6 +108,7 @@ export class RemoteIngressHandler {
|
|
|
102
108
|
const edge = await manager.updateEdge(dataArg.id, {
|
|
103
109
|
name: dataArg.name,
|
|
104
110
|
listenPorts: dataArg.listenPorts,
|
|
111
|
+
autoDerivePorts: dataArg.autoDerivePorts,
|
|
105
112
|
enabled: dataArg.enabled,
|
|
106
113
|
tags: dataArg.tags,
|
|
107
114
|
});
|
|
@@ -115,7 +122,17 @@ export class RemoteIngressHandler {
|
|
|
115
122
|
await tunnelManager.syncAllowedEdges();
|
|
116
123
|
}
|
|
117
124
|
|
|
118
|
-
|
|
125
|
+
const breakdown = manager.getPortBreakdown(edge);
|
|
126
|
+
return {
|
|
127
|
+
success: true,
|
|
128
|
+
edge: {
|
|
129
|
+
...edge,
|
|
130
|
+
secret: '********',
|
|
131
|
+
effectiveListenPorts: manager.getEffectiveListenPorts(edge),
|
|
132
|
+
manualPorts: breakdown.manual,
|
|
133
|
+
derivedPorts: breakdown.derived,
|
|
134
|
+
},
|
|
135
|
+
};
|
|
119
136
|
},
|
|
120
137
|
),
|
|
121
138
|
);
|
|
@@ -47,6 +47,11 @@ export class RemoteIngressManager {
|
|
|
47
47
|
for (const key of keys) {
|
|
48
48
|
const edge = await this.storageManager.getJSON<IRemoteIngress>(key);
|
|
49
49
|
if (edge) {
|
|
50
|
+
// Migration: old edges without autoDerivePorts default to true
|
|
51
|
+
if ((edge as any).autoDerivePorts === undefined) {
|
|
52
|
+
edge.autoDerivePorts = true;
|
|
53
|
+
await this.storageManager.setJSON(key, edge);
|
|
54
|
+
}
|
|
50
55
|
this.edges.set(edge.id, edge);
|
|
51
56
|
}
|
|
52
57
|
}
|
|
@@ -91,13 +96,28 @@ export class RemoteIngressManager {
|
|
|
91
96
|
|
|
92
97
|
/**
|
|
93
98
|
* Get the effective listen ports for an edge.
|
|
94
|
-
*
|
|
99
|
+
* Manual ports are always included. Auto-derived ports are added (union) when autoDerivePorts is true.
|
|
95
100
|
*/
|
|
96
101
|
public getEffectiveListenPorts(edge: IRemoteIngress): number[] {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
102
|
+
const manualPorts = edge.listenPorts || [];
|
|
103
|
+
const shouldDerive = edge.autoDerivePorts !== false;
|
|
104
|
+
if (!shouldDerive) return [...manualPorts].sort((a, b) => a - b);
|
|
105
|
+
const derivedPorts = this.derivePortsForEdge(edge.id, edge.tags);
|
|
106
|
+
return [...new Set([...manualPorts, ...derivedPorts])].sort((a, b) => a - b);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Get manual and derived port breakdown for an edge (used in API responses).
|
|
111
|
+
* Derived ports exclude any ports already present in the manual list.
|
|
112
|
+
*/
|
|
113
|
+
public getPortBreakdown(edge: IRemoteIngress): { manual: number[]; derived: number[] } {
|
|
114
|
+
const manual = edge.listenPorts || [];
|
|
115
|
+
const shouldDerive = edge.autoDerivePorts !== false;
|
|
116
|
+
if (!shouldDerive) return { manual, derived: [] };
|
|
117
|
+
const manualSet = new Set(manual);
|
|
118
|
+
const allDerived = this.derivePortsForEdge(edge.id, edge.tags);
|
|
119
|
+
const derived = allDerived.filter((p) => !manualSet.has(p));
|
|
120
|
+
return { manual, derived };
|
|
101
121
|
}
|
|
102
122
|
|
|
103
123
|
/**
|
|
@@ -107,6 +127,7 @@ export class RemoteIngressManager {
|
|
|
107
127
|
name: string,
|
|
108
128
|
listenPorts: number[] = [],
|
|
109
129
|
tags?: string[],
|
|
130
|
+
autoDerivePorts: boolean = true,
|
|
110
131
|
): Promise<IRemoteIngress> {
|
|
111
132
|
const id = plugins.uuid.v4();
|
|
112
133
|
const secret = plugins.crypto.randomBytes(32).toString('hex');
|
|
@@ -118,6 +139,7 @@ export class RemoteIngressManager {
|
|
|
118
139
|
secret,
|
|
119
140
|
listenPorts,
|
|
120
141
|
enabled: true,
|
|
142
|
+
autoDerivePorts,
|
|
121
143
|
tags: tags || [],
|
|
122
144
|
createdAt: now,
|
|
123
145
|
updatedAt: now,
|
|
@@ -150,6 +172,7 @@ export class RemoteIngressManager {
|
|
|
150
172
|
updates: {
|
|
151
173
|
name?: string;
|
|
152
174
|
listenPorts?: number[];
|
|
175
|
+
autoDerivePorts?: boolean;
|
|
153
176
|
enabled?: boolean;
|
|
154
177
|
tags?: string[];
|
|
155
178
|
},
|
|
@@ -161,6 +184,7 @@ export class RemoteIngressManager {
|
|
|
161
184
|
|
|
162
185
|
if (updates.name !== undefined) edge.name = updates.name;
|
|
163
186
|
if (updates.listenPorts !== undefined) edge.listenPorts = updates.listenPorts;
|
|
187
|
+
if (updates.autoDerivePorts !== undefined) edge.autoDerivePorts = updates.autoDerivePorts;
|
|
164
188
|
if (updates.enabled !== undefined) edge.enabled = updates.enabled;
|
|
165
189
|
if (updates.tags !== undefined) edge.tags = updates.tags;
|
|
166
190
|
edge.updatedAt = Date.now();
|
package/ts_web/appstate.ts
CHANGED
|
@@ -821,7 +821,8 @@ export const fetchRemoteIngressAction = remoteIngressStatePart.createAction(asyn
|
|
|
821
821
|
|
|
822
822
|
export const createRemoteIngressAction = remoteIngressStatePart.createAction<{
|
|
823
823
|
name: string;
|
|
824
|
-
listenPorts
|
|
824
|
+
listenPorts?: number[];
|
|
825
|
+
autoDerivePorts?: boolean;
|
|
825
826
|
tags?: string[];
|
|
826
827
|
}>(async (statePartArg, dataArg) => {
|
|
827
828
|
const context = getActionContext();
|
|
@@ -836,6 +837,7 @@ export const createRemoteIngressAction = remoteIngressStatePart.createAction<{
|
|
|
836
837
|
identity: context.identity,
|
|
837
838
|
name: dataArg.name,
|
|
838
839
|
listenPorts: dataArg.listenPorts,
|
|
840
|
+
autoDerivePorts: dataArg.autoDerivePorts,
|
|
839
841
|
tags: dataArg.tags,
|
|
840
842
|
});
|
|
841
843
|
|
|
@@ -883,6 +885,40 @@ export const deleteRemoteIngressAction = remoteIngressStatePart.createAction<str
|
|
|
883
885
|
}
|
|
884
886
|
);
|
|
885
887
|
|
|
888
|
+
export const updateRemoteIngressAction = remoteIngressStatePart.createAction<{
|
|
889
|
+
id: string;
|
|
890
|
+
name?: string;
|
|
891
|
+
listenPorts?: number[];
|
|
892
|
+
autoDerivePorts?: boolean;
|
|
893
|
+
tags?: string[];
|
|
894
|
+
}>(async (statePartArg, dataArg) => {
|
|
895
|
+
const context = getActionContext();
|
|
896
|
+
const currentState = statePartArg.getState();
|
|
897
|
+
|
|
898
|
+
try {
|
|
899
|
+
const request = new plugins.domtools.plugins.typedrequest.TypedRequest<
|
|
900
|
+
interfaces.requests.IReq_UpdateRemoteIngress
|
|
901
|
+
>('/typedrequest', 'updateRemoteIngress');
|
|
902
|
+
|
|
903
|
+
await request.fire({
|
|
904
|
+
identity: context.identity,
|
|
905
|
+
id: dataArg.id,
|
|
906
|
+
name: dataArg.name,
|
|
907
|
+
listenPorts: dataArg.listenPorts,
|
|
908
|
+
autoDerivePorts: dataArg.autoDerivePorts,
|
|
909
|
+
tags: dataArg.tags,
|
|
910
|
+
});
|
|
911
|
+
|
|
912
|
+
await remoteIngressStatePart.dispatchAction(fetchRemoteIngressAction, null);
|
|
913
|
+
return statePartArg.getState();
|
|
914
|
+
} catch (error) {
|
|
915
|
+
return {
|
|
916
|
+
...currentState,
|
|
917
|
+
error: error instanceof Error ? error.message : 'Failed to update edge',
|
|
918
|
+
};
|
|
919
|
+
}
|
|
920
|
+
});
|
|
921
|
+
|
|
886
922
|
export const regenerateRemoteIngressSecretAction = remoteIngressStatePart.createAction<string>(
|
|
887
923
|
async (statePartArg, edgeId) => {
|
|
888
924
|
const context = getActionContext();
|
|
@@ -924,6 +960,34 @@ export const clearNewEdgeSecretAction = remoteIngressStatePart.createAction(
|
|
|
924
960
|
}
|
|
925
961
|
);
|
|
926
962
|
|
|
963
|
+
export const toggleRemoteIngressAction = remoteIngressStatePart.createAction<{
|
|
964
|
+
id: string;
|
|
965
|
+
enabled: boolean;
|
|
966
|
+
}>(async (statePartArg, dataArg) => {
|
|
967
|
+
const context = getActionContext();
|
|
968
|
+
const currentState = statePartArg.getState();
|
|
969
|
+
|
|
970
|
+
try {
|
|
971
|
+
const request = new plugins.domtools.plugins.typedrequest.TypedRequest<
|
|
972
|
+
interfaces.requests.IReq_UpdateRemoteIngress
|
|
973
|
+
>('/typedrequest', 'updateRemoteIngress');
|
|
974
|
+
|
|
975
|
+
await request.fire({
|
|
976
|
+
identity: context.identity,
|
|
977
|
+
id: dataArg.id,
|
|
978
|
+
enabled: dataArg.enabled,
|
|
979
|
+
});
|
|
980
|
+
|
|
981
|
+
await remoteIngressStatePart.dispatchAction(fetchRemoteIngressAction, null);
|
|
982
|
+
return statePartArg.getState();
|
|
983
|
+
} catch (error) {
|
|
984
|
+
return {
|
|
985
|
+
...currentState,
|
|
986
|
+
error: error instanceof Error ? error.message : 'Failed to toggle edge',
|
|
987
|
+
};
|
|
988
|
+
}
|
|
989
|
+
});
|
|
990
|
+
|
|
927
991
|
// Combined refresh action for efficient polling
|
|
928
992
|
async function dispatchCombinedRefreshAction() {
|
|
929
993
|
const context = getActionContext();
|