@serve.zone/remoteingress 4.15.3 → 4.17.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_rust/remoteingress-bin_linux_amd64 +0 -0
- package/dist_rust/remoteingress-bin_linux_arm64 +0 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.remoteingresshub.d.ts +53 -0
- package/dist_ts/classes.remoteingresshub.js +3 -1
- package/package.json +1 -1
- package/readme.md +4 -4
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.remoteingresshub.ts +75 -13
|
Binary file
|
|
Binary file
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@serve.zone/remoteingress',
|
|
6
|
-
version: '4.
|
|
6
|
+
version: '4.17.0',
|
|
7
7
|
description: 'Edge ingress tunnel for DcRouter - tunnels TCP and UDP traffic from the network edge to SmartProxy over TLS or QUIC, preserving client IP via PROXY protocol.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSwyQkFBMkI7SUFDakMsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLCtKQUErSjtDQUM3SyxDQUFBIn0=
|
|
@@ -28,6 +28,51 @@ export interface IHubConfig {
|
|
|
28
28
|
certPem?: string;
|
|
29
29
|
keyPem?: string;
|
|
30
30
|
};
|
|
31
|
+
performance?: IPerformanceConfig;
|
|
32
|
+
}
|
|
33
|
+
export type TPerformanceProfile = 'balanced' | 'throughput' | 'highConcurrency';
|
|
34
|
+
export interface IPerformanceConfig {
|
|
35
|
+
profile?: TPerformanceProfile;
|
|
36
|
+
maxStreamsPerEdge?: number;
|
|
37
|
+
totalWindowBudgetBytes?: number;
|
|
38
|
+
minStreamWindowBytes?: number;
|
|
39
|
+
maxStreamWindowBytes?: number;
|
|
40
|
+
sustainedStreamWindowBytes?: number;
|
|
41
|
+
quicDatagramReceiveBufferBytes?: number;
|
|
42
|
+
}
|
|
43
|
+
export interface IEffectivePerformanceConfig {
|
|
44
|
+
profile: TPerformanceProfile;
|
|
45
|
+
maxStreamsPerEdge: number;
|
|
46
|
+
totalWindowBudgetBytes: number;
|
|
47
|
+
minStreamWindowBytes: number;
|
|
48
|
+
maxStreamWindowBytes: number;
|
|
49
|
+
sustainedStreamWindowBytes: number;
|
|
50
|
+
quicDatagramReceiveBufferBytes: number;
|
|
51
|
+
}
|
|
52
|
+
export interface IFlowControlStatus {
|
|
53
|
+
applies: boolean;
|
|
54
|
+
currentWindowBytes: number;
|
|
55
|
+
minWindowBytes: number;
|
|
56
|
+
maxWindowBytes: number;
|
|
57
|
+
totalWindowBudgetBytes: number;
|
|
58
|
+
estimatedInFlightBytes: number;
|
|
59
|
+
stalledStreams: number;
|
|
60
|
+
}
|
|
61
|
+
export interface IQueueStatus {
|
|
62
|
+
ctrlQueueDepth: number;
|
|
63
|
+
dataQueueDepth: number;
|
|
64
|
+
sustainedQueueDepth: number;
|
|
65
|
+
}
|
|
66
|
+
export interface ITrafficStatus {
|
|
67
|
+
bytesIn: number;
|
|
68
|
+
bytesOut: number;
|
|
69
|
+
streamsOpenedTotal: number;
|
|
70
|
+
streamsClosedTotal: number;
|
|
71
|
+
rejectedStreams: number;
|
|
72
|
+
}
|
|
73
|
+
export interface IUdpStatus {
|
|
74
|
+
activeSessions: number;
|
|
75
|
+
droppedDatagrams: number;
|
|
31
76
|
}
|
|
32
77
|
type TAllowedEdge = {
|
|
33
78
|
id: string;
|
|
@@ -36,6 +81,7 @@ type TAllowedEdge = {
|
|
|
36
81
|
listenPortsUdp?: number[];
|
|
37
82
|
stunIntervalSecs?: number;
|
|
38
83
|
firewallConfig?: IFirewallConfig;
|
|
84
|
+
performance?: IPerformanceConfig;
|
|
39
85
|
};
|
|
40
86
|
export declare class RemoteIngressHub extends EventEmitter {
|
|
41
87
|
private bridge;
|
|
@@ -69,6 +115,13 @@ export declare class RemoteIngressHub extends EventEmitter {
|
|
|
69
115
|
connectedAt: number;
|
|
70
116
|
activeStreams: number;
|
|
71
117
|
peerAddr: string;
|
|
118
|
+
transportMode: "tcpTls" | "quic" | "quicWithFallback";
|
|
119
|
+
fallbackUsed: boolean;
|
|
120
|
+
performance: IEffectivePerformanceConfig;
|
|
121
|
+
flowControl: IFlowControlStatus;
|
|
122
|
+
queues: IQueueStatus;
|
|
123
|
+
traffic: ITrafficStatus;
|
|
124
|
+
udp: IUdpStatus;
|
|
72
125
|
}>;
|
|
73
126
|
}>;
|
|
74
127
|
/**
|
|
@@ -48,6 +48,7 @@ export class RemoteIngressHub extends EventEmitter {
|
|
|
48
48
|
...(config.tls?.certPem && config.tls?.keyPem
|
|
49
49
|
? { tlsCertPem: config.tls.certPem, tlsKeyPem: config.tls.keyPem }
|
|
50
50
|
: {}),
|
|
51
|
+
...(config.performance ? { performance: config.performance } : {}),
|
|
51
52
|
});
|
|
52
53
|
// Restore allowed edges
|
|
53
54
|
if (this.savedEdges.length > 0) {
|
|
@@ -123,6 +124,7 @@ export class RemoteIngressHub extends EventEmitter {
|
|
|
123
124
|
await this.bridge.sendCommand('startHub', {
|
|
124
125
|
tunnelPort: config.tunnelPort ?? 8443,
|
|
125
126
|
targetHost: config.targetHost ?? '127.0.0.1',
|
|
127
|
+
...(config.performance ? { performance: config.performance } : {}),
|
|
126
128
|
...(config.tls?.certPem && config.tls?.keyPem
|
|
127
129
|
? { tlsCertPem: config.tls.certPem, tlsKeyPem: config.tls.keyPem }
|
|
128
130
|
: {}),
|
|
@@ -180,4 +182,4 @@ export class RemoteIngressHub extends EventEmitter {
|
|
|
180
182
|
return this.bridge.running;
|
|
181
183
|
}
|
|
182
184
|
}
|
|
183
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
185
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yZW1vdGVpbmdyZXNzaHViLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5yZW1vdGVpbmdyZXNzaHViLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUM7QUEwSXRDLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxDQUFDO0FBRXRDLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxZQUFZO0lBU2hEO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUFSRixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsZ0JBQVcsR0FBc0IsSUFBSSxDQUFDO1FBQ3RDLGVBQVUsR0FBbUIsRUFBRSxDQUFDO1FBQ2hDLHFCQUFnQixHQUFHLElBQUksQ0FBQztRQUN4QixvQkFBZSxHQUFHLENBQUMsQ0FBQztRQXNJNUI7O1dBRUc7UUFDSyx3QkFBbUIsR0FBRyxLQUFLLEVBQUUsSUFBbUIsRUFBRSxNQUFxQixFQUFFLEVBQUU7WUFDakYsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDeEQsT0FBTztZQUNULENBQUM7WUFFRCxPQUFPLENBQUMsS0FBSyxDQUNYLGdEQUFnRCxJQUFJLFlBQVksTUFBTSxLQUFLO2dCQUMzRSxXQUFXLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxJQUFJLG9CQUFvQixFQUFFLENBQzlELENBQUM7WUFFRixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUVyQixJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksb0JBQW9CLEVBQUUsQ0FBQztnQkFDakQsT0FBTyxDQUFDLEtBQUssQ0FB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@serve.zone/remoteingress",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.17.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Edge ingress tunnel for DcRouter - tunnels TCP and UDP traffic from the network edge to SmartProxy over TLS or QUIC, preserving client IP via PROXY protocol.",
|
|
6
6
|
"main": "dist_ts/index.js",
|
package/readme.md
CHANGED
|
@@ -130,7 +130,7 @@ await hub.stop();
|
|
|
130
130
|
|
|
131
131
|
### Setting Up the Edge (Network Edge Side)
|
|
132
132
|
|
|
133
|
-
The edge
|
|
133
|
+
The edge connects via **QUIC with TCP+TLS fallback** by default. Edges run as **root** so they can bind to privileged ports and apply nftables firewall rules.
|
|
134
134
|
|
|
135
135
|
#### Option A: Connection Token (Recommended)
|
|
136
136
|
|
|
@@ -162,7 +162,7 @@ await edge.start({
|
|
|
162
162
|
hubPort: 8443,
|
|
163
163
|
edgeId: 'edge-nyc-01',
|
|
164
164
|
secret: 'supersecrettoken1',
|
|
165
|
-
transportMode: 'quic', // 'tcpTls'
|
|
165
|
+
transportMode: 'quic', // 'tcpTls' | 'quic' | 'quicWithFallback' (default)
|
|
166
166
|
});
|
|
167
167
|
|
|
168
168
|
const edgeStatus = await edge.getStatus();
|
|
@@ -175,9 +175,9 @@ await edge.stop();
|
|
|
175
175
|
|
|
176
176
|
| Mode | Description |
|
|
177
177
|
|------|-------------|
|
|
178
|
-
| `'tcpTls'` |
|
|
178
|
+
| `'tcpTls'` | Single TLS connection with frame-based multiplexing. Universal compatibility. |
|
|
179
179
|
| `'quic'` | QUIC with native stream multiplexing. Eliminates head-of-line blocking. Uses QUIC datagrams for UDP traffic. |
|
|
180
|
-
| `'quicWithFallback'` | Tries QUIC first (5s timeout), falls back to TCP+TLS if UDP is blocked by the network. |
|
|
180
|
+
| `'quicWithFallback'` | **Default.** Tries QUIC first (5s timeout), falls back to TCP+TLS if UDP is blocked by the network. |
|
|
181
181
|
|
|
182
182
|
### Connection Tokens
|
|
183
183
|
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@serve.zone/remoteingress',
|
|
6
|
-
version: '4.
|
|
6
|
+
version: '4.17.0',
|
|
7
7
|
description: 'Edge ingress tunnel for DcRouter - tunnels TCP and UDP traffic from the network edge to SmartProxy over TLS or QUIC, preserving client IP via PROXY protocol.'
|
|
8
8
|
}
|
|
@@ -9,11 +9,12 @@ type THubCommands = {
|
|
|
9
9
|
};
|
|
10
10
|
startHub: {
|
|
11
11
|
params: {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
tunnelPort: number;
|
|
13
|
+
targetHost?: string;
|
|
14
|
+
tlsCertPem?: string;
|
|
15
|
+
tlsKeyPem?: string;
|
|
16
|
+
performance?: IPerformanceConfig;
|
|
17
|
+
};
|
|
17
18
|
result: { started: boolean };
|
|
18
19
|
};
|
|
19
20
|
stopHub: {
|
|
@@ -22,7 +23,7 @@ type THubCommands = {
|
|
|
22
23
|
};
|
|
23
24
|
updateAllowedEdges: {
|
|
24
25
|
params: {
|
|
25
|
-
edges: Array<{ id: string; secret: string; listenPorts?: number[]; listenPortsUdp?: number[]; stunIntervalSecs?: number; firewallConfig?: IFirewallConfig }>;
|
|
26
|
+
edges: Array<{ id: string; secret: string; listenPorts?: number[]; listenPortsUdp?: number[]; stunIntervalSecs?: number; firewallConfig?: IFirewallConfig; performance?: IPerformanceConfig }>;
|
|
26
27
|
};
|
|
27
28
|
result: { updated: boolean };
|
|
28
29
|
};
|
|
@@ -31,12 +32,19 @@ type THubCommands = {
|
|
|
31
32
|
result: {
|
|
32
33
|
running: boolean;
|
|
33
34
|
tunnelPort: number;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
35
|
+
connectedEdges: Array<{
|
|
36
|
+
edgeId: string;
|
|
37
|
+
connectedAt: number;
|
|
38
|
+
activeStreams: number;
|
|
39
|
+
peerAddr: string;
|
|
40
|
+
transportMode: 'tcpTls' | 'quic' | 'quicWithFallback';
|
|
41
|
+
fallbackUsed: boolean;
|
|
42
|
+
performance: IEffectivePerformanceConfig;
|
|
43
|
+
flowControl: IFlowControlStatus;
|
|
44
|
+
queues: IQueueStatus;
|
|
45
|
+
traffic: ITrafficStatus;
|
|
46
|
+
udp: IUdpStatus;
|
|
47
|
+
}>;
|
|
40
48
|
};
|
|
41
49
|
};
|
|
42
50
|
};
|
|
@@ -73,9 +81,61 @@ export interface IHubConfig {
|
|
|
73
81
|
certPem?: string;
|
|
74
82
|
keyPem?: string;
|
|
75
83
|
};
|
|
84
|
+
performance?: IPerformanceConfig;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export type TPerformanceProfile = 'balanced' | 'throughput' | 'highConcurrency';
|
|
88
|
+
|
|
89
|
+
export interface IPerformanceConfig {
|
|
90
|
+
profile?: TPerformanceProfile;
|
|
91
|
+
maxStreamsPerEdge?: number;
|
|
92
|
+
totalWindowBudgetBytes?: number;
|
|
93
|
+
minStreamWindowBytes?: number;
|
|
94
|
+
maxStreamWindowBytes?: number;
|
|
95
|
+
sustainedStreamWindowBytes?: number;
|
|
96
|
+
quicDatagramReceiveBufferBytes?: number;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface IEffectivePerformanceConfig {
|
|
100
|
+
profile: TPerformanceProfile;
|
|
101
|
+
maxStreamsPerEdge: number;
|
|
102
|
+
totalWindowBudgetBytes: number;
|
|
103
|
+
minStreamWindowBytes: number;
|
|
104
|
+
maxStreamWindowBytes: number;
|
|
105
|
+
sustainedStreamWindowBytes: number;
|
|
106
|
+
quicDatagramReceiveBufferBytes: number;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export interface IFlowControlStatus {
|
|
110
|
+
applies: boolean;
|
|
111
|
+
currentWindowBytes: number;
|
|
112
|
+
minWindowBytes: number;
|
|
113
|
+
maxWindowBytes: number;
|
|
114
|
+
totalWindowBudgetBytes: number;
|
|
115
|
+
estimatedInFlightBytes: number;
|
|
116
|
+
stalledStreams: number;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export interface IQueueStatus {
|
|
120
|
+
ctrlQueueDepth: number;
|
|
121
|
+
dataQueueDepth: number;
|
|
122
|
+
sustainedQueueDepth: number;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export interface ITrafficStatus {
|
|
126
|
+
bytesIn: number;
|
|
127
|
+
bytesOut: number;
|
|
128
|
+
streamsOpenedTotal: number;
|
|
129
|
+
streamsClosedTotal: number;
|
|
130
|
+
rejectedStreams: number;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export interface IUdpStatus {
|
|
134
|
+
activeSessions: number;
|
|
135
|
+
droppedDatagrams: number;
|
|
76
136
|
}
|
|
77
137
|
|
|
78
|
-
type TAllowedEdge = { id: string; secret: string; listenPorts?: number[]; listenPortsUdp?: number[]; stunIntervalSecs?: number; firewallConfig?: IFirewallConfig };
|
|
138
|
+
type TAllowedEdge = { id: string; secret: string; listenPorts?: number[]; listenPortsUdp?: number[]; stunIntervalSecs?: number; firewallConfig?: IFirewallConfig; performance?: IPerformanceConfig };
|
|
79
139
|
|
|
80
140
|
const MAX_RESTART_ATTEMPTS = 10;
|
|
81
141
|
const MAX_RESTART_BACKOFF_MS = 30_000;
|
|
@@ -160,6 +220,7 @@ export class RemoteIngressHub extends EventEmitter {
|
|
|
160
220
|
await this.bridge.sendCommand('startHub', {
|
|
161
221
|
tunnelPort: config.tunnelPort ?? 8443,
|
|
162
222
|
targetHost: config.targetHost ?? '127.0.0.1',
|
|
223
|
+
...(config.performance ? { performance: config.performance } : {}),
|
|
163
224
|
...(config.tls?.certPem && config.tls?.keyPem
|
|
164
225
|
? { tlsCertPem: config.tls.certPem, tlsKeyPem: config.tls.keyPem }
|
|
165
226
|
: {}),
|
|
@@ -266,6 +327,7 @@ export class RemoteIngressHub extends EventEmitter {
|
|
|
266
327
|
...(config.tls?.certPem && config.tls?.keyPem
|
|
267
328
|
? { tlsCertPem: config.tls.certPem, tlsKeyPem: config.tls.keyPem }
|
|
268
329
|
: {}),
|
|
330
|
+
...(config.performance ? { performance: config.performance } : {}),
|
|
269
331
|
});
|
|
270
332
|
|
|
271
333
|
// Restore allowed edges
|