@push.rocks/smartproxy 16.0.3 → 17.0.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_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/common/port80-adapter.js +29 -3
- package/dist_ts/forwarding/config/forwarding-types.d.ts +3 -29
- package/dist_ts/forwarding/config/forwarding-types.js +3 -36
- package/dist_ts/forwarding/config/index.d.ts +3 -2
- package/dist_ts/forwarding/config/index.js +4 -3
- package/dist_ts/forwarding/factory/forwarding-factory.js +9 -3
- package/dist_ts/forwarding/handlers/base-handler.d.ts +4 -0
- package/dist_ts/forwarding/handlers/base-handler.js +25 -3
- package/dist_ts/forwarding/index.d.ts +3 -8
- package/dist_ts/forwarding/index.js +4 -13
- package/dist_ts/proxies/network-proxy/network-proxy.js +4 -2
- package/dist_ts/proxies/network-proxy/request-handler.js +3 -3
- package/dist_ts/proxies/network-proxy/websocket-handler.js +2 -2
- package/dist_ts/proxies/smart-proxy/models/index.d.ts +0 -1
- package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +0 -9
- package/dist_ts/proxies/smart-proxy/models/interfaces.js +1 -12
- package/dist_ts/proxies/smart-proxy/models/route-types.d.ts +1 -44
- package/dist_ts/proxies/smart-proxy/models/route-types.js +2 -1
- package/dist_ts/proxies/smart-proxy/route-connection-handler.d.ts +0 -3
- package/dist_ts/proxies/smart-proxy/route-connection-handler.js +8 -13
- package/dist_ts/proxies/smart-proxy/route-manager.js +2 -3
- package/dist_ts/proxies/smart-proxy/smart-proxy.js +2 -3
- package/dist_ts/proxies/smart-proxy/utils/index.d.ts +0 -2
- package/dist_ts/proxies/smart-proxy/utils/index.js +3 -6
- package/dist_ts/proxies/smart-proxy/utils/route-patterns.d.ts +48 -0
- package/dist_ts/proxies/smart-proxy/utils/route-patterns.js +106 -2
- package/package.json +1 -1
- package/readme.plan.md +175 -77
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/common/port80-adapter.ts +26 -2
- package/ts/forwarding/config/forwarding-types.ts +12 -70
- package/ts/forwarding/config/index.ts +19 -2
- package/ts/forwarding/factory/forwarding-factory.ts +7 -2
- package/ts/forwarding/handlers/base-handler.ts +22 -2
- package/ts/forwarding/index.ts +17 -17
- package/ts/proxies/network-proxy/network-proxy.ts +4 -1
- package/ts/proxies/network-proxy/request-handler.ts +2 -2
- package/ts/proxies/network-proxy/websocket-handler.ts +1 -1
- package/ts/proxies/smart-proxy/models/index.ts +0 -3
- package/ts/proxies/smart-proxy/models/interfaces.ts +1 -17
- package/ts/proxies/smart-proxy/models/route-types.ts +2 -60
- package/ts/proxies/smart-proxy/route-connection-handler.ts +4 -14
- package/ts/proxies/smart-proxy/route-manager.ts +3 -8
- package/ts/proxies/smart-proxy/smart-proxy.ts +2 -4
- package/ts/proxies/smart-proxy/utils/index.ts +2 -5
- package/ts/proxies/smart-proxy/utils/route-patterns.ts +146 -2
- package/ts/proxies/smart-proxy/utils/route-migration-utils.ts +0 -165
|
@@ -4,8 +4,112 @@
|
|
|
4
4
|
* This file provides pre-defined route patterns for common use cases.
|
|
5
5
|
* These patterns can be used as templates for creating route configurations.
|
|
6
6
|
*/
|
|
7
|
-
import { createHttpRoute, createHttpsTerminateRoute, createHttpsPassthroughRoute, createCompleteHttpsServer } from './route-helpers.js';
|
|
8
7
|
import { mergeRouteConfigs } from './route-utils.js';
|
|
8
|
+
/**
|
|
9
|
+
* Create a basic HTTP route configuration
|
|
10
|
+
*/
|
|
11
|
+
export function createHttpRoute(domains, target, options = {}) {
|
|
12
|
+
const route = {
|
|
13
|
+
match: {
|
|
14
|
+
domains,
|
|
15
|
+
ports: 80
|
|
16
|
+
},
|
|
17
|
+
action: {
|
|
18
|
+
type: 'forward',
|
|
19
|
+
target: {
|
|
20
|
+
host: target.host,
|
|
21
|
+
port: target.port
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
name: options.name || `HTTP: ${Array.isArray(domains) ? domains.join(', ') : domains}`
|
|
25
|
+
};
|
|
26
|
+
return mergeRouteConfigs(route, options);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Create an HTTPS route with TLS termination
|
|
30
|
+
*/
|
|
31
|
+
export function createHttpsTerminateRoute(domains, target, options = {}) {
|
|
32
|
+
const route = {
|
|
33
|
+
match: {
|
|
34
|
+
domains,
|
|
35
|
+
ports: 443
|
|
36
|
+
},
|
|
37
|
+
action: {
|
|
38
|
+
type: 'forward',
|
|
39
|
+
target: {
|
|
40
|
+
host: target.host,
|
|
41
|
+
port: target.port
|
|
42
|
+
},
|
|
43
|
+
tls: {
|
|
44
|
+
mode: options.reencrypt ? 'terminate-and-reencrypt' : 'terminate',
|
|
45
|
+
certificate: options.certificate || 'auto'
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
name: options.name || `HTTPS (terminate): ${Array.isArray(domains) ? domains.join(', ') : domains}`
|
|
49
|
+
};
|
|
50
|
+
return mergeRouteConfigs(route, options);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Create an HTTPS route with TLS passthrough
|
|
54
|
+
*/
|
|
55
|
+
export function createHttpsPassthroughRoute(domains, target, options = {}) {
|
|
56
|
+
const route = {
|
|
57
|
+
match: {
|
|
58
|
+
domains,
|
|
59
|
+
ports: 443
|
|
60
|
+
},
|
|
61
|
+
action: {
|
|
62
|
+
type: 'forward',
|
|
63
|
+
target: {
|
|
64
|
+
host: target.host,
|
|
65
|
+
port: target.port
|
|
66
|
+
},
|
|
67
|
+
tls: {
|
|
68
|
+
mode: 'passthrough'
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
name: options.name || `HTTPS (passthrough): ${Array.isArray(domains) ? domains.join(', ') : domains}`
|
|
72
|
+
};
|
|
73
|
+
return mergeRouteConfigs(route, options);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Create an HTTP to HTTPS redirect route
|
|
77
|
+
*/
|
|
78
|
+
export function createHttpToHttpsRedirect(domains, options = {}) {
|
|
79
|
+
const route = {
|
|
80
|
+
match: {
|
|
81
|
+
domains,
|
|
82
|
+
ports: 80
|
|
83
|
+
},
|
|
84
|
+
action: {
|
|
85
|
+
type: 'redirect',
|
|
86
|
+
redirect: {
|
|
87
|
+
to: options.preservePath ? 'https://{domain}{path}' : 'https://{domain}',
|
|
88
|
+
status: options.redirectCode || 301
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
name: options.name || `HTTP to HTTPS redirect: ${Array.isArray(domains) ? domains.join(', ') : domains}`
|
|
92
|
+
};
|
|
93
|
+
return mergeRouteConfigs(route, options);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Create a complete HTTPS server with redirect from HTTP
|
|
97
|
+
*/
|
|
98
|
+
export function createCompleteHttpsServer(domains, target, options = {}) {
|
|
99
|
+
// Create the TLS route based on the selected mode
|
|
100
|
+
const tlsRoute = options.tlsMode === 'passthrough'
|
|
101
|
+
? createHttpsPassthroughRoute(domains, target, options)
|
|
102
|
+
: createHttpsTerminateRoute(domains, target, {
|
|
103
|
+
...options,
|
|
104
|
+
reencrypt: options.tlsMode === 'terminate-and-reencrypt'
|
|
105
|
+
});
|
|
106
|
+
// Create the HTTP to HTTPS redirect route
|
|
107
|
+
const redirectRoute = createHttpToHttpsRedirect(domains, {
|
|
108
|
+
redirectCode: options.redirectCode,
|
|
109
|
+
preservePath: true
|
|
110
|
+
});
|
|
111
|
+
return [tlsRoute, redirectRoute];
|
|
112
|
+
}
|
|
9
113
|
/**
|
|
10
114
|
* Create an API Gateway route pattern
|
|
11
115
|
* @param domains Domain(s) to match
|
|
@@ -214,4 +318,4 @@ export function addJwtAuth(baseRoute, jwt) {
|
|
|
214
318
|
}
|
|
215
319
|
});
|
|
216
320
|
}
|
|
217
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtcGF0dGVybnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9wcm94aWVzL3NtYXJ0LXByb3h5L3V0aWxzL3JvdXRlLXBhdHRlcm5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBR0gsT0FBTyxFQUFFLGVBQWUsRUFBRSx5QkFBeUIsRUFBRSwyQkFBMkIsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hJLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXJEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQ25DLE9BQTBCLEVBQzFCLFdBQW1CLEVBQ25CLE1BQWlELEVBQ2pELFVBS0ksRUFBRTtJQUVOLDBFQUEwRTtJQUMxRSxNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUNoRCxDQUFDLENBQUMsV0FBVztRQUNiLENBQUMsQ0FBQyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBRXRCLGtEQUFrRDtJQUNsRCxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztRQUMxQyxDQUFDLENBQUMsR0FBRyxjQUFjLEdBQUc7UUFDdEIsQ0FBQyxDQUFDLEdBQUcsY0FBYyxJQUFJLENBQUM7SUFFMUIsb0JBQW9CO0lBQ3BCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxNQUFNO1FBQzlCLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFO1lBQ3pDLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLE1BQU07U0FDM0MsQ0FBQztRQUNKLENBQUMsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRXJDLGtDQUFrQztJQUNsQyxNQUFNLFFBQVEsR0FBMEI7UUFDdEMsS0FBSyxFQUFFO1lBQ0wsR0FBRyxTQUFTLENBQUMs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
|
|
321
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtcGF0dGVybnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9wcm94aWVzL3NtYXJ0LXByb3h5L3V0aWxzL3JvdXRlLXBhdHRlcm5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBR0gsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFckQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUM3QixPQUEwQixFQUMxQixNQUF1RixFQUN2RixVQUFpQyxFQUFFO0lBRW5DLE1BQU0sS0FBSyxHQUFpQjtRQUMxQixLQUFLLEVBQUU7WUFDTCxPQUFPO1lBQ1AsS0FBSyxFQUFFLEVBQUU7U0FDVjtRQUNELE1BQU0sRUFBRTtZQUNOLElBQUksRUFBRSxTQUFTO1lBQ2YsTUFBTSxFQUFFO2dCQUNOLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDakIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO2FBQ2xCO1NBQ0Y7UUFDRCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksSUFBSSxTQUFTLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRTtLQUN2RixDQUFDO0lBRUYsT0FBTyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUN2QyxPQUEwQixFQUMxQixNQUF1RixFQUN2RixVQUdJLEVBQUU7SUFFTixNQUFNLEtBQUssR0FBaUI7UUFDMUIsS0FBSyxFQUFFO1lBQ0wsT0FBTztZQUNQLEtBQUssRUFBRSxHQUFHO1NBQ1g7UUFDRCxNQUFNLEVBQUU7WUFDTixJQUFJLEVBQUUsU0FBUztZQUNmLE1BQU0sRUFBRTtnQkFDTixJQUFJLEVBQUUs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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@push.rocks/smartproxy",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "17.0.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "A powerful proxy package with unified route-based configuration for high traffic management. Features include SSL/TLS support, flexible routing patterns, WebSocket handling, advanced security options, and automatic ACME certificate management.",
|
|
6
6
|
"main": "dist_ts/index.js",
|
package/readme.plan.md
CHANGED
|
@@ -1,103 +1,201 @@
|
|
|
1
|
-
# SmartProxy
|
|
1
|
+
# SmartProxy Codebase Cleanup Plan
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## Overview
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
The SmartProxy is failing to match connections for wildcard domains (like `*.lossless.digital`) when IP restrictions are in place. After extensive debugging, the root cause has been identified:
|
|
5
|
+
This document outlines a comprehensive plan to clean up the SmartProxy codebase by removing deprecated and unused code, consolidating functionality, and reducing complexity. The goal is to make the codebase more maintainable, easier to understand, and better positioned for future enhancements.
|
|
7
6
|
|
|
8
|
-
|
|
7
|
+
## Phase 1: Remove Deprecated Code
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
```
|
|
12
|
-
[DEBUG] Route rejected: clientIp mismatch. Request: ::ffff:212.95.99.130, Route patterns: ["212.95.99.130"]
|
|
13
|
-
```
|
|
9
|
+
### 1.1 Delete Legacy Migration Utilities ✅
|
|
14
10
|
|
|
15
|
-
|
|
11
|
+
The route migration utilities were created to assist in transitioning from the legacy domain-based configuration to the new route-based configuration system. As this migration is now complete, these utilities can be safely removed.
|
|
16
12
|
|
|
17
|
-
|
|
13
|
+
- **Action:** ✅ Remove `/ts/proxies/smart-proxy/utils/route-migration-utils.ts`
|
|
14
|
+
- **Impact:** Low - This file is explicitly marked as temporary and for migration purposes only
|
|
15
|
+
- **Dependencies:** ✅ Update any imports of these utilities (check forwarding-types.ts)
|
|
18
16
|
|
|
19
|
-
|
|
20
|
-
// Wildcard domain route for *.lossless.digital
|
|
21
|
-
{
|
|
22
|
-
match: {
|
|
23
|
-
ports: 443,
|
|
24
|
-
domains: ['*.lossless.digital'],
|
|
25
|
-
clientIp: ['212.95.99.130', '::ffff:212.95.99.130'], // Include both formats
|
|
26
|
-
},
|
|
27
|
-
action: {
|
|
28
|
-
type: 'forward',
|
|
29
|
-
target: {
|
|
30
|
-
host: '212.95.99.130',
|
|
31
|
-
port: 443
|
|
32
|
-
},
|
|
33
|
-
tls: {
|
|
34
|
-
mode: 'passthrough'
|
|
35
|
-
},
|
|
36
|
-
security: {
|
|
37
|
-
allowedIps: ['212.95.99.130', '::ffff:212.95.99.130'] // Include both formats
|
|
38
|
-
}
|
|
39
|
-
},
|
|
40
|
-
name: 'Wildcard lossless.digital route (IP restricted)'
|
|
41
|
-
}
|
|
42
|
-
```
|
|
17
|
+
### 1.2 Clean Up References to Deleted Files ✅
|
|
43
18
|
|
|
44
|
-
|
|
19
|
+
Several files are marked for deletion in the git status but are still referenced in the codebase.
|
|
45
20
|
|
|
46
|
-
|
|
21
|
+
- **Action:** ✅ Remove references to deleted route-helpers files:
|
|
22
|
+
- ✅ Update `/ts/proxies/smart-proxy/utils/index.ts` to remove `export * from './route-helpers.js';`
|
|
23
|
+
- ✅ Update `/ts/forwarding/config/forwarding-types.ts` to remove imports and re-exports of route helper functions
|
|
24
|
+
- **Impact:** Medium - May break code that still relies on these helpers
|
|
25
|
+
- **Dependencies:** ✅ Ensure route-patterns.js provides equivalent functionality (moved helper functions from route-helpers.js to route-patterns.ts)
|
|
47
26
|
|
|
48
|
-
1.
|
|
27
|
+
### 1.3 Remove Deprecated Forwarding Types and Helpers ✅
|
|
49
28
|
|
|
50
|
-
|
|
51
|
-
private matchIpPattern(pattern: string, ip: string): boolean {
|
|
52
|
-
// Normalize IPv6-mapped IPv4 addresses
|
|
53
|
-
const normalizedIp = ip.startsWith('::ffff:') ? ip.substring(7) : ip;
|
|
54
|
-
const normalizedPattern = pattern.startsWith('::ffff:') ? pattern.substring(7) : pattern;
|
|
55
|
-
|
|
56
|
-
// Handle exact match with normalized addresses
|
|
57
|
-
if (normalizedPattern === normalizedIp) {
|
|
58
|
-
return true;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Rest of the existing function...
|
|
62
|
-
}
|
|
63
|
-
```
|
|
29
|
+
Legacy forwarding types and helper functions in forwarding-types.ts are marked as deprecated.
|
|
64
30
|
|
|
65
|
-
|
|
31
|
+
- **Action:** ✅
|
|
32
|
+
- ✅ Clean up `/ts/forwarding/config/forwarding-types.ts`
|
|
33
|
+
- ✅ Remove deprecated helper functions: `httpOnly`, `tlsTerminateToHttp`, `tlsTerminateToHttps`, `httpsPassthrough`
|
|
34
|
+
- ✅ Remove deprecated interfaces: `IDeprecatedForwardConfig`
|
|
35
|
+
- **Impact:** Medium - May break code that still uses these helpers
|
|
36
|
+
- **Dependencies:** ✅ Ensure route patterns provide equivalent functionality
|
|
66
37
|
|
|
67
|
-
##
|
|
38
|
+
## Phase 2: Consolidate and Simplify Code
|
|
68
39
|
|
|
69
|
-
###
|
|
40
|
+
### 2.1 Streamline Interface Definitions ✅
|
|
70
41
|
|
|
71
|
-
|
|
42
|
+
There are several redundant interfaces that could be simplified.
|
|
72
43
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
44
|
+
- **Action:** ✅
|
|
45
|
+
- ✅ Remove legacy type checking functions (`isLegacyOptions`, `isRoutedOptions`) in `/ts/proxies/smart-proxy/models/interfaces.ts`
|
|
46
|
+
- ✅ Update `ISmartProxyOptions` interface to remove obsolete properties
|
|
47
|
+
- ✅ Remove backward compatibility aliases like `IRoutedSmartProxyOptions`
|
|
48
|
+
- **Impact:** Medium - May break code that relies on these interfaces
|
|
49
|
+
- **Dependencies:** ✅ Update any code that references these interfaces
|
|
76
50
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
51
|
+
### 2.2 Consolidate Route Utilities
|
|
52
|
+
|
|
53
|
+
The route utilities are spread across multiple files with some overlapping functionality.
|
|
54
|
+
|
|
55
|
+
- **Action:**
|
|
56
|
+
- Consolidate route utilities into a single coherent structure
|
|
57
|
+
- Move common functions from route-utils.ts, route-patterns.ts into a single location
|
|
58
|
+
- Ensure consistent naming conventions for route utility functions
|
|
59
|
+
- **Impact:** Medium - Requires careful refactoring
|
|
60
|
+
- **Dependencies:** Update all references to these utilities
|
|
61
|
+
|
|
62
|
+
### 2.3 Clean Up Legacy Connection Handling ✅
|
|
63
|
+
|
|
64
|
+
The route-connection-handler.ts file contains legacy code and parameters kept for backward compatibility.
|
|
65
|
+
|
|
66
|
+
- **Action:** ✅
|
|
67
|
+
- ✅ Remove unused parameters and legacy comments from `setupDirectConnection` method
|
|
68
|
+
- ✅ Simplify connection handling logic by removing special cases for legacy configurations
|
|
69
|
+
- **Impact:** Medium - Requires careful testing to ensure no regressions
|
|
70
|
+
- **Dependencies:** ✅ Test with all current route configurations
|
|
71
|
+
|
|
72
|
+
## Phase 3: Code Modernization
|
|
73
|
+
|
|
74
|
+
### 3.1 Standardize on 'preserve' Port Handling ✅
|
|
75
|
+
|
|
76
|
+
Previously implemented changes to use `port: 'preserve'` instead of `preservePort: true` should be consistently applied.
|
|
77
|
+
|
|
78
|
+
- **Action:** ✅
|
|
79
|
+
- ✅ Ensure all code paths handle the 'preserve' value for port
|
|
80
|
+
- ✅ Remove any remaining references to preservePort in code and documentation
|
|
81
|
+
- **Impact:** Low - Already implemented in most places
|
|
82
|
+
- **Dependencies:** None
|
|
83
|
+
|
|
84
|
+
### 3.2 Normalize IPv6-Mapped IPv4 Addresses ✅
|
|
85
|
+
|
|
86
|
+
Implement consistent handling of IPv6-mapped IPv4 addresses throughout the codebase.
|
|
87
|
+
|
|
88
|
+
- **Action:** ✅
|
|
89
|
+
- ✅ Ensure any IP address comparisons consistently handle IPv6-mapped IPv4 addresses
|
|
90
|
+
- ✅ Standardize on a single approach to IP normalization
|
|
91
|
+
- **Impact:** Low - Already partially implemented
|
|
92
|
+
- **Dependencies:** None
|
|
93
|
+
|
|
94
|
+
### 3.3 Improve Type Safety ✅
|
|
95
|
+
|
|
96
|
+
Enhance type safety throughout the codebase to catch errors at compile time.
|
|
97
|
+
|
|
98
|
+
- **Action:** ✅
|
|
99
|
+
- ✅ Add stronger types where appropriate
|
|
100
|
+
- ✅ Remove any `any` types that could be replaced with more specific types
|
|
101
|
+
- ✅ Add explicit return types to functions
|
|
102
|
+
- **Impact:** Medium - May uncover existing issues
|
|
103
|
+
- **Dependencies:** None
|
|
104
|
+
|
|
105
|
+
## Phase 4: Documentation and Tests
|
|
106
|
+
|
|
107
|
+
### 4.1 Update API Documentation ✅
|
|
108
|
+
|
|
109
|
+
Ensure documentation is current and accurately reflects the cleaned-up API.
|
|
110
|
+
|
|
111
|
+
- **Action:** ✅
|
|
112
|
+
- ✅ Update comments and JSDoc throughout the codebase
|
|
113
|
+
- ✅ Ensure porthandling.md and other documentation reflect current implementation
|
|
114
|
+
- ✅ Remove references to deprecated functionality
|
|
115
|
+
- **Impact:** Low
|
|
116
|
+
- **Dependencies:** None
|
|
117
|
+
|
|
118
|
+
### 4.2 Add or Update Tests ✅
|
|
119
|
+
|
|
120
|
+
Ensure test coverage for the cleaned-up codebase.
|
|
121
|
+
|
|
122
|
+
- **Action:** ✅
|
|
123
|
+
- ✅ Update existing tests to remove references to deprecated functionality
|
|
124
|
+
- ✅ Add tests for edge cases in IP normalization
|
|
125
|
+
- ✅ Add tests for the updated route utility functions
|
|
126
|
+
- **Impact:** Medium
|
|
127
|
+
- **Dependencies:** None
|
|
128
|
+
|
|
129
|
+
## Implementation Sequence ✅
|
|
130
|
+
|
|
131
|
+
The changes were implemented in this order:
|
|
132
|
+
|
|
133
|
+
1. ✅ **Phase 1.1**: Remove Legacy Migration Utilities
|
|
134
|
+
2. ✅ **Phase 1.2**: Clean Up References to Deleted Files
|
|
135
|
+
3. ✅ **Phase 1.3**: Remove Deprecated Forwarding Types and Helpers
|
|
136
|
+
4. ✅ **Phase 2.1**: Streamline Interface Definitions
|
|
137
|
+
5. ✅ **Phase 3.1**: Standardize on 'preserve' Port Handling
|
|
138
|
+
6. ✅ **Phase 3.2**: Normalize IPv6-Mapped IPv4 Addresses
|
|
139
|
+
7. ⏸️ **Phase 2.2**: Consolidate Route Utilities (Postponed - Low priority)
|
|
140
|
+
8. ✅ **Phase 2.3**: Clean Up Legacy Connection Handling
|
|
141
|
+
9. ✅ **Phase 3.3**: Improve Type Safety
|
|
142
|
+
10. ✅ **Phase 4.1**: Update API Documentation
|
|
143
|
+
11. ✅ **Phase 4.2**: Add or Update Tests
|
|
144
|
+
|
|
145
|
+
## Detailed Implementation Steps
|
|
146
|
+
|
|
147
|
+
### 1. Remove Legacy Migration Utilities
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
# Delete the file
|
|
151
|
+
git rm ts/proxies/smart-proxy/utils/route-migration-utils.ts
|
|
152
|
+
|
|
153
|
+
# Remove the export from the index file
|
|
154
|
+
# Edit ts/proxies/smart-proxy/utils/index.ts to remove the export line
|
|
80
155
|
```
|
|
81
156
|
|
|
82
|
-
|
|
157
|
+
### 2. Clean Up References to Deleted Files
|
|
83
158
|
|
|
84
|
-
|
|
159
|
+
```bash
|
|
160
|
+
# Update forwarding-types.ts to remove imports from route-helpers.js
|
|
161
|
+
# Edit ts/forwarding/config/forwarding-types.ts
|
|
85
162
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
163
|
+
# Remove or update imports in index.ts
|
|
164
|
+
# Edit ts/proxies/smart-proxy/utils/index.ts
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### 3. Remove Deprecated Forwarding Types
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
# Edit ts/forwarding/config/forwarding-types.ts to remove deprecated helpers and interfaces
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### 4. Streamline Interface Definitions
|
|
91
174
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
175
|
+
```bash
|
|
176
|
+
# Edit ts/proxies/smart-proxy/models/interfaces.ts to remove legacy functions and aliases
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### 5. Normalize IPv6-Mapped IPv4 Addresses
|
|
180
|
+
|
|
181
|
+
Ensure all IP matching functions consistently handle IPv6-mapped IPv4 addresses:
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
// In all IP matching functions:
|
|
185
|
+
const normalizeIp = (ip: string): string => {
|
|
186
|
+
return ip.startsWith('::ffff:') ? ip.substring(7) : ip;
|
|
187
|
+
};
|
|
188
|
+
```
|
|
96
189
|
|
|
97
|
-
|
|
190
|
+
## Implementation Results ✅
|
|
98
191
|
|
|
99
|
-
|
|
192
|
+
The cleanup implementation was successful, resulting in:
|
|
100
193
|
|
|
101
|
-
|
|
194
|
+
- **Reduced Codebase Size**: Successfully removed multiple deprecated files and functions
|
|
195
|
+
- **Improved Maintainability**: Cleaner, more focused code without legacy compatibility layers
|
|
196
|
+
- **Reduced Complexity**: Eliminated special cases for legacy config formats
|
|
197
|
+
- **Better Developer Experience**: Standardized on consistent patterns for port handling
|
|
198
|
+
- **Future-Proofing**: Removed deprecated code that would complicate future upgrades
|
|
199
|
+
- **Type Safety**: Fixed multiple TypeScript errors and improved type checking
|
|
102
200
|
|
|
103
|
-
|
|
201
|
+
All changes successfully compile and the build process passes with no errors. The codebase is now simpler, more maintainable, and better positioned for future enhancements.
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartproxy',
|
|
6
|
-
version: '
|
|
6
|
+
version: '17.0.0',
|
|
7
7
|
description: 'A powerful proxy package with unified route-based configuration for high traffic management. Features include SSL/TLS support, flexible routing patterns, WebSocket handling, advanced security options, and automatic ACME certificate management.'
|
|
8
8
|
}
|
|
@@ -21,9 +21,21 @@ export function convertToLegacyForwardConfig(
|
|
|
21
21
|
? forwardConfig.target.host[0] // Use the first host in the array
|
|
22
22
|
: forwardConfig.target.host;
|
|
23
23
|
|
|
24
|
+
// Extract port number, handling different port formats
|
|
25
|
+
let port: number;
|
|
26
|
+
if (typeof forwardConfig.target.port === 'function') {
|
|
27
|
+
// Use a default port for function-based ports in adapter context
|
|
28
|
+
port = 80;
|
|
29
|
+
} else if (forwardConfig.target.port === 'preserve') {
|
|
30
|
+
// For 'preserve', use the default port 80 in this adapter context
|
|
31
|
+
port = 80;
|
|
32
|
+
} else {
|
|
33
|
+
port = forwardConfig.target.port;
|
|
34
|
+
}
|
|
35
|
+
|
|
24
36
|
return {
|
|
25
37
|
ip: host,
|
|
26
|
-
port:
|
|
38
|
+
port: port
|
|
27
39
|
};
|
|
28
40
|
}
|
|
29
41
|
|
|
@@ -75,11 +87,23 @@ export function createPort80HandlerOptions(
|
|
|
75
87
|
forwardConfig.type === 'https-terminate-to-https'));
|
|
76
88
|
|
|
77
89
|
if (supportsHttp) {
|
|
90
|
+
// Determine port value handling different formats
|
|
91
|
+
let port: number;
|
|
92
|
+
if (typeof forwardConfig.target.port === 'function') {
|
|
93
|
+
// Use a default port for function-based ports
|
|
94
|
+
port = 80;
|
|
95
|
+
} else if (forwardConfig.target.port === 'preserve') {
|
|
96
|
+
// For 'preserve', use 80 in this adapter context
|
|
97
|
+
port = 80;
|
|
98
|
+
} else {
|
|
99
|
+
port = forwardConfig.target.port;
|
|
100
|
+
}
|
|
101
|
+
|
|
78
102
|
options.forward = {
|
|
79
103
|
ip: Array.isArray(forwardConfig.target.host)
|
|
80
104
|
? forwardConfig.target.host[0]
|
|
81
105
|
: forwardConfig.target.host,
|
|
82
|
-
port:
|
|
106
|
+
port: port
|
|
83
107
|
};
|
|
84
108
|
}
|
|
85
109
|
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import type * as plugins from '../../plugins.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* @deprecated The legacy forwarding types are being replaced by the route-based configuration system.
|
|
5
|
-
* See /ts/proxies/smart-proxy/models/route-types.ts for the new route-based configuration.
|
|
6
|
-
*
|
|
7
4
|
* The primary forwarding types supported by SmartProxy
|
|
5
|
+
* Used for configuration compatibility
|
|
8
6
|
*/
|
|
9
7
|
export type TForwardingType =
|
|
10
8
|
| 'http-only' // HTTP forwarding only (no HTTPS)
|
|
@@ -35,7 +33,7 @@ export interface IForwardingHandler extends plugins.EventEmitter {
|
|
|
35
33
|
handleHttpRequest(req: plugins.http.IncomingMessage, res: plugins.http.ServerResponse): void;
|
|
36
34
|
}
|
|
37
35
|
|
|
38
|
-
//
|
|
36
|
+
// Route-based helpers are now available directly from route-patterns.ts
|
|
39
37
|
import {
|
|
40
38
|
createHttpRoute,
|
|
41
39
|
createHttpsTerminateRoute,
|
|
@@ -43,7 +41,7 @@ import {
|
|
|
43
41
|
createHttpToHttpsRedirect,
|
|
44
42
|
createCompleteHttpsServer,
|
|
45
43
|
createLoadBalancerRoute
|
|
46
|
-
} from '../../proxies/smart-proxy/utils/route-
|
|
44
|
+
} from '../../proxies/smart-proxy/utils/route-patterns.js';
|
|
47
45
|
|
|
48
46
|
export {
|
|
49
47
|
createHttpRoute,
|
|
@@ -54,23 +52,20 @@ export {
|
|
|
54
52
|
createLoadBalancerRoute
|
|
55
53
|
};
|
|
56
54
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
* - createHttpToHttpsRedirect
|
|
64
|
-
*/
|
|
55
|
+
// Note: Legacy helper functions have been removed
|
|
56
|
+
// Please use the route-based helpers instead:
|
|
57
|
+
// - createHttpRoute
|
|
58
|
+
// - createHttpsTerminateRoute
|
|
59
|
+
// - createHttpsPassthroughRoute
|
|
60
|
+
// - createHttpToHttpsRedirect
|
|
65
61
|
import type { IRouteConfig } from '../../proxies/smart-proxy/models/route-types.js';
|
|
66
|
-
import { domainConfigToRouteConfig } from '../../proxies/smart-proxy/utils/route-migration-utils.js';
|
|
67
62
|
|
|
68
|
-
// For backward compatibility
|
|
63
|
+
// For backward compatibility, kept only the basic configuration interface
|
|
69
64
|
export interface IForwardConfig {
|
|
70
65
|
type: TForwardingType;
|
|
71
66
|
target: {
|
|
72
67
|
host: string | string[];
|
|
73
|
-
port: number;
|
|
68
|
+
port: number | 'preserve' | ((ctx: any) => number);
|
|
74
69
|
};
|
|
75
70
|
http?: any;
|
|
76
71
|
https?: any;
|
|
@@ -78,57 +73,4 @@ export interface IForwardConfig {
|
|
|
78
73
|
security?: any;
|
|
79
74
|
advanced?: any;
|
|
80
75
|
[key: string]: any;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
export interface IDeprecatedForwardConfig {
|
|
84
|
-
type: TForwardingType;
|
|
85
|
-
target: {
|
|
86
|
-
host: string | string[];
|
|
87
|
-
port: number;
|
|
88
|
-
};
|
|
89
|
-
[key: string]: any;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* @deprecated Use createHttpRoute instead
|
|
94
|
-
*/
|
|
95
|
-
export const httpOnly = (
|
|
96
|
-
partialConfig: Partial<IDeprecatedForwardConfig> & Pick<IDeprecatedForwardConfig, 'target'>
|
|
97
|
-
): IDeprecatedForwardConfig => ({
|
|
98
|
-
type: 'http-only',
|
|
99
|
-
target: partialConfig.target,
|
|
100
|
-
...(partialConfig)
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* @deprecated Use createHttpsTerminateRoute instead
|
|
105
|
-
*/
|
|
106
|
-
export const tlsTerminateToHttp = (
|
|
107
|
-
partialConfig: Partial<IDeprecatedForwardConfig> & Pick<IDeprecatedForwardConfig, 'target'>
|
|
108
|
-
): IDeprecatedForwardConfig => ({
|
|
109
|
-
type: 'https-terminate-to-http',
|
|
110
|
-
target: partialConfig.target,
|
|
111
|
-
...(partialConfig)
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* @deprecated Use createHttpsTerminateRoute with reencrypt option instead
|
|
116
|
-
*/
|
|
117
|
-
export const tlsTerminateToHttps = (
|
|
118
|
-
partialConfig: Partial<IDeprecatedForwardConfig> & Pick<IDeprecatedForwardConfig, 'target'>
|
|
119
|
-
): IDeprecatedForwardConfig => ({
|
|
120
|
-
type: 'https-terminate-to-https',
|
|
121
|
-
target: partialConfig.target,
|
|
122
|
-
...(partialConfig)
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* @deprecated Use createHttpsPassthroughRoute instead
|
|
127
|
-
*/
|
|
128
|
-
export const httpsPassthrough = (
|
|
129
|
-
partialConfig: Partial<IDeprecatedForwardConfig> & Pick<IDeprecatedForwardConfig, 'target'>
|
|
130
|
-
): IDeprecatedForwardConfig => ({
|
|
131
|
-
type: 'https-passthrough',
|
|
132
|
-
target: partialConfig.target,
|
|
133
|
-
...(partialConfig)
|
|
134
|
-
});
|
|
76
|
+
}
|
|
@@ -5,5 +5,22 @@
|
|
|
5
5
|
* See /ts/proxies/smart-proxy/models/route-types.ts for the new route-based configuration.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
export
|
|
9
|
-
|
|
8
|
+
export type {
|
|
9
|
+
TForwardingType,
|
|
10
|
+
IForwardConfig,
|
|
11
|
+
IForwardingHandler
|
|
12
|
+
} from './forwarding-types.js';
|
|
13
|
+
|
|
14
|
+
export {
|
|
15
|
+
ForwardingHandlerEvents
|
|
16
|
+
} from './forwarding-types.js';
|
|
17
|
+
|
|
18
|
+
// Import route helpers from route-patterns instead of deleted route-helpers
|
|
19
|
+
export {
|
|
20
|
+
createHttpRoute,
|
|
21
|
+
createHttpsTerminateRoute,
|
|
22
|
+
createHttpsPassthroughRoute,
|
|
23
|
+
createHttpToHttpsRedirect,
|
|
24
|
+
createCompleteHttpsServer,
|
|
25
|
+
createLoadBalancerRoute
|
|
26
|
+
} from '../../proxies/smart-proxy/utils/route-patterns.js';
|
|
@@ -122,8 +122,13 @@ export class ForwardingHandlerFactory {
|
|
|
122
122
|
throw new Error('Target must include a host or array of hosts');
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
-
|
|
126
|
-
|
|
125
|
+
// Validate port if it's a number
|
|
126
|
+
if (typeof config.target.port === 'number') {
|
|
127
|
+
if (config.target.port <= 0 || config.target.port > 65535) {
|
|
128
|
+
throw new Error('Target must include a valid port (1-65535)');
|
|
129
|
+
}
|
|
130
|
+
} else if (config.target.port !== 'preserve' && typeof config.target.port !== 'function') {
|
|
131
|
+
throw new Error('Target port must be a number, "preserve", or a function');
|
|
127
132
|
}
|
|
128
133
|
|
|
129
134
|
// Type-specific validation
|