@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.
Files changed (48) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/common/port80-adapter.js +29 -3
  3. package/dist_ts/forwarding/config/forwarding-types.d.ts +3 -29
  4. package/dist_ts/forwarding/config/forwarding-types.js +3 -36
  5. package/dist_ts/forwarding/config/index.d.ts +3 -2
  6. package/dist_ts/forwarding/config/index.js +4 -3
  7. package/dist_ts/forwarding/factory/forwarding-factory.js +9 -3
  8. package/dist_ts/forwarding/handlers/base-handler.d.ts +4 -0
  9. package/dist_ts/forwarding/handlers/base-handler.js +25 -3
  10. package/dist_ts/forwarding/index.d.ts +3 -8
  11. package/dist_ts/forwarding/index.js +4 -13
  12. package/dist_ts/proxies/network-proxy/network-proxy.js +4 -2
  13. package/dist_ts/proxies/network-proxy/request-handler.js +3 -3
  14. package/dist_ts/proxies/network-proxy/websocket-handler.js +2 -2
  15. package/dist_ts/proxies/smart-proxy/models/index.d.ts +0 -1
  16. package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +0 -9
  17. package/dist_ts/proxies/smart-proxy/models/interfaces.js +1 -12
  18. package/dist_ts/proxies/smart-proxy/models/route-types.d.ts +1 -44
  19. package/dist_ts/proxies/smart-proxy/models/route-types.js +2 -1
  20. package/dist_ts/proxies/smart-proxy/route-connection-handler.d.ts +0 -3
  21. package/dist_ts/proxies/smart-proxy/route-connection-handler.js +8 -13
  22. package/dist_ts/proxies/smart-proxy/route-manager.js +2 -3
  23. package/dist_ts/proxies/smart-proxy/smart-proxy.js +2 -3
  24. package/dist_ts/proxies/smart-proxy/utils/index.d.ts +0 -2
  25. package/dist_ts/proxies/smart-proxy/utils/index.js +3 -6
  26. package/dist_ts/proxies/smart-proxy/utils/route-patterns.d.ts +48 -0
  27. package/dist_ts/proxies/smart-proxy/utils/route-patterns.js +106 -2
  28. package/package.json +1 -1
  29. package/readme.plan.md +175 -77
  30. package/ts/00_commitinfo_data.ts +1 -1
  31. package/ts/common/port80-adapter.ts +26 -2
  32. package/ts/forwarding/config/forwarding-types.ts +12 -70
  33. package/ts/forwarding/config/index.ts +19 -2
  34. package/ts/forwarding/factory/forwarding-factory.ts +7 -2
  35. package/ts/forwarding/handlers/base-handler.ts +22 -2
  36. package/ts/forwarding/index.ts +17 -17
  37. package/ts/proxies/network-proxy/network-proxy.ts +4 -1
  38. package/ts/proxies/network-proxy/request-handler.ts +2 -2
  39. package/ts/proxies/network-proxy/websocket-handler.ts +1 -1
  40. package/ts/proxies/smart-proxy/models/index.ts +0 -3
  41. package/ts/proxies/smart-proxy/models/interfaces.ts +1 -17
  42. package/ts/proxies/smart-proxy/models/route-types.ts +2 -60
  43. package/ts/proxies/smart-proxy/route-connection-handler.ts +4 -14
  44. package/ts/proxies/smart-proxy/route-manager.ts +3 -8
  45. package/ts/proxies/smart-proxy/smart-proxy.ts +2 -4
  46. package/ts/proxies/smart-proxy/utils/index.ts +2 -5
  47. package/ts/proxies/smart-proxy/utils/route-patterns.ts +146 -2
  48. 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": "16.0.3",
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 Configuration Troubleshooting
1
+ # SmartProxy Codebase Cleanup Plan
2
2
 
3
- ## IPv6/IPv4 Mapping Issue
3
+ ## Overview
4
4
 
5
- ### Problem Identified
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
- When a connection comes in from an IPv4 address (e.g., `212.95.99.130`), the Node.js server receives it as an IPv6-mapped IPv4 address with the format `::ffff:212.95.99.130`. However, the route configuration is expecting the exact string `212.95.99.130`, causing a mismatch.
7
+ ## Phase 1: Remove Deprecated Code
9
8
 
10
- From the debug logs:
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
- ### Solution
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
- To fix this issue, update the route configurations to include both formats of the IP address. Here's how to modify the affected route:
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
- ```typescript
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
- ### Alternative Long-Term Fix
19
+ Several files are marked for deletion in the git status but are still referenced in the codebase.
45
20
 
46
- A more robust solution would be to modify the SmartProxy codebase to automatically handle IPv6-mapped IPv4 addresses by normalizing them before comparison. This would involve:
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. Modifying the `matchIpPattern` function in `route-manager.ts` to normalize IPv6-mapped IPv4 addresses:
27
+ ### 1.3 Remove Deprecated Forwarding Types and Helpers
49
28
 
50
- ```typescript
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
- 2. Making similar modifications to other IP-related functions in the codebase.
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
- ## Wild Card Domain Matching Issue
38
+ ## Phase 2: Consolidate and Simplify Code
68
39
 
69
- ### Explanation
40
+ ### 2.1 Streamline Interface Definitions ✅
70
41
 
71
- The wildcard domain matching in SmartProxy works as follows:
42
+ There are several redundant interfaces that could be simplified.
72
43
 
73
- 1. When a pattern like `*.lossless.digital` is specified, it's converted to a regex: `/^.*\.lossless\.digital$/i`
74
- 2. This correctly matches any subdomain like `my.lossless.digital`, `api.lossless.digital`, etc.
75
- 3. However, it does NOT match the apex domain `lossless.digital` (without a subdomain)
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
- If you need to match both the apex domain and subdomains, use a list:
78
- ```typescript
79
- domains: ['lossless.digital', '*.lossless.digital']
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
- ## Debugging SmartProxy
157
+ ### 2. Clean Up References to Deleted Files
83
158
 
84
- To debug routing issues in SmartProxy:
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
- 1. Add detailed logging to the `route-manager.js` file in the `dist_ts` directory:
87
- - `findMatchingRoute` method - to see what criteria are being checked
88
- - `matchRouteDomain` method - to see domain matching logic
89
- - `matchDomain` method - to see pattern matching
90
- - `matchIpPattern` method - to see IP matching logic
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
- 2. Run the proxy with debugging enabled:
93
- ```
94
- pnpm run startNew
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
- 3. Monitor the logs for detailed information about the routing process and identify where matches are failing.
190
+ ## Implementation Results
98
191
 
99
- ## Priority and Route Order
192
+ The cleanup implementation was successful, resulting in:
100
193
 
101
- Remember that routes are evaluated in priority order (higher priority first). If multiple routes could match the same request, ensure that the more specific routes have higher priority.
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
- When routes have the same priority (or none specified), they're evaluated in the order they're defined in the configuration.
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.
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartproxy',
6
- version: '16.0.3',
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: forwardConfig.target.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: forwardConfig.target.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
- // Import and re-export the route-based helpers for seamless transition
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-helpers.js';
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
- * @deprecated These helper functions are maintained for backward compatibility.
59
- * Please use the route-based helpers instead:
60
- * - createHttpRoute
61
- * - createHttpsTerminateRoute
62
- * - createHttpsPassthroughRoute
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 * from './forwarding-types.js';
9
- export * from '../../proxies/smart-proxy/utils/route-helpers.js';
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
- if (!config.target.port || config.target.port <= 0 || config.target.port > 65535) {
126
- throw new Error('Target must include a valid port (1-65535)');
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