Compare commits

...

6 Commits

Author SHA1 Message Date
0577f45ced v12.2.3
Some checks failed
Docker (tags) / security (push) Failing after 2s
Docker (tags) / test (push) Has been skipped
Docker (tags) / release (push) Has been skipped
Docker (tags) / metadata (push) Has been skipped
2026-04-02 16:27:35 +00:00
7d23617f15 fix(repo): no changes to commit 2026-04-02 16:27:35 +00:00
02415f8c53 v12.2.2
Some checks failed
Docker (tags) / security (push) Failing after 2s
Docker (tags) / test (push) Has been skipped
Docker (tags) / release (push) Has been skipped
Docker (tags) / metadata (push) Has been skipped
2026-04-02 16:26:24 +00:00
73a47e5a97 fix(route-config): sync applied routes to remote ingress manager after route updates 2026-04-02 16:26:24 +00:00
5e980812b0 v12.2.1
Some checks failed
Docker (tags) / security (push) Failing after 3s
Docker (tags) / test (push) Has been skipped
Docker (tags) / release (push) Has been skipped
Docker (tags) / metadata (push) Has been skipped
2026-04-02 16:10:35 +00:00
76e9735cde fix(web-ui): align dees-table props and action handlers in security profile and network target views 2026-04-02 16:10:35 +00:00
8 changed files with 44 additions and 13 deletions

View File

@@ -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

View File

@@ -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": {

View File

@@ -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.'
}

View File

@@ -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();

View File

@@ -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)`);
}
}

View File

@@ -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.'
}

View File

@@ -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);
},
},

View File

@@ -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);
},
},