@push.rocks/smartproxy 21.1.7 → 22.6.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 (155) hide show
  1. package/changelog.md +109 -0
  2. package/dist_rust/rustproxy +0 -0
  3. package/dist_ts/00_commitinfo_data.js +1 -1
  4. package/dist_ts/core/utils/shared-security-manager.d.ts +17 -0
  5. package/dist_ts/core/utils/shared-security-manager.js +66 -1
  6. package/dist_ts/index.d.ts +1 -5
  7. package/dist_ts/index.js +3 -9
  8. package/dist_ts/protocols/common/fragment-handler.js +5 -1
  9. package/dist_ts/proxies/http-proxy/default-certificates.d.ts +54 -0
  10. package/dist_ts/proxies/http-proxy/default-certificates.js +127 -0
  11. package/dist_ts/proxies/http-proxy/http-proxy.d.ts +1 -1
  12. package/dist_ts/proxies/http-proxy/http-proxy.js +9 -14
  13. package/dist_ts/proxies/http-proxy/index.d.ts +5 -1
  14. package/dist_ts/proxies/http-proxy/index.js +6 -2
  15. package/dist_ts/proxies/http-proxy/security-manager.d.ts +4 -12
  16. package/dist_ts/proxies/http-proxy/security-manager.js +66 -99
  17. package/dist_ts/proxies/index.d.ts +1 -5
  18. package/dist_ts/proxies/index.js +2 -6
  19. package/dist_ts/proxies/nftables-proxy/index.d.ts +1 -0
  20. package/dist_ts/proxies/nftables-proxy/index.js +2 -1
  21. package/dist_ts/proxies/nftables-proxy/nftables-proxy.d.ts +4 -26
  22. package/dist_ts/proxies/nftables-proxy/nftables-proxy.js +84 -236
  23. package/dist_ts/proxies/nftables-proxy/utils/index.d.ts +9 -0
  24. package/dist_ts/proxies/nftables-proxy/utils/index.js +12 -0
  25. package/dist_ts/proxies/nftables-proxy/utils/nft-command-executor.d.ts +66 -0
  26. package/dist_ts/proxies/nftables-proxy/utils/nft-command-executor.js +131 -0
  27. package/dist_ts/proxies/nftables-proxy/utils/nft-port-spec-normalizer.d.ts +39 -0
  28. package/dist_ts/proxies/nftables-proxy/utils/nft-port-spec-normalizer.js +112 -0
  29. package/dist_ts/proxies/nftables-proxy/utils/nft-rule-validator.d.ts +59 -0
  30. package/dist_ts/proxies/nftables-proxy/utils/nft-rule-validator.js +130 -0
  31. package/dist_ts/proxies/smart-proxy/certificate-manager.js +4 -3
  32. package/dist_ts/proxies/smart-proxy/connection-manager.d.ts +13 -2
  33. package/dist_ts/proxies/smart-proxy/connection-manager.js +16 -6
  34. package/dist_ts/proxies/smart-proxy/http-proxy-bridge.js +35 -10
  35. package/dist_ts/proxies/smart-proxy/index.d.ts +5 -10
  36. package/dist_ts/proxies/smart-proxy/index.js +7 -13
  37. package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +5 -3
  38. package/dist_ts/proxies/smart-proxy/route-connection-handler.d.ts +17 -0
  39. package/dist_ts/proxies/smart-proxy/route-connection-handler.js +72 -9
  40. package/dist_ts/proxies/smart-proxy/route-preprocessor.d.ts +37 -0
  41. package/dist_ts/proxies/smart-proxy/route-preprocessor.js +103 -0
  42. package/dist_ts/proxies/smart-proxy/rust-binary-locator.d.ts +23 -0
  43. package/dist_ts/proxies/smart-proxy/rust-binary-locator.js +104 -0
  44. package/dist_ts/proxies/smart-proxy/rust-metrics-adapter.d.ts +74 -0
  45. package/dist_ts/proxies/smart-proxy/rust-metrics-adapter.js +146 -0
  46. package/dist_ts/proxies/smart-proxy/rust-proxy-bridge.d.ts +49 -0
  47. package/dist_ts/proxies/smart-proxy/rust-proxy-bridge.js +259 -0
  48. package/dist_ts/proxies/smart-proxy/security-manager.d.ts +14 -12
  49. package/dist_ts/proxies/smart-proxy/security-manager.js +80 -74
  50. package/dist_ts/proxies/smart-proxy/smart-proxy.d.ts +39 -157
  51. package/dist_ts/proxies/smart-proxy/smart-proxy.js +224 -622
  52. package/dist_ts/proxies/smart-proxy/socket-handler-server.d.ts +45 -0
  53. package/dist_ts/proxies/smart-proxy/socket-handler-server.js +253 -0
  54. package/dist_ts/proxies/smart-proxy/tls-manager.d.ts +2 -9
  55. package/dist_ts/proxies/smart-proxy/tls-manager.js +3 -26
  56. package/dist_ts/proxies/smart-proxy/utils/index.d.ts +1 -1
  57. package/dist_ts/proxies/smart-proxy/utils/index.js +3 -4
  58. package/dist_ts/proxies/smart-proxy/utils/route-helpers/api-helpers.d.ts +49 -0
  59. package/dist_ts/proxies/smart-proxy/utils/route-helpers/api-helpers.js +108 -0
  60. package/dist_ts/proxies/smart-proxy/utils/route-helpers/dynamic-helpers.d.ts +57 -0
  61. package/dist_ts/proxies/smart-proxy/utils/route-helpers/dynamic-helpers.js +89 -0
  62. package/dist_ts/proxies/smart-proxy/utils/route-helpers/http-helpers.d.ts +17 -0
  63. package/dist_ts/proxies/smart-proxy/utils/route-helpers/http-helpers.js +32 -0
  64. package/dist_ts/proxies/smart-proxy/utils/route-helpers/https-helpers.d.ts +68 -0
  65. package/dist_ts/proxies/smart-proxy/utils/route-helpers/https-helpers.js +117 -0
  66. package/dist_ts/proxies/smart-proxy/utils/route-helpers/index.d.ts +17 -0
  67. package/dist_ts/proxies/smart-proxy/utils/route-helpers/index.js +27 -0
  68. package/dist_ts/proxies/smart-proxy/utils/route-helpers/load-balancer-helpers.d.ts +63 -0
  69. package/dist_ts/proxies/smart-proxy/utils/route-helpers/load-balancer-helpers.js +105 -0
  70. package/dist_ts/proxies/smart-proxy/utils/route-helpers/nftables-helpers.d.ts +83 -0
  71. package/dist_ts/proxies/smart-proxy/utils/route-helpers/nftables-helpers.js +126 -0
  72. package/dist_ts/proxies/smart-proxy/utils/route-helpers/security-helpers.d.ts +47 -0
  73. package/dist_ts/proxies/smart-proxy/utils/route-helpers/security-helpers.js +66 -0
  74. package/dist_ts/proxies/smart-proxy/utils/route-helpers/socket-handlers.d.ts +70 -0
  75. package/dist_ts/proxies/smart-proxy/utils/route-helpers/socket-handlers.js +287 -0
  76. package/dist_ts/proxies/smart-proxy/utils/route-helpers/websocket-helpers.d.ts +46 -0
  77. package/dist_ts/proxies/smart-proxy/utils/route-helpers/websocket-helpers.js +67 -0
  78. package/dist_ts/proxies/smart-proxy/utils/route-helpers.d.ts +4 -457
  79. package/dist_ts/proxies/smart-proxy/utils/route-helpers.js +6 -950
  80. package/dist_ts/proxies/smart-proxy/utils/route-utils.js +2 -2
  81. package/dist_ts/proxies/smart-proxy/utils/route-validator.d.ts +67 -1
  82. package/dist_ts/proxies/smart-proxy/utils/route-validator.js +251 -3
  83. package/dist_ts/routing/index.d.ts +1 -1
  84. package/dist_ts/routing/index.js +3 -3
  85. package/dist_ts/routing/models/http-types.d.ts +119 -4
  86. package/dist_ts/routing/models/http-types.js +93 -5
  87. package/npmextra.json +12 -6
  88. package/package.json +34 -24
  89. package/readme.hints.md +184 -1
  90. package/readme.md +580 -266
  91. package/ts/00_commitinfo_data.ts +1 -1
  92. package/ts/core/utils/shared-security-manager.ts +98 -13
  93. package/ts/index.ts +4 -12
  94. package/ts/protocols/common/fragment-handler.ts +4 -0
  95. package/ts/proxies/index.ts +1 -9
  96. package/ts/proxies/nftables-proxy/index.ts +1 -0
  97. package/ts/proxies/nftables-proxy/nftables-proxy.ts +116 -290
  98. package/ts/proxies/nftables-proxy/utils/index.ts +38 -0
  99. package/ts/proxies/nftables-proxy/utils/nft-command-executor.ts +162 -0
  100. package/ts/proxies/nftables-proxy/utils/nft-port-spec-normalizer.ts +125 -0
  101. package/ts/proxies/nftables-proxy/utils/nft-rule-validator.ts +156 -0
  102. package/ts/proxies/smart-proxy/index.ts +6 -13
  103. package/ts/proxies/smart-proxy/models/interfaces.ts +6 -5
  104. package/ts/proxies/smart-proxy/route-preprocessor.ts +122 -0
  105. package/ts/proxies/smart-proxy/rust-binary-locator.ts +112 -0
  106. package/ts/proxies/smart-proxy/rust-metrics-adapter.ts +161 -0
  107. package/ts/proxies/smart-proxy/rust-proxy-bridge.ts +310 -0
  108. package/ts/proxies/smart-proxy/smart-proxy.ts +282 -800
  109. package/ts/proxies/smart-proxy/socket-handler-server.ts +279 -0
  110. package/ts/proxies/smart-proxy/utils/index.ts +3 -5
  111. package/ts/proxies/smart-proxy/utils/route-helpers/api-helpers.ts +144 -0
  112. package/ts/proxies/smart-proxy/utils/route-helpers/dynamic-helpers.ts +124 -0
  113. package/ts/proxies/smart-proxy/utils/route-helpers/http-helpers.ts +40 -0
  114. package/ts/proxies/smart-proxy/utils/route-helpers/https-helpers.ts +163 -0
  115. package/ts/proxies/smart-proxy/utils/route-helpers/index.ts +62 -0
  116. package/ts/proxies/smart-proxy/utils/route-helpers/load-balancer-helpers.ts +154 -0
  117. package/ts/proxies/smart-proxy/utils/route-helpers/nftables-helpers.ts +202 -0
  118. package/ts/proxies/smart-proxy/utils/route-helpers/security-helpers.ts +96 -0
  119. package/ts/proxies/smart-proxy/utils/route-helpers/socket-handlers.ts +337 -0
  120. package/ts/proxies/smart-proxy/utils/route-helpers/websocket-helpers.ts +98 -0
  121. package/ts/proxies/smart-proxy/utils/route-helpers.ts +5 -1302
  122. package/ts/proxies/smart-proxy/utils/route-utils.ts +1 -1
  123. package/ts/proxies/smart-proxy/utils/route-validator.ts +274 -4
  124. package/ts/routing/index.ts +2 -2
  125. package/ts/routing/models/http-types.ts +147 -4
  126. package/ts/proxies/http-proxy/certificate-manager.ts +0 -244
  127. package/ts/proxies/http-proxy/connection-pool.ts +0 -228
  128. package/ts/proxies/http-proxy/context-creator.ts +0 -145
  129. package/ts/proxies/http-proxy/function-cache.ts +0 -279
  130. package/ts/proxies/http-proxy/handlers/index.ts +0 -5
  131. package/ts/proxies/http-proxy/http-proxy.ts +0 -675
  132. package/ts/proxies/http-proxy/http-request-handler.ts +0 -331
  133. package/ts/proxies/http-proxy/http2-request-handler.ts +0 -255
  134. package/ts/proxies/http-proxy/index.ts +0 -13
  135. package/ts/proxies/http-proxy/models/http-types.ts +0 -148
  136. package/ts/proxies/http-proxy/models/index.ts +0 -5
  137. package/ts/proxies/http-proxy/models/types.ts +0 -125
  138. package/ts/proxies/http-proxy/request-handler.ts +0 -878
  139. package/ts/proxies/http-proxy/security-manager.ts +0 -433
  140. package/ts/proxies/http-proxy/websocket-handler.ts +0 -581
  141. package/ts/proxies/smart-proxy/acme-state-manager.ts +0 -112
  142. package/ts/proxies/smart-proxy/cert-store.ts +0 -92
  143. package/ts/proxies/smart-proxy/certificate-manager.ts +0 -894
  144. package/ts/proxies/smart-proxy/connection-manager.ts +0 -796
  145. package/ts/proxies/smart-proxy/http-proxy-bridge.ts +0 -187
  146. package/ts/proxies/smart-proxy/metrics-collector.ts +0 -453
  147. package/ts/proxies/smart-proxy/nftables-manager.ts +0 -271
  148. package/ts/proxies/smart-proxy/port-manager.ts +0 -358
  149. package/ts/proxies/smart-proxy/route-connection-handler.ts +0 -1640
  150. package/ts/proxies/smart-proxy/route-orchestrator.ts +0 -297
  151. package/ts/proxies/smart-proxy/security-manager.ts +0 -257
  152. package/ts/proxies/smart-proxy/throughput-tracker.ts +0 -138
  153. package/ts/proxies/smart-proxy/timeout-manager.ts +0 -196
  154. package/ts/proxies/smart-proxy/tls-manager.ts +0 -207
  155. package/ts/proxies/smart-proxy/utils/route-validators.ts +0 -283
@@ -0,0 +1,126 @@
1
+ /**
2
+ * NFTables Route Helper Functions
3
+ *
4
+ * This module provides utility functions for creating NFTables-based route configurations
5
+ * for high-performance packet forwarding at the kernel level.
6
+ */
7
+ import { createHttpToHttpsRedirect } from './https-helpers.js';
8
+ /**
9
+ * Create an NFTables-based route for high-performance packet forwarding
10
+ * @param nameOrDomains Name or domain(s) to match
11
+ * @param target Target host and port
12
+ * @param options Additional route options
13
+ * @returns Route configuration object
14
+ */
15
+ export function createNfTablesRoute(nameOrDomains, target, options = {}) {
16
+ // Determine if this is a name or domain
17
+ let name;
18
+ let domains;
19
+ if (Array.isArray(nameOrDomains) || (typeof nameOrDomains === 'string' && nameOrDomains.includes('.'))) {
20
+ domains = nameOrDomains;
21
+ name = Array.isArray(nameOrDomains) ? nameOrDomains[0] : nameOrDomains;
22
+ }
23
+ else {
24
+ name = nameOrDomains;
25
+ domains = undefined; // No domains
26
+ }
27
+ // Create route match
28
+ const match = {
29
+ domains,
30
+ ports: options.ports || 80
31
+ };
32
+ // Create route action
33
+ const action = {
34
+ type: 'forward',
35
+ targets: [{
36
+ host: target.host,
37
+ port: target.port
38
+ }],
39
+ forwardingEngine: 'nftables',
40
+ nftables: {
41
+ protocol: options.protocol || 'tcp',
42
+ preserveSourceIP: options.preserveSourceIP,
43
+ maxRate: options.maxRate,
44
+ priority: options.priority,
45
+ tableName: options.tableName,
46
+ useIPSets: options.useIPSets,
47
+ useAdvancedNAT: options.useAdvancedNAT
48
+ }
49
+ };
50
+ // Add TLS options if needed
51
+ if (options.useTls) {
52
+ action.tls = {
53
+ mode: 'passthrough'
54
+ };
55
+ }
56
+ // Create the route config
57
+ const routeConfig = {
58
+ name,
59
+ match,
60
+ action
61
+ };
62
+ // Add security if allowed or blocked IPs are specified
63
+ if (options.ipAllowList?.length || options.ipBlockList?.length) {
64
+ routeConfig.security = {
65
+ ipAllowList: options.ipAllowList,
66
+ ipBlockList: options.ipBlockList
67
+ };
68
+ }
69
+ return routeConfig;
70
+ }
71
+ /**
72
+ * Create an NFTables-based TLS termination route
73
+ * @param nameOrDomains Name or domain(s) to match
74
+ * @param target Target host and port
75
+ * @param options Additional route options
76
+ * @returns Route configuration object
77
+ */
78
+ export function createNfTablesTerminateRoute(nameOrDomains, target, options = {}) {
79
+ // Create basic NFTables route
80
+ const route = createNfTablesRoute(nameOrDomains, target, {
81
+ ...options,
82
+ ports: options.ports || 443,
83
+ useTls: false
84
+ });
85
+ // Set TLS termination
86
+ route.action.tls = {
87
+ mode: 'terminate',
88
+ certificate: options.certificate || 'auto'
89
+ };
90
+ return route;
91
+ }
92
+ /**
93
+ * Create a complete NFTables-based HTTPS setup with HTTP redirect
94
+ * @param nameOrDomains Name or domain(s) to match
95
+ * @param target Target host and port
96
+ * @param options Additional route options
97
+ * @returns Array of two route configurations (HTTPS and HTTP redirect)
98
+ */
99
+ export function createCompleteNfTablesHttpsServer(nameOrDomains, target, options = {}) {
100
+ // Create the HTTPS route using NFTables
101
+ const httpsRoute = createNfTablesTerminateRoute(nameOrDomains, target, {
102
+ ...options,
103
+ ports: options.httpsPort || 443
104
+ });
105
+ // Determine the domain(s) for HTTP redirect
106
+ const domains = typeof nameOrDomains === 'string' && !nameOrDomains.includes('.')
107
+ ? undefined
108
+ : nameOrDomains;
109
+ // Extract the HTTPS port for the redirect destination
110
+ const httpsPort = typeof options.httpsPort === 'number'
111
+ ? options.httpsPort
112
+ : Array.isArray(options.httpsPort) && typeof options.httpsPort[0] === 'number'
113
+ ? options.httpsPort[0]
114
+ : 443;
115
+ // Create the HTTP redirect route (this uses standard forwarding, not NFTables)
116
+ const httpRedirectRoute = createHttpToHttpsRedirect(domains, // Type cast needed since domains can be undefined now
117
+ httpsPort, {
118
+ match: {
119
+ ports: options.httpPort || 80,
120
+ domains: domains // Type cast needed since domains can be undefined now
121
+ },
122
+ name: `HTTP to HTTPS Redirect for ${Array.isArray(domains) ? domains.join(', ') : domains || 'all domains'}`
123
+ });
124
+ return [httpsRoute, httpRedirectRoute];
125
+ }
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmZ0YWJsZXMtaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RzL3Byb3hpZXMvc21hcnQtcHJveHkvdXRpbHMvcm91dGUtaGVscGVycy9uZnRhYmxlcy1oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBR0gsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFL0Q7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxhQUFnQyxFQUNoQyxNQUFtRCxFQUNuRCxVQVlJLEVBQUU7SUFFTix3Q0FBd0M7SUFDeEMsSUFBSSxJQUFZLENBQUM7SUFDakIsSUFBSSxPQUFzQyxDQUFDO0lBRTNDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sYUFBYSxLQUFLLFFBQVEsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN2RyxPQUFPLEdBQUcsYUFBYSxDQUFDO1FBQ3hCLElBQUksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztJQUN6RSxDQUFDO1NBQU0sQ0FBQztRQUNOLElBQUksR0FBRyxhQUFhLENBQUM7UUFDckIsT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLGFBQWE7SUFDcEMsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixNQUFNLEtBQUssR0FBZ0I7UUFDekIsT0FBTztRQUNQLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUU7S0FDM0IsQ0FBQztJQUVGLHNCQUFzQjtJQUN0QixNQUFNLE1BQU0sR0FBaUI7UUFDM0IsSUFBSSxFQUFFLFNBQVM7UUFDZixPQUFPLEVBQUUsQ0FBQztnQkFDUixJQUFJLEVBQUUsTUFB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
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Security Route Helper Functions
3
+ *
4
+ * This module provides utility functions for adding security features to routes.
5
+ */
6
+ import type { IRouteConfig } from '../../models/route-types.js';
7
+ /**
8
+ * Create a rate limiting route pattern
9
+ * @param baseRoute Base route to add rate limiting to
10
+ * @param rateLimit Rate limiting configuration
11
+ * @returns Route with rate limiting
12
+ */
13
+ export declare function addRateLimiting(baseRoute: IRouteConfig, rateLimit: {
14
+ maxRequests: number;
15
+ window: number;
16
+ keyBy?: 'ip' | 'path' | 'header';
17
+ headerName?: string;
18
+ errorMessage?: string;
19
+ }): IRouteConfig;
20
+ /**
21
+ * Create a basic authentication route pattern
22
+ * @param baseRoute Base route to add authentication to
23
+ * @param auth Authentication configuration
24
+ * @returns Route with basic authentication
25
+ */
26
+ export declare function addBasicAuth(baseRoute: IRouteConfig, auth: {
27
+ users: Array<{
28
+ username: string;
29
+ password: string;
30
+ }>;
31
+ realm?: string;
32
+ excludePaths?: string[];
33
+ }): IRouteConfig;
34
+ /**
35
+ * Create a JWT authentication route pattern
36
+ * @param baseRoute Base route to add JWT authentication to
37
+ * @param jwt JWT authentication configuration
38
+ * @returns Route with JWT authentication
39
+ */
40
+ export declare function addJwtAuth(baseRoute: IRouteConfig, jwt: {
41
+ secret: string;
42
+ algorithm?: string;
43
+ issuer?: string;
44
+ audience?: string;
45
+ expiresIn?: number;
46
+ excludePaths?: string[];
47
+ }): IRouteConfig;
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Security Route Helper Functions
3
+ *
4
+ * This module provides utility functions for adding security features to routes.
5
+ */
6
+ import { mergeRouteConfigs } from '../route-utils.js';
7
+ /**
8
+ * Create a rate limiting route pattern
9
+ * @param baseRoute Base route to add rate limiting to
10
+ * @param rateLimit Rate limiting configuration
11
+ * @returns Route with rate limiting
12
+ */
13
+ export function addRateLimiting(baseRoute, rateLimit) {
14
+ return mergeRouteConfigs(baseRoute, {
15
+ security: {
16
+ rateLimit: {
17
+ enabled: true,
18
+ maxRequests: rateLimit.maxRequests,
19
+ window: rateLimit.window,
20
+ keyBy: rateLimit.keyBy || 'ip',
21
+ headerName: rateLimit.headerName,
22
+ errorMessage: rateLimit.errorMessage || 'Rate limit exceeded. Please try again later.'
23
+ }
24
+ }
25
+ });
26
+ }
27
+ /**
28
+ * Create a basic authentication route pattern
29
+ * @param baseRoute Base route to add authentication to
30
+ * @param auth Authentication configuration
31
+ * @returns Route with basic authentication
32
+ */
33
+ export function addBasicAuth(baseRoute, auth) {
34
+ return mergeRouteConfigs(baseRoute, {
35
+ security: {
36
+ basicAuth: {
37
+ enabled: true,
38
+ users: auth.users,
39
+ realm: auth.realm || 'Restricted Area',
40
+ excludePaths: auth.excludePaths || []
41
+ }
42
+ }
43
+ });
44
+ }
45
+ /**
46
+ * Create a JWT authentication route pattern
47
+ * @param baseRoute Base route to add JWT authentication to
48
+ * @param jwt JWT authentication configuration
49
+ * @returns Route with JWT authentication
50
+ */
51
+ export function addJwtAuth(baseRoute, jwt) {
52
+ return mergeRouteConfigs(baseRoute, {
53
+ security: {
54
+ jwtAuth: {
55
+ enabled: true,
56
+ secret: jwt.secret,
57
+ algorithm: jwt.algorithm || 'HS256',
58
+ issuer: jwt.issuer,
59
+ audience: jwt.audience,
60
+ expiresIn: jwt.expiresIn,
61
+ excludePaths: jwt.excludePaths || []
62
+ }
63
+ }
64
+ });
65
+ }
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHktaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RzL3Byb3hpZXMvc21hcnQtcHJveHkvdXRpbHMvcm91dGUtaGVscGVycy9zZWN1cml0eS1oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFHSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUV0RDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQzdCLFNBQXVCLEVBQ3ZCLFNBTUM7SUFFRCxPQUFPLGlCQUFpQixDQUFDLFNBQVMsRUFBRTtRQUNsQyxRQUFRLEVBQUU7WUFDUixTQUFTLEVBQUU7Z0JBQ1QsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsV0FBVyxFQUFFLFNBQVMsQ0FBQyxXQUFXO2dCQUNsQyxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU07Z0JBQ3hCLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSyxJQUFJLElBQUk7Z0JBQzlCLFVBQVUsRUFBRSxTQUFTLENBQUMsVUFBVTtnQkFDaEMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxZQUFZLElBQUksOENBQThDO2FBQ3ZGO1NBQ0Y7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUMxQixTQUF1QixFQUN2QixJQUlDO0lBRUQsT0FBTyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUU7UUFDbEMsUUFBUSxFQUFFO1lBQ1IsU0FBUyxFQUFFO2dCQUNULE9BQU8sRUFBRSxJQUFJO2dCQUNiLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDakIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLElBQUksaUJBQWlCO2dCQUN0QyxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksSUFBSSxFQUFFO2FBQ3RDO1NBQ0Y7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUN4QixTQUF1QixFQUN2QixHQU9DO0lBRUQsT0FBTyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUU7UUFDbEMsUUFBUSxFQUFFO1lBQ1IsT0FBTyxFQUFFO2dCQUNQLE9BQU8sRUFBRSxJQUFJO2dCQUNiLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtnQkFDbEIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTLElBQUksT0FBTztnQkFDbkMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNO2dCQUNsQixRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVE7Z0JBQ3RCLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUztnQkFDeEIsWUFBWSxFQUFFLEdBQUcsQ0FBQyxZQUFZLElBQUksRUFBRTthQUNyQztTQUNGO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyJ9
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Socket Handler Functions
3
+ *
4
+ * This module provides pre-built socket handlers for common use cases
5
+ * like echoing, proxying, HTTP responses, and redirects.
6
+ */
7
+ import * as plugins from '../../../../plugins.js';
8
+ import type { IRouteConfig, TPortRange, IRouteContext } from '../../models/route-types.js';
9
+ /**
10
+ * Pre-built socket handlers for common use cases
11
+ */
12
+ export declare const SocketHandlers: {
13
+ /**
14
+ * Simple echo server handler
15
+ */
16
+ echo: (socket: plugins.net.Socket, context: IRouteContext) => void;
17
+ /**
18
+ * TCP proxy handler
19
+ */
20
+ proxy: (targetHost: string, targetPort: number) => (socket: plugins.net.Socket, context: IRouteContext) => void;
21
+ /**
22
+ * Line-based protocol handler
23
+ */
24
+ lineProtocol: (handler: (line: string, socket: plugins.net.Socket) => void) => (socket: plugins.net.Socket, context: IRouteContext) => void;
25
+ /**
26
+ * Simple HTTP response handler (for testing)
27
+ */
28
+ httpResponse: (statusCode: number, body: string) => (socket: plugins.net.Socket, context: IRouteContext) => void;
29
+ /**
30
+ * Block connection immediately
31
+ */
32
+ block: (message?: string) => (socket: plugins.net.Socket, context: IRouteContext) => void;
33
+ /**
34
+ * HTTP block response
35
+ */
36
+ httpBlock: (statusCode?: number, message?: string) => (socket: plugins.net.Socket, context: IRouteContext) => void;
37
+ /**
38
+ * HTTP redirect handler
39
+ * Uses the centralized detection module for HTTP parsing
40
+ */
41
+ httpRedirect: (locationTemplate: string, statusCode?: number) => (socket: plugins.net.Socket, context: IRouteContext) => void;
42
+ /**
43
+ * HTTP server handler for ACME challenges and other HTTP needs
44
+ * Uses the centralized detection module for HTTP parsing
45
+ */
46
+ httpServer: (handler: (req: {
47
+ method: string;
48
+ url: string;
49
+ headers: Record<string, string>;
50
+ body?: string;
51
+ }, res: {
52
+ status: (code: number) => void;
53
+ header: (name: string, value: string) => void;
54
+ send: (data: string) => void;
55
+ end: () => void;
56
+ }) => void) => (socket: plugins.net.Socket, context: IRouteContext) => void;
57
+ };
58
+ /**
59
+ * Create a socket handler route configuration
60
+ * @param domains Domain(s) to match
61
+ * @param ports Port(s) to listen on
62
+ * @param handler Socket handler function
63
+ * @param options Additional route options
64
+ * @returns Route configuration object
65
+ */
66
+ export declare function createSocketHandlerRoute(domains: string | string[], ports: TPortRange, handler: (socket: plugins.net.Socket) => void | Promise<void>, options?: {
67
+ name?: string;
68
+ priority?: number;
69
+ path?: string;
70
+ }): IRouteConfig;
@@ -0,0 +1,287 @@
1
+ /**
2
+ * Socket Handler Functions
3
+ *
4
+ * This module provides pre-built socket handlers for common use cases
5
+ * like echoing, proxying, HTTP responses, and redirects.
6
+ */
7
+ import * as plugins from '../../../../plugins.js';
8
+ import { ProtocolDetector } from '../../../../detection/index.js';
9
+ import { createSocketTracker } from '../../../../core/utils/socket-tracker.js';
10
+ /**
11
+ * Pre-built socket handlers for common use cases
12
+ */
13
+ export const SocketHandlers = {
14
+ /**
15
+ * Simple echo server handler
16
+ */
17
+ echo: (socket, context) => {
18
+ socket.write('ECHO SERVER READY\n');
19
+ socket.on('data', data => socket.write(data));
20
+ },
21
+ /**
22
+ * TCP proxy handler
23
+ */
24
+ proxy: (targetHost, targetPort) => (socket, context) => {
25
+ const target = plugins.net.connect(targetPort, targetHost);
26
+ socket.pipe(target);
27
+ target.pipe(socket);
28
+ socket.on('close', () => target.destroy());
29
+ target.on('close', () => socket.destroy());
30
+ target.on('error', (err) => {
31
+ console.error('Proxy target error:', err);
32
+ socket.destroy();
33
+ });
34
+ },
35
+ /**
36
+ * Line-based protocol handler
37
+ */
38
+ lineProtocol: (handler) => (socket, context) => {
39
+ let buffer = '';
40
+ socket.on('data', (data) => {
41
+ buffer += data.toString();
42
+ const lines = buffer.split('\n');
43
+ buffer = lines.pop() || '';
44
+ lines.forEach(line => {
45
+ if (line.trim()) {
46
+ handler(line.trim(), socket);
47
+ }
48
+ });
49
+ });
50
+ },
51
+ /**
52
+ * Simple HTTP response handler (for testing)
53
+ */
54
+ httpResponse: (statusCode, body) => (socket, context) => {
55
+ const response = [
56
+ `HTTP/1.1 ${statusCode} ${statusCode === 200 ? 'OK' : 'Error'}`,
57
+ 'Content-Type: text/plain',
58
+ `Content-Length: ${body.length}`,
59
+ 'Connection: close',
60
+ '',
61
+ body
62
+ ].join('\r\n');
63
+ socket.write(response);
64
+ socket.end();
65
+ },
66
+ /**
67
+ * Block connection immediately
68
+ */
69
+ block: (message) => (socket, context) => {
70
+ const finalMessage = message || `Connection blocked from ${context.clientIp}`;
71
+ if (finalMessage) {
72
+ socket.write(finalMessage);
73
+ }
74
+ socket.end();
75
+ },
76
+ /**
77
+ * HTTP block response
78
+ */
79
+ httpBlock: (statusCode = 403, message) => (socket, context) => {
80
+ const defaultMessage = `Access forbidden for ${context.domain || context.clientIp}`;
81
+ const finalMessage = message || defaultMessage;
82
+ const response = [
83
+ `HTTP/1.1 ${statusCode} ${finalMessage}`,
84
+ 'Content-Type: text/plain',
85
+ `Content-Length: ${finalMessage.length}`,
86
+ 'Connection: close',
87
+ '',
88
+ finalMessage
89
+ ].join('\r\n');
90
+ socket.write(response);
91
+ socket.end();
92
+ },
93
+ /**
94
+ * HTTP redirect handler
95
+ * Uses the centralized detection module for HTTP parsing
96
+ */
97
+ httpRedirect: (locationTemplate, statusCode = 301) => (socket, context) => {
98
+ const tracker = createSocketTracker(socket);
99
+ const connectionId = ProtocolDetector.createConnectionId({
100
+ socketId: context.connectionId || `${Date.now()}-${Math.random()}`
101
+ });
102
+ const handleData = async (data) => {
103
+ // Use detection module for parsing
104
+ const detectionResult = await ProtocolDetector.detectWithConnectionTracking(data, connectionId, { extractFullHeaders: false } // We only need method and path
105
+ );
106
+ if (detectionResult.protocol === 'http' && detectionResult.connectionInfo.path) {
107
+ const method = detectionResult.connectionInfo.method || 'GET';
108
+ const path = detectionResult.connectionInfo.path || '/';
109
+ const domain = context.domain || 'localhost';
110
+ const port = context.port;
111
+ let finalLocation = locationTemplate
112
+ .replace('{domain}', domain)
113
+ .replace('{port}', String(port))
114
+ .replace('{path}', path)
115
+ .replace('{clientIp}', context.clientIp);
116
+ const message = `Redirecting to ${finalLocation}`;
117
+ const response = [
118
+ `HTTP/1.1 ${statusCode} ${statusCode === 301 ? 'Moved Permanently' : 'Found'}`,
119
+ `Location: ${finalLocation}`,
120
+ 'Content-Type: text/plain',
121
+ `Content-Length: ${message.length}`,
122
+ 'Connection: close',
123
+ '',
124
+ message
125
+ ].join('\r\n');
126
+ socket.write(response);
127
+ }
128
+ else {
129
+ // Not a valid HTTP request, close connection
130
+ socket.write('HTTP/1.1 400 Bad Request\r\nConnection: close\r\n\r\n');
131
+ }
132
+ socket.end();
133
+ // Clean up detection state
134
+ ProtocolDetector.cleanupConnections();
135
+ // Clean up all tracked resources
136
+ tracker.cleanup();
137
+ };
138
+ // Use tracker to manage the listener
139
+ socket.once('data', handleData);
140
+ tracker.addListener('error', (err) => {
141
+ tracker.safeDestroy(err);
142
+ });
143
+ tracker.addListener('close', () => {
144
+ tracker.cleanup();
145
+ });
146
+ },
147
+ /**
148
+ * HTTP server handler for ACME challenges and other HTTP needs
149
+ * Uses the centralized detection module for HTTP parsing
150
+ */
151
+ httpServer: (handler) => (socket, context) => {
152
+ const tracker = createSocketTracker(socket);
153
+ let requestParsed = false;
154
+ let responseTimer = null;
155
+ const connectionId = ProtocolDetector.createConnectionId({
156
+ socketId: context.connectionId || `${Date.now()}-${Math.random()}`
157
+ });
158
+ const processData = async (data) => {
159
+ if (requestParsed)
160
+ return; // Only handle the first request
161
+ // Use HttpDetector for parsing
162
+ const detectionResult = await ProtocolDetector.detectWithConnectionTracking(data, connectionId, { extractFullHeaders: true });
163
+ if (detectionResult.protocol !== 'http' || !detectionResult.isComplete) {
164
+ // Not a complete HTTP request yet
165
+ return;
166
+ }
167
+ requestParsed = true;
168
+ // Remove data listener after parsing request
169
+ socket.removeListener('data', processData);
170
+ const connInfo = detectionResult.connectionInfo;
171
+ // Create request object from detection result
172
+ const req = {
173
+ method: connInfo.method || 'GET',
174
+ url: connInfo.path || '/',
175
+ headers: connInfo.headers || {},
176
+ body: detectionResult.remainingBuffer?.toString() || ''
177
+ };
178
+ // Create response object
179
+ let statusCode = 200;
180
+ const responseHeaders = {};
181
+ let ended = false;
182
+ const res = {
183
+ status: (code) => {
184
+ statusCode = code;
185
+ },
186
+ header: (name, value) => {
187
+ responseHeaders[name] = value;
188
+ },
189
+ send: (data) => {
190
+ if (ended)
191
+ return;
192
+ ended = true;
193
+ // Clear response timer since we're sending now
194
+ if (responseTimer) {
195
+ clearTimeout(responseTimer);
196
+ responseTimer = null;
197
+ }
198
+ if (!responseHeaders['content-type']) {
199
+ responseHeaders['content-type'] = 'text/plain';
200
+ }
201
+ responseHeaders['content-length'] = String(data.length);
202
+ responseHeaders['connection'] = 'close';
203
+ const statusText = statusCode === 200 ? 'OK' :
204
+ statusCode === 404 ? 'Not Found' :
205
+ statusCode === 500 ? 'Internal Server Error' : 'Response';
206
+ let response = `HTTP/1.1 ${statusCode} ${statusText}\r\n`;
207
+ for (const [name, value] of Object.entries(responseHeaders)) {
208
+ response += `${name}: ${value}\r\n`;
209
+ }
210
+ response += '\r\n';
211
+ response += data;
212
+ socket.write(response);
213
+ socket.end();
214
+ },
215
+ end: () => {
216
+ if (ended)
217
+ return;
218
+ ended = true;
219
+ socket.write('HTTP/1.1 200 OK\r\nContent-Length: 0\r\nConnection: close\r\n\r\n');
220
+ socket.end();
221
+ }
222
+ };
223
+ try {
224
+ handler(req, res);
225
+ // Ensure response is sent even if handler doesn't call send()
226
+ responseTimer = setTimeout(() => {
227
+ if (!ended) {
228
+ res.send('');
229
+ }
230
+ responseTimer = null;
231
+ }, 1000);
232
+ // Track and unref the timer
233
+ tracker.addTimer(responseTimer);
234
+ }
235
+ catch (error) {
236
+ if (!ended) {
237
+ res.status(500);
238
+ res.send('Internal Server Error');
239
+ }
240
+ // Use safeDestroy for error cases
241
+ tracker.safeDestroy(error instanceof Error ? error : new Error('Handler error'));
242
+ }
243
+ };
244
+ // Use tracker to manage listeners
245
+ tracker.addListener('data', processData);
246
+ tracker.addListener('error', (err) => {
247
+ if (!requestParsed) {
248
+ tracker.safeDestroy(err);
249
+ }
250
+ });
251
+ tracker.addListener('close', () => {
252
+ // Clear any pending response timer
253
+ if (responseTimer) {
254
+ clearTimeout(responseTimer);
255
+ responseTimer = null;
256
+ }
257
+ // Clean up detection state
258
+ ProtocolDetector.cleanupConnections();
259
+ // Clean up all tracked resources
260
+ tracker.cleanup();
261
+ });
262
+ }
263
+ };
264
+ /**
265
+ * Create a socket handler route configuration
266
+ * @param domains Domain(s) to match
267
+ * @param ports Port(s) to listen on
268
+ * @param handler Socket handler function
269
+ * @param options Additional route options
270
+ * @returns Route configuration object
271
+ */
272
+ export function createSocketHandlerRoute(domains, ports, handler, options = {}) {
273
+ return {
274
+ name: options.name || 'socket-handler-route',
275
+ priority: options.priority !== undefined ? options.priority : 50,
276
+ match: {
277
+ domains,
278
+ ports,
279
+ ...(options.path && { path: options.path })
280
+ },
281
+ action: {
282
+ type: 'socket-handler',
283
+ socketHandler: handler
284
+ }
285
+ };
286
+ }
287
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ja2V0LWhhbmRsZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdHMvcHJveGllcy9zbWFydC1wcm94eS91dGlscy9yb3V0ZS1oZWxwZXJzL3NvY2tldC1oYW5kbGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sS0FBSyxPQUFPLE1BQU0sd0JBQXdCLENBQUM7QUFFbEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFFL0U7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUI7O09BRUc7SUFDSCxJQUFJLEVBQUUsQ0FBQyxNQUEwQixFQUFFLE9BQXNCLEVBQUUsRUFBRTtRQUMzRCxNQUFNLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDcEMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxFQUFFLENBQUMsVUFBa0IsRUFBRSxVQUFrQixFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQTBCLEVBQUUsT0FBc0IsRUFBRSxFQUFFO1FBQ3hHLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMzRCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFD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
@@ -0,0 +1,46 @@
1
+ /**
2
+ * WebSocket Route Helper Functions
3
+ *
4
+ * This module provides utility functions for creating WebSocket route configurations.
5
+ */
6
+ import type { IRouteConfig } from '../../models/route-types.js';
7
+ /**
8
+ * Create a WebSocket route configuration
9
+ * @param domains Domain(s) to match
10
+ * @param targetOrPath Target server OR WebSocket path (legacy)
11
+ * @param targetOrOptions Target server (legacy) OR options
12
+ * @param options Additional route options (legacy)
13
+ * @returns Route configuration object
14
+ */
15
+ export declare function createWebSocketRoute(domains: string | string[], targetOrPath: {
16
+ host: string | string[];
17
+ port: number;
18
+ } | string, targetOrOptions?: {
19
+ host: string | string[];
20
+ port: number;
21
+ } | {
22
+ useTls?: boolean;
23
+ certificate?: 'auto' | {
24
+ key: string;
25
+ cert: string;
26
+ };
27
+ path?: string;
28
+ httpPort?: number | number[];
29
+ httpsPort?: number | number[];
30
+ pingInterval?: number;
31
+ pingTimeout?: number;
32
+ name?: string;
33
+ [key: string]: any;
34
+ }, options?: {
35
+ useTls?: boolean;
36
+ certificate?: 'auto' | {
37
+ key: string;
38
+ cert: string;
39
+ };
40
+ httpPort?: number | number[];
41
+ httpsPort?: number | number[];
42
+ pingInterval?: number;
43
+ pingTimeout?: number;
44
+ name?: string;
45
+ [key: string]: any;
46
+ }): IRouteConfig;