@push.rocks/smartproxy 26.2.4 → 27.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 (64) hide show
  1. package/changelog.md +16 -0
  2. package/dist_rust/rustproxy_linux_amd64 +0 -0
  3. package/dist_rust/rustproxy_linux_arm64 +0 -0
  4. package/dist_ts/00_commitinfo_data.js +1 -1
  5. package/dist_ts/core/models/wrapped-socket.js +4 -1
  6. package/dist_ts/core/routing/route-manager.js +9 -7
  7. package/dist_ts/plugins.d.ts +2 -1
  8. package/dist_ts/plugins.js +3 -2
  9. package/dist_ts/proxies/smart-proxy/datagram-handler-server.js +7 -5
  10. package/dist_ts/proxies/smart-proxy/route-preprocessor.js +6 -8
  11. package/dist_ts/proxies/smart-proxy/rust-metrics-adapter.js +186 -184
  12. package/dist_ts/proxies/smart-proxy/rust-proxy-bridge.d.ts +0 -1
  13. package/dist_ts/proxies/smart-proxy/rust-proxy-bridge.js +2 -4
  14. package/dist_ts/proxies/smart-proxy/smart-proxy.d.ts +9 -4
  15. package/dist_ts/proxies/smart-proxy/smart-proxy.js +70 -10
  16. package/dist_ts/proxies/smart-proxy/socket-handler-server.js +5 -3
  17. package/dist_ts/proxies/smart-proxy/utils/concurrency-semaphore.js +4 -3
  18. package/dist_ts/proxies/smart-proxy/utils/index.d.ts +2 -3
  19. package/dist_ts/proxies/smart-proxy/utils/index.js +4 -6
  20. package/dist_ts/proxies/smart-proxy/utils/mutex.js +3 -5
  21. package/dist_ts/proxies/smart-proxy/utils/route-validator.js +7 -7
  22. package/dist_ts/proxies/smart-proxy/utils/{route-helpers/socket-handlers.d.ts → socket-handlers.d.ts} +2 -10
  23. package/dist_ts/proxies/smart-proxy/utils/socket-handlers.js +268 -0
  24. package/dist_ts/routing/models/http-types.js +5 -1
  25. package/package.json +2 -1
  26. package/readme.hints.md +42 -20
  27. package/readme.md +165 -163
  28. package/ts/00_commitinfo_data.ts +1 -1
  29. package/ts/plugins.ts +2 -0
  30. package/ts/proxies/smart-proxy/rust-proxy-bridge.ts +0 -5
  31. package/ts/proxies/smart-proxy/smart-proxy.ts +67 -5
  32. package/ts/proxies/smart-proxy/utils/index.ts +3 -11
  33. package/ts/proxies/smart-proxy/utils/{route-helpers/socket-handlers.ts → socket-handlers.ts} +3 -31
  34. package/dist_ts/proxies/smart-proxy/utils/route-helpers/api-helpers.d.ts +0 -49
  35. package/dist_ts/proxies/smart-proxy/utils/route-helpers/api-helpers.js +0 -108
  36. package/dist_ts/proxies/smart-proxy/utils/route-helpers/dynamic-helpers.d.ts +0 -57
  37. package/dist_ts/proxies/smart-proxy/utils/route-helpers/dynamic-helpers.js +0 -90
  38. package/dist_ts/proxies/smart-proxy/utils/route-helpers/http-helpers.d.ts +0 -17
  39. package/dist_ts/proxies/smart-proxy/utils/route-helpers/http-helpers.js +0 -32
  40. package/dist_ts/proxies/smart-proxy/utils/route-helpers/https-helpers.d.ts +0 -68
  41. package/dist_ts/proxies/smart-proxy/utils/route-helpers/https-helpers.js +0 -117
  42. package/dist_ts/proxies/smart-proxy/utils/route-helpers/index.d.ts +0 -17
  43. package/dist_ts/proxies/smart-proxy/utils/route-helpers/index.js +0 -27
  44. package/dist_ts/proxies/smart-proxy/utils/route-helpers/load-balancer-helpers.d.ts +0 -63
  45. package/dist_ts/proxies/smart-proxy/utils/route-helpers/load-balancer-helpers.js +0 -105
  46. package/dist_ts/proxies/smart-proxy/utils/route-helpers/nftables-helpers.d.ts +0 -83
  47. package/dist_ts/proxies/smart-proxy/utils/route-helpers/nftables-helpers.js +0 -126
  48. package/dist_ts/proxies/smart-proxy/utils/route-helpers/security-helpers.d.ts +0 -47
  49. package/dist_ts/proxies/smart-proxy/utils/route-helpers/security-helpers.js +0 -66
  50. package/dist_ts/proxies/smart-proxy/utils/route-helpers/socket-handlers.js +0 -286
  51. package/dist_ts/proxies/smart-proxy/utils/route-helpers/websocket-helpers.d.ts +0 -46
  52. package/dist_ts/proxies/smart-proxy/utils/route-helpers/websocket-helpers.js +0 -67
  53. package/dist_ts/proxies/smart-proxy/utils/route-helpers.d.ts +0 -9
  54. package/dist_ts/proxies/smart-proxy/utils/route-helpers.js +0 -11
  55. package/ts/proxies/smart-proxy/utils/route-helpers/api-helpers.ts +0 -144
  56. package/ts/proxies/smart-proxy/utils/route-helpers/dynamic-helpers.ts +0 -125
  57. package/ts/proxies/smart-proxy/utils/route-helpers/http-helpers.ts +0 -40
  58. package/ts/proxies/smart-proxy/utils/route-helpers/https-helpers.ts +0 -163
  59. package/ts/proxies/smart-proxy/utils/route-helpers/index.ts +0 -62
  60. package/ts/proxies/smart-proxy/utils/route-helpers/load-balancer-helpers.ts +0 -154
  61. package/ts/proxies/smart-proxy/utils/route-helpers/nftables-helpers.ts +0 -202
  62. package/ts/proxies/smart-proxy/utils/route-helpers/security-helpers.ts +0 -96
  63. package/ts/proxies/smart-proxy/utils/route-helpers/websocket-helpers.ts +0 -98
  64. package/ts/proxies/smart-proxy/utils/route-helpers.ts +0 -11
@@ -1,27 +0,0 @@
1
- /**
2
- * Route Helper Functions
3
- *
4
- * This module 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 barrel file re-exports all helper functions for backwards compatibility.
8
- */
9
- // HTTP helpers
10
- export { createHttpRoute } from './http-helpers.js';
11
- // HTTPS helpers
12
- export { createHttpsTerminateRoute, createHttpToHttpsRedirect, createHttpsPassthroughRoute, createCompleteHttpsServer } from './https-helpers.js';
13
- // WebSocket helpers
14
- export { createWebSocketRoute } from './websocket-helpers.js';
15
- // Load balancer helpers
16
- export { createLoadBalancerRoute, createSmartLoadBalancer } from './load-balancer-helpers.js';
17
- // NFTables helpers
18
- export { createNfTablesRoute, createNfTablesTerminateRoute, createCompleteNfTablesHttpsServer } from './nftables-helpers.js';
19
- // Dynamic routing helpers
20
- export { createPortOffset, createPortMappingRoute, createOffsetPortMappingRoute, createDynamicRoute } from './dynamic-helpers.js';
21
- // API helpers
22
- export { createApiRoute, createApiGatewayRoute } from './api-helpers.js';
23
- // Security helpers
24
- export { addRateLimiting, addBasicAuth, addJwtAuth } from './security-helpers.js';
25
- // Socket handlers
26
- export { SocketHandlers, createSocketHandlerRoute } from './socket-handlers.js';
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90cy9wcm94aWVzL3NtYXJ0LXByb3h5L3V0aWxzL3JvdXRlLWhlbHBlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILGVBQWU7QUFDZixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFcEQsZ0JBQWdCO0FBQ2hCLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIseUJBQXlCLEVBQ3pCLDJCQUEyQixFQUMzQix5QkFBeUIsRUFDMUIsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QixvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFOUQsd0JBQXdCO0FBQ3hCLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsdUJBQXVCLEVBQ3hCLE1BQU0sNEJBQTRCLENBQUM7QUFFcEMsbUJBQW1CO0FBQ25CLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsNEJBQTRCLEVBQzVCLGlDQUFpQyxFQUNsQyxNQUFNLHVCQUF1QixDQUFDO0FBRS9CLDBCQUEwQjtBQUMxQixPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHNCQUFzQixFQUN0Qiw0QkFBNEIsRUFDNUIsa0JBQWtCLEVBQ25CLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsY0FBYztBQUNkLE9BQU8sRUFDTCxjQUFjLEVBQ2QscUJBQXFCLEVBQ3RCLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIsbUJBQW1CO0FBQ25CLE9BQU8sRUFDTCxlQUFlLEVBQ2YsWUFBWSxFQUNaLFVBQVUsRUFDWCxNQUFNLHVCQUF1QixDQUFDO0FBRS9CLGtCQUFrQjtBQUNsQixPQUFPLEVBQ0wsY0FBYyxFQUNkLHdCQUF3QixFQUN6QixNQUFNLHNCQUFzQixDQUFDIn0=
@@ -1,63 +0,0 @@
1
- /**
2
- * Load Balancer Route Helper Functions
3
- *
4
- * This module provides utility functions for creating load balancer route configurations.
5
- */
6
- import type { IRouteConfig, TPortRange, IRouteContext } from '../../models/route-types.js';
7
- /**
8
- * Create a load balancer route (round-robin between multiple backend hosts)
9
- * @param domains Domain(s) to match
10
- * @param backendsOrHosts Array of backend servers OR array of host strings (legacy)
11
- * @param portOrOptions Port number (legacy) OR options object
12
- * @param options Additional route options (legacy)
13
- * @returns Route configuration object
14
- */
15
- export declare function createLoadBalancerRoute(domains: string | string[], backendsOrHosts: Array<{
16
- host: string;
17
- port: number;
18
- }> | string[], portOrOptions?: number | {
19
- tls?: {
20
- mode: 'passthrough' | 'terminate' | 'terminate-and-reencrypt';
21
- certificate?: 'auto' | {
22
- key: string;
23
- cert: string;
24
- };
25
- };
26
- useTls?: boolean;
27
- certificate?: 'auto' | {
28
- key: string;
29
- cert: string;
30
- };
31
- algorithm?: 'round-robin' | 'least-connections' | 'ip-hash';
32
- healthCheck?: {
33
- path: string;
34
- interval: number;
35
- timeout: number;
36
- unhealthyThreshold: number;
37
- healthyThreshold: number;
38
- };
39
- [key: string]: any;
40
- }, options?: {
41
- tls?: {
42
- mode: 'passthrough' | 'terminate' | 'terminate-and-reencrypt';
43
- certificate?: 'auto' | {
44
- key: string;
45
- cert: string;
46
- };
47
- };
48
- [key: string]: any;
49
- }): IRouteConfig;
50
- /**
51
- * Create a smart load balancer with dynamic domain-based backend selection
52
- * @param options Smart load balancer options
53
- * @returns Route configuration object
54
- */
55
- export declare function createSmartLoadBalancer(options: {
56
- ports: TPortRange;
57
- domainTargets: Record<string, string | string[]>;
58
- portMapper: (context: IRouteContext) => number;
59
- name?: string;
60
- defaultTarget?: string | string[];
61
- priority?: number;
62
- [key: string]: any;
63
- }): IRouteConfig;
@@ -1,105 +0,0 @@
1
- /**
2
- * Load Balancer Route Helper Functions
3
- *
4
- * This module provides utility functions for creating load balancer route configurations.
5
- */
6
- /**
7
- * Create a load balancer route (round-robin between multiple backend hosts)
8
- * @param domains Domain(s) to match
9
- * @param backendsOrHosts Array of backend servers OR array of host strings (legacy)
10
- * @param portOrOptions Port number (legacy) OR options object
11
- * @param options Additional route options (legacy)
12
- * @returns Route configuration object
13
- */
14
- export function createLoadBalancerRoute(domains, backendsOrHosts, portOrOptions, options) {
15
- // Handle legacy signature: (domains, hosts[], port, options)
16
- let backends;
17
- let finalOptions;
18
- if (Array.isArray(backendsOrHosts) && backendsOrHosts.length > 0 && typeof backendsOrHosts[0] === 'string') {
19
- // Legacy signature
20
- const hosts = backendsOrHosts;
21
- const port = portOrOptions;
22
- backends = hosts.map(host => ({ host, port }));
23
- finalOptions = options || {};
24
- }
25
- else {
26
- // New signature
27
- backends = backendsOrHosts;
28
- finalOptions = portOrOptions || {};
29
- }
30
- // Extract hosts and ensure all backends use the same port
31
- const port = backends[0].port;
32
- const hosts = backends.map(backend => backend.host);
33
- // Create route match
34
- const match = {
35
- ports: finalOptions.match?.ports || (finalOptions.tls || finalOptions.useTls ? 443 : 80),
36
- domains
37
- };
38
- // Create route target
39
- const target = {
40
- host: hosts,
41
- port
42
- };
43
- // Create route action
44
- const action = {
45
- type: 'forward',
46
- targets: [target]
47
- };
48
- // Add TLS configuration if provided
49
- if (finalOptions.tls || finalOptions.useTls) {
50
- action.tls = {
51
- mode: finalOptions.tls?.mode || 'terminate',
52
- certificate: finalOptions.tls?.certificate || finalOptions.certificate || 'auto'
53
- };
54
- }
55
- // Add load balancing options
56
- if (finalOptions.algorithm || finalOptions.healthCheck) {
57
- action.loadBalancing = {
58
- algorithm: finalOptions.algorithm || 'round-robin',
59
- healthCheck: finalOptions.healthCheck
60
- };
61
- }
62
- // Create the route config
63
- return {
64
- match,
65
- action,
66
- name: finalOptions.name || `Load Balancer for ${Array.isArray(domains) ? domains.join(', ') : domains}`,
67
- ...finalOptions
68
- };
69
- }
70
- /**
71
- * Create a smart load balancer with dynamic domain-based backend selection
72
- * @param options Smart load balancer options
73
- * @returns Route configuration object
74
- */
75
- export function createSmartLoadBalancer(options) {
76
- // Extract all domain keys to create the match criteria
77
- const domains = Object.keys(options.domainTargets);
78
- // Create the smart host selector function
79
- const hostSelector = (context) => {
80
- const domain = context.domain || '';
81
- return options.domainTargets[domain] || options.defaultTarget || 'localhost';
82
- };
83
- // Create route match
84
- const match = {
85
- ports: options.ports,
86
- domains
87
- };
88
- // Create route action
89
- const action = {
90
- type: 'forward',
91
- targets: [{
92
- host: hostSelector,
93
- port: options.portMapper
94
- }]
95
- };
96
- // Create the route config
97
- return {
98
- match,
99
- action,
100
- name: options.name || `Smart Load Balancer for ${domains.join(', ')}`,
101
- priority: options.priority,
102
- ...options
103
- };
104
- }
105
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC1iYWxhbmNlci1oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdHMvcHJveGllcy9zbWFydC1wcm94eS91dGlscy9yb3V0ZS1oZWxwZXJzL2xvYWQtYmFsYW5jZXItaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBSUg7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FDckMsT0FBMEIsRUFDMUIsZUFBaUUsRUFDakUsYUFnQkMsRUFDRCxPQU1DO0lBRUQsNkRBQTZEO0lBQzdELElBQUksUUFBK0MsQ0FBQztJQUNwRCxJQUFJLFlBQWlCLENBQUM7SUFFdEIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE9BQU8sZUFBZSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzNHLG1CQUFtQjtRQUNuQixNQUFNLEtBQUssR0FBRyxlQUEyQixDQUFDO1FBQzFDLE1BQU0sSUFBSSxHQUFHLGFBQXVCLENBQUM7UUFDckMsUUFBUSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvQyxZQUFZLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUMvQixDQUFDO1NBQU0sQ0FBQztRQUNOLGdCQUFnQjtRQUNoQixRQUFRLEdBQUcsZUFBd0QsQ0FBQztRQUNwRSxZQUFZLEdBQUksYUFBcUIsSUFBSSxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUVELDBEQUEwRDtJQUMxRCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzlCLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVB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
@@ -1,83 +0,0 @@
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 type { IRouteConfig, TPortRange } from '../../models/route-types.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 declare function createNfTablesRoute(nameOrDomains: string | string[], target: {
16
- host: string;
17
- port: number | 'preserve';
18
- }, options?: {
19
- ports?: TPortRange;
20
- protocol?: 'tcp' | 'udp' | 'all';
21
- preserveSourceIP?: boolean;
22
- ipAllowList?: string[];
23
- ipBlockList?: string[];
24
- maxRate?: string;
25
- priority?: number;
26
- useTls?: boolean;
27
- tableName?: string;
28
- useIPSets?: boolean;
29
- useAdvancedNAT?: boolean;
30
- }): IRouteConfig;
31
- /**
32
- * Create an NFTables-based TLS termination route
33
- * @param nameOrDomains Name or domain(s) to match
34
- * @param target Target host and port
35
- * @param options Additional route options
36
- * @returns Route configuration object
37
- */
38
- export declare function createNfTablesTerminateRoute(nameOrDomains: string | string[], target: {
39
- host: string;
40
- port: number | 'preserve';
41
- }, options?: {
42
- ports?: TPortRange;
43
- protocol?: 'tcp' | 'udp' | 'all';
44
- preserveSourceIP?: boolean;
45
- ipAllowList?: string[];
46
- ipBlockList?: string[];
47
- maxRate?: string;
48
- priority?: number;
49
- tableName?: string;
50
- useIPSets?: boolean;
51
- useAdvancedNAT?: boolean;
52
- certificate?: 'auto' | {
53
- key: string;
54
- cert: string;
55
- };
56
- }): IRouteConfig;
57
- /**
58
- * Create a complete NFTables-based HTTPS setup with HTTP redirect
59
- * @param nameOrDomains Name or domain(s) to match
60
- * @param target Target host and port
61
- * @param options Additional route options
62
- * @returns Array of two route configurations (HTTPS and HTTP redirect)
63
- */
64
- export declare function createCompleteNfTablesHttpsServer(nameOrDomains: string | string[], target: {
65
- host: string;
66
- port: number | 'preserve';
67
- }, options?: {
68
- httpPort?: TPortRange;
69
- httpsPort?: TPortRange;
70
- protocol?: 'tcp' | 'udp' | 'all';
71
- preserveSourceIP?: boolean;
72
- ipAllowList?: string[];
73
- ipBlockList?: string[];
74
- maxRate?: string;
75
- priority?: number;
76
- tableName?: string;
77
- useIPSets?: boolean;
78
- useAdvancedNAT?: boolean;
79
- certificate?: 'auto' | {
80
- key: string;
81
- cert: string;
82
- };
83
- }): IRouteConfig[];
@@ -1,126 +0,0 @@
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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
@@ -1,47 +0,0 @@
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;
@@ -1,66 +0,0 @@
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