Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0577f45ced | |||
| 7d23617f15 | |||
| 02415f8c53 | |||
| 73a47e5a97 | |||
| 5e980812b0 | |||
| 76e9735cde |
16
changelog.md
16
changelog.md
@@ -1,5 +1,21 @@
|
||||
# Changelog
|
||||
|
||||
## 2026-04-02 - 12.2.3 - fix(repo)
|
||||
no changes to commit
|
||||
|
||||
|
||||
## 2026-04-02 - 12.2.2 - fix(route-config)
|
||||
sync applied routes to remote ingress manager after route updates
|
||||
|
||||
- add an optional route-applied callback to RouteConfigManager
|
||||
- forward merged SmartProxy routes to RemoteIngressManager whenever routes are updated
|
||||
|
||||
## 2026-04-02 - 12.2.1 - fix(web-ui)
|
||||
align dees-table props and action handlers in security profile and network target views
|
||||
|
||||
- replace deprecated table heading prop with heading1 and heading2 in both admin views
|
||||
- rename table action callbacks from action to actionFunc for create, refresh, edit, and delete actions
|
||||
|
||||
## 2026-04-02 - 12.2.0 - feat(config)
|
||||
add reusable security profiles and network targets with route reference resolution
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@serve.zone/dcrouter",
|
||||
"private": false,
|
||||
"version": "12.2.0",
|
||||
"version": "12.2.3",
|
||||
"description": "A multifaceted routing service handling mail and SMS delivery functions.",
|
||||
"type": "module",
|
||||
"exports": {
|
||||
|
||||
@@ -3,6 +3,6 @@
|
||||
*/
|
||||
export const commitinfo = {
|
||||
name: '@serve.zone/dcrouter',
|
||||
version: '12.2.0',
|
||||
version: '12.2.3',
|
||||
description: 'A multifaceted routing service handling mail and SMS delivery functions.'
|
||||
}
|
||||
|
||||
@@ -478,6 +478,12 @@ export class DcRouter {
|
||||
}
|
||||
: undefined,
|
||||
this.referenceResolver,
|
||||
// Sync merged routes to RemoteIngressManager whenever routes change
|
||||
(routes) => {
|
||||
if (this.remoteIngressManager) {
|
||||
this.remoteIngressManager.setRoutes(routes as any[]);
|
||||
}
|
||||
},
|
||||
);
|
||||
this.apiTokenManager = new ApiTokenManager();
|
||||
await this.apiTokenManager.initialize();
|
||||
|
||||
@@ -23,6 +23,7 @@ export class RouteConfigManager {
|
||||
private getHttp3Config?: () => IHttp3Config | undefined,
|
||||
private getVpnAllowList?: (tags?: string[]) => string[],
|
||||
private referenceResolver?: ReferenceResolver,
|
||||
private onRoutesApplied?: (routes: plugins.smartproxy.IRouteConfig[]) => void,
|
||||
) {}
|
||||
|
||||
/** Expose stored routes map for reference resolution lookups. */
|
||||
@@ -393,6 +394,12 @@ export class RouteConfigManager {
|
||||
}
|
||||
|
||||
await smartProxy.updateRoutes(enabledRoutes);
|
||||
|
||||
// Notify listeners (e.g. RemoteIngressManager) of the merged route set
|
||||
if (this.onRoutesApplied) {
|
||||
this.onRoutesApplied(enabledRoutes);
|
||||
}
|
||||
|
||||
logger.log('info', `Applied ${enabledRoutes.length} routes to SmartProxy (${this.storedRoutes.size} programmatic, ${this.overrides.size} overrides)`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,6 @@
|
||||
*/
|
||||
export const commitinfo = {
|
||||
name: '@serve.zone/dcrouter',
|
||||
version: '12.2.0',
|
||||
version: '12.2.3',
|
||||
description: 'A multifaceted routing service handling mail and SMS delivery functions.'
|
||||
}
|
||||
|
||||
@@ -67,7 +67,8 @@ export class OpsViewNetworkTargets extends DeesElement {
|
||||
<div class="targetsContainer">
|
||||
<dees-statsgrid .tiles=${statsTiles}></dees-statsgrid>
|
||||
<dees-table
|
||||
.heading=${'Network Targets'}
|
||||
.heading1=${'Network Targets'}
|
||||
.heading2=${'Reusable host:port destinations for routes'}
|
||||
.data=${targets}
|
||||
.displayFunction=${(target: interfaces.data.INetworkTarget) => ({
|
||||
Name: target.name,
|
||||
@@ -80,7 +81,7 @@ export class OpsViewNetworkTargets extends DeesElement {
|
||||
name: 'Create Target',
|
||||
iconName: 'lucide:plus',
|
||||
type: ['header' as const],
|
||||
action: async (_: any, table: any) => {
|
||||
actionFunc: async (_: any, table: any) => {
|
||||
await this.showCreateTargetDialog(table);
|
||||
},
|
||||
},
|
||||
@@ -88,7 +89,7 @@ export class OpsViewNetworkTargets extends DeesElement {
|
||||
name: 'Refresh',
|
||||
iconName: 'lucide:rotateCw',
|
||||
type: ['header' as const],
|
||||
action: async () => {
|
||||
actionFunc: async () => {
|
||||
await appstate.profilesTargetsStatePart.dispatchAction(appstate.fetchProfilesAndTargetsAction, null);
|
||||
},
|
||||
},
|
||||
@@ -96,7 +97,7 @@ export class OpsViewNetworkTargets extends DeesElement {
|
||||
name: 'Edit',
|
||||
iconName: 'lucide:pencil',
|
||||
type: ['contextmenu' as const],
|
||||
action: async (target: interfaces.data.INetworkTarget, table: any) => {
|
||||
actionFunc: async (target: interfaces.data.INetworkTarget, table: any) => {
|
||||
await this.showEditTargetDialog(target, table);
|
||||
},
|
||||
},
|
||||
@@ -104,7 +105,7 @@ export class OpsViewNetworkTargets extends DeesElement {
|
||||
name: 'Delete',
|
||||
iconName: 'lucide:trash2',
|
||||
type: ['contextmenu' as const],
|
||||
action: async (target: interfaces.data.INetworkTarget) => {
|
||||
actionFunc: async (target: interfaces.data.INetworkTarget) => {
|
||||
await this.deleteTarget(target);
|
||||
},
|
||||
},
|
||||
|
||||
@@ -67,7 +67,8 @@ export class OpsViewSecurityProfiles extends DeesElement {
|
||||
<div class="profilesContainer">
|
||||
<dees-statsgrid .tiles=${statsTiles}></dees-statsgrid>
|
||||
<dees-table
|
||||
.heading=${'Security Profiles'}
|
||||
.heading1=${'Security Profiles'}
|
||||
.heading2=${'Reusable security configurations for routes'}
|
||||
.data=${profiles}
|
||||
.displayFunction=${(profile: interfaces.data.ISecurityProfile) => ({
|
||||
Name: profile.name,
|
||||
@@ -88,7 +89,7 @@ export class OpsViewSecurityProfiles extends DeesElement {
|
||||
name: 'Create Profile',
|
||||
iconName: 'lucide:plus',
|
||||
type: ['header' as const],
|
||||
action: async (_: any, table: any) => {
|
||||
actionFunc: async (_: any, table: any) => {
|
||||
await this.showCreateProfileDialog(table);
|
||||
},
|
||||
},
|
||||
@@ -96,7 +97,7 @@ export class OpsViewSecurityProfiles extends DeesElement {
|
||||
name: 'Refresh',
|
||||
iconName: 'lucide:rotateCw',
|
||||
type: ['header' as const],
|
||||
action: async () => {
|
||||
actionFunc: async () => {
|
||||
await appstate.profilesTargetsStatePart.dispatchAction(appstate.fetchProfilesAndTargetsAction, null);
|
||||
},
|
||||
},
|
||||
@@ -104,7 +105,7 @@ export class OpsViewSecurityProfiles extends DeesElement {
|
||||
name: 'Edit',
|
||||
iconName: 'lucide:pencil',
|
||||
type: ['contextmenu' as const],
|
||||
action: async (profile: interfaces.data.ISecurityProfile, table: any) => {
|
||||
actionFunc: async (profile: interfaces.data.ISecurityProfile, table: any) => {
|
||||
await this.showEditProfileDialog(profile, table);
|
||||
},
|
||||
},
|
||||
@@ -112,7 +113,7 @@ export class OpsViewSecurityProfiles extends DeesElement {
|
||||
name: 'Delete',
|
||||
iconName: 'lucide:trash2',
|
||||
type: ['contextmenu' as const],
|
||||
action: async (profile: interfaces.data.ISecurityProfile) => {
|
||||
actionFunc: async (profile: interfaces.data.ISecurityProfile) => {
|
||||
await this.deleteProfile(profile);
|
||||
},
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user