Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f6e1951aa2 | |||
| 76fd563e21 | |||
| ee831ea057 | |||
| a65c2ec096 | |||
| 65822278d5 | |||
| aa3955fc67 |
18
changelog.md
18
changelog.md
@@ -1,5 +1,23 @@
|
||||
# Changelog
|
||||
|
||||
## 2026-03-19 - 11.8.1 - fix(dcrouter)
|
||||
use constructor routes for remote ingress setup and bump smartproxy dependency
|
||||
|
||||
- Switch remote ingress initialization to use constructorRoutes instead of smartProxyConfig routes so derived edge ports are based on the active route set.
|
||||
- Update @push.rocks/smartproxy from ^25.16.2 to ^25.16.3.
|
||||
|
||||
## 2026-03-19 - 11.8.0 - feat(remoteingress)
|
||||
add UDP listen port derivation and edge configuration support
|
||||
|
||||
- derive UDP ports from remote ingress routes using transport 'udp' or 'all'
|
||||
- expose effective UDP listen ports in allowed edge payloads and remote ingress interfaces
|
||||
- update @push.rocks/smartproxy to ^25.16.2
|
||||
|
||||
## 2026-03-19 - 11.7.1 - fix(deps)
|
||||
bump @push.rocks/smartproxy to ^25.16.0
|
||||
|
||||
- updates the smartproxy dependency from ^25.15.0 to ^25.16.0
|
||||
|
||||
## 2026-03-19 - 11.7.0 - feat(readme)
|
||||
document HTTP/3 QUIC support and configuration options
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@serve.zone/dcrouter",
|
||||
"private": false,
|
||||
"version": "11.7.0",
|
||||
"version": "11.8.1",
|
||||
"description": "A multifaceted routing service handling mail and SMS delivery functions.",
|
||||
"type": "module",
|
||||
"exports": {
|
||||
@@ -53,7 +53,7 @@
|
||||
"@push.rocks/smartnetwork": "^4.4.0",
|
||||
"@push.rocks/smartpath": "^6.0.0",
|
||||
"@push.rocks/smartpromise": "^4.2.3",
|
||||
"@push.rocks/smartproxy": "^25.15.0",
|
||||
"@push.rocks/smartproxy": "^25.16.3",
|
||||
"@push.rocks/smartradius": "^1.1.1",
|
||||
"@push.rocks/smartrequest": "^5.0.1",
|
||||
"@push.rocks/smartrx": "^3.0.10",
|
||||
|
||||
10
pnpm-lock.yaml
generated
10
pnpm-lock.yaml
generated
@@ -78,8 +78,8 @@ importers:
|
||||
specifier: ^4.2.3
|
||||
version: 4.2.3
|
||||
'@push.rocks/smartproxy':
|
||||
specifier: ^25.15.0
|
||||
version: 25.15.0
|
||||
specifier: ^25.16.3
|
||||
version: 25.16.3
|
||||
'@push.rocks/smartradius':
|
||||
specifier: ^1.1.1
|
||||
version: 1.1.1
|
||||
@@ -1256,8 +1256,8 @@ packages:
|
||||
'@push.rocks/smartpromise@4.2.3':
|
||||
resolution: {integrity: sha512-Ycg/TJR+tMt+S3wSFurOpEoW6nXv12QBtKXgBcjMZ4RsdO28geN46U09osPn9N9WuwQy1PkmTV5J/V4F9U8qEw==}
|
||||
|
||||
'@push.rocks/smartproxy@25.15.0':
|
||||
resolution: {integrity: sha512-quw4MH6Snr6X2vy27iykXbBwN1oDKU7AntbUAPOgsWERTTDZGZU79fk9VZTvk5hGNemb2wEgnkgsUxAnj0y4dQ==}
|
||||
'@push.rocks/smartproxy@25.16.3':
|
||||
resolution: {integrity: sha512-8pS41d2AZTVriip4OcAMWl+jYM/cF9fJ2/dTWm/oG4XM2BTnmeX6Bh3RThX7AIP7Js5Jv/Inot5fA3oIe8RtbA==}
|
||||
|
||||
'@push.rocks/smartpuppeteer@2.0.5':
|
||||
resolution: {integrity: sha512-yK/qSeWVHIGWRp3c8S5tfdGP6WCKllZC4DR8d8CQlEjszOSBmHtlTdyyqOMBZ/BA4kd+eU5f3A1r4K2tGYty1g==}
|
||||
@@ -6539,7 +6539,7 @@ snapshots:
|
||||
|
||||
'@push.rocks/smartpromise@4.2.3': {}
|
||||
|
||||
'@push.rocks/smartproxy@25.15.0':
|
||||
'@push.rocks/smartproxy@25.16.3':
|
||||
dependencies:
|
||||
'@push.rocks/smartcrypto': 2.0.4
|
||||
'@push.rocks/smartlog': 3.2.1
|
||||
|
||||
@@ -3,6 +3,6 @@
|
||||
*/
|
||||
export const commitinfo = {
|
||||
name: '@serve.zone/dcrouter',
|
||||
version: '11.7.0',
|
||||
version: '11.8.1',
|
||||
description: 'A multifaceted routing service handling mail and SMS delivery functions.'
|
||||
}
|
||||
|
||||
@@ -1753,7 +1753,7 @@ export class DcRouter {
|
||||
await this.remoteIngressManager.initialize();
|
||||
|
||||
// Pass current routes so the manager can derive edge ports from remoteIngress-tagged routes
|
||||
const currentRoutes = this.options.smartProxyConfig?.routes || [];
|
||||
const currentRoutes = this.constructorRoutes;
|
||||
this.remoteIngressManager.setRoutes(currentRoutes as any[]);
|
||||
|
||||
// Resolve TLS certs for tunnel: explicit paths > ACME for hubDomain > self-signed (Rust default)
|
||||
|
||||
@@ -94,6 +94,38 @@ export class RemoteIngressManager {
|
||||
return [...ports].sort((a, b) => a - b);
|
||||
}
|
||||
|
||||
/**
|
||||
* Derive UDP listen ports for an edge from routes with transport 'udp' or 'all'.
|
||||
* These ports need UDP listeners on the edge (e.g. for QUIC/HTTP3).
|
||||
*/
|
||||
public deriveUdpPortsForEdge(edgeId: string, edgeTags?: string[]): number[] {
|
||||
const ports = new Set<number>();
|
||||
|
||||
for (const route of this.routes) {
|
||||
if (!route.remoteIngress?.enabled) continue;
|
||||
|
||||
// Apply edge filter if present
|
||||
const filter = route.remoteIngress.edgeFilter;
|
||||
if (filter && filter.length > 0) {
|
||||
const idMatch = filter.includes(edgeId);
|
||||
const tagMatch = edgeTags?.some((tag) => filter.includes(tag)) ?? false;
|
||||
if (!idMatch && !tagMatch) continue;
|
||||
}
|
||||
|
||||
// Only include ports from routes that listen on UDP
|
||||
const transport = route.match?.transport;
|
||||
if (transport === 'udp' || transport === 'all') {
|
||||
if (route.match?.ports) {
|
||||
for (const p of extractPorts(route.match.ports)) {
|
||||
ports.add(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return [...ports].sort((a, b) => a - b);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the effective listen ports for an edge.
|
||||
* Manual ports are always included. Auto-derived ports are added (union) when autoDerivePorts is true.
|
||||
@@ -106,6 +138,18 @@ export class RemoteIngressManager {
|
||||
return [...new Set([...manualPorts, ...derivedPorts])].sort((a, b) => a - b);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the effective UDP listen ports for an edge.
|
||||
* Manual UDP ports are always included. Auto-derived UDP ports are added when autoDerivePorts is true.
|
||||
*/
|
||||
public getEffectiveListenPortsUdp(edge: IRemoteIngress): number[] {
|
||||
const manualPorts = edge.listenPortsUdp || [];
|
||||
const shouldDerive = edge.autoDerivePorts !== false;
|
||||
if (!shouldDerive) return [...manualPorts].sort((a, b) => a - b);
|
||||
const derivedPorts = this.deriveUdpPortsForEdge(edge.id, edge.tags);
|
||||
return [...new Set([...manualPorts, ...derivedPorts])].sort((a, b) => a - b);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get manual and derived port breakdown for an edge (used in API responses).
|
||||
* Derived ports exclude any ports already present in the manual list.
|
||||
@@ -241,15 +285,18 @@ export class RemoteIngressManager {
|
||||
|
||||
/**
|
||||
* Get the list of allowed edges (enabled only) for the Rust hub.
|
||||
* Includes listenPortsUdp when routes with transport 'udp' or 'all' are present.
|
||||
*/
|
||||
public getAllowedEdges(): Array<{ id: string; secret: string; listenPorts: number[] }> {
|
||||
const result: Array<{ id: string; secret: string; listenPorts: number[] }> = [];
|
||||
public getAllowedEdges(): Array<{ id: string; secret: string; listenPorts: number[]; listenPortsUdp?: number[] }> {
|
||||
const result: Array<{ id: string; secret: string; listenPorts: number[]; listenPortsUdp?: number[] }> = [];
|
||||
for (const edge of this.edges.values()) {
|
||||
if (edge.enabled) {
|
||||
const listenPortsUdp = this.getEffectiveListenPortsUdp(edge);
|
||||
result.push({
|
||||
id: edge.id,
|
||||
secret: edge.secret,
|
||||
listenPorts: this.getEffectiveListenPorts(edge),
|
||||
...(listenPortsUdp.length > 0 ? { listenPortsUdp } : {}),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,8 @@ export interface IRemoteIngress {
|
||||
name: string;
|
||||
secret: string;
|
||||
listenPorts: number[];
|
||||
/** UDP listen ports (e.g. for QUIC/HTTP3). Derived from routes with transport 'udp' or 'all'. */
|
||||
listenPortsUdp?: number[];
|
||||
enabled: boolean;
|
||||
/** Whether to auto-derive ports from remoteIngress-tagged routes. Defaults to true. */
|
||||
autoDerivePorts: boolean;
|
||||
@@ -20,6 +22,8 @@ export interface IRemoteIngress {
|
||||
manualPorts?: number[];
|
||||
/** Ports auto-derived from route configs — only present in API responses. */
|
||||
derivedPorts?: number[];
|
||||
/** Effective UDP ports (union of manual + derived) — only present in API responses. */
|
||||
effectiveListenPortsUdp?: number[];
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -3,6 +3,6 @@
|
||||
*/
|
||||
export const commitinfo = {
|
||||
name: '@serve.zone/dcrouter',
|
||||
version: '11.7.0',
|
||||
version: '11.8.1',
|
||||
description: 'A multifaceted routing service handling mail and SMS delivery functions.'
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user