@push.rocks/smartproxy 12.0.0 → 13.1.2
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_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/certificate/acme/acme-factory.d.ts +17 -0
- package/dist_ts/certificate/acme/acme-factory.js +40 -0
- package/dist_ts/certificate/acme/challenge-handler.d.ts +44 -0
- package/dist_ts/certificate/acme/challenge-handler.js +92 -0
- package/dist_ts/certificate/acme/index.d.ts +4 -0
- package/dist_ts/certificate/acme/index.js +5 -0
- package/dist_ts/certificate/events/certificate-events.d.ts +33 -0
- package/dist_ts/certificate/events/certificate-events.js +38 -0
- package/dist_ts/certificate/index.d.ts +24 -0
- package/dist_ts/certificate/index.js +39 -0
- package/dist_ts/certificate/models/certificate-types.d.ts +77 -0
- package/dist_ts/certificate/models/certificate-types.js +2 -0
- package/dist_ts/certificate/providers/cert-provisioner.d.ts +93 -0
- package/dist_ts/certificate/providers/cert-provisioner.js +262 -0
- package/dist_ts/certificate/providers/index.d.ts +4 -0
- package/dist_ts/certificate/providers/index.js +5 -0
- package/dist_ts/certificate/storage/file-storage.d.ts +66 -0
- package/dist_ts/certificate/storage/file-storage.js +194 -0
- package/dist_ts/certificate/storage/index.d.ts +4 -0
- package/dist_ts/certificate/storage/index.js +5 -0
- package/dist_ts/certificate/utils/certificate-helpers.d.ts +17 -0
- package/dist_ts/certificate/utils/certificate-helpers.js +45 -0
- package/dist_ts/common/eventUtils.d.ts +1 -1
- package/dist_ts/common/port80-adapter.d.ts +1 -1
- package/dist_ts/core/events/index.d.ts +4 -0
- package/dist_ts/core/events/index.js +5 -0
- package/dist_ts/core/index.d.ts +6 -0
- package/dist_ts/core/index.js +8 -0
- package/dist_ts/core/models/common-types.d.ts +82 -0
- package/dist_ts/core/models/common-types.js +15 -0
- package/dist_ts/core/models/index.d.ts +4 -0
- package/dist_ts/core/models/index.js +5 -0
- package/dist_ts/core/utils/event-utils.d.ts +15 -0
- package/dist_ts/core/utils/event-utils.js +19 -0
- package/dist_ts/core/utils/index.d.ts +6 -0
- package/dist_ts/core/utils/index.js +7 -0
- package/dist_ts/core/utils/ip-utils.d.ts +53 -0
- package/dist_ts/core/utils/ip-utils.js +153 -0
- package/dist_ts/core/utils/validation-utils.d.ts +61 -0
- package/dist_ts/core/utils/validation-utils.js +149 -0
- package/dist_ts/forwarding/config/domain-config.d.ts +12 -0
- package/dist_ts/forwarding/config/domain-config.js +12 -0
- package/dist_ts/forwarding/config/domain-manager.d.ts +86 -0
- package/dist_ts/forwarding/config/domain-manager.js +242 -0
- package/dist_ts/forwarding/config/forwarding-types.d.ts +104 -0
- package/dist_ts/forwarding/config/forwarding-types.js +50 -0
- package/dist_ts/forwarding/config/index.d.ts +6 -0
- package/dist_ts/forwarding/config/index.js +7 -0
- package/dist_ts/forwarding/factory/forwarding-factory.d.ts +25 -0
- package/dist_ts/forwarding/factory/forwarding-factory.js +138 -0
- package/dist_ts/forwarding/factory/index.d.ts +4 -0
- package/dist_ts/forwarding/factory/index.js +5 -0
- package/dist_ts/forwarding/handlers/base-handler.d.ts +55 -0
- package/dist_ts/forwarding/handlers/base-handler.js +94 -0
- package/dist_ts/forwarding/handlers/http-handler.d.ts +30 -0
- package/dist_ts/forwarding/handlers/http-handler.js +131 -0
- package/dist_ts/forwarding/handlers/https-passthrough-handler.d.ts +29 -0
- package/dist_ts/forwarding/handlers/https-passthrough-handler.js +162 -0
- package/dist_ts/forwarding/handlers/https-terminate-to-http-handler.d.ts +36 -0
- package/dist_ts/forwarding/handlers/https-terminate-to-http-handler.js +229 -0
- package/dist_ts/forwarding/handlers/https-terminate-to-https-handler.d.ts +35 -0
- package/dist_ts/forwarding/handlers/https-terminate-to-https-handler.js +254 -0
- package/dist_ts/forwarding/handlers/index.d.ts +8 -0
- package/dist_ts/forwarding/handlers/index.js +9 -0
- package/dist_ts/forwarding/index.d.ts +19 -0
- package/dist_ts/forwarding/index.js +25 -0
- package/dist_ts/http/index.d.ts +15 -0
- package/dist_ts/http/index.js +20 -0
- package/dist_ts/http/models/http-types.d.ts +81 -0
- package/dist_ts/http/models/http-types.js +62 -0
- package/dist_ts/http/port80/acme-interfaces.d.ts +78 -0
- package/dist_ts/http/port80/acme-interfaces.js +6 -0
- package/dist_ts/http/port80/challenge-responder.d.ts +53 -0
- package/dist_ts/http/port80/challenge-responder.js +203 -0
- package/dist_ts/http/port80/index.d.ts +6 -0
- package/dist_ts/http/port80/index.js +9 -0
- package/dist_ts/http/port80/port80-handler.d.ts +121 -0
- package/dist_ts/http/port80/port80-handler.js +554 -0
- package/dist_ts/http/redirects/index.d.ts +4 -0
- package/dist_ts/http/redirects/index.js +5 -0
- package/dist_ts/http/router/index.d.ts +4 -0
- package/dist_ts/http/router/index.js +5 -0
- package/dist_ts/http/router/proxy-router.d.ts +115 -0
- package/dist_ts/http/router/proxy-router.js +325 -0
- package/dist_ts/index.d.ts +15 -8
- package/dist_ts/index.js +26 -10
- package/dist_ts/networkproxy/classes.np.certificatemanager.js +2 -2
- package/dist_ts/networkproxy/index.d.ts +1 -6
- package/dist_ts/networkproxy/index.js +4 -8
- package/dist_ts/plugins.d.ts +2 -1
- package/dist_ts/plugins.js +3 -2
- package/dist_ts/port80handler/classes.port80handler.d.ts +8 -136
- package/dist_ts/port80handler/classes.port80handler.js +14 -567
- package/dist_ts/proxies/index.d.ts +6 -0
- package/dist_ts/proxies/index.js +8 -0
- package/dist_ts/proxies/network-proxy/certificate-manager.d.ts +77 -0
- package/dist_ts/proxies/network-proxy/certificate-manager.js +373 -0
- package/dist_ts/proxies/network-proxy/connection-pool.d.ts +47 -0
- package/dist_ts/proxies/network-proxy/connection-pool.js +210 -0
- package/dist_ts/proxies/network-proxy/index.d.ts +10 -0
- package/dist_ts/proxies/network-proxy/index.js +12 -0
- package/dist_ts/proxies/network-proxy/models/index.d.ts +4 -0
- package/dist_ts/proxies/network-proxy/models/index.js +5 -0
- package/dist_ts/proxies/network-proxy/models/types.d.ts +80 -0
- package/dist_ts/proxies/network-proxy/models/types.js +35 -0
- package/dist_ts/proxies/network-proxy/network-proxy.d.ts +118 -0
- package/dist_ts/proxies/network-proxy/network-proxy.js +387 -0
- package/dist_ts/proxies/network-proxy/request-handler.d.ts +57 -0
- package/dist_ts/proxies/network-proxy/request-handler.js +394 -0
- package/dist_ts/proxies/network-proxy/websocket-handler.d.ts +38 -0
- package/dist_ts/proxies/network-proxy/websocket-handler.js +188 -0
- package/dist_ts/proxies/nftables-proxy/index.d.ts +5 -0
- package/dist_ts/proxies/nftables-proxy/index.js +6 -0
- package/dist_ts/proxies/nftables-proxy/models/errors.d.ts +15 -0
- package/dist_ts/proxies/nftables-proxy/models/errors.js +28 -0
- package/dist_ts/proxies/nftables-proxy/models/index.d.ts +5 -0
- package/dist_ts/proxies/nftables-proxy/models/index.js +6 -0
- package/dist_ts/proxies/nftables-proxy/models/interfaces.d.ts +75 -0
- package/dist_ts/proxies/nftables-proxy/models/interfaces.js +5 -0
- package/dist_ts/proxies/nftables-proxy/nftables-proxy.d.ts +136 -0
- package/dist_ts/proxies/nftables-proxy/nftables-proxy.js +1516 -0
- package/dist_ts/proxies/smart-proxy/connection-handler.d.ts +39 -0
- package/dist_ts/proxies/smart-proxy/connection-handler.js +894 -0
- package/dist_ts/proxies/smart-proxy/connection-manager.d.ts +78 -0
- package/dist_ts/proxies/smart-proxy/connection-manager.js +378 -0
- package/dist_ts/proxies/smart-proxy/domain-config-manager.d.ts +95 -0
- package/dist_ts/proxies/smart-proxy/domain-config-manager.js +255 -0
- package/dist_ts/proxies/smart-proxy/index.d.ts +13 -0
- package/dist_ts/proxies/smart-proxy/index.js +17 -0
- package/dist_ts/proxies/smart-proxy/models/index.d.ts +4 -0
- package/dist_ts/proxies/smart-proxy/models/index.js +5 -0
- package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +107 -0
- package/dist_ts/proxies/smart-proxy/models/interfaces.js +2 -0
- package/dist_ts/proxies/smart-proxy/network-proxy-bridge.d.ts +62 -0
- package/dist_ts/proxies/smart-proxy/network-proxy-bridge.js +316 -0
- package/dist_ts/proxies/smart-proxy/port-range-manager.d.ts +56 -0
- package/dist_ts/proxies/smart-proxy/port-range-manager.js +176 -0
- package/dist_ts/proxies/smart-proxy/security-manager.d.ts +64 -0
- package/dist_ts/proxies/smart-proxy/security-manager.js +149 -0
- package/dist_ts/proxies/smart-proxy/smart-proxy.d.ts +63 -0
- package/dist_ts/proxies/smart-proxy/smart-proxy.js +523 -0
- package/dist_ts/proxies/smart-proxy/timeout-manager.d.ts +47 -0
- package/dist_ts/proxies/smart-proxy/timeout-manager.js +154 -0
- package/dist_ts/proxies/smart-proxy/tls-manager.d.ts +57 -0
- package/dist_ts/proxies/smart-proxy/tls-manager.js +132 -0
- package/dist_ts/smartproxy/classes.pp.networkproxybridge.d.ts +2 -2
- package/dist_ts/smartproxy/classes.pp.networkproxybridge.js +1 -1
- package/dist_ts/smartproxy/classes.pp.tlsmanager.js +2 -2
- package/dist_ts/smartproxy/classes.smartproxy.js +3 -3
- package/dist_ts/tls/alerts/index.d.ts +4 -0
- package/dist_ts/tls/alerts/index.js +5 -0
- package/dist_ts/tls/alerts/tls-alert.d.ts +150 -0
- package/dist_ts/tls/alerts/tls-alert.js +226 -0
- package/dist_ts/tls/index.d.ts +18 -0
- package/dist_ts/tls/index.js +27 -0
- package/dist_ts/tls/sni/client-hello-parser.d.ts +100 -0
- package/dist_ts/tls/sni/client-hello-parser.js +463 -0
- package/dist_ts/tls/sni/index.d.ts +4 -0
- package/dist_ts/tls/sni/index.js +5 -0
- package/dist_ts/tls/sni/sni-extraction.d.ts +58 -0
- package/dist_ts/tls/sni/sni-extraction.js +275 -0
- package/dist_ts/tls/sni/sni-handler.d.ts +154 -0
- package/dist_ts/tls/sni/sni-handler.js +191 -0
- package/dist_ts/tls/utils/index.d.ts +4 -0
- package/dist_ts/tls/utils/index.js +5 -0
- package/dist_ts/tls/utils/tls-utils.d.ts +158 -0
- package/dist_ts/tls/utils/tls-utils.js +187 -0
- package/package.json +1 -1
- package/readme.md +89 -21
- package/readme.plan.md +253 -469
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/certificate/acme/acme-factory.ts +48 -0
- package/ts/certificate/acme/challenge-handler.ts +110 -0
- package/ts/certificate/acme/index.ts +3 -0
- package/ts/certificate/events/certificate-events.ts +36 -0
- package/ts/certificate/index.ts +67 -0
- package/ts/certificate/models/certificate-types.ts +88 -0
- package/ts/certificate/providers/cert-provisioner.ts +326 -0
- package/ts/certificate/providers/index.ts +3 -0
- package/ts/certificate/storage/file-storage.ts +234 -0
- package/ts/certificate/storage/index.ts +3 -0
- package/ts/certificate/utils/certificate-helpers.ts +50 -0
- package/ts/common/eventUtils.ts +1 -1
- package/ts/common/port80-adapter.ts +1 -1
- package/ts/core/events/index.ts +3 -0
- package/ts/core/index.ts +8 -0
- package/ts/core/models/common-types.ts +91 -0
- package/ts/core/models/index.ts +5 -0
- package/ts/core/utils/event-utils.ts +34 -0
- package/ts/core/utils/index.ts +7 -0
- package/ts/core/utils/ip-utils.ts +175 -0
- package/ts/core/utils/validation-utils.ts +177 -0
- package/ts/{smartproxy/forwarding → forwarding/config}/domain-config.ts +1 -1
- package/ts/{smartproxy/forwarding → forwarding/config}/domain-manager.ts +8 -8
- package/ts/{smartproxy/types/forwarding.types.ts → forwarding/config/forwarding-types.ts} +6 -6
- package/ts/forwarding/config/index.ts +7 -0
- package/ts/{smartproxy/forwarding/forwarding.factory.ts → forwarding/factory/forwarding-factory.ts} +12 -11
- package/ts/forwarding/factory/index.ts +5 -0
- package/ts/{smartproxy/forwarding/forwarding.handler.ts → forwarding/handlers/base-handler.ts} +2 -2
- package/ts/{smartproxy/forwarding/http.handler.ts → forwarding/handlers/http-handler.ts} +13 -4
- package/ts/{smartproxy/forwarding/https-passthrough.handler.ts → forwarding/handlers/https-passthrough-handler.ts} +13 -4
- package/ts/{smartproxy/forwarding/https-terminate-to-http.handler.ts → forwarding/handlers/https-terminate-to-http-handler.ts} +3 -3
- package/ts/{smartproxy/forwarding/https-terminate-to-https.handler.ts → forwarding/handlers/https-terminate-to-https-handler.ts} +3 -3
- package/ts/forwarding/handlers/index.ts +9 -0
- package/ts/forwarding/index.ts +34 -0
- package/ts/http/index.ts +23 -0
- package/ts/http/models/http-types.ts +105 -0
- package/ts/http/port80/acme-interfaces.ts +85 -0
- package/ts/http/port80/challenge-responder.ts +246 -0
- package/ts/http/port80/index.ts +13 -0
- package/ts/{port80handler/classes.port80handler.ts → http/port80/port80-handler.ts} +164 -161
- package/ts/http/redirects/index.ts +3 -0
- package/ts/http/router/index.ts +5 -0
- package/ts/{classes.router.ts → http/router/proxy-router.ts} +27 -20
- package/ts/index.ts +32 -9
- package/ts/plugins.ts +2 -1
- package/ts/proxies/index.ts +8 -0
- package/ts/{networkproxy/classes.np.certificatemanager.ts → proxies/network-proxy/certificate-manager.ts} +17 -16
- package/ts/{networkproxy/classes.np.connectionpool.ts → proxies/network-proxy/connection-pool.ts} +3 -3
- package/ts/proxies/network-proxy/index.ts +13 -0
- package/ts/proxies/network-proxy/models/index.ts +4 -0
- package/ts/{networkproxy/classes.np.types.ts → proxies/network-proxy/models/types.ts} +7 -11
- package/ts/{networkproxy/classes.np.networkproxy.ts → proxies/network-proxy/network-proxy.ts} +31 -24
- package/ts/{networkproxy/classes.np.requesthandler.ts → proxies/network-proxy/request-handler.ts} +12 -7
- package/ts/{networkproxy/classes.np.websockethandler.ts → proxies/network-proxy/websocket-handler.ts} +6 -6
- package/ts/proxies/nftables-proxy/index.ts +5 -0
- package/ts/proxies/nftables-proxy/models/errors.ts +30 -0
- package/ts/proxies/nftables-proxy/models/index.ts +5 -0
- package/ts/proxies/nftables-proxy/models/interfaces.ts +94 -0
- package/ts/{nfttablesproxy/classes.nftablesproxy.ts → proxies/nftables-proxy/nftables-proxy.ts} +24 -126
- package/ts/{smartproxy/classes.pp.connectionhandler.ts → proxies/smart-proxy/connection-handler.ts} +12 -12
- package/ts/{smartproxy/classes.pp.connectionmanager.ts → proxies/smart-proxy/connection-manager.ts} +8 -8
- package/ts/{smartproxy/classes.pp.domainconfigmanager.ts → proxies/smart-proxy/domain-config-manager.ts} +15 -14
- package/ts/proxies/smart-proxy/index.ts +18 -0
- package/ts/proxies/smart-proxy/models/index.ts +4 -0
- package/ts/{smartproxy/classes.pp.interfaces.ts → proxies/smart-proxy/models/interfaces.ts} +12 -8
- package/ts/{smartproxy/classes.pp.networkproxybridge.ts → proxies/smart-proxy/network-proxy-bridge.ts} +14 -14
- package/ts/{smartproxy/classes.pp.portrangemanager.ts → proxies/smart-proxy/port-range-manager.ts} +1 -1
- package/ts/{smartproxy/classes.pp.securitymanager.ts → proxies/smart-proxy/security-manager.ts} +3 -3
- package/ts/{smartproxy/classes.smartproxy.ts → proxies/smart-proxy/smart-proxy.ts} +29 -24
- package/ts/{smartproxy/classes.pp.timeoutmanager.ts → proxies/smart-proxy/timeout-manager.ts} +3 -3
- package/ts/{smartproxy/classes.pp.tlsmanager.ts → proxies/smart-proxy/tls-manager.ts} +3 -3
- package/ts/tls/alerts/index.ts +3 -0
- package/ts/{smartproxy/classes.pp.tlsalert.ts → tls/alerts/tls-alert.ts} +44 -43
- package/ts/tls/index.ts +33 -0
- package/ts/tls/sni/client-hello-parser.ts +629 -0
- package/ts/tls/sni/index.ts +3 -0
- package/ts/tls/sni/sni-extraction.ts +353 -0
- package/ts/tls/sni/sni-handler.ts +264 -0
- package/ts/tls/utils/index.ts +3 -0
- package/ts/tls/utils/tls-utils.ts +201 -0
- package/ts/common/acmeFactory.ts +0 -23
- package/ts/helpers.certificates.ts +0 -30
- package/ts/networkproxy/index.ts +0 -7
- package/ts/smartproxy/classes.pp.certprovisioner.ts +0 -200
- package/ts/smartproxy/classes.pp.snihandler.ts +0 -1281
- package/ts/smartproxy/forwarding/index.ts +0 -52
|
@@ -1,22 +1,29 @@
|
|
|
1
|
-
import * as plugins from '
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import type { IReverseProxyConfig } from '../../proxies/network-proxy/models/types.js';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Optional path pattern configuration that can be added to proxy configs
|
|
5
6
|
*/
|
|
6
|
-
export interface
|
|
7
|
+
export interface PathPatternConfig {
|
|
7
8
|
pathPattern?: string;
|
|
8
9
|
}
|
|
9
10
|
|
|
11
|
+
// Backward compatibility
|
|
12
|
+
export type IPathPatternConfig = PathPatternConfig;
|
|
13
|
+
|
|
10
14
|
/**
|
|
11
15
|
* Interface for router result with additional metadata
|
|
12
16
|
*/
|
|
13
|
-
export interface
|
|
14
|
-
config:
|
|
17
|
+
export interface RouterResult {
|
|
18
|
+
config: IReverseProxyConfig;
|
|
15
19
|
pathMatch?: string;
|
|
16
20
|
pathParams?: Record<string, string>;
|
|
17
21
|
pathRemainder?: string;
|
|
18
22
|
}
|
|
19
23
|
|
|
24
|
+
// Backward compatibility
|
|
25
|
+
export type IRouterResult = RouterResult;
|
|
26
|
+
|
|
20
27
|
/**
|
|
21
28
|
* Router for HTTP reverse proxy requests
|
|
22
29
|
*
|
|
@@ -34,13 +41,13 @@ export interface IRouterResult {
|
|
|
34
41
|
*/
|
|
35
42
|
export class ProxyRouter {
|
|
36
43
|
// Store original configs for reference
|
|
37
|
-
private reverseProxyConfigs:
|
|
44
|
+
private reverseProxyConfigs: IReverseProxyConfig[] = [];
|
|
38
45
|
// Default config to use when no match is found (optional)
|
|
39
|
-
private defaultConfig?:
|
|
46
|
+
private defaultConfig?: IReverseProxyConfig;
|
|
40
47
|
// Store path patterns separately since they're not in the original interface
|
|
41
|
-
private pathPatterns: Map<
|
|
48
|
+
private pathPatterns: Map<IReverseProxyConfig, string> = new Map();
|
|
42
49
|
// Logger interface
|
|
43
|
-
private logger: {
|
|
50
|
+
private logger: {
|
|
44
51
|
error: (message: string, data?: any) => void;
|
|
45
52
|
warn: (message: string, data?: any) => void;
|
|
46
53
|
info: (message: string, data?: any) => void;
|
|
@@ -48,8 +55,8 @@ export class ProxyRouter {
|
|
|
48
55
|
};
|
|
49
56
|
|
|
50
57
|
constructor(
|
|
51
|
-
configs?:
|
|
52
|
-
logger?: {
|
|
58
|
+
configs?: IReverseProxyConfig[],
|
|
59
|
+
logger?: {
|
|
53
60
|
error: (message: string, data?: any) => void;
|
|
54
61
|
warn: (message: string, data?: any) => void;
|
|
55
62
|
info: (message: string, data?: any) => void;
|
|
@@ -66,12 +73,12 @@ export class ProxyRouter {
|
|
|
66
73
|
* Sets a new set of reverse configs to be routed to
|
|
67
74
|
* @param reverseCandidatesArg Array of reverse proxy configurations
|
|
68
75
|
*/
|
|
69
|
-
public setNewProxyConfigs(reverseCandidatesArg:
|
|
76
|
+
public setNewProxyConfigs(reverseCandidatesArg: IReverseProxyConfig[]): void {
|
|
70
77
|
this.reverseProxyConfigs = [...reverseCandidatesArg];
|
|
71
|
-
|
|
78
|
+
|
|
72
79
|
// Find default config if any (config with "*" as hostname)
|
|
73
80
|
this.defaultConfig = this.reverseProxyConfigs.find(config => config.hostName === '*');
|
|
74
|
-
|
|
81
|
+
|
|
75
82
|
this.logger.info(`Router initialized with ${this.reverseProxyConfigs.length} configs (${this.getHostnames().length} unique hosts)`);
|
|
76
83
|
}
|
|
77
84
|
|
|
@@ -80,17 +87,17 @@ export class ProxyRouter {
|
|
|
80
87
|
* @param req The incoming HTTP request
|
|
81
88
|
* @returns The matching proxy config or undefined if no match found
|
|
82
89
|
*/
|
|
83
|
-
public routeReq(req: plugins.http.IncomingMessage):
|
|
90
|
+
public routeReq(req: plugins.http.IncomingMessage): IReverseProxyConfig {
|
|
84
91
|
const result = this.routeReqWithDetails(req);
|
|
85
92
|
return result ? result.config : undefined;
|
|
86
93
|
}
|
|
87
|
-
|
|
94
|
+
|
|
88
95
|
/**
|
|
89
96
|
* Routes a request with detailed matching information
|
|
90
97
|
* @param req The incoming HTTP request
|
|
91
98
|
* @returns Detailed routing result including matched config and path information
|
|
92
99
|
*/
|
|
93
|
-
public routeReqWithDetails(req: plugins.http.IncomingMessage):
|
|
100
|
+
public routeReqWithDetails(req: plugins.http.IncomingMessage): RouterResult | undefined {
|
|
94
101
|
// Extract and validate host header
|
|
95
102
|
const originalHost = req.headers.host;
|
|
96
103
|
if (!originalHost) {
|
|
@@ -202,7 +209,7 @@ export class ProxyRouter {
|
|
|
202
209
|
/**
|
|
203
210
|
* Find a config for a specific host and path
|
|
204
211
|
*/
|
|
205
|
-
private findConfigForHost(hostname: string, path: string):
|
|
212
|
+
private findConfigForHost(hostname: string, path: string): RouterResult | undefined {
|
|
206
213
|
// Find all configs for this hostname
|
|
207
214
|
const configs = this.reverseProxyConfigs.filter(
|
|
208
215
|
config => config.hostName.toLowerCase() === hostname.toLowerCase()
|
|
@@ -349,7 +356,7 @@ export class ProxyRouter {
|
|
|
349
356
|
* Gets all currently active proxy configurations
|
|
350
357
|
* @returns Array of all active configurations
|
|
351
358
|
*/
|
|
352
|
-
public getProxyConfigs():
|
|
359
|
+
public getProxyConfigs(): IReverseProxyConfig[] {
|
|
353
360
|
return [...this.reverseProxyConfigs];
|
|
354
361
|
}
|
|
355
362
|
|
|
@@ -373,7 +380,7 @@ export class ProxyRouter {
|
|
|
373
380
|
* @param pathPattern Optional path pattern for route matching
|
|
374
381
|
*/
|
|
375
382
|
public addProxyConfig(
|
|
376
|
-
config:
|
|
383
|
+
config: IReverseProxyConfig,
|
|
377
384
|
pathPattern?: string
|
|
378
385
|
): void {
|
|
379
386
|
this.reverseProxyConfigs.push(config);
|
|
@@ -391,7 +398,7 @@ export class ProxyRouter {
|
|
|
391
398
|
* @returns Boolean indicating if the config was found and updated
|
|
392
399
|
*/
|
|
393
400
|
public setPathPattern(
|
|
394
|
-
config:
|
|
401
|
+
config: IReverseProxyConfig,
|
|
395
402
|
pathPattern: string
|
|
396
403
|
): boolean {
|
|
397
404
|
const exists = this.reverseProxyConfigs.includes(config);
|
package/ts/index.ts
CHANGED
|
@@ -1,12 +1,35 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/**
|
|
2
|
+
* SmartProxy main module exports
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
// Legacy exports (to maintain backward compatibility)
|
|
6
|
+
// Migrated to the new proxies structure
|
|
7
|
+
export * from './proxies/nftables-proxy/index.js';
|
|
8
|
+
export * from './proxies/network-proxy/index.js';
|
|
9
|
+
// Export port80handler elements selectively to avoid conflicts
|
|
10
|
+
export {
|
|
11
|
+
Port80Handler,
|
|
12
|
+
Port80HandlerError as HttpError,
|
|
13
|
+
ServerError,
|
|
14
|
+
CertificateError
|
|
15
|
+
} from './http/port80/port80-handler.js';
|
|
16
|
+
// Use re-export to control the names
|
|
17
|
+
export { Port80HandlerEvents } from './certificate/events/certificate-events.js';
|
|
18
|
+
|
|
4
19
|
export * from './redirect/classes.redirect.js';
|
|
5
|
-
export * from './
|
|
6
|
-
export * from './smartproxy/classes.pp.snihandler.js'
|
|
7
|
-
export
|
|
20
|
+
export * from './proxies/smart-proxy/index.js';
|
|
21
|
+
// Original: export * from './smartproxy/classes.pp.snihandler.js'
|
|
22
|
+
// Now we export from the new module
|
|
23
|
+
export { SniHandler } from './tls/sni/sni-handler.js';
|
|
24
|
+
// Original: export * from './smartproxy/classes.pp.interfaces.js'
|
|
25
|
+
// Now we export from the new module
|
|
26
|
+
export * from './proxies/smart-proxy/models/interfaces.js';
|
|
8
27
|
|
|
9
|
-
|
|
28
|
+
// Core types and utilities
|
|
29
|
+
export * from './core/models/common-types.js';
|
|
10
30
|
|
|
11
|
-
//
|
|
12
|
-
export * as forwarding from './
|
|
31
|
+
// Modular exports for new architecture
|
|
32
|
+
export * as forwarding from './forwarding/index.js';
|
|
33
|
+
export * as certificate from './certificate/index.js';
|
|
34
|
+
export * as tls from './tls/index.js';
|
|
35
|
+
export * as http from './http/index.js';
|
package/ts/plugins.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// node native scope
|
|
2
2
|
import { EventEmitter } from 'events';
|
|
3
|
+
import * as fs from 'fs';
|
|
3
4
|
import * as http from 'http';
|
|
4
5
|
import * as https from 'https';
|
|
5
6
|
import * as net from 'net';
|
|
@@ -7,7 +8,7 @@ import * as tls from 'tls';
|
|
|
7
8
|
import * as url from 'url';
|
|
8
9
|
import * as http2 from 'http2';
|
|
9
10
|
|
|
10
|
-
export { EventEmitter, http, https, net, tls, url, http2 };
|
|
11
|
+
export { EventEmitter, fs, http, https, net, tls, url, http2 };
|
|
11
12
|
|
|
12
13
|
// tsclass scope
|
|
13
14
|
import * as tsclass from '@tsclass/tsclass';
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import * as plugins from '
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
2
|
import * as fs from 'fs';
|
|
3
3
|
import * as path from 'path';
|
|
4
4
|
import { fileURLToPath } from 'url';
|
|
5
|
-
import { type INetworkProxyOptions, type ICertificateEntry, type ILogger, createLogger } from './
|
|
6
|
-
import { Port80Handler } from '
|
|
7
|
-
import {
|
|
8
|
-
import { buildPort80Handler } from '
|
|
9
|
-
import { subscribeToPort80Handler } from '
|
|
10
|
-
import type { IDomainOptions } from '
|
|
5
|
+
import { type INetworkProxyOptions, type ICertificateEntry, type ILogger, createLogger } from './models/types.js';
|
|
6
|
+
import { Port80Handler } from '../../http/port80/port80-handler.js';
|
|
7
|
+
import { CertificateEvents } from '../../certificate/events/certificate-events.js';
|
|
8
|
+
import { buildPort80Handler } from '../../certificate/acme/acme-factory.js';
|
|
9
|
+
import { subscribeToPort80Handler } from '../../core/utils/event-utils.js';
|
|
10
|
+
import type { IDomainOptions } from '../../certificate/models/certificate-types.js';
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* Manages SSL certificates for NetworkProxy including ACME integration
|
|
@@ -20,7 +20,7 @@ export class CertificateManager {
|
|
|
20
20
|
private certificateStoreDir: string;
|
|
21
21
|
private logger: ILogger;
|
|
22
22
|
private httpsServer: plugins.https.Server | null = null;
|
|
23
|
-
|
|
23
|
+
|
|
24
24
|
constructor(private options: INetworkProxyOptions) {
|
|
25
25
|
this.certificateStoreDir = path.resolve(options.acme?.certificateStore || './certs');
|
|
26
26
|
this.logger = createLogger(options.logLevel || 'info');
|
|
@@ -43,8 +43,9 @@ export class CertificateManager {
|
|
|
43
43
|
*/
|
|
44
44
|
public loadDefaultCertificates(): void {
|
|
45
45
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
// Fix the path to look for certificates at the project root instead of inside ts directory
|
|
47
|
+
const certPath = path.join(__dirname, '..', '..', '..', 'assets', 'certs');
|
|
48
|
+
|
|
48
49
|
try {
|
|
49
50
|
this.defaultCertificates = {
|
|
50
51
|
key: fs.readFileSync(path.join(certPath, 'key.pem'), 'utf8'),
|
|
@@ -53,7 +54,7 @@ export class CertificateManager {
|
|
|
53
54
|
this.logger.info('Default certificates loaded successfully');
|
|
54
55
|
} catch (error) {
|
|
55
56
|
this.logger.error('Error loading default certificates', error);
|
|
56
|
-
|
|
57
|
+
|
|
57
58
|
// Generate self-signed fallback certificates
|
|
58
59
|
try {
|
|
59
60
|
// This is a placeholder for actual certificate generation code
|
|
@@ -94,10 +95,10 @@ export class CertificateManager {
|
|
|
94
95
|
// Clean up existing handler if needed
|
|
95
96
|
if (this.port80Handler !== handler) {
|
|
96
97
|
// Unregister event handlers to avoid memory leaks
|
|
97
|
-
this.port80Handler.removeAllListeners(
|
|
98
|
-
this.port80Handler.removeAllListeners(
|
|
99
|
-
this.port80Handler.removeAllListeners(
|
|
100
|
-
this.port80Handler.removeAllListeners(
|
|
98
|
+
this.port80Handler.removeAllListeners(CertificateEvents.CERTIFICATE_ISSUED);
|
|
99
|
+
this.port80Handler.removeAllListeners(CertificateEvents.CERTIFICATE_RENEWED);
|
|
100
|
+
this.port80Handler.removeAllListeners(CertificateEvents.CERTIFICATE_FAILED);
|
|
101
|
+
this.port80Handler.removeAllListeners(CertificateEvents.CERTIFICATE_EXPIRING);
|
|
101
102
|
}
|
|
102
103
|
}
|
|
103
104
|
|
|
@@ -218,7 +219,7 @@ export class CertificateManager {
|
|
|
218
219
|
|
|
219
220
|
if (!certData) {
|
|
220
221
|
this.logger.info(`No certificate found for ${domain}, registering for issuance`);
|
|
221
|
-
|
|
222
|
+
|
|
222
223
|
// Register with new domain options format
|
|
223
224
|
const domainOptions: IDomainOptions = {
|
|
224
225
|
domainName: domain,
|
package/ts/{networkproxy/classes.np.connectionpool.ts → proxies/network-proxy/connection-pool.ts}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import * as plugins from '
|
|
2
|
-
import { type INetworkProxyOptions, type IConnectionEntry, type ILogger, createLogger } from './
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import { type INetworkProxyOptions, type IConnectionEntry, type ILogger, createLogger } from './models/types.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Manages a pool of backend connections for efficient reuse
|
|
@@ -8,7 +8,7 @@ export class ConnectionPool {
|
|
|
8
8
|
private connectionPool: Map<string, Array<IConnectionEntry>> = new Map();
|
|
9
9
|
private roundRobinPositions: Map<string, number> = new Map();
|
|
10
10
|
private logger: ILogger;
|
|
11
|
-
|
|
11
|
+
|
|
12
12
|
constructor(private options: INetworkProxyOptions) {
|
|
13
13
|
this.logger = createLogger(options.logLevel || 'info');
|
|
14
14
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NetworkProxy implementation
|
|
3
|
+
*/
|
|
4
|
+
// Re-export models
|
|
5
|
+
export * from './models/index.js';
|
|
6
|
+
|
|
7
|
+
// Export NetworkProxy and supporting classes
|
|
8
|
+
export { NetworkProxy } from './network-proxy.js';
|
|
9
|
+
export { CertificateManager } from './certificate-manager.js';
|
|
10
|
+
export { ConnectionPool } from './connection-pool.js';
|
|
11
|
+
export { RequestHandler } from './request-handler.js';
|
|
12
|
+
export type { IMetricsTracker, MetricsTracker } from './request-handler.js';
|
|
13
|
+
export { WebSocketHandler } from './websocket-handler.js';
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
import * as plugins from '
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Configuration options for NetworkProxy
|
|
5
|
-
*/
|
|
6
|
-
import type { IAcmeOptions } from '../common/types.js';
|
|
1
|
+
import * as plugins from '../../../plugins.js';
|
|
2
|
+
import type { IAcmeOptions } from '../../../certificate/models/certificate-types.js';
|
|
7
3
|
|
|
8
4
|
/**
|
|
9
5
|
* Configuration options for NetworkProxy
|
|
@@ -20,14 +16,14 @@ export interface INetworkProxyOptions {
|
|
|
20
16
|
allowHeaders?: string;
|
|
21
17
|
maxAge?: number;
|
|
22
18
|
};
|
|
23
|
-
|
|
24
|
-
// Settings for
|
|
19
|
+
|
|
20
|
+
// Settings for SmartProxy integration
|
|
25
21
|
connectionPoolSize?: number; // Maximum connections to maintain in the pool to each backend
|
|
26
|
-
portProxyIntegration?: boolean; // Flag to indicate this proxy is used by
|
|
22
|
+
portProxyIntegration?: boolean; // Flag to indicate this proxy is used by SmartProxy
|
|
27
23
|
useExternalPort80Handler?: boolean; // Flag to indicate using external Port80Handler
|
|
28
24
|
// Protocol to use when proxying to backends: HTTP/1.x or HTTP/2
|
|
29
25
|
backendProtocol?: 'http1' | 'http2';
|
|
30
|
-
|
|
26
|
+
|
|
31
27
|
// ACME certificate management options
|
|
32
28
|
acme?: IAcmeOptions;
|
|
33
29
|
}
|
|
@@ -100,7 +96,7 @@ export function createLogger(logLevel: string = 'info'): ILogger {
|
|
|
100
96
|
info: 2,
|
|
101
97
|
debug: 3
|
|
102
98
|
};
|
|
103
|
-
|
|
99
|
+
|
|
104
100
|
return {
|
|
105
101
|
debug: (message: string, data?: any) => {
|
|
106
102
|
if (logLevels[logLevel] >= logLevels.debug) {
|
package/ts/{networkproxy/classes.np.networkproxy.ts → proxies/network-proxy/network-proxy.ts}
RENAMED
|
@@ -1,11 +1,18 @@
|
|
|
1
|
-
import * as plugins from '
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import {
|
|
3
|
+
createLogger
|
|
4
|
+
} from './models/types.js';
|
|
5
|
+
import type {
|
|
6
|
+
INetworkProxyOptions,
|
|
7
|
+
ILogger,
|
|
8
|
+
IReverseProxyConfig
|
|
9
|
+
} from './models/types.js';
|
|
10
|
+
import { CertificateManager } from './certificate-manager.js';
|
|
11
|
+
import { ConnectionPool } from './connection-pool.js';
|
|
12
|
+
import { RequestHandler, type IMetricsTracker } from './request-handler.js';
|
|
13
|
+
import { WebSocketHandler } from './websocket-handler.js';
|
|
14
|
+
import { ProxyRouter } from '../../http/router/index.js';
|
|
15
|
+
import { Port80Handler } from '../../http/port80/port80-handler.js';
|
|
9
16
|
|
|
10
17
|
/**
|
|
11
18
|
* NetworkProxy provides a reverse proxy with TLS termination, WebSocket support,
|
|
@@ -38,7 +45,7 @@ export class NetworkProxy implements IMetricsTracker {
|
|
|
38
45
|
public requestsServed: number = 0;
|
|
39
46
|
public failedRequests: number = 0;
|
|
40
47
|
|
|
41
|
-
// Tracking for
|
|
48
|
+
// Tracking for SmartProxy integration
|
|
42
49
|
private portProxyConnections: number = 0;
|
|
43
50
|
private tlsTerminatedConnections: number = 0;
|
|
44
51
|
|
|
@@ -66,7 +73,7 @@ export class NetworkProxy implements IMetricsTracker {
|
|
|
66
73
|
allowHeaders: 'Content-Type, Authorization',
|
|
67
74
|
maxAge: 86400
|
|
68
75
|
},
|
|
69
|
-
// Defaults for
|
|
76
|
+
// Defaults for SmartProxy integration
|
|
70
77
|
connectionPoolSize: optionsArg.connectionPoolSize || 50,
|
|
71
78
|
portProxyIntegration: optionsArg.portProxyIntegration || false,
|
|
72
79
|
useExternalPort80Handler: optionsArg.useExternalPort80Handler || false,
|
|
@@ -114,7 +121,7 @@ export class NetworkProxy implements IMetricsTracker {
|
|
|
114
121
|
|
|
115
122
|
/**
|
|
116
123
|
* Returns the port number this NetworkProxy is listening on
|
|
117
|
-
* Useful for
|
|
124
|
+
* Useful for SmartProxy to determine where to forward connections
|
|
118
125
|
*/
|
|
119
126
|
public getListeningPort(): number {
|
|
120
127
|
return this.options.port;
|
|
@@ -152,7 +159,7 @@ export class NetworkProxy implements IMetricsTracker {
|
|
|
152
159
|
|
|
153
160
|
/**
|
|
154
161
|
* Returns current server metrics
|
|
155
|
-
* Useful for
|
|
162
|
+
* Useful for SmartProxy to determine which NetworkProxy to use for load balancing
|
|
156
163
|
*/
|
|
157
164
|
public getMetrics(): any {
|
|
158
165
|
return {
|
|
@@ -247,14 +254,14 @@ export class NetworkProxy implements IMetricsTracker {
|
|
|
247
254
|
this.socketMap.add(connection);
|
|
248
255
|
this.connectedClients = this.socketMap.getArray().length;
|
|
249
256
|
|
|
250
|
-
// Check for connection from
|
|
257
|
+
// Check for connection from SmartProxy by inspecting the source port
|
|
251
258
|
const localPort = connection.localPort || 0;
|
|
252
259
|
const remotePort = connection.remotePort || 0;
|
|
253
260
|
|
|
254
|
-
// If this connection is from a
|
|
261
|
+
// If this connection is from a SmartProxy (usually indicated by it coming from localhost)
|
|
255
262
|
if (this.options.portProxyIntegration && connection.remoteAddress?.includes('127.0.0.1')) {
|
|
256
263
|
this.portProxyConnections++;
|
|
257
|
-
this.logger.debug(`New connection from
|
|
264
|
+
this.logger.debug(`New connection from SmartProxy (local: ${localPort}, remote: ${remotePort})`);
|
|
258
265
|
} else {
|
|
259
266
|
this.logger.debug(`New direct connection (local: ${localPort}, remote: ${remotePort})`);
|
|
260
267
|
}
|
|
@@ -265,7 +272,7 @@ export class NetworkProxy implements IMetricsTracker {
|
|
|
265
272
|
this.socketMap.remove(connection);
|
|
266
273
|
this.connectedClients = this.socketMap.getArray().length;
|
|
267
274
|
|
|
268
|
-
// If this was a
|
|
275
|
+
// If this was a SmartProxy connection, decrement the counter
|
|
269
276
|
if (this.options.portProxyIntegration && connection.remoteAddress?.includes('127.0.0.1')) {
|
|
270
277
|
this.portProxyConnections--;
|
|
271
278
|
}
|
|
@@ -321,7 +328,7 @@ export class NetworkProxy implements IMetricsTracker {
|
|
|
321
328
|
* Updates proxy configurations
|
|
322
329
|
*/
|
|
323
330
|
public async updateProxyConfigs(
|
|
324
|
-
proxyConfigsArg:
|
|
331
|
+
proxyConfigsArg: IReverseProxyConfig[]
|
|
325
332
|
): Promise<void> {
|
|
326
333
|
this.logger.info(`Updating proxy configurations (${proxyConfigsArg.length} configs)`);
|
|
327
334
|
|
|
@@ -366,20 +373,20 @@ export class NetworkProxy implements IMetricsTracker {
|
|
|
366
373
|
}
|
|
367
374
|
|
|
368
375
|
/**
|
|
369
|
-
* Converts
|
|
370
|
-
* @param domainConfigs
|
|
376
|
+
* Converts SmartProxy domain configurations to NetworkProxy configs
|
|
377
|
+
* @param domainConfigs SmartProxy domain configs
|
|
371
378
|
* @param sslKeyPair Default SSL key pair to use if not specified
|
|
372
379
|
* @returns Array of NetworkProxy configs
|
|
373
380
|
*/
|
|
374
|
-
public
|
|
381
|
+
public convertSmartProxyConfigs(
|
|
375
382
|
domainConfigs: Array<{
|
|
376
383
|
domains: string[];
|
|
377
384
|
targetIPs?: string[];
|
|
378
385
|
allowedIPs?: string[];
|
|
379
386
|
}>,
|
|
380
387
|
sslKeyPair?: { key: string; cert: string }
|
|
381
|
-
):
|
|
382
|
-
const proxyConfigs:
|
|
388
|
+
): IReverseProxyConfig[] {
|
|
389
|
+
const proxyConfigs: IReverseProxyConfig[] = [];
|
|
383
390
|
|
|
384
391
|
// Use default certificates if not provided
|
|
385
392
|
const defaultCerts = this.certificateManager.getDefaultCertificates();
|
|
@@ -404,7 +411,7 @@ export class NetworkProxy implements IMetricsTracker {
|
|
|
404
411
|
}
|
|
405
412
|
}
|
|
406
413
|
|
|
407
|
-
this.logger.info(`Converted ${domainConfigs.length}
|
|
414
|
+
this.logger.info(`Converted ${domainConfigs.length} SmartProxy configs to ${proxyConfigs.length} NetworkProxy configs`);
|
|
408
415
|
return proxyConfigs;
|
|
409
416
|
}
|
|
410
417
|
|
|
@@ -471,7 +478,7 @@ export class NetworkProxy implements IMetricsTracker {
|
|
|
471
478
|
/**
|
|
472
479
|
* Gets all proxy configurations currently in use
|
|
473
480
|
*/
|
|
474
|
-
public getProxyConfigs():
|
|
481
|
+
public getProxyConfigs(): IReverseProxyConfig[] {
|
|
475
482
|
return [...this.proxyConfigs];
|
|
476
483
|
}
|
|
477
484
|
}
|
package/ts/{networkproxy/classes.np.requesthandler.ts → proxies/network-proxy/request-handler.ts}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import * as plugins from '
|
|
2
|
-
import { type INetworkProxyOptions, type ILogger, createLogger, type IReverseProxyConfig } from './
|
|
3
|
-
import { ConnectionPool } from './
|
|
4
|
-
import { ProxyRouter } from '
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import { type INetworkProxyOptions, type ILogger, createLogger, type IReverseProxyConfig } from './models/types.js';
|
|
3
|
+
import { ConnectionPool } from './connection-pool.js';
|
|
4
|
+
import { ProxyRouter } from '../../http/router/index.js';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Interface for tracking metrics
|
|
@@ -11,6 +11,9 @@ export interface IMetricsTracker {
|
|
|
11
11
|
incrementFailedRequests(): void;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
+
// Backward compatibility
|
|
15
|
+
export type MetricsTracker = IMetricsTracker;
|
|
16
|
+
|
|
14
17
|
/**
|
|
15
18
|
* Handles HTTP request processing and proxying
|
|
16
19
|
*/
|
|
@@ -20,7 +23,7 @@ export class RequestHandler {
|
|
|
20
23
|
private metricsTracker: IMetricsTracker | null = null;
|
|
21
24
|
// HTTP/2 client sessions for backend proxying
|
|
22
25
|
private h2Sessions: Map<string, plugins.http2.ClientHttp2Session> = new Map();
|
|
23
|
-
|
|
26
|
+
|
|
24
27
|
constructor(
|
|
25
28
|
private options: INetworkProxyOptions,
|
|
26
29
|
private connectionPool: ConnectionPool,
|
|
@@ -423,7 +426,7 @@ export class RequestHandler {
|
|
|
423
426
|
outboundHeaders[key] = value;
|
|
424
427
|
}
|
|
425
428
|
}
|
|
426
|
-
if (outboundHeaders.host && (proxyConfig as
|
|
429
|
+
if (outboundHeaders.host && (proxyConfig as IReverseProxyConfig).rewriteHostHeader) {
|
|
427
430
|
outboundHeaders.host = `${destination.host}:${destination.port}`;
|
|
428
431
|
}
|
|
429
432
|
// Create HTTP/1 proxy request
|
|
@@ -433,7 +436,9 @@ export class RequestHandler {
|
|
|
433
436
|
// Map status and headers back to HTTP/2
|
|
434
437
|
const responseHeaders: Record<string, number|string|string[]> = {};
|
|
435
438
|
for (const [k, v] of Object.entries(proxyRes.headers)) {
|
|
436
|
-
if (v !== undefined)
|
|
439
|
+
if (v !== undefined) {
|
|
440
|
+
responseHeaders[k] = v as string | string[];
|
|
441
|
+
}
|
|
437
442
|
}
|
|
438
443
|
stream.respond({ ':status': proxyRes.statusCode || 500, ...responseHeaders });
|
|
439
444
|
proxyRes.pipe(stream);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import * as plugins from '
|
|
2
|
-
import { type INetworkProxyOptions, type IWebSocketWithHeartbeat, type ILogger, createLogger, type IReverseProxyConfig } from './
|
|
3
|
-
import { ConnectionPool } from './
|
|
4
|
-
import { ProxyRouter } from '
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import { type INetworkProxyOptions, type IWebSocketWithHeartbeat, type ILogger, createLogger, type IReverseProxyConfig } from './models/types.js';
|
|
3
|
+
import { ConnectionPool } from './connection-pool.js';
|
|
4
|
+
import { ProxyRouter } from '../../http/router/index.js';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Handles WebSocket connections and proxying
|
|
@@ -10,7 +10,7 @@ export class WebSocketHandler {
|
|
|
10
10
|
private heartbeatInterval: NodeJS.Timeout | null = null;
|
|
11
11
|
private wsServer: plugins.ws.WebSocketServer | null = null;
|
|
12
12
|
private logger: ILogger;
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
constructor(
|
|
15
15
|
private options: INetworkProxyOptions,
|
|
16
16
|
private connectionPool: ConnectionPool,
|
|
@@ -56,7 +56,7 @@ export class WebSocketHandler {
|
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
this.logger.debug(`WebSocket heartbeat check for ${this.wsServer.clients.size} clients`);
|
|
59
|
-
|
|
59
|
+
|
|
60
60
|
this.wsServer.clients.forEach((ws: plugins.wsDefault) => {
|
|
61
61
|
const wsWithHeartbeat = ws as IWebSocketWithHeartbeat;
|
|
62
62
|
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom error classes for better error handling
|
|
3
|
+
*/
|
|
4
|
+
export class NftBaseError extends Error {
|
|
5
|
+
constructor(message: string) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'NftBaseError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export class NftValidationError extends NftBaseError {
|
|
12
|
+
constructor(message: string) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = 'NftValidationError';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export class NftExecutionError extends NftBaseError {
|
|
19
|
+
constructor(message: string) {
|
|
20
|
+
super(message);
|
|
21
|
+
this.name = 'NftExecutionError';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export class NftResourceError extends NftBaseError {
|
|
26
|
+
constructor(message: string) {
|
|
27
|
+
super(message);
|
|
28
|
+
this.name = 'NftResourceError';
|
|
29
|
+
}
|
|
30
|
+
}
|