@push.rocks/smartproxy 15.0.2 → 16.0.3

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 (160) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/certificate/index.d.ts +10 -4
  3. package/dist_ts/certificate/index.js +5 -7
  4. package/dist_ts/certificate/models/certificate-types.d.ts +35 -15
  5. package/dist_ts/certificate/providers/cert-provisioner.d.ts +41 -15
  6. package/dist_ts/certificate/providers/cert-provisioner.js +201 -41
  7. package/dist_ts/core/models/index.d.ts +2 -0
  8. package/dist_ts/core/models/index.js +3 -1
  9. package/dist_ts/core/models/route-context.d.ts +62 -0
  10. package/dist_ts/core/models/route-context.js +43 -0
  11. package/dist_ts/core/models/socket-augmentation.d.ts +12 -0
  12. package/dist_ts/core/models/socket-augmentation.js +18 -0
  13. package/dist_ts/core/utils/event-system.d.ts +200 -0
  14. package/dist_ts/core/utils/event-system.js +224 -0
  15. package/dist_ts/core/utils/index.d.ts +7 -0
  16. package/dist_ts/core/utils/index.js +8 -1
  17. package/dist_ts/core/utils/route-manager.d.ts +118 -0
  18. package/dist_ts/core/utils/route-manager.js +383 -0
  19. package/dist_ts/core/utils/route-utils.d.ts +94 -0
  20. package/dist_ts/core/utils/route-utils.js +264 -0
  21. package/dist_ts/core/utils/security-utils.d.ts +111 -0
  22. package/dist_ts/core/utils/security-utils.js +212 -0
  23. package/dist_ts/core/utils/shared-security-manager.d.ts +110 -0
  24. package/dist_ts/core/utils/shared-security-manager.js +252 -0
  25. package/dist_ts/core/utils/template-utils.d.ts +37 -0
  26. package/dist_ts/core/utils/template-utils.js +104 -0
  27. package/dist_ts/core/utils/websocket-utils.d.ts +23 -0
  28. package/dist_ts/core/utils/websocket-utils.js +86 -0
  29. package/dist_ts/forwarding/config/forwarding-types.d.ts +40 -76
  30. package/dist_ts/forwarding/config/forwarding-types.js +19 -18
  31. package/dist_ts/forwarding/config/index.d.ts +4 -2
  32. package/dist_ts/forwarding/config/index.js +5 -3
  33. package/dist_ts/forwarding/handlers/base-handler.js +3 -1
  34. package/dist_ts/forwarding/index.d.ts +5 -6
  35. package/dist_ts/forwarding/index.js +3 -3
  36. package/dist_ts/http/models/http-types.js +1 -1
  37. package/dist_ts/http/port80/acme-interfaces.d.ts +30 -0
  38. package/dist_ts/http/port80/acme-interfaces.js +46 -1
  39. package/dist_ts/http/port80/port80-handler.d.ts +17 -2
  40. package/dist_ts/http/port80/port80-handler.js +49 -11
  41. package/dist_ts/http/router/index.d.ts +5 -1
  42. package/dist_ts/http/router/index.js +4 -2
  43. package/dist_ts/http/router/route-router.d.ts +108 -0
  44. package/dist_ts/http/router/route-router.js +393 -0
  45. package/dist_ts/index.d.ts +8 -2
  46. package/dist_ts/index.js +10 -3
  47. package/dist_ts/proxies/index.d.ts +7 -2
  48. package/dist_ts/proxies/index.js +10 -4
  49. package/dist_ts/proxies/network-proxy/certificate-manager.d.ts +21 -0
  50. package/dist_ts/proxies/network-proxy/certificate-manager.js +92 -1
  51. package/dist_ts/proxies/network-proxy/context-creator.d.ts +34 -0
  52. package/dist_ts/proxies/network-proxy/context-creator.js +108 -0
  53. package/dist_ts/proxies/network-proxy/function-cache.d.ts +90 -0
  54. package/dist_ts/proxies/network-proxy/function-cache.js +198 -0
  55. package/dist_ts/proxies/network-proxy/http-request-handler.d.ts +40 -0
  56. package/dist_ts/proxies/network-proxy/http-request-handler.js +256 -0
  57. package/dist_ts/proxies/network-proxy/http2-request-handler.d.ts +24 -0
  58. package/dist_ts/proxies/network-proxy/http2-request-handler.js +201 -0
  59. package/dist_ts/proxies/network-proxy/models/types.d.ts +73 -1
  60. package/dist_ts/proxies/network-proxy/models/types.js +242 -1
  61. package/dist_ts/proxies/network-proxy/network-proxy.d.ts +23 -20
  62. package/dist_ts/proxies/network-proxy/network-proxy.js +147 -60
  63. package/dist_ts/proxies/network-proxy/request-handler.d.ts +38 -5
  64. package/dist_ts/proxies/network-proxy/request-handler.js +584 -198
  65. package/dist_ts/proxies/network-proxy/security-manager.d.ts +65 -0
  66. package/dist_ts/proxies/network-proxy/security-manager.js +255 -0
  67. package/dist_ts/proxies/network-proxy/websocket-handler.d.ts +13 -2
  68. package/dist_ts/proxies/network-proxy/websocket-handler.js +238 -20
  69. package/dist_ts/proxies/smart-proxy/index.d.ts +1 -1
  70. package/dist_ts/proxies/smart-proxy/index.js +3 -3
  71. package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +5 -66
  72. package/dist_ts/proxies/smart-proxy/models/interfaces.js +5 -4
  73. package/dist_ts/proxies/smart-proxy/models/route-types.d.ts +173 -6
  74. package/dist_ts/proxies/smart-proxy/network-proxy-bridge.d.ts +20 -7
  75. package/dist_ts/proxies/smart-proxy/network-proxy-bridge.js +49 -108
  76. package/dist_ts/proxies/smart-proxy/port-manager.d.ts +81 -0
  77. package/dist_ts/proxies/smart-proxy/port-manager.js +166 -0
  78. package/dist_ts/proxies/smart-proxy/route-connection-handler.d.ts +7 -5
  79. package/dist_ts/proxies/smart-proxy/route-connection-handler.js +155 -160
  80. package/dist_ts/proxies/smart-proxy/route-helpers/index.d.ts +9 -0
  81. package/dist_ts/proxies/smart-proxy/route-helpers/index.js +11 -0
  82. package/dist_ts/proxies/smart-proxy/route-helpers.d.ts +5 -125
  83. package/dist_ts/proxies/smart-proxy/route-helpers.js +8 -195
  84. package/dist_ts/proxies/smart-proxy/route-manager.d.ts +14 -11
  85. package/dist_ts/proxies/smart-proxy/route-manager.js +81 -124
  86. package/dist_ts/proxies/smart-proxy/smart-proxy.d.ts +101 -12
  87. package/dist_ts/proxies/smart-proxy/smart-proxy.js +178 -306
  88. package/dist_ts/proxies/smart-proxy/timeout-manager.js +3 -3
  89. package/dist_ts/proxies/smart-proxy/utils/index.d.ts +12 -0
  90. package/dist_ts/proxies/smart-proxy/utils/index.js +19 -0
  91. package/dist_ts/proxies/smart-proxy/utils/route-helpers.d.ts +240 -0
  92. package/dist_ts/proxies/smart-proxy/utils/route-helpers.js +451 -0
  93. package/dist_ts/proxies/smart-proxy/utils/route-migration-utils.d.ts +51 -0
  94. package/dist_ts/proxies/smart-proxy/utils/route-migration-utils.js +124 -0
  95. package/dist_ts/proxies/smart-proxy/utils/route-patterns.d.ts +131 -0
  96. package/dist_ts/proxies/smart-proxy/utils/route-patterns.js +217 -0
  97. package/dist_ts/proxies/smart-proxy/utils/route-utils.d.ts +79 -0
  98. package/dist_ts/proxies/smart-proxy/utils/route-utils.js +266 -0
  99. package/dist_ts/proxies/smart-proxy/utils/route-validators.d.ts +73 -0
  100. package/dist_ts/proxies/smart-proxy/utils/route-validators.js +264 -0
  101. package/package.json +1 -1
  102. package/readme.md +241 -125
  103. package/readme.plan.md +73 -286
  104. package/ts/00_commitinfo_data.ts +1 -1
  105. package/ts/certificate/index.ts +17 -9
  106. package/ts/certificate/models/certificate-types.ts +37 -16
  107. package/ts/certificate/providers/cert-provisioner.ts +247 -54
  108. package/ts/core/models/index.ts +2 -0
  109. package/ts/core/models/route-context.ts +113 -0
  110. package/ts/core/models/socket-augmentation.ts +33 -0
  111. package/ts/core/utils/event-system.ts +376 -0
  112. package/ts/core/utils/index.ts +7 -0
  113. package/ts/core/utils/route-manager.ts +489 -0
  114. package/ts/core/utils/route-utils.ts +312 -0
  115. package/ts/core/utils/security-utils.ts +309 -0
  116. package/ts/core/utils/shared-security-manager.ts +333 -0
  117. package/ts/core/utils/template-utils.ts +124 -0
  118. package/ts/core/utils/websocket-utils.ts +81 -0
  119. package/ts/forwarding/config/forwarding-types.ts +79 -107
  120. package/ts/forwarding/config/index.ts +4 -2
  121. package/ts/forwarding/handlers/base-handler.ts +4 -2
  122. package/ts/forwarding/index.ts +3 -2
  123. package/ts/http/models/http-types.ts +0 -1
  124. package/ts/http/port80/acme-interfaces.ts +84 -0
  125. package/ts/http/port80/port80-handler.ts +61 -15
  126. package/ts/http/router/index.ts +8 -1
  127. package/ts/http/router/route-router.ts +482 -0
  128. package/ts/index.ts +14 -2
  129. package/ts/proxies/index.ts +12 -3
  130. package/ts/proxies/network-proxy/certificate-manager.ts +114 -10
  131. package/ts/proxies/network-proxy/context-creator.ts +145 -0
  132. package/ts/proxies/network-proxy/function-cache.ts +259 -0
  133. package/ts/proxies/network-proxy/http-request-handler.ts +330 -0
  134. package/ts/proxies/network-proxy/http2-request-handler.ts +255 -0
  135. package/ts/proxies/network-proxy/models/types.ts +312 -1
  136. package/ts/proxies/network-proxy/network-proxy.ts +195 -86
  137. package/ts/proxies/network-proxy/request-handler.ts +698 -246
  138. package/ts/proxies/network-proxy/security-manager.ts +298 -0
  139. package/ts/proxies/network-proxy/websocket-handler.ts +276 -33
  140. package/ts/proxies/smart-proxy/index.ts +2 -12
  141. package/ts/proxies/smart-proxy/models/interfaces.ts +13 -67
  142. package/ts/proxies/smart-proxy/models/route-types.ts +223 -25
  143. package/ts/proxies/smart-proxy/network-proxy-bridge.ts +57 -123
  144. package/ts/proxies/smart-proxy/port-manager.ts +195 -0
  145. package/ts/proxies/smart-proxy/route-connection-handler.ts +191 -225
  146. package/ts/proxies/smart-proxy/route-manager.ts +101 -144
  147. package/ts/proxies/smart-proxy/smart-proxy.ts +206 -377
  148. package/ts/proxies/smart-proxy/timeout-manager.ts +2 -2
  149. package/ts/proxies/smart-proxy/utils/index.ts +40 -0
  150. package/ts/proxies/smart-proxy/utils/route-helpers.ts +621 -0
  151. package/ts/proxies/smart-proxy/utils/route-migration-utils.ts +165 -0
  152. package/ts/proxies/smart-proxy/utils/route-patterns.ts +309 -0
  153. package/ts/proxies/smart-proxy/utils/route-utils.ts +330 -0
  154. package/ts/proxies/smart-proxy/utils/route-validators.ts +288 -0
  155. package/ts/forwarding/config/domain-config.ts +0 -28
  156. package/ts/forwarding/config/domain-manager.ts +0 -283
  157. package/ts/proxies/smart-proxy/connection-handler.ts +0 -1240
  158. package/ts/proxies/smart-proxy/domain-config-manager.ts +0 -441
  159. package/ts/proxies/smart-proxy/port-range-manager.ts +0 -211
  160. package/ts/proxies/smart-proxy/route-helpers.ts +0 -344
@@ -0,0 +1,451 @@
1
+ /**
2
+ * Route Helper Functions
3
+ *
4
+ * This file provides utility functions for creating route configurations for common scenarios.
5
+ * These functions aim to simplify the creation of route configurations for typical use cases.
6
+ *
7
+ * This module includes helper functions for creating:
8
+ * - HTTP routes (createHttpRoute)
9
+ * - HTTPS routes with TLS termination (createHttpsTerminateRoute)
10
+ * - HTTP to HTTPS redirects (createHttpToHttpsRedirect)
11
+ * - HTTPS passthrough routes (createHttpsPassthroughRoute)
12
+ * - Complete HTTPS servers with redirects (createCompleteHttpsServer)
13
+ * - Load balancer routes (createLoadBalancerRoute)
14
+ * - Static file server routes (createStaticFileRoute)
15
+ * - API routes (createApiRoute)
16
+ * - WebSocket routes (createWebSocketRoute)
17
+ * - Port mapping routes (createPortMappingRoute, createOffsetPortMappingRoute)
18
+ * - Dynamic routing (createDynamicRoute, createSmartLoadBalancer)
19
+ */
20
+ /**
21
+ * Create an HTTP-only route configuration
22
+ * @param domains Domain(s) to match
23
+ * @param target Target host and port
24
+ * @param options Additional route options
25
+ * @returns Route configuration object
26
+ */
27
+ export function createHttpRoute(domains, target, options = {}) {
28
+ // Create route match
29
+ const match = {
30
+ ports: options.match?.ports || 80,
31
+ domains
32
+ };
33
+ // Create route action
34
+ const action = {
35
+ type: 'forward',
36
+ target
37
+ };
38
+ // Create the route config
39
+ return {
40
+ match,
41
+ action,
42
+ name: options.name || `HTTP Route for ${Array.isArray(domains) ? domains.join(', ') : domains}`,
43
+ ...options
44
+ };
45
+ }
46
+ /**
47
+ * Create an HTTPS route with TLS termination (including HTTP redirect to HTTPS)
48
+ * @param domains Domain(s) to match
49
+ * @param target Target host and port
50
+ * @param options Additional route options
51
+ * @returns Route configuration object
52
+ */
53
+ export function createHttpsTerminateRoute(domains, target, options = {}) {
54
+ // Create route match
55
+ const match = {
56
+ ports: options.httpsPort || 443,
57
+ domains
58
+ };
59
+ // Create route action
60
+ const action = {
61
+ type: 'forward',
62
+ target,
63
+ tls: {
64
+ mode: options.reencrypt ? 'terminate-and-reencrypt' : 'terminate',
65
+ certificate: options.certificate || 'auto'
66
+ }
67
+ };
68
+ // Create the route config
69
+ return {
70
+ match,
71
+ action,
72
+ name: options.name || `HTTPS Route for ${Array.isArray(domains) ? domains.join(', ') : domains}`,
73
+ ...options
74
+ };
75
+ }
76
+ /**
77
+ * Create an HTTP to HTTPS redirect route
78
+ * @param domains Domain(s) to match
79
+ * @param httpsPort HTTPS port to redirect to (default: 443)
80
+ * @param options Additional route options
81
+ * @returns Route configuration object
82
+ */
83
+ export function createHttpToHttpsRedirect(domains, httpsPort = 443, options = {}) {
84
+ // Create route match
85
+ const match = {
86
+ ports: options.match?.ports || 80,
87
+ domains
88
+ };
89
+ // Create route action
90
+ const action = {
91
+ type: 'redirect',
92
+ redirect: {
93
+ to: `https://{domain}:${httpsPort}{path}`,
94
+ status: 301
95
+ }
96
+ };
97
+ // Create the route config
98
+ return {
99
+ match,
100
+ action,
101
+ name: options.name || `HTTP to HTTPS Redirect for ${Array.isArray(domains) ? domains.join(', ') : domains}`,
102
+ ...options
103
+ };
104
+ }
105
+ /**
106
+ * Create an HTTPS passthrough route (SNI-based forwarding without TLS termination)
107
+ * @param domains Domain(s) to match
108
+ * @param target Target host and port
109
+ * @param options Additional route options
110
+ * @returns Route configuration object
111
+ */
112
+ export function createHttpsPassthroughRoute(domains, target, options = {}) {
113
+ // Create route match
114
+ const match = {
115
+ ports: options.match?.ports || 443,
116
+ domains
117
+ };
118
+ // Create route action
119
+ const action = {
120
+ type: 'forward',
121
+ target,
122
+ tls: {
123
+ mode: 'passthrough'
124
+ }
125
+ };
126
+ // Create the route config
127
+ return {
128
+ match,
129
+ action,
130
+ name: options.name || `HTTPS Passthrough for ${Array.isArray(domains) ? domains.join(', ') : domains}`,
131
+ ...options
132
+ };
133
+ }
134
+ /**
135
+ * Create a complete HTTPS server with HTTP to HTTPS redirects
136
+ * @param domains Domain(s) to match
137
+ * @param target Target host and port
138
+ * @param options Additional configuration options
139
+ * @returns Array of two route configurations (HTTPS and HTTP redirect)
140
+ */
141
+ export function createCompleteHttpsServer(domains, target, options = {}) {
142
+ // Create the HTTPS route
143
+ const httpsRoute = createHttpsTerminateRoute(domains, target, options);
144
+ // Create the HTTP redirect route
145
+ const httpRedirectRoute = createHttpToHttpsRedirect(domains,
146
+ // Extract the HTTPS port from the HTTPS route - ensure it's a number
147
+ typeof options.httpsPort === 'number' ? options.httpsPort :
148
+ Array.isArray(options.httpsPort) ? options.httpsPort[0] : 443, {
149
+ // Set the HTTP port
150
+ match: {
151
+ ports: options.httpPort || 80,
152
+ domains
153
+ },
154
+ name: `HTTP to HTTPS Redirect for ${Array.isArray(domains) ? domains.join(', ') : domains}`
155
+ });
156
+ return [httpsRoute, httpRedirectRoute];
157
+ }
158
+ /**
159
+ * Create a load balancer route (round-robin between multiple backend hosts)
160
+ * @param domains Domain(s) to match
161
+ * @param hosts Array of backend hosts to load balance between
162
+ * @param port Backend port
163
+ * @param options Additional route options
164
+ * @returns Route configuration object
165
+ */
166
+ export function createLoadBalancerRoute(domains, hosts, port, options = {}) {
167
+ // Create route match
168
+ const match = {
169
+ ports: options.match?.ports || (options.tls ? 443 : 80),
170
+ domains
171
+ };
172
+ // Create route target
173
+ const target = {
174
+ host: hosts,
175
+ port
176
+ };
177
+ // Create route action
178
+ const action = {
179
+ type: 'forward',
180
+ target
181
+ };
182
+ // Add TLS configuration if provided
183
+ if (options.tls) {
184
+ action.tls = {
185
+ mode: options.tls.mode,
186
+ certificate: options.tls.certificate || 'auto'
187
+ };
188
+ }
189
+ // Create the route config
190
+ return {
191
+ match,
192
+ action,
193
+ name: options.name || `Load Balancer for ${Array.isArray(domains) ? domains.join(', ') : domains}`,
194
+ ...options
195
+ };
196
+ }
197
+ /**
198
+ * Create a static file server route
199
+ * @param domains Domain(s) to match
200
+ * @param rootDir Root directory path for static files
201
+ * @param options Additional route options
202
+ * @returns Route configuration object
203
+ */
204
+ export function createStaticFileRoute(domains, rootDir, options = {}) {
205
+ // Create route match
206
+ const match = {
207
+ ports: options.serveOnHttps
208
+ ? (options.httpsPort || 443)
209
+ : (options.httpPort || 80),
210
+ domains
211
+ };
212
+ // Create route action
213
+ const action = {
214
+ type: 'static',
215
+ static: {
216
+ root: rootDir,
217
+ index: options.indexFiles || ['index.html', 'index.htm']
218
+ }
219
+ };
220
+ // Add TLS configuration if serving on HTTPS
221
+ if (options.serveOnHttps) {
222
+ action.tls = {
223
+ mode: 'terminate',
224
+ certificate: options.certificate || 'auto'
225
+ };
226
+ }
227
+ // Create the route config
228
+ return {
229
+ match,
230
+ action,
231
+ name: options.name || `Static Files for ${Array.isArray(domains) ? domains.join(', ') : domains}`,
232
+ ...options
233
+ };
234
+ }
235
+ /**
236
+ * Create an API route configuration
237
+ * @param domains Domain(s) to match
238
+ * @param apiPath API base path (e.g., "/api")
239
+ * @param target Target host and port
240
+ * @param options Additional route options
241
+ * @returns Route configuration object
242
+ */
243
+ export function createApiRoute(domains, apiPath, target, options = {}) {
244
+ // Normalize API path
245
+ const normalizedPath = apiPath.startsWith('/') ? apiPath : `/${apiPath}`;
246
+ const pathWithWildcard = normalizedPath.endsWith('/')
247
+ ? `${normalizedPath}*`
248
+ : `${normalizedPath}/*`;
249
+ // Create route match
250
+ const match = {
251
+ ports: options.useTls
252
+ ? (options.httpsPort || 443)
253
+ : (options.httpPort || 80),
254
+ domains,
255
+ path: pathWithWildcard
256
+ };
257
+ // Create route action
258
+ const action = {
259
+ type: 'forward',
260
+ target
261
+ };
262
+ // Add TLS configuration if using HTTPS
263
+ if (options.useTls) {
264
+ action.tls = {
265
+ mode: 'terminate',
266
+ certificate: options.certificate || 'auto'
267
+ };
268
+ }
269
+ // Add CORS headers if requested
270
+ const headers = {};
271
+ if (options.addCorsHeaders) {
272
+ headers.response = {
273
+ 'Access-Control-Allow-Origin': '*',
274
+ 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
275
+ 'Access-Control-Allow-Headers': 'Content-Type, Authorization',
276
+ 'Access-Control-Max-Age': '86400'
277
+ };
278
+ }
279
+ // Create the route config
280
+ return {
281
+ match,
282
+ action,
283
+ headers: Object.keys(headers).length > 0 ? headers : undefined,
284
+ name: options.name || `API Route ${normalizedPath} for ${Array.isArray(domains) ? domains.join(', ') : domains}`,
285
+ priority: options.priority || 100, // Higher priority for specific path matches
286
+ ...options
287
+ };
288
+ }
289
+ /**
290
+ * Create a WebSocket route configuration
291
+ * @param domains Domain(s) to match
292
+ * @param wsPath WebSocket path (e.g., "/ws")
293
+ * @param target Target WebSocket server host and port
294
+ * @param options Additional route options
295
+ * @returns Route configuration object
296
+ */
297
+ export function createWebSocketRoute(domains, wsPath, target, options = {}) {
298
+ // Normalize WebSocket path
299
+ const normalizedPath = wsPath.startsWith('/') ? wsPath : `/${wsPath}`;
300
+ // Create route match
301
+ const match = {
302
+ ports: options.useTls
303
+ ? (options.httpsPort || 443)
304
+ : (options.httpPort || 80),
305
+ domains,
306
+ path: normalizedPath
307
+ };
308
+ // Create route action
309
+ const action = {
310
+ type: 'forward',
311
+ target,
312
+ websocket: {
313
+ enabled: true,
314
+ pingInterval: options.pingInterval || 30000, // 30 seconds
315
+ pingTimeout: options.pingTimeout || 5000 // 5 seconds
316
+ }
317
+ };
318
+ // Add TLS configuration if using HTTPS
319
+ if (options.useTls) {
320
+ action.tls = {
321
+ mode: 'terminate',
322
+ certificate: options.certificate || 'auto'
323
+ };
324
+ }
325
+ // Create the route config
326
+ return {
327
+ match,
328
+ action,
329
+ name: options.name || `WebSocket Route ${normalizedPath} for ${Array.isArray(domains) ? domains.join(', ') : domains}`,
330
+ priority: options.priority || 100, // Higher priority for WebSocket routes
331
+ ...options
332
+ };
333
+ }
334
+ /**
335
+ * Create a helper function that applies a port offset
336
+ * @param offset The offset to apply to the matched port
337
+ * @returns A function that adds the offset to the matched port
338
+ */
339
+ export function createPortOffset(offset) {
340
+ return (context) => context.port + offset;
341
+ }
342
+ /**
343
+ * Create a port mapping route with context-based port function
344
+ * @param options Port mapping route options
345
+ * @returns Route configuration object
346
+ */
347
+ export function createPortMappingRoute(options) {
348
+ // Create route match
349
+ const match = {
350
+ ports: options.sourcePortRange,
351
+ domains: options.domains
352
+ };
353
+ // Create route action
354
+ const action = {
355
+ type: 'forward',
356
+ target: {
357
+ host: options.targetHost,
358
+ port: options.portMapper
359
+ }
360
+ };
361
+ // Create the route config
362
+ return {
363
+ match,
364
+ action,
365
+ name: options.name || `Port Mapping Route for ${options.domains || 'all domains'}`,
366
+ priority: options.priority,
367
+ ...options
368
+ };
369
+ }
370
+ /**
371
+ * Create a simple offset port mapping route
372
+ * @param options Offset port mapping route options
373
+ * @returns Route configuration object
374
+ */
375
+ export function createOffsetPortMappingRoute(options) {
376
+ return createPortMappingRoute({
377
+ sourcePortRange: options.ports,
378
+ targetHost: options.targetHost,
379
+ portMapper: (context) => context.port + options.offset,
380
+ name: options.name || `Offset Mapping (${options.offset > 0 ? '+' : ''}${options.offset}) for ${options.domains || 'all domains'}`,
381
+ domains: options.domains,
382
+ priority: options.priority,
383
+ ...options
384
+ });
385
+ }
386
+ /**
387
+ * Create a dynamic route with context-based host and port mapping
388
+ * @param options Dynamic route options
389
+ * @returns Route configuration object
390
+ */
391
+ export function createDynamicRoute(options) {
392
+ // Create route match
393
+ const match = {
394
+ ports: options.ports,
395
+ domains: options.domains,
396
+ path: options.path,
397
+ clientIp: options.clientIp
398
+ };
399
+ // Create route action
400
+ const action = {
401
+ type: 'forward',
402
+ target: {
403
+ host: options.targetHost,
404
+ port: options.portMapper
405
+ }
406
+ };
407
+ // Create the route config
408
+ return {
409
+ match,
410
+ action,
411
+ name: options.name || `Dynamic Route for ${options.domains || 'all domains'}`,
412
+ priority: options.priority,
413
+ ...options
414
+ };
415
+ }
416
+ /**
417
+ * Create a smart load balancer with dynamic domain-based backend selection
418
+ * @param options Smart load balancer options
419
+ * @returns Route configuration object
420
+ */
421
+ export function createSmartLoadBalancer(options) {
422
+ // Extract all domain keys to create the match criteria
423
+ const domains = Object.keys(options.domainTargets);
424
+ // Create the smart host selector function
425
+ const hostSelector = (context) => {
426
+ const domain = context.domain || '';
427
+ return options.domainTargets[domain] || options.defaultTarget || 'localhost';
428
+ };
429
+ // Create route match
430
+ const match = {
431
+ ports: options.ports,
432
+ domains
433
+ };
434
+ // Create route action
435
+ const action = {
436
+ type: 'forward',
437
+ target: {
438
+ host: hostSelector,
439
+ port: options.portMapper
440
+ }
441
+ };
442
+ // Create the route config
443
+ return {
444
+ match,
445
+ action,
446
+ name: options.name || `Smart Load Balancer for ${domains.join(', ')}`,
447
+ priority: options.priority,
448
+ ...options
449
+ };
450
+ }
451
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL3Byb3hpZXMvc21hcnQtcHJveHkvdXRpbHMvcm91dGUtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBSUg7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsT0FBMEIsRUFDMUIsTUFBaUQsRUFDakQsVUFBaUMsRUFBRTtJQUVuQyxxQkFBcUI7SUFDckIsTUFBTSxLQUFLLEdBQWdCO1FBQ3pCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2pDLE9BQU87S0FDUixDQUFDO0lBRUYsc0JBQXNCO0lBQ3RCLE1BQU0sTUFBTSxHQUFpQjtRQUMzQixJQUFJLEVBQUUsU0FBUztRQUNmLE1BQU07S0FDUCxDQUFDO0lBRUYsMEJBQTBCO0lBQzFCLE9BQU87UUFDTCxLQUFLO1FBQ0wsTUFBTTtRQUNOLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLGtCQUFrQixLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUU7UUFDL0YsR0FBRyxPQUFPO0tBQ1gsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQ3ZDLE9BQTBCLEVBQzFCLE1BQWlELEVBQ2pELFVBT0ksRUFBRTtJQUVOLHFCQUFxQjtJQUNyQixNQUFNLEtBQUssR0FBZ0I7UUFDekIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxTQUFTLElBQUksR0FBRztRQUMvQixPQUFPO0tBQ1IsQ0FBQztJQUVGLHNCQUFzQjtJQUN0QixNQUFNLE1BQU0sR0FBaUI7UUFDM0IsSUFBSSxFQUFFLFNBQVM7UUFDZixNQUFNO1FBQ04s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
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Route Migration Utilities
3
+ *
4
+ * This file provides utility functions for migrating from legacy domain-based
5
+ * configuration to the new route-based configuration system. These functions
6
+ * are temporary and will be removed after the migration is complete.
7
+ */
8
+ import type { TForwardingType } from '../../../forwarding/config/forwarding-types.js';
9
+ import type { IRouteConfig } from '../models/route-types.js';
10
+ /**
11
+ * Legacy domain config interface (for migration only)
12
+ * @deprecated This interface will be removed in a future version
13
+ */
14
+ export interface ILegacyDomainConfig {
15
+ domains: string[];
16
+ forwarding: {
17
+ type: TForwardingType;
18
+ target: {
19
+ host: string | string[];
20
+ port: number;
21
+ };
22
+ [key: string]: any;
23
+ };
24
+ }
25
+ /**
26
+ * Convert a legacy domain config to a route-based config
27
+ * @param domainConfig Legacy domain configuration
28
+ * @param additionalOptions Additional options to add to the route
29
+ * @returns Route configuration
30
+ * @deprecated This function will be removed in a future version
31
+ */
32
+ export declare function domainConfigToRouteConfig(domainConfig: ILegacyDomainConfig, additionalOptions?: Partial<IRouteConfig>): IRouteConfig;
33
+ /**
34
+ * Convert an array of legacy domain configs to route configurations
35
+ * @param domainConfigs Array of legacy domain configurations
36
+ * @returns Array of route configurations
37
+ * @deprecated This function will be removed in a future version
38
+ */
39
+ export declare function domainConfigsToRouteConfigs(domainConfigs: ILegacyDomainConfig[]): IRouteConfig[];
40
+ /**
41
+ * Extract domains from a route configuration
42
+ * @param route Route configuration
43
+ * @returns Array of domains
44
+ */
45
+ export declare function extractDomainsFromRoute(route: IRouteConfig): string[];
46
+ /**
47
+ * Extract domains from an array of route configurations
48
+ * @param routes Array of route configurations
49
+ * @returns Array of unique domains
50
+ */
51
+ export declare function extractDomainsFromRoutes(routes: IRouteConfig[]): string[];
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Route Migration Utilities
3
+ *
4
+ * This file provides utility functions for migrating from legacy domain-based
5
+ * configuration to the new route-based configuration system. These functions
6
+ * are temporary and will be removed after the migration is complete.
7
+ */
8
+ /**
9
+ * Convert a legacy domain config to a route-based config
10
+ * @param domainConfig Legacy domain configuration
11
+ * @param additionalOptions Additional options to add to the route
12
+ * @returns Route configuration
13
+ * @deprecated This function will be removed in a future version
14
+ */
15
+ export function domainConfigToRouteConfig(domainConfig, additionalOptions = {}) {
16
+ // Default port based on forwarding type
17
+ let defaultPort = 80;
18
+ let tlsMode;
19
+ switch (domainConfig.forwarding.type) {
20
+ case 'http-only':
21
+ defaultPort = 80;
22
+ break;
23
+ case 'https-passthrough':
24
+ defaultPort = 443;
25
+ tlsMode = 'passthrough';
26
+ break;
27
+ case 'https-terminate-to-http':
28
+ defaultPort = 443;
29
+ tlsMode = 'terminate';
30
+ break;
31
+ case 'https-terminate-to-https':
32
+ defaultPort = 443;
33
+ tlsMode = 'terminate-and-reencrypt';
34
+ break;
35
+ }
36
+ // Create route match criteria
37
+ const match = {
38
+ ports: additionalOptions.match?.ports || defaultPort,
39
+ domains: domainConfig.domains
40
+ };
41
+ // Create route target
42
+ const target = {
43
+ host: domainConfig.forwarding.target.host,
44
+ port: domainConfig.forwarding.target.port
45
+ };
46
+ // Create route action
47
+ const action = {
48
+ type: 'forward',
49
+ target
50
+ };
51
+ // Add TLS configuration if needed
52
+ if (tlsMode) {
53
+ action.tls = {
54
+ mode: tlsMode,
55
+ certificate: 'auto'
56
+ };
57
+ // If the legacy config has custom certificates, use them
58
+ if (domainConfig.forwarding.https?.customCert) {
59
+ action.tls.certificate = {
60
+ key: domainConfig.forwarding.https.customCert.key,
61
+ cert: domainConfig.forwarding.https.customCert.cert
62
+ };
63
+ }
64
+ }
65
+ // Add security options if present
66
+ if (domainConfig.forwarding.security) {
67
+ action.security = domainConfig.forwarding.security;
68
+ }
69
+ // Create the route config
70
+ const routeConfig = {
71
+ match,
72
+ action,
73
+ // Include a name based on domains if not provided
74
+ name: additionalOptions.name || `Legacy route for ${domainConfig.domains.join(', ')}`,
75
+ // Include a note that this was converted from a legacy config
76
+ description: additionalOptions.description || 'Converted from legacy domain configuration'
77
+ };
78
+ // Add optional properties if provided
79
+ if (additionalOptions.priority !== undefined) {
80
+ routeConfig.priority = additionalOptions.priority;
81
+ }
82
+ if (additionalOptions.tags) {
83
+ routeConfig.tags = additionalOptions.tags;
84
+ }
85
+ return routeConfig;
86
+ }
87
+ /**
88
+ * Convert an array of legacy domain configs to route configurations
89
+ * @param domainConfigs Array of legacy domain configurations
90
+ * @returns Array of route configurations
91
+ * @deprecated This function will be removed in a future version
92
+ */
93
+ export function domainConfigsToRouteConfigs(domainConfigs) {
94
+ return domainConfigs.map(config => domainConfigToRouteConfig(config));
95
+ }
96
+ /**
97
+ * Extract domains from a route configuration
98
+ * @param route Route configuration
99
+ * @returns Array of domains
100
+ */
101
+ export function extractDomainsFromRoute(route) {
102
+ if (!route.match.domains) {
103
+ return [];
104
+ }
105
+ return Array.isArray(route.match.domains)
106
+ ? route.match.domains
107
+ : [route.match.domains];
108
+ }
109
+ /**
110
+ * Extract domains from an array of route configurations
111
+ * @param routes Array of route configurations
112
+ * @returns Array of unique domains
113
+ */
114
+ export function extractDomainsFromRoutes(routes) {
115
+ const domains = new Set();
116
+ for (const route of routes) {
117
+ const routeDomains = extractDomainsFromRoute(route);
118
+ for (const domain of routeDomains) {
119
+ domains.add(domain);
120
+ }
121
+ }
122
+ return Array.from(domains);
123
+ }
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtbWlncmF0aW9uLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvcHJveGllcy9zbWFydC1wcm94eS91dGlscy9yb3V0ZS1taWdyYXRpb24tdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBcUJIOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FDdkMsWUFBaUMsRUFDakMsb0JBQTJDLEVBQUU7SUFFN0Msd0NBQXdDO0lBQ3hDLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUNyQixJQUFJLE9BQTRFLENBQUM7SUFFakYsUUFBUSxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JDLEtBQUssV0FBVztZQUNkLFdBQVcsR0FBRyxFQUFFLENBQUM7WUFDakIsTUFBTTtRQUNSLEtBQUssbUJBQW1CO1lBQ3RCLFdBQVcsR0FBRyxHQUFHLENBQUM7WUFDbEIsT0FBTyxHQUFHLGFBQWEsQ0FBQztZQUN4QixNQUFNO1FBQ1IsS0FBSyx5QkFBeUI7WUFDNUIsV0FBVyxHQUFHLEdBQUcsQ0FBQztZQUNsQixPQUFPLEdBQUcsV0FBVyxDQUFDO1lBQ3RCLE1BQU07UUFDUixLQUFLLDBCQUEwQjtZQUM3QixXQUFXLEdBQUcsR0FBRyxDQUFDO1lBQ2xCLE9BQU8sR0FBRyx5QkFBeUIsQ0FBQztZQUNwQyxNQUFNO0lBQ1YsQ0FBQztJQUVELDhCQUE4QjtJQUM5QixNQUFNLEtBQUssR0FBZ0I7UUFDekIsS0FBSyxFQUFFLGlCQUFpQixDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksV0FBVztRQUNwRCxPQUFPLEVBQUUsWUFBWSxDQUFDLE9BQU87S0FDOUIsQ0FBQztJQUVGLHNCQUFzQjtJQUN0QixNQUFNLE1BQU0sR0FBaUI7UUFDM0IsSUFBSSxFQUFFLFlBQVksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUk7UUFDekMsSUFBSSxFQUFFLFlBQVks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