@push.rocks/smartproxy 22.6.0 → 23.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/changelog.md +18 -0
- package/dist_rust/{rustproxy → rustproxy_linux_amd64} +0 -0
- package/dist_rust/rustproxy_linux_arm64 +0 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/index.d.ts +0 -1
- package/dist_ts/index.js +1 -3
- package/dist_ts/plugins.d.ts +2 -1
- package/dist_ts/plugins.js +3 -2
- package/dist_ts/proxies/index.d.ts +0 -1
- package/dist_ts/proxies/index.js +1 -3
- package/dist_ts/proxies/smart-proxy/models/route-types.js +1 -1
- package/dist_ts/proxies/smart-proxy/rust-proxy-bridge.d.ts +9 -21
- package/dist_ts/proxies/smart-proxy/rust-proxy-bridge.js +83 -212
- package/dist_ts/proxies/smart-proxy/smart-proxy.js +2 -3
- package/npmextra.json +3 -0
- package/package.json +13 -11
- package/readme.md +35 -31
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/index.ts +0 -3
- package/ts/plugins.ts +2 -0
- package/ts/proxies/index.ts +0 -3
- package/ts/proxies/smart-proxy/models/route-types.ts +0 -2
- package/ts/proxies/smart-proxy/rust-proxy-bridge.ts +102 -233
- package/ts/proxies/smart-proxy/smart-proxy.ts +1 -2
- package/dist_ts/common/eventUtils.d.ts +0 -14
- package/dist_ts/common/eventUtils.js +0 -20
- package/dist_ts/common/types.d.ts +0 -82
- package/dist_ts/common/types.js +0 -15
- package/dist_ts/core/utils/event-system.d.ts +0 -200
- package/dist_ts/core/utils/event-system.js +0 -224
- package/dist_ts/core/utils/event-utils.d.ts +0 -15
- package/dist_ts/core/utils/event-utils.js +0 -11
- package/dist_ts/core/utils/route-manager.d.ts +0 -88
- package/dist_ts/core/utils/route-manager.js +0 -342
- package/dist_ts/core/utils/route-utils.d.ts +0 -28
- package/dist_ts/core/utils/route-utils.js +0 -67
- package/dist_ts/detection/detectors/http-detector-v2.d.ts +0 -33
- package/dist_ts/detection/detectors/http-detector-v2.js +0 -87
- package/dist_ts/detection/detectors/tls-detector-v2.d.ts +0 -33
- package/dist_ts/detection/detectors/tls-detector-v2.js +0 -80
- package/dist_ts/detection/protocol-detector-v2.d.ts +0 -46
- package/dist_ts/detection/protocol-detector-v2.js +0 -116
- package/dist_ts/forwarding/config/forwarding-types.d.ts +0 -42
- package/dist_ts/forwarding/config/forwarding-types.js +0 -18
- package/dist_ts/forwarding/config/index.d.ts +0 -9
- package/dist_ts/forwarding/config/index.js +0 -10
- package/dist_ts/forwarding/factory/forwarding-factory.d.ts +0 -25
- package/dist_ts/forwarding/factory/forwarding-factory.js +0 -172
- package/dist_ts/forwarding/factory/index.d.ts +0 -4
- package/dist_ts/forwarding/factory/index.js +0 -5
- package/dist_ts/forwarding/handlers/base-handler.d.ts +0 -62
- package/dist_ts/forwarding/handlers/base-handler.js +0 -121
- package/dist_ts/forwarding/handlers/http-handler.d.ts +0 -30
- package/dist_ts/forwarding/handlers/http-handler.js +0 -143
- package/dist_ts/forwarding/handlers/https-passthrough-handler.d.ts +0 -29
- package/dist_ts/forwarding/handlers/https-passthrough-handler.js +0 -156
- package/dist_ts/forwarding/handlers/https-terminate-to-http-handler.d.ts +0 -36
- package/dist_ts/forwarding/handlers/https-terminate-to-http-handler.js +0 -276
- package/dist_ts/forwarding/handlers/https-terminate-to-https-handler.d.ts +0 -35
- package/dist_ts/forwarding/handlers/https-terminate-to-https-handler.js +0 -261
- package/dist_ts/forwarding/handlers/index.d.ts +0 -8
- package/dist_ts/forwarding/handlers/index.js +0 -9
- package/dist_ts/forwarding/index.d.ts +0 -13
- package/dist_ts/forwarding/index.js +0 -16
- package/dist_ts/http/index.d.ts +0 -5
- package/dist_ts/http/index.js +0 -8
- package/dist_ts/http/models/http-types.d.ts +0 -6
- package/dist_ts/http/models/http-types.js +0 -7
- package/dist_ts/http/router/index.d.ts +0 -8
- package/dist_ts/http/router/index.js +0 -7
- package/dist_ts/http/router/proxy-router.d.ts +0 -115
- package/dist_ts/http/router/proxy-router.js +0 -325
- package/dist_ts/http/router/route-router.d.ts +0 -108
- package/dist_ts/http/router/route-router.js +0 -393
- package/dist_ts/protocols/tls/constants.d.ts +0 -122
- package/dist_ts/protocols/tls/constants.js +0 -135
- package/dist_ts/protocols/tls/parser.d.ts +0 -53
- package/dist_ts/protocols/tls/parser.js +0 -294
- package/dist_ts/protocols/tls/types.d.ts +0 -65
- package/dist_ts/protocols/tls/types.js +0 -5
- package/dist_ts/proxies/http-proxy/certificate-manager.d.ts +0 -95
- package/dist_ts/proxies/http-proxy/certificate-manager.js +0 -214
- package/dist_ts/proxies/http-proxy/connection-pool.d.ts +0 -47
- package/dist_ts/proxies/http-proxy/connection-pool.js +0 -195
- package/dist_ts/proxies/http-proxy/context-creator.d.ts +0 -34
- package/dist_ts/proxies/http-proxy/context-creator.js +0 -108
- package/dist_ts/proxies/http-proxy/default-certificates.d.ts +0 -54
- package/dist_ts/proxies/http-proxy/default-certificates.js +0 -127
- package/dist_ts/proxies/http-proxy/function-cache.d.ts +0 -95
- package/dist_ts/proxies/http-proxy/function-cache.js +0 -215
- package/dist_ts/proxies/http-proxy/handlers/index.d.ts +0 -4
- package/dist_ts/proxies/http-proxy/handlers/index.js +0 -6
- package/dist_ts/proxies/http-proxy/handlers/redirect-handler.d.ts +0 -18
- package/dist_ts/proxies/http-proxy/handlers/redirect-handler.js +0 -78
- package/dist_ts/proxies/http-proxy/handlers/static-handler.d.ts +0 -19
- package/dist_ts/proxies/http-proxy/handlers/static-handler.js +0 -211
- package/dist_ts/proxies/http-proxy/http-proxy.d.ts +0 -117
- package/dist_ts/proxies/http-proxy/http-proxy.js +0 -521
- package/dist_ts/proxies/http-proxy/http-request-handler.d.ts +0 -40
- package/dist_ts/proxies/http-proxy/http-request-handler.js +0 -257
- package/dist_ts/proxies/http-proxy/http2-request-handler.d.ts +0 -24
- package/dist_ts/proxies/http-proxy/http2-request-handler.js +0 -201
- package/dist_ts/proxies/http-proxy/index.d.ts +0 -14
- package/dist_ts/proxies/http-proxy/index.js +0 -16
- package/dist_ts/proxies/http-proxy/models/http-types.d.ts +0 -117
- package/dist_ts/proxies/http-proxy/models/http-types.js +0 -92
- package/dist_ts/proxies/http-proxy/models/index.d.ts +0 -5
- package/dist_ts/proxies/http-proxy/models/index.js +0 -6
- package/dist_ts/proxies/http-proxy/models/types.d.ts +0 -75
- package/dist_ts/proxies/http-proxy/models/types.js +0 -35
- package/dist_ts/proxies/http-proxy/request-handler.d.ts +0 -97
- package/dist_ts/proxies/http-proxy/request-handler.js +0 -737
- package/dist_ts/proxies/http-proxy/security-manager.d.ts +0 -98
- package/dist_ts/proxies/http-proxy/security-manager.js +0 -341
- package/dist_ts/proxies/http-proxy/websocket-handler.d.ts +0 -50
- package/dist_ts/proxies/http-proxy/websocket-handler.js +0 -505
- package/dist_ts/proxies/nftables-proxy/index.d.ts +0 -6
- package/dist_ts/proxies/nftables-proxy/index.js +0 -7
- package/dist_ts/proxies/nftables-proxy/models/errors.d.ts +0 -15
- package/dist_ts/proxies/nftables-proxy/models/errors.js +0 -28
- package/dist_ts/proxies/nftables-proxy/models/index.d.ts +0 -5
- package/dist_ts/proxies/nftables-proxy/models/index.js +0 -6
- package/dist_ts/proxies/nftables-proxy/models/interfaces.d.ts +0 -75
- package/dist_ts/proxies/nftables-proxy/models/interfaces.js +0 -5
- package/dist_ts/proxies/nftables-proxy/nftables-proxy.d.ts +0 -124
- package/dist_ts/proxies/nftables-proxy/nftables-proxy.js +0 -1374
- package/dist_ts/proxies/nftables-proxy/utils/index.d.ts +0 -9
- package/dist_ts/proxies/nftables-proxy/utils/index.js +0 -12
- package/dist_ts/proxies/nftables-proxy/utils/nft-command-executor.d.ts +0 -66
- package/dist_ts/proxies/nftables-proxy/utils/nft-command-executor.js +0 -131
- package/dist_ts/proxies/nftables-proxy/utils/nft-port-spec-normalizer.d.ts +0 -39
- package/dist_ts/proxies/nftables-proxy/utils/nft-port-spec-normalizer.js +0 -112
- package/dist_ts/proxies/nftables-proxy/utils/nft-rule-validator.d.ts +0 -59
- package/dist_ts/proxies/nftables-proxy/utils/nft-rule-validator.js +0 -130
- package/dist_ts/proxies/smart-proxy/acme-state-manager.d.ts +0 -42
- package/dist_ts/proxies/smart-proxy/acme-state-manager.js +0 -101
- package/dist_ts/proxies/smart-proxy/cert-store.d.ts +0 -10
- package/dist_ts/proxies/smart-proxy/cert-store.js +0 -72
- package/dist_ts/proxies/smart-proxy/certificate-manager.d.ts +0 -164
- package/dist_ts/proxies/smart-proxy/certificate-manager.js +0 -745
- package/dist_ts/proxies/smart-proxy/connection-manager.d.ts +0 -128
- package/dist_ts/proxies/smart-proxy/connection-manager.js +0 -689
- package/dist_ts/proxies/smart-proxy/http-proxy-bridge.d.ts +0 -43
- package/dist_ts/proxies/smart-proxy/http-proxy-bridge.js +0 -180
- package/dist_ts/proxies/smart-proxy/metrics-collector.d.ts +0 -98
- package/dist_ts/proxies/smart-proxy/metrics-collector.js +0 -355
- package/dist_ts/proxies/smart-proxy/nftables-manager.d.ts +0 -82
- package/dist_ts/proxies/smart-proxy/nftables-manager.js +0 -237
- package/dist_ts/proxies/smart-proxy/port-manager.d.ts +0 -117
- package/dist_ts/proxies/smart-proxy/port-manager.js +0 -318
- package/dist_ts/proxies/smart-proxy/route-connection-handler.d.ts +0 -60
- package/dist_ts/proxies/smart-proxy/route-connection-handler.js +0 -1407
- package/dist_ts/proxies/smart-proxy/route-manager.d.ts +0 -112
- package/dist_ts/proxies/smart-proxy/route-manager.js +0 -453
- package/dist_ts/proxies/smart-proxy/route-orchestrator.d.ts +0 -56
- package/dist_ts/proxies/smart-proxy/route-orchestrator.js +0 -204
- package/dist_ts/proxies/smart-proxy/rust-binary-locator.d.ts +0 -23
- package/dist_ts/proxies/smart-proxy/rust-binary-locator.js +0 -104
- package/dist_ts/proxies/smart-proxy/security-manager.d.ts +0 -74
- package/dist_ts/proxies/smart-proxy/security-manager.js +0 -227
- package/dist_ts/proxies/smart-proxy/throughput-tracker.d.ts +0 -36
- package/dist_ts/proxies/smart-proxy/throughput-tracker.js +0 -115
- package/dist_ts/proxies/smart-proxy/timeout-manager.d.ts +0 -48
- package/dist_ts/proxies/smart-proxy/timeout-manager.js +0 -158
- package/dist_ts/proxies/smart-proxy/tls-manager.d.ts +0 -50
- package/dist_ts/proxies/smart-proxy/tls-manager.js +0 -110
- package/dist_ts/proxies/smart-proxy/utils/route-patterns.d.ts +0 -161
- package/dist_ts/proxies/smart-proxy/utils/route-patterns.js +0 -282
- package/dist_ts/proxies/smart-proxy/utils/route-validators.d.ts +0 -73
- package/dist_ts/proxies/smart-proxy/utils/route-validators.js +0 -259
- package/dist_ts/routing/router/proxy-router.d.ts +0 -115
- package/dist_ts/routing/router/proxy-router.js +0 -325
- package/dist_ts/routing/router/route-router.d.ts +0 -108
- package/dist_ts/routing/router/route-router.js +0 -393
- package/dist_ts/tls/alerts/index.d.ts +0 -4
- package/dist_ts/tls/alerts/index.js +0 -5
- package/dist_ts/tls/alerts/tls-alert.d.ts +0 -150
- package/dist_ts/tls/alerts/tls-alert.js +0 -226
- package/dist_ts/tls/sni/client-hello-parser.d.ts +0 -100
- package/dist_ts/tls/sni/client-hello-parser.js +0 -464
- package/dist_ts/tls/sni/sni-extraction.d.ts +0 -58
- package/dist_ts/tls/sni/sni-extraction.js +0 -275
- package/dist_ts/tls/utils/index.d.ts +0 -4
- package/dist_ts/tls/utils/index.js +0 -5
- package/dist_ts/tls/utils/tls-utils.d.ts +0 -49
- package/dist_ts/tls/utils/tls-utils.js +0 -75
- package/ts/proxies/nftables-proxy/index.ts +0 -6
- package/ts/proxies/nftables-proxy/models/errors.ts +0 -30
- package/ts/proxies/nftables-proxy/models/index.ts +0 -5
- package/ts/proxies/nftables-proxy/models/interfaces.ts +0 -94
- package/ts/proxies/nftables-proxy/nftables-proxy.ts +0 -1754
- package/ts/proxies/nftables-proxy/utils/index.ts +0 -38
- package/ts/proxies/nftables-proxy/utils/nft-command-executor.ts +0 -162
- package/ts/proxies/nftables-proxy/utils/nft-port-spec-normalizer.ts +0 -125
- package/ts/proxies/nftables-proxy/utils/nft-rule-validator.ts +0 -156
- package/ts/proxies/smart-proxy/rust-binary-locator.ts +0 -112
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../../plugins.js';
|
|
2
|
-
import * as fs from 'fs';
|
|
3
|
-
import * as path from 'path';
|
|
4
|
-
import { fileURLToPath } from 'url';
|
|
5
|
-
import { AsyncFileSystem } from '../../core/utils/fs-utils.js';
|
|
6
|
-
import { createLogger } from './models/types.js';
|
|
7
|
-
/**
|
|
8
|
-
* @deprecated This class is deprecated. Use SmartCertManager instead.
|
|
9
|
-
*
|
|
10
|
-
* This is a stub implementation that maintains backward compatibility
|
|
11
|
-
* while the functionality has been moved to SmartCertManager.
|
|
12
|
-
*/
|
|
13
|
-
export class CertificateManager {
|
|
14
|
-
constructor(options) {
|
|
15
|
-
this.options = options;
|
|
16
|
-
this.certificateCache = new Map();
|
|
17
|
-
this.httpsServer = null;
|
|
18
|
-
this.initialized = false;
|
|
19
|
-
this.certificateStoreDir = path.resolve(options.acme?.certificateStore || './certs');
|
|
20
|
-
this.logger = createLogger(options.logLevel || 'info');
|
|
21
|
-
this.logger.warn('CertificateManager is deprecated - use SmartCertManager instead');
|
|
22
|
-
// Initialize synchronously for backward compatibility but log warning
|
|
23
|
-
this.initializeSync();
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Synchronous initialization for backward compatibility
|
|
27
|
-
* @deprecated This uses sync filesystem operations which block the event loop
|
|
28
|
-
*/
|
|
29
|
-
initializeSync() {
|
|
30
|
-
// Ensure certificate store directory exists
|
|
31
|
-
try {
|
|
32
|
-
if (!fs.existsSync(this.certificateStoreDir)) {
|
|
33
|
-
fs.mkdirSync(this.certificateStoreDir, { recursive: true });
|
|
34
|
-
this.logger.info(`Created certificate store directory: ${this.certificateStoreDir}`);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
catch (error) {
|
|
38
|
-
this.logger.warn(`Failed to create certificate store directory: ${error}`);
|
|
39
|
-
}
|
|
40
|
-
this.loadDefaultCertificates();
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Async initialization - preferred method
|
|
44
|
-
*/
|
|
45
|
-
async initialize() {
|
|
46
|
-
if (this.initialized)
|
|
47
|
-
return;
|
|
48
|
-
// Ensure certificate store directory exists
|
|
49
|
-
try {
|
|
50
|
-
await AsyncFileSystem.ensureDir(this.certificateStoreDir);
|
|
51
|
-
this.logger.info(`Ensured certificate store directory: ${this.certificateStoreDir}`);
|
|
52
|
-
}
|
|
53
|
-
catch (error) {
|
|
54
|
-
this.logger.warn(`Failed to create certificate store directory: ${error}`);
|
|
55
|
-
}
|
|
56
|
-
await this.loadDefaultCertificatesAsync();
|
|
57
|
-
this.initialized = true;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Loads default certificates from the filesystem
|
|
61
|
-
* @deprecated This uses sync filesystem operations which block the event loop
|
|
62
|
-
*/
|
|
63
|
-
loadDefaultCertificates() {
|
|
64
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
65
|
-
const certPath = path.join(__dirname, '..', '..', '..', 'assets', 'certs');
|
|
66
|
-
try {
|
|
67
|
-
this.defaultCertificates = {
|
|
68
|
-
key: fs.readFileSync(path.join(certPath, 'key.pem'), 'utf8'),
|
|
69
|
-
cert: fs.readFileSync(path.join(certPath, 'cert.pem'), 'utf8')
|
|
70
|
-
};
|
|
71
|
-
this.logger.info('Loaded default certificates from filesystem (sync - deprecated)');
|
|
72
|
-
}
|
|
73
|
-
catch (error) {
|
|
74
|
-
this.logger.error(`Failed to load default certificates: ${error}`);
|
|
75
|
-
this.generateSelfSignedCertificate();
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Loads default certificates from the filesystem asynchronously
|
|
80
|
-
*/
|
|
81
|
-
async loadDefaultCertificatesAsync() {
|
|
82
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
83
|
-
const certPath = path.join(__dirname, '..', '..', '..', 'assets', 'certs');
|
|
84
|
-
try {
|
|
85
|
-
const [key, cert] = await Promise.all([
|
|
86
|
-
AsyncFileSystem.readFile(path.join(certPath, 'key.pem')),
|
|
87
|
-
AsyncFileSystem.readFile(path.join(certPath, 'cert.pem'))
|
|
88
|
-
]);
|
|
89
|
-
this.defaultCertificates = { key, cert };
|
|
90
|
-
this.logger.info('Loaded default certificates from filesystem (async)');
|
|
91
|
-
}
|
|
92
|
-
catch (error) {
|
|
93
|
-
this.logger.error(`Failed to load default certificates: ${error}`);
|
|
94
|
-
this.generateSelfSignedCertificate();
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Generates self-signed certificates as fallback
|
|
99
|
-
*/
|
|
100
|
-
generateSelfSignedCertificate() {
|
|
101
|
-
// Generate a self-signed certificate using forge or similar
|
|
102
|
-
// For now, just use a placeholder
|
|
103
|
-
const selfSignedCert = `-----BEGIN CERTIFICATE-----
|
|
104
|
-
MIIBkTCB+wIJAKHHIgIIA0/cMA0GCSqGSIb3DQEBBQUAMA0xCzAJBgNVBAYTAlVT
|
|
105
|
-
MB4XDTE0MDEwMTAwMDAwMFoXDTI0MDEwMTAwMDAwMFowDTELMAkGA1UEBhMCVVMw
|
|
106
|
-
gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMRiH0VwnOH3jCV7c6JFZWYrvuqy
|
|
107
|
-
-----END CERTIFICATE-----`;
|
|
108
|
-
const selfSignedKey = `-----BEGIN PRIVATE KEY-----
|
|
109
|
-
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMRiH0VwnOH3jCV7
|
|
110
|
-
c6JFZWYrvuqyALCLXj0pcr1iqNdHjegNXnkl5zjdaUjq4edNOKl7M1AlFiYjG2xk
|
|
111
|
-
-----END PRIVATE KEY-----`;
|
|
112
|
-
this.defaultCertificates = {
|
|
113
|
-
key: selfSignedKey,
|
|
114
|
-
cert: selfSignedCert
|
|
115
|
-
};
|
|
116
|
-
this.logger.warn('Using self-signed certificate as fallback');
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Gets the default certificates
|
|
120
|
-
*/
|
|
121
|
-
getDefaultCertificates() {
|
|
122
|
-
return this.defaultCertificates;
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* @deprecated Use SmartCertManager instead
|
|
126
|
-
*/
|
|
127
|
-
setExternalPort80Handler(handler) {
|
|
128
|
-
this.logger.warn('setExternalPort80Handler is deprecated - use SmartCertManager instead');
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* @deprecated Use SmartCertManager instead
|
|
132
|
-
*/
|
|
133
|
-
async updateRoutes(routes) {
|
|
134
|
-
this.logger.warn('updateRoutes is deprecated - use SmartCertManager instead');
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Handles SNI callback to provide appropriate certificate
|
|
138
|
-
*/
|
|
139
|
-
handleSNI(domain, cb) {
|
|
140
|
-
const certificate = this.getCachedCertificate(domain);
|
|
141
|
-
if (certificate) {
|
|
142
|
-
const context = plugins.tls.createSecureContext({
|
|
143
|
-
key: certificate.key,
|
|
144
|
-
cert: certificate.cert
|
|
145
|
-
});
|
|
146
|
-
cb(null, context);
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
// Use default certificate if no domain-specific certificate found
|
|
150
|
-
const defaultContext = plugins.tls.createSecureContext({
|
|
151
|
-
key: this.defaultCertificates.key,
|
|
152
|
-
cert: this.defaultCertificates.cert
|
|
153
|
-
});
|
|
154
|
-
cb(null, defaultContext);
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Updates a certificate in the cache
|
|
158
|
-
*/
|
|
159
|
-
updateCertificate(domain, cert, key) {
|
|
160
|
-
this.certificateCache.set(domain, {
|
|
161
|
-
cert,
|
|
162
|
-
key,
|
|
163
|
-
expires: new Date(Date.now() + 90 * 24 * 60 * 60 * 1000) // 90 days
|
|
164
|
-
});
|
|
165
|
-
this.logger.info(`Certificate updated for ${domain}`);
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Gets a cached certificate
|
|
169
|
-
*/
|
|
170
|
-
getCachedCertificate(domain) {
|
|
171
|
-
return this.certificateCache.get(domain) || null;
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* @deprecated Use SmartCertManager instead
|
|
175
|
-
*/
|
|
176
|
-
async initializePort80Handler() {
|
|
177
|
-
this.logger.warn('initializePort80Handler is deprecated - use SmartCertManager instead');
|
|
178
|
-
return null;
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* @deprecated Use SmartCertManager instead
|
|
182
|
-
*/
|
|
183
|
-
async stopPort80Handler() {
|
|
184
|
-
this.logger.warn('stopPort80Handler is deprecated - use SmartCertManager instead');
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* @deprecated Use SmartCertManager instead
|
|
188
|
-
*/
|
|
189
|
-
registerDomainsWithPort80Handler(domains) {
|
|
190
|
-
this.logger.warn('registerDomainsWithPort80Handler is deprecated - use SmartCertManager instead');
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* @deprecated Use SmartCertManager instead
|
|
194
|
-
*/
|
|
195
|
-
registerRoutesWithPort80Handler(routes) {
|
|
196
|
-
this.logger.warn('registerRoutesWithPort80Handler is deprecated - use SmartCertManager instead');
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Sets the HTTPS server for certificate updates
|
|
200
|
-
*/
|
|
201
|
-
setHttpsServer(server) {
|
|
202
|
-
this.httpsServer = server;
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Gets statistics for metrics
|
|
206
|
-
*/
|
|
207
|
-
getStats() {
|
|
208
|
-
return {
|
|
209
|
-
cachedCertificates: this.certificateCache.size,
|
|
210
|
-
defaultCertEnabled: true
|
|
211
|
-
};
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydGlmaWNhdGUtbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3Byb3hpZXMvaHR0cC1wcm94eS9jZXJ0aWZpY2F0ZS1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUNwQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFnRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUcvRzs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxrQkFBa0I7SUFRN0IsWUFBb0IsT0FBMEI7UUFBMUIsWUFBTyxHQUFQLE9BQU8sQ0FBbUI7UUFOdEMscUJBQWdCLEdBQW1DLElBQUksR0FBRyxFQUFFLENBQUM7UUFHN0QsZ0JBQVcsR0FBZ0MsSUFBSSxDQUFDO1FBQ2hELGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBRzFCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLElBQUksU0FBUyxDQUFDLENBQUM7UUFDckYsSUFBSSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsQ0FBQztRQUV2RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO1FBRXBGLHNFQUFzRTtRQUN0RSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGNBQWM7UUFDcEIsNENBQTRDO1FBQzVDLElBQUksQ0FBQztZQUNILElBQUks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
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../../plugins.js';
|
|
2
|
-
import { type IHttpProxyOptions } from './models/types.js';
|
|
3
|
-
/**
|
|
4
|
-
* Manages a pool of backend connections for efficient reuse
|
|
5
|
-
*/
|
|
6
|
-
export declare class ConnectionPool {
|
|
7
|
-
private options;
|
|
8
|
-
private connectionPool;
|
|
9
|
-
private roundRobinPositions;
|
|
10
|
-
private logger;
|
|
11
|
-
constructor(options: IHttpProxyOptions);
|
|
12
|
-
/**
|
|
13
|
-
* Get a connection from the pool or create a new one
|
|
14
|
-
*/
|
|
15
|
-
getConnection(host: string, port: number): Promise<plugins.net.Socket>;
|
|
16
|
-
/**
|
|
17
|
-
* Return a connection to the pool for reuse
|
|
18
|
-
*/
|
|
19
|
-
returnConnection(socket: plugins.net.Socket, host: string, port: number): void;
|
|
20
|
-
/**
|
|
21
|
-
* Cleanup the connection pool by removing idle connections
|
|
22
|
-
* or reducing pool size if it exceeds the configured maximum
|
|
23
|
-
*/
|
|
24
|
-
cleanupConnectionPool(): void;
|
|
25
|
-
/**
|
|
26
|
-
* Close all connections in the pool
|
|
27
|
-
*/
|
|
28
|
-
closeAllConnections(): void;
|
|
29
|
-
/**
|
|
30
|
-
* Get load balancing target using round-robin
|
|
31
|
-
*/
|
|
32
|
-
getNextTarget(targets: string[], port: number): {
|
|
33
|
-
host: string;
|
|
34
|
-
port: number;
|
|
35
|
-
};
|
|
36
|
-
/**
|
|
37
|
-
* Gets the connection pool status
|
|
38
|
-
*/
|
|
39
|
-
getPoolStatus(): Record<string, {
|
|
40
|
-
total: number;
|
|
41
|
-
idle: number;
|
|
42
|
-
}>;
|
|
43
|
-
/**
|
|
44
|
-
* Setup a periodic cleanup task
|
|
45
|
-
*/
|
|
46
|
-
setupPeriodicCleanup(interval?: number): NodeJS.Timeout;
|
|
47
|
-
}
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../../plugins.js';
|
|
2
|
-
import { createLogger } from './models/types.js';
|
|
3
|
-
import { cleanupSocket } from '../../core/utils/socket-utils.js';
|
|
4
|
-
/**
|
|
5
|
-
* Manages a pool of backend connections for efficient reuse
|
|
6
|
-
*/
|
|
7
|
-
export class ConnectionPool {
|
|
8
|
-
constructor(options) {
|
|
9
|
-
this.options = options;
|
|
10
|
-
this.connectionPool = new Map();
|
|
11
|
-
this.roundRobinPositions = new Map();
|
|
12
|
-
this.logger = createLogger(options.logLevel || 'info');
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Get a connection from the pool or create a new one
|
|
16
|
-
*/
|
|
17
|
-
getConnection(host, port) {
|
|
18
|
-
return new Promise((resolve, reject) => {
|
|
19
|
-
const poolKey = `${host}:${port}`;
|
|
20
|
-
const connectionList = this.connectionPool.get(poolKey) || [];
|
|
21
|
-
// Look for an idle connection
|
|
22
|
-
const idleConnectionIndex = connectionList.findIndex(c => c.isIdle);
|
|
23
|
-
if (idleConnectionIndex >= 0) {
|
|
24
|
-
// Get existing connection from pool
|
|
25
|
-
const connection = connectionList[idleConnectionIndex];
|
|
26
|
-
connection.isIdle = false;
|
|
27
|
-
connection.lastUsed = Date.now();
|
|
28
|
-
this.logger.debug(`Reusing connection from pool for ${poolKey}`);
|
|
29
|
-
// Update the pool
|
|
30
|
-
this.connectionPool.set(poolKey, connectionList);
|
|
31
|
-
resolve(connection.socket);
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
// No idle connection available, create a new one if pool isn't full
|
|
35
|
-
const poolSize = this.options.connectionPoolSize || 50;
|
|
36
|
-
if (connectionList.length < poolSize) {
|
|
37
|
-
this.logger.debug(`Creating new connection to ${host}:${port}`);
|
|
38
|
-
try {
|
|
39
|
-
const socket = plugins.net.connect({
|
|
40
|
-
host,
|
|
41
|
-
port,
|
|
42
|
-
keepAlive: true,
|
|
43
|
-
keepAliveInitialDelay: 30000 // 30 seconds
|
|
44
|
-
});
|
|
45
|
-
socket.once('connect', () => {
|
|
46
|
-
// Add to connection pool
|
|
47
|
-
const connection = {
|
|
48
|
-
socket,
|
|
49
|
-
lastUsed: Date.now(),
|
|
50
|
-
isIdle: false
|
|
51
|
-
};
|
|
52
|
-
connectionList.push(connection);
|
|
53
|
-
this.connectionPool.set(poolKey, connectionList);
|
|
54
|
-
// Setup cleanup when the connection is closed
|
|
55
|
-
socket.once('close', () => {
|
|
56
|
-
const idx = connectionList.findIndex(c => c.socket === socket);
|
|
57
|
-
if (idx >= 0) {
|
|
58
|
-
connectionList.splice(idx, 1);
|
|
59
|
-
this.connectionPool.set(poolKey, connectionList);
|
|
60
|
-
this.logger.debug(`Removed closed connection from pool for ${poolKey}`);
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
resolve(socket);
|
|
64
|
-
});
|
|
65
|
-
socket.once('error', (err) => {
|
|
66
|
-
this.logger.error(`Error creating connection to ${host}:${port}`, err);
|
|
67
|
-
reject(err);
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
catch (err) {
|
|
71
|
-
this.logger.error(`Failed to create connection to ${host}:${port}`, err);
|
|
72
|
-
reject(err);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
// Pool is full, wait for an idle connection or reject
|
|
77
|
-
this.logger.warn(`Connection pool for ${poolKey} is full (${connectionList.length})`);
|
|
78
|
-
reject(new Error(`Connection pool for ${poolKey} is full`));
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Return a connection to the pool for reuse
|
|
84
|
-
*/
|
|
85
|
-
returnConnection(socket, host, port) {
|
|
86
|
-
const poolKey = `${host}:${port}`;
|
|
87
|
-
const connectionList = this.connectionPool.get(poolKey) || [];
|
|
88
|
-
// Find this connection in the pool
|
|
89
|
-
const connectionIndex = connectionList.findIndex(c => c.socket === socket);
|
|
90
|
-
if (connectionIndex >= 0) {
|
|
91
|
-
// Mark as idle and update last used time
|
|
92
|
-
connectionList[connectionIndex].isIdle = true;
|
|
93
|
-
connectionList[connectionIndex].lastUsed = Date.now();
|
|
94
|
-
this.logger.debug(`Returned connection to pool for ${poolKey}`);
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
this.logger.warn(`Attempted to return unknown connection to pool for ${poolKey}`);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Cleanup the connection pool by removing idle connections
|
|
102
|
-
* or reducing pool size if it exceeds the configured maximum
|
|
103
|
-
*/
|
|
104
|
-
cleanupConnectionPool() {
|
|
105
|
-
const now = Date.now();
|
|
106
|
-
const idleTimeout = this.options.keepAliveTimeout || 120000; // 2 minutes default
|
|
107
|
-
for (const [host, connections] of this.connectionPool.entries()) {
|
|
108
|
-
// Sort by last used time (oldest first)
|
|
109
|
-
connections.sort((a, b) => a.lastUsed - b.lastUsed);
|
|
110
|
-
// Remove idle connections older than the idle timeout
|
|
111
|
-
let removed = 0;
|
|
112
|
-
while (connections.length > 0) {
|
|
113
|
-
const connection = connections[0];
|
|
114
|
-
// Remove if idle and exceeds timeout, or if pool is too large
|
|
115
|
-
if ((connection.isIdle && now - connection.lastUsed > idleTimeout) ||
|
|
116
|
-
connections.length > (this.options.connectionPoolSize || 50)) {
|
|
117
|
-
cleanupSocket(connection.socket, `pool-${host}-idle`, { immediate: true }).catch(() => { });
|
|
118
|
-
connections.shift(); // Remove from pool
|
|
119
|
-
removed++;
|
|
120
|
-
}
|
|
121
|
-
else {
|
|
122
|
-
break; // Stop removing if we've reached active or recent connections
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
if (removed > 0) {
|
|
126
|
-
this.logger.debug(`Removed ${removed} idle connections from pool for ${host}, ${connections.length} remaining`);
|
|
127
|
-
}
|
|
128
|
-
// Update the pool with the remaining connections
|
|
129
|
-
if (connections.length === 0) {
|
|
130
|
-
this.connectionPool.delete(host);
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
this.connectionPool.set(host, connections);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Close all connections in the pool
|
|
139
|
-
*/
|
|
140
|
-
closeAllConnections() {
|
|
141
|
-
for (const [host, connections] of this.connectionPool.entries()) {
|
|
142
|
-
this.logger.debug(`Closing ${connections.length} connections to ${host}`);
|
|
143
|
-
for (const connection of connections) {
|
|
144
|
-
cleanupSocket(connection.socket, `pool-${host}-close`, { immediate: true }).catch(() => { });
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
this.connectionPool.clear();
|
|
148
|
-
this.roundRobinPositions.clear();
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Get load balancing target using round-robin
|
|
152
|
-
*/
|
|
153
|
-
getNextTarget(targets, port) {
|
|
154
|
-
const targetKey = targets.join(',');
|
|
155
|
-
// Initialize position if not exists
|
|
156
|
-
if (!this.roundRobinPositions.has(targetKey)) {
|
|
157
|
-
this.roundRobinPositions.set(targetKey, 0);
|
|
158
|
-
}
|
|
159
|
-
// Get current position and increment for next time
|
|
160
|
-
const currentPosition = this.roundRobinPositions.get(targetKey);
|
|
161
|
-
const nextPosition = (currentPosition + 1) % targets.length;
|
|
162
|
-
this.roundRobinPositions.set(targetKey, nextPosition);
|
|
163
|
-
// Return the selected target
|
|
164
|
-
return {
|
|
165
|
-
host: targets[currentPosition],
|
|
166
|
-
port
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
/**
|
|
170
|
-
* Gets the connection pool status
|
|
171
|
-
*/
|
|
172
|
-
getPoolStatus() {
|
|
173
|
-
return Object.fromEntries(Array.from(this.connectionPool.entries()).map(([host, connections]) => [
|
|
174
|
-
host,
|
|
175
|
-
{
|
|
176
|
-
total: connections.length,
|
|
177
|
-
idle: connections.filter(c => c.isIdle).length
|
|
178
|
-
}
|
|
179
|
-
]));
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* Setup a periodic cleanup task
|
|
183
|
-
*/
|
|
184
|
-
setupPeriodicCleanup(interval = 60000) {
|
|
185
|
-
const timer = setInterval(() => {
|
|
186
|
-
this.cleanupConnectionPool();
|
|
187
|
-
}, interval);
|
|
188
|
-
// Don't prevent process exit
|
|
189
|
-
if (timer.unref) {
|
|
190
|
-
timer.unref();
|
|
191
|
-
}
|
|
192
|
-
return timer;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdGlvbi1wb29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvcHJveGllcy9odHRwLXByb3h5L2Nvbm5lY3Rpb24tcG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBK0QsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRWpFOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFLekIsWUFBb0IsT0FBMEI7UUFBMUIsWUFBTyxHQUFQLE9BQU8sQ0FBbUI7UUFKdEMsbUJBQWMsR0FBeUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNqRSx3QkFBbUIsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUkzRCxJQUFJLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7T0FFRztJQUNJLGFBQWEsQ0FBQyxJQUFZLEVBQUUsSUFBWTtRQUM3QyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLE1BQU0sT0FBTyxHQUFHLEdBQUcsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2xDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUU5RCw4QkFBOEI7WUFDOUIsTUFBTSxtQkFBbUIsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXBFLElBQUksbUJBQW1CLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLG9DQUFvQztnQkFDcEMsTUFBTSxVQUFVLEdB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
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../../plugins.js';
|
|
2
|
-
import '../../core/models/socket-augmentation.js';
|
|
3
|
-
import type { IRouteContext, IHttpRouteContext, IHttp2RouteContext } from '../../core/models/route-context.js';
|
|
4
|
-
/**
|
|
5
|
-
* Context creator for NetworkProxy
|
|
6
|
-
* Creates route contexts for matching and function evaluation
|
|
7
|
-
*/
|
|
8
|
-
export declare class ContextCreator {
|
|
9
|
-
/**
|
|
10
|
-
* Create a route context from HTTP request information
|
|
11
|
-
*/
|
|
12
|
-
createHttpRouteContext(req: any, options: {
|
|
13
|
-
tlsVersion?: string;
|
|
14
|
-
connectionId: string;
|
|
15
|
-
clientIp: string;
|
|
16
|
-
serverIp: string;
|
|
17
|
-
}): IHttpRouteContext;
|
|
18
|
-
/**
|
|
19
|
-
* Create a route context from HTTP/2 stream and headers
|
|
20
|
-
*/
|
|
21
|
-
createHttp2RouteContext(stream: plugins.http2.ServerHttp2Stream, headers: plugins.http2.IncomingHttpHeaders, options: {
|
|
22
|
-
connectionId: string;
|
|
23
|
-
clientIp: string;
|
|
24
|
-
serverIp: string;
|
|
25
|
-
}): IHttp2RouteContext;
|
|
26
|
-
/**
|
|
27
|
-
* Create a basic route context from socket information
|
|
28
|
-
*/
|
|
29
|
-
createSocketRouteContext(socket: plugins.net.Socket, options: {
|
|
30
|
-
domain?: string;
|
|
31
|
-
tlsVersion?: string;
|
|
32
|
-
connectionId: string;
|
|
33
|
-
}): IRouteContext;
|
|
34
|
-
}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../../plugins.js';
|
|
2
|
-
import '../../core/models/socket-augmentation.js';
|
|
3
|
-
/**
|
|
4
|
-
* Context creator for NetworkProxy
|
|
5
|
-
* Creates route contexts for matching and function evaluation
|
|
6
|
-
*/
|
|
7
|
-
export class ContextCreator {
|
|
8
|
-
/**
|
|
9
|
-
* Create a route context from HTTP request information
|
|
10
|
-
*/
|
|
11
|
-
createHttpRouteContext(req, options) {
|
|
12
|
-
// Parse headers
|
|
13
|
-
const headers = {};
|
|
14
|
-
for (const [key, value] of Object.entries(req.headers)) {
|
|
15
|
-
if (typeof value === 'string') {
|
|
16
|
-
headers[key.toLowerCase()] = value;
|
|
17
|
-
}
|
|
18
|
-
else if (Array.isArray(value) && value.length > 0) {
|
|
19
|
-
headers[key.toLowerCase()] = value[0];
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
// Parse domain from Host header
|
|
23
|
-
const domain = headers['host']?.split(':')[0] || '';
|
|
24
|
-
// Parse URL
|
|
25
|
-
const url = new URL(`http://${domain}${req.url || '/'}`);
|
|
26
|
-
return {
|
|
27
|
-
// Connection basics
|
|
28
|
-
port: req.socket.localPort || 0,
|
|
29
|
-
domain,
|
|
30
|
-
clientIp: options.clientIp,
|
|
31
|
-
serverIp: options.serverIp,
|
|
32
|
-
// HTTP specifics
|
|
33
|
-
path: url.pathname,
|
|
34
|
-
query: url.search ? url.search.substring(1) : '',
|
|
35
|
-
headers,
|
|
36
|
-
// TLS information
|
|
37
|
-
isTls: !!req.socket.encrypted,
|
|
38
|
-
tlsVersion: options.tlsVersion,
|
|
39
|
-
// Request objects
|
|
40
|
-
req,
|
|
41
|
-
// Metadata
|
|
42
|
-
timestamp: Date.now(),
|
|
43
|
-
connectionId: options.connectionId
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Create a route context from HTTP/2 stream and headers
|
|
48
|
-
*/
|
|
49
|
-
createHttp2RouteContext(stream, headers, options) {
|
|
50
|
-
// Parse headers, excluding HTTP/2 pseudo-headers
|
|
51
|
-
const processedHeaders = {};
|
|
52
|
-
for (const [key, value] of Object.entries(headers)) {
|
|
53
|
-
if (!key.startsWith(':') && typeof value === 'string') {
|
|
54
|
-
processedHeaders[key.toLowerCase()] = value;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
// Get domain from :authority pseudo-header
|
|
58
|
-
const authority = headers[':authority'] || '';
|
|
59
|
-
const domain = authority.split(':')[0];
|
|
60
|
-
// Get path from :path pseudo-header
|
|
61
|
-
const path = headers[':path'] || '/';
|
|
62
|
-
// Parse the path to extract query string
|
|
63
|
-
const pathParts = path.split('?');
|
|
64
|
-
const pathname = pathParts[0];
|
|
65
|
-
const query = pathParts.length > 1 ? pathParts[1] : '';
|
|
66
|
-
// Get the socket from the session
|
|
67
|
-
const socket = stream.session?.socket;
|
|
68
|
-
return {
|
|
69
|
-
// Connection basics
|
|
70
|
-
port: socket?.localPort || 0,
|
|
71
|
-
domain,
|
|
72
|
-
clientIp: options.clientIp,
|
|
73
|
-
serverIp: options.serverIp,
|
|
74
|
-
// HTTP specifics
|
|
75
|
-
path: pathname,
|
|
76
|
-
query,
|
|
77
|
-
headers: processedHeaders,
|
|
78
|
-
// HTTP/2 specific properties
|
|
79
|
-
method: headers[':method'],
|
|
80
|
-
stream,
|
|
81
|
-
// TLS information - HTTP/2 is always on TLS in browsers
|
|
82
|
-
isTls: true,
|
|
83
|
-
tlsVersion: socket?.getTLSVersion?.() || 'TLSv1.3',
|
|
84
|
-
// Metadata
|
|
85
|
-
timestamp: Date.now(),
|
|
86
|
-
connectionId: options.connectionId
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Create a basic route context from socket information
|
|
91
|
-
*/
|
|
92
|
-
createSocketRouteContext(socket, options) {
|
|
93
|
-
return {
|
|
94
|
-
// Connection basics
|
|
95
|
-
port: socket.localPort || 0,
|
|
96
|
-
domain: options.domain,
|
|
97
|
-
clientIp: socket.remoteAddress?.replace('::ffff:', '') || '0.0.0.0',
|
|
98
|
-
serverIp: socket.localAddress?.replace('::ffff:', '') || '0.0.0.0',
|
|
99
|
-
// TLS information
|
|
100
|
-
isTls: options.tlsVersion !== undefined,
|
|
101
|
-
tlsVersion: options.tlsVersion,
|
|
102
|
-
// Metadata
|
|
103
|
-
timestamp: Date.now(),
|
|
104
|
-
connectionId: options.connectionId
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1jcmVhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvcHJveGllcy9odHRwLXByb3h5L2NvbnRleHQtY3JlYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sMENBQTBDLENBQUM7QUFHbEQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFDekI7O09BRUc7SUFDSSxzQkFBc0IsQ0FBQyxHQUFRLEVBQUUsT0FLdkM7UUFDQyxnQkFBZ0I7UUFDaEIsTUFBTSxPQUFPLEdBQTJCLEVBQUUsQ0FBQztRQUMzQyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN2RCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM5QixPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ3JDLENBQUM7aUJBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BELE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsQ0FBQztRQUNILENBQUM7UUFFRCxnQ0FBZ0M7UUFDaEMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFcEQsWUFBWTtRQUNaLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxF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
|