@push.rocks/smartproxy 12.0.0 → 13.1.2
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/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/certificate/acme/acme-factory.d.ts +17 -0
- package/dist_ts/certificate/acme/acme-factory.js +40 -0
- package/dist_ts/certificate/acme/challenge-handler.d.ts +44 -0
- package/dist_ts/certificate/acme/challenge-handler.js +92 -0
- package/dist_ts/certificate/acme/index.d.ts +4 -0
- package/dist_ts/certificate/acme/index.js +5 -0
- package/dist_ts/certificate/events/certificate-events.d.ts +33 -0
- package/dist_ts/certificate/events/certificate-events.js +38 -0
- package/dist_ts/certificate/index.d.ts +24 -0
- package/dist_ts/certificate/index.js +39 -0
- package/dist_ts/certificate/models/certificate-types.d.ts +77 -0
- package/dist_ts/certificate/models/certificate-types.js +2 -0
- package/dist_ts/certificate/providers/cert-provisioner.d.ts +93 -0
- package/dist_ts/certificate/providers/cert-provisioner.js +262 -0
- package/dist_ts/certificate/providers/index.d.ts +4 -0
- package/dist_ts/certificate/providers/index.js +5 -0
- package/dist_ts/certificate/storage/file-storage.d.ts +66 -0
- package/dist_ts/certificate/storage/file-storage.js +194 -0
- package/dist_ts/certificate/storage/index.d.ts +4 -0
- package/dist_ts/certificate/storage/index.js +5 -0
- package/dist_ts/certificate/utils/certificate-helpers.d.ts +17 -0
- package/dist_ts/certificate/utils/certificate-helpers.js +45 -0
- package/dist_ts/common/eventUtils.d.ts +1 -1
- package/dist_ts/common/port80-adapter.d.ts +1 -1
- package/dist_ts/core/events/index.d.ts +4 -0
- package/dist_ts/core/events/index.js +5 -0
- package/dist_ts/core/index.d.ts +6 -0
- package/dist_ts/core/index.js +8 -0
- package/dist_ts/core/models/common-types.d.ts +82 -0
- package/dist_ts/core/models/common-types.js +15 -0
- package/dist_ts/core/models/index.d.ts +4 -0
- package/dist_ts/core/models/index.js +5 -0
- package/dist_ts/core/utils/event-utils.d.ts +15 -0
- package/dist_ts/core/utils/event-utils.js +19 -0
- package/dist_ts/core/utils/index.d.ts +6 -0
- package/dist_ts/core/utils/index.js +7 -0
- package/dist_ts/core/utils/ip-utils.d.ts +53 -0
- package/dist_ts/core/utils/ip-utils.js +153 -0
- package/dist_ts/core/utils/validation-utils.d.ts +61 -0
- package/dist_ts/core/utils/validation-utils.js +149 -0
- package/dist_ts/forwarding/config/domain-config.d.ts +12 -0
- package/dist_ts/forwarding/config/domain-config.js +12 -0
- package/dist_ts/forwarding/config/domain-manager.d.ts +86 -0
- package/dist_ts/forwarding/config/domain-manager.js +242 -0
- package/dist_ts/forwarding/config/forwarding-types.d.ts +104 -0
- package/dist_ts/forwarding/config/forwarding-types.js +50 -0
- package/dist_ts/forwarding/config/index.d.ts +6 -0
- package/dist_ts/forwarding/config/index.js +7 -0
- package/dist_ts/forwarding/factory/forwarding-factory.d.ts +25 -0
- package/dist_ts/forwarding/factory/forwarding-factory.js +138 -0
- package/dist_ts/forwarding/factory/index.d.ts +4 -0
- package/dist_ts/forwarding/factory/index.js +5 -0
- package/dist_ts/forwarding/handlers/base-handler.d.ts +55 -0
- package/dist_ts/forwarding/handlers/base-handler.js +94 -0
- package/dist_ts/forwarding/handlers/http-handler.d.ts +30 -0
- package/dist_ts/forwarding/handlers/http-handler.js +131 -0
- package/dist_ts/forwarding/handlers/https-passthrough-handler.d.ts +29 -0
- package/dist_ts/forwarding/handlers/https-passthrough-handler.js +162 -0
- package/dist_ts/forwarding/handlers/https-terminate-to-http-handler.d.ts +36 -0
- package/dist_ts/forwarding/handlers/https-terminate-to-http-handler.js +229 -0
- package/dist_ts/forwarding/handlers/https-terminate-to-https-handler.d.ts +35 -0
- package/dist_ts/forwarding/handlers/https-terminate-to-https-handler.js +254 -0
- package/dist_ts/forwarding/handlers/index.d.ts +8 -0
- package/dist_ts/forwarding/handlers/index.js +9 -0
- package/dist_ts/forwarding/index.d.ts +19 -0
- package/dist_ts/forwarding/index.js +25 -0
- package/dist_ts/http/index.d.ts +15 -0
- package/dist_ts/http/index.js +20 -0
- package/dist_ts/http/models/http-types.d.ts +81 -0
- package/dist_ts/http/models/http-types.js +62 -0
- package/dist_ts/http/port80/acme-interfaces.d.ts +78 -0
- package/dist_ts/http/port80/acme-interfaces.js +6 -0
- package/dist_ts/http/port80/challenge-responder.d.ts +53 -0
- package/dist_ts/http/port80/challenge-responder.js +203 -0
- package/dist_ts/http/port80/index.d.ts +6 -0
- package/dist_ts/http/port80/index.js +9 -0
- package/dist_ts/http/port80/port80-handler.d.ts +121 -0
- package/dist_ts/http/port80/port80-handler.js +554 -0
- package/dist_ts/http/redirects/index.d.ts +4 -0
- package/dist_ts/http/redirects/index.js +5 -0
- package/dist_ts/http/router/index.d.ts +4 -0
- package/dist_ts/http/router/index.js +5 -0
- package/dist_ts/http/router/proxy-router.d.ts +115 -0
- package/dist_ts/http/router/proxy-router.js +325 -0
- package/dist_ts/index.d.ts +15 -8
- package/dist_ts/index.js +26 -10
- package/dist_ts/networkproxy/classes.np.certificatemanager.js +2 -2
- package/dist_ts/networkproxy/index.d.ts +1 -6
- package/dist_ts/networkproxy/index.js +4 -8
- package/dist_ts/plugins.d.ts +2 -1
- package/dist_ts/plugins.js +3 -2
- package/dist_ts/port80handler/classes.port80handler.d.ts +8 -136
- package/dist_ts/port80handler/classes.port80handler.js +14 -567
- package/dist_ts/proxies/index.d.ts +6 -0
- package/dist_ts/proxies/index.js +8 -0
- package/dist_ts/proxies/network-proxy/certificate-manager.d.ts +77 -0
- package/dist_ts/proxies/network-proxy/certificate-manager.js +373 -0
- package/dist_ts/proxies/network-proxy/connection-pool.d.ts +47 -0
- package/dist_ts/proxies/network-proxy/connection-pool.js +210 -0
- package/dist_ts/proxies/network-proxy/index.d.ts +10 -0
- package/dist_ts/proxies/network-proxy/index.js +12 -0
- package/dist_ts/proxies/network-proxy/models/index.d.ts +4 -0
- package/dist_ts/proxies/network-proxy/models/index.js +5 -0
- package/dist_ts/proxies/network-proxy/models/types.d.ts +80 -0
- package/dist_ts/proxies/network-proxy/models/types.js +35 -0
- package/dist_ts/proxies/network-proxy/network-proxy.d.ts +118 -0
- package/dist_ts/proxies/network-proxy/network-proxy.js +387 -0
- package/dist_ts/proxies/network-proxy/request-handler.d.ts +57 -0
- package/dist_ts/proxies/network-proxy/request-handler.js +394 -0
- package/dist_ts/proxies/network-proxy/websocket-handler.d.ts +38 -0
- package/dist_ts/proxies/network-proxy/websocket-handler.js +188 -0
- package/dist_ts/proxies/nftables-proxy/index.d.ts +5 -0
- package/dist_ts/proxies/nftables-proxy/index.js +6 -0
- package/dist_ts/proxies/nftables-proxy/models/errors.d.ts +15 -0
- package/dist_ts/proxies/nftables-proxy/models/errors.js +28 -0
- package/dist_ts/proxies/nftables-proxy/models/index.d.ts +5 -0
- package/dist_ts/proxies/nftables-proxy/models/index.js +6 -0
- package/dist_ts/proxies/nftables-proxy/models/interfaces.d.ts +75 -0
- package/dist_ts/proxies/nftables-proxy/models/interfaces.js +5 -0
- package/dist_ts/proxies/nftables-proxy/nftables-proxy.d.ts +136 -0
- package/dist_ts/proxies/nftables-proxy/nftables-proxy.js +1516 -0
- package/dist_ts/proxies/smart-proxy/connection-handler.d.ts +39 -0
- package/dist_ts/proxies/smart-proxy/connection-handler.js +894 -0
- package/dist_ts/proxies/smart-proxy/connection-manager.d.ts +78 -0
- package/dist_ts/proxies/smart-proxy/connection-manager.js +378 -0
- package/dist_ts/proxies/smart-proxy/domain-config-manager.d.ts +95 -0
- package/dist_ts/proxies/smart-proxy/domain-config-manager.js +255 -0
- package/dist_ts/proxies/smart-proxy/index.d.ts +13 -0
- package/dist_ts/proxies/smart-proxy/index.js +17 -0
- package/dist_ts/proxies/smart-proxy/models/index.d.ts +4 -0
- package/dist_ts/proxies/smart-proxy/models/index.js +5 -0
- package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +107 -0
- package/dist_ts/proxies/smart-proxy/models/interfaces.js +2 -0
- package/dist_ts/proxies/smart-proxy/network-proxy-bridge.d.ts +62 -0
- package/dist_ts/proxies/smart-proxy/network-proxy-bridge.js +316 -0
- package/dist_ts/proxies/smart-proxy/port-range-manager.d.ts +56 -0
- package/dist_ts/proxies/smart-proxy/port-range-manager.js +176 -0
- package/dist_ts/proxies/smart-proxy/security-manager.d.ts +64 -0
- package/dist_ts/proxies/smart-proxy/security-manager.js +149 -0
- package/dist_ts/proxies/smart-proxy/smart-proxy.d.ts +63 -0
- package/dist_ts/proxies/smart-proxy/smart-proxy.js +523 -0
- package/dist_ts/proxies/smart-proxy/timeout-manager.d.ts +47 -0
- package/dist_ts/proxies/smart-proxy/timeout-manager.js +154 -0
- package/dist_ts/proxies/smart-proxy/tls-manager.d.ts +57 -0
- package/dist_ts/proxies/smart-proxy/tls-manager.js +132 -0
- package/dist_ts/smartproxy/classes.pp.networkproxybridge.d.ts +2 -2
- package/dist_ts/smartproxy/classes.pp.networkproxybridge.js +1 -1
- package/dist_ts/smartproxy/classes.pp.tlsmanager.js +2 -2
- package/dist_ts/smartproxy/classes.smartproxy.js +3 -3
- package/dist_ts/tls/alerts/index.d.ts +4 -0
- package/dist_ts/tls/alerts/index.js +5 -0
- package/dist_ts/tls/alerts/tls-alert.d.ts +150 -0
- package/dist_ts/tls/alerts/tls-alert.js +226 -0
- package/dist_ts/tls/index.d.ts +18 -0
- package/dist_ts/tls/index.js +27 -0
- package/dist_ts/tls/sni/client-hello-parser.d.ts +100 -0
- package/dist_ts/tls/sni/client-hello-parser.js +463 -0
- package/dist_ts/tls/sni/index.d.ts +4 -0
- package/dist_ts/tls/sni/index.js +5 -0
- package/dist_ts/tls/sni/sni-extraction.d.ts +58 -0
- package/dist_ts/tls/sni/sni-extraction.js +275 -0
- package/dist_ts/tls/sni/sni-handler.d.ts +154 -0
- package/dist_ts/tls/sni/sni-handler.js +191 -0
- package/dist_ts/tls/utils/index.d.ts +4 -0
- package/dist_ts/tls/utils/index.js +5 -0
- package/dist_ts/tls/utils/tls-utils.d.ts +158 -0
- package/dist_ts/tls/utils/tls-utils.js +187 -0
- package/package.json +1 -1
- package/readme.md +89 -21
- package/readme.plan.md +253 -469
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/certificate/acme/acme-factory.ts +48 -0
- package/ts/certificate/acme/challenge-handler.ts +110 -0
- package/ts/certificate/acme/index.ts +3 -0
- package/ts/certificate/events/certificate-events.ts +36 -0
- package/ts/certificate/index.ts +67 -0
- package/ts/certificate/models/certificate-types.ts +88 -0
- package/ts/certificate/providers/cert-provisioner.ts +326 -0
- package/ts/certificate/providers/index.ts +3 -0
- package/ts/certificate/storage/file-storage.ts +234 -0
- package/ts/certificate/storage/index.ts +3 -0
- package/ts/certificate/utils/certificate-helpers.ts +50 -0
- package/ts/common/eventUtils.ts +1 -1
- package/ts/common/port80-adapter.ts +1 -1
- package/ts/core/events/index.ts +3 -0
- package/ts/core/index.ts +8 -0
- package/ts/core/models/common-types.ts +91 -0
- package/ts/core/models/index.ts +5 -0
- package/ts/core/utils/event-utils.ts +34 -0
- package/ts/core/utils/index.ts +7 -0
- package/ts/core/utils/ip-utils.ts +175 -0
- package/ts/core/utils/validation-utils.ts +177 -0
- package/ts/{smartproxy/forwarding → forwarding/config}/domain-config.ts +1 -1
- package/ts/{smartproxy/forwarding → forwarding/config}/domain-manager.ts +8 -8
- package/ts/{smartproxy/types/forwarding.types.ts → forwarding/config/forwarding-types.ts} +6 -6
- package/ts/forwarding/config/index.ts +7 -0
- package/ts/{smartproxy/forwarding/forwarding.factory.ts → forwarding/factory/forwarding-factory.ts} +12 -11
- package/ts/forwarding/factory/index.ts +5 -0
- package/ts/{smartproxy/forwarding/forwarding.handler.ts → forwarding/handlers/base-handler.ts} +2 -2
- package/ts/{smartproxy/forwarding/http.handler.ts → forwarding/handlers/http-handler.ts} +13 -4
- package/ts/{smartproxy/forwarding/https-passthrough.handler.ts → forwarding/handlers/https-passthrough-handler.ts} +13 -4
- package/ts/{smartproxy/forwarding/https-terminate-to-http.handler.ts → forwarding/handlers/https-terminate-to-http-handler.ts} +3 -3
- package/ts/{smartproxy/forwarding/https-terminate-to-https.handler.ts → forwarding/handlers/https-terminate-to-https-handler.ts} +3 -3
- package/ts/forwarding/handlers/index.ts +9 -0
- package/ts/forwarding/index.ts +34 -0
- package/ts/http/index.ts +23 -0
- package/ts/http/models/http-types.ts +105 -0
- package/ts/http/port80/acme-interfaces.ts +85 -0
- package/ts/http/port80/challenge-responder.ts +246 -0
- package/ts/http/port80/index.ts +13 -0
- package/ts/{port80handler/classes.port80handler.ts → http/port80/port80-handler.ts} +164 -161
- package/ts/http/redirects/index.ts +3 -0
- package/ts/http/router/index.ts +5 -0
- package/ts/{classes.router.ts → http/router/proxy-router.ts} +27 -20
- package/ts/index.ts +32 -9
- package/ts/plugins.ts +2 -1
- package/ts/proxies/index.ts +8 -0
- package/ts/{networkproxy/classes.np.certificatemanager.ts → proxies/network-proxy/certificate-manager.ts} +17 -16
- package/ts/{networkproxy/classes.np.connectionpool.ts → proxies/network-proxy/connection-pool.ts} +3 -3
- package/ts/proxies/network-proxy/index.ts +13 -0
- package/ts/proxies/network-proxy/models/index.ts +4 -0
- package/ts/{networkproxy/classes.np.types.ts → proxies/network-proxy/models/types.ts} +7 -11
- package/ts/{networkproxy/classes.np.networkproxy.ts → proxies/network-proxy/network-proxy.ts} +31 -24
- package/ts/{networkproxy/classes.np.requesthandler.ts → proxies/network-proxy/request-handler.ts} +12 -7
- package/ts/{networkproxy/classes.np.websockethandler.ts → proxies/network-proxy/websocket-handler.ts} +6 -6
- package/ts/proxies/nftables-proxy/index.ts +5 -0
- package/ts/proxies/nftables-proxy/models/errors.ts +30 -0
- package/ts/proxies/nftables-proxy/models/index.ts +5 -0
- package/ts/proxies/nftables-proxy/models/interfaces.ts +94 -0
- package/ts/{nfttablesproxy/classes.nftablesproxy.ts → proxies/nftables-proxy/nftables-proxy.ts} +24 -126
- package/ts/{smartproxy/classes.pp.connectionhandler.ts → proxies/smart-proxy/connection-handler.ts} +12 -12
- package/ts/{smartproxy/classes.pp.connectionmanager.ts → proxies/smart-proxy/connection-manager.ts} +8 -8
- package/ts/{smartproxy/classes.pp.domainconfigmanager.ts → proxies/smart-proxy/domain-config-manager.ts} +15 -14
- package/ts/proxies/smart-proxy/index.ts +18 -0
- package/ts/proxies/smart-proxy/models/index.ts +4 -0
- package/ts/{smartproxy/classes.pp.interfaces.ts → proxies/smart-proxy/models/interfaces.ts} +12 -8
- package/ts/{smartproxy/classes.pp.networkproxybridge.ts → proxies/smart-proxy/network-proxy-bridge.ts} +14 -14
- package/ts/{smartproxy/classes.pp.portrangemanager.ts → proxies/smart-proxy/port-range-manager.ts} +1 -1
- package/ts/{smartproxy/classes.pp.securitymanager.ts → proxies/smart-proxy/security-manager.ts} +3 -3
- package/ts/{smartproxy/classes.smartproxy.ts → proxies/smart-proxy/smart-proxy.ts} +29 -24
- package/ts/{smartproxy/classes.pp.timeoutmanager.ts → proxies/smart-proxy/timeout-manager.ts} +3 -3
- package/ts/{smartproxy/classes.pp.tlsmanager.ts → proxies/smart-proxy/tls-manager.ts} +3 -3
- package/ts/tls/alerts/index.ts +3 -0
- package/ts/{smartproxy/classes.pp.tlsalert.ts → tls/alerts/tls-alert.ts} +44 -43
- package/ts/tls/index.ts +33 -0
- package/ts/tls/sni/client-hello-parser.ts +629 -0
- package/ts/tls/sni/index.ts +3 -0
- package/ts/tls/sni/sni-extraction.ts +353 -0
- package/ts/tls/sni/sni-handler.ts +264 -0
- package/ts/tls/utils/index.ts +3 -0
- package/ts/tls/utils/tls-utils.ts +201 -0
- package/ts/common/acmeFactory.ts +0 -23
- package/ts/helpers.certificates.ts +0 -30
- package/ts/networkproxy/index.ts +0 -7
- package/ts/smartproxy/classes.pp.certprovisioner.ts +0 -200
- package/ts/smartproxy/classes.pp.snihandler.ts +0 -1281
- package/ts/smartproxy/forwarding/index.ts +0 -52
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import { ForwardingHandler } from './base-handler.js';
|
|
3
|
+
import { ForwardingHandlerEvents } from '../config/forwarding-types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Handler for HTTPS termination with HTTPS backend
|
|
6
|
+
*/
|
|
7
|
+
export class HttpsTerminateToHttpsHandler extends ForwardingHandler {
|
|
8
|
+
/**
|
|
9
|
+
* Create a new HTTPS termination with HTTPS backend handler
|
|
10
|
+
* @param config The forwarding configuration
|
|
11
|
+
*/
|
|
12
|
+
constructor(config) {
|
|
13
|
+
super(config);
|
|
14
|
+
this.secureContext = null;
|
|
15
|
+
// Validate that this is an HTTPS terminate to HTTPS configuration
|
|
16
|
+
if (config.type !== 'https-terminate-to-https') {
|
|
17
|
+
throw new Error(`Invalid configuration type for HttpsTerminateToHttpsHandler: ${config.type}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Initialize the handler, setting up TLS context
|
|
22
|
+
*/
|
|
23
|
+
async initialize() {
|
|
24
|
+
// We need to load or create TLS certificates for termination
|
|
25
|
+
if (this.config.https?.customCert) {
|
|
26
|
+
// Use custom certificate from configuration
|
|
27
|
+
this.secureContext = plugins.tls.createSecureContext({
|
|
28
|
+
key: this.config.https.customCert.key,
|
|
29
|
+
cert: this.config.https.customCert.cert
|
|
30
|
+
});
|
|
31
|
+
this.emit(ForwardingHandlerEvents.CERTIFICATE_LOADED, {
|
|
32
|
+
source: 'config',
|
|
33
|
+
domain: this.config.target.host
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
else if (this.config.acme?.enabled) {
|
|
37
|
+
// Request certificate through ACME if needed
|
|
38
|
+
this.emit(ForwardingHandlerEvents.CERTIFICATE_NEEDED, {
|
|
39
|
+
domain: Array.isArray(this.config.target.host)
|
|
40
|
+
? this.config.target.host[0]
|
|
41
|
+
: this.config.target.host,
|
|
42
|
+
useProduction: this.config.acme.production || false
|
|
43
|
+
});
|
|
44
|
+
// In a real implementation, we would wait for the certificate to be issued
|
|
45
|
+
// For now, we'll use a dummy context
|
|
46
|
+
this.secureContext = plugins.tls.createSecureContext({
|
|
47
|
+
key: '-----BEGIN PRIVATE KEY-----\nDummy key\n-----END PRIVATE KEY-----',
|
|
48
|
+
cert: '-----BEGIN CERTIFICATE-----\nDummy cert\n-----END CERTIFICATE-----'
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
throw new Error('HTTPS termination requires either a custom certificate or ACME enabled');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Set the secure context for TLS termination
|
|
57
|
+
* Called when a certificate is available
|
|
58
|
+
* @param context The secure context
|
|
59
|
+
*/
|
|
60
|
+
setSecureContext(context) {
|
|
61
|
+
this.secureContext = context;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Handle a TLS/SSL socket connection by terminating TLS and creating a new TLS connection to backend
|
|
65
|
+
* @param clientSocket The incoming socket from the client
|
|
66
|
+
*/
|
|
67
|
+
handleConnection(clientSocket) {
|
|
68
|
+
// Make sure we have a secure context
|
|
69
|
+
if (!this.secureContext) {
|
|
70
|
+
clientSocket.destroy(new Error('TLS secure context not initialized'));
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const remoteAddress = clientSocket.remoteAddress || 'unknown';
|
|
74
|
+
const remotePort = clientSocket.remotePort || 0;
|
|
75
|
+
// Create a TLS socket using our secure context
|
|
76
|
+
const tlsSocket = new plugins.tls.TLSSocket(clientSocket, {
|
|
77
|
+
secureContext: this.secureContext,
|
|
78
|
+
isServer: true
|
|
79
|
+
});
|
|
80
|
+
this.emit(ForwardingHandlerEvents.CONNECTED, {
|
|
81
|
+
remoteAddress,
|
|
82
|
+
remotePort,
|
|
83
|
+
tls: true
|
|
84
|
+
});
|
|
85
|
+
// Handle TLS errors
|
|
86
|
+
tlsSocket.on('error', (error) => {
|
|
87
|
+
this.emit(ForwardingHandlerEvents.ERROR, {
|
|
88
|
+
remoteAddress,
|
|
89
|
+
error: `TLS error: ${error.message}`
|
|
90
|
+
});
|
|
91
|
+
if (!tlsSocket.destroyed) {
|
|
92
|
+
tlsSocket.destroy();
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
// The TLS socket will now emit HTTP traffic that can be processed
|
|
96
|
+
// In a real implementation, we would create an HTTP parser and handle
|
|
97
|
+
// the requests here, but for simplicity, we'll just forward the data
|
|
98
|
+
// Get the target from configuration
|
|
99
|
+
const target = this.getTargetFromConfig();
|
|
100
|
+
// Set up the connection to the HTTPS backend
|
|
101
|
+
const connectToBackend = () => {
|
|
102
|
+
const backendSocket = plugins.tls.connect({
|
|
103
|
+
host: target.host,
|
|
104
|
+
port: target.port,
|
|
105
|
+
// In a real implementation, we would configure TLS options
|
|
106
|
+
rejectUnauthorized: false // For testing only, never use in production
|
|
107
|
+
}, () => {
|
|
108
|
+
this.emit(ForwardingHandlerEvents.DATA_FORWARDED, {
|
|
109
|
+
direction: 'outbound',
|
|
110
|
+
target: `${target.host}:${target.port}`,
|
|
111
|
+
tls: true
|
|
112
|
+
});
|
|
113
|
+
// Set up bidirectional data flow
|
|
114
|
+
tlsSocket.pipe(backendSocket);
|
|
115
|
+
backendSocket.pipe(tlsSocket);
|
|
116
|
+
});
|
|
117
|
+
backendSocket.on('error', (error) => {
|
|
118
|
+
this.emit(ForwardingHandlerEvents.ERROR, {
|
|
119
|
+
remoteAddress,
|
|
120
|
+
error: `Backend connection error: ${error.message}`
|
|
121
|
+
});
|
|
122
|
+
if (!tlsSocket.destroyed) {
|
|
123
|
+
tlsSocket.destroy();
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
// Handle close
|
|
127
|
+
backendSocket.on('close', () => {
|
|
128
|
+
if (!tlsSocket.destroyed) {
|
|
129
|
+
tlsSocket.destroy();
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
// Set timeout
|
|
133
|
+
const timeout = this.getTimeout();
|
|
134
|
+
backendSocket.setTimeout(timeout);
|
|
135
|
+
backendSocket.on('timeout', () => {
|
|
136
|
+
this.emit(ForwardingHandlerEvents.ERROR, {
|
|
137
|
+
remoteAddress,
|
|
138
|
+
error: 'Backend connection timeout'
|
|
139
|
+
});
|
|
140
|
+
if (!backendSocket.destroyed) {
|
|
141
|
+
backendSocket.destroy();
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
};
|
|
145
|
+
// Wait for the TLS handshake to complete before connecting to backend
|
|
146
|
+
tlsSocket.on('secure', () => {
|
|
147
|
+
connectToBackend();
|
|
148
|
+
});
|
|
149
|
+
// Handle close
|
|
150
|
+
tlsSocket.on('close', () => {
|
|
151
|
+
this.emit(ForwardingHandlerEvents.DISCONNECTED, {
|
|
152
|
+
remoteAddress
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
// Set timeout
|
|
156
|
+
const timeout = this.getTimeout();
|
|
157
|
+
tlsSocket.setTimeout(timeout);
|
|
158
|
+
tlsSocket.on('timeout', () => {
|
|
159
|
+
this.emit(ForwardingHandlerEvents.ERROR, {
|
|
160
|
+
remoteAddress,
|
|
161
|
+
error: 'TLS connection timeout'
|
|
162
|
+
});
|
|
163
|
+
if (!tlsSocket.destroyed) {
|
|
164
|
+
tlsSocket.destroy();
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Handle an HTTP request by forwarding to the HTTPS backend
|
|
170
|
+
* @param req The HTTP request
|
|
171
|
+
* @param res The HTTP response
|
|
172
|
+
*/
|
|
173
|
+
handleHttpRequest(req, res) {
|
|
174
|
+
// Check if we should redirect to HTTPS
|
|
175
|
+
if (this.config.http?.redirectToHttps) {
|
|
176
|
+
this.redirectToHttps(req, res);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
// Get the target from configuration
|
|
180
|
+
const target = this.getTargetFromConfig();
|
|
181
|
+
// Create custom headers with variable substitution
|
|
182
|
+
const variables = {
|
|
183
|
+
clientIp: req.socket.remoteAddress || 'unknown'
|
|
184
|
+
};
|
|
185
|
+
// Prepare headers, merging with any custom headers from config
|
|
186
|
+
const headers = this.applyCustomHeaders(req.headers, variables);
|
|
187
|
+
// Create the proxy request options
|
|
188
|
+
const options = {
|
|
189
|
+
hostname: target.host,
|
|
190
|
+
port: target.port,
|
|
191
|
+
path: req.url,
|
|
192
|
+
method: req.method,
|
|
193
|
+
headers,
|
|
194
|
+
// In a real implementation, we would configure TLS options
|
|
195
|
+
rejectUnauthorized: false // For testing only, never use in production
|
|
196
|
+
};
|
|
197
|
+
// Create the proxy request using HTTPS
|
|
198
|
+
const proxyReq = plugins.https.request(options, (proxyRes) => {
|
|
199
|
+
// Copy status code and headers from the proxied response
|
|
200
|
+
res.writeHead(proxyRes.statusCode || 500, proxyRes.headers);
|
|
201
|
+
// Pipe the proxy response to the client response
|
|
202
|
+
proxyRes.pipe(res);
|
|
203
|
+
// Track response size for logging
|
|
204
|
+
let responseSize = 0;
|
|
205
|
+
proxyRes.on('data', (chunk) => {
|
|
206
|
+
responseSize += chunk.length;
|
|
207
|
+
});
|
|
208
|
+
proxyRes.on('end', () => {
|
|
209
|
+
this.emit(ForwardingHandlerEvents.HTTP_RESPONSE, {
|
|
210
|
+
statusCode: proxyRes.statusCode,
|
|
211
|
+
headers: proxyRes.headers,
|
|
212
|
+
size: responseSize
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
// Handle errors in the proxy request
|
|
217
|
+
proxyReq.on('error', (error) => {
|
|
218
|
+
this.emit(ForwardingHandlerEvents.ERROR, {
|
|
219
|
+
remoteAddress: req.socket.remoteAddress,
|
|
220
|
+
error: `Proxy request error: ${error.message}`
|
|
221
|
+
});
|
|
222
|
+
// Send an error response if headers haven't been sent yet
|
|
223
|
+
if (!res.headersSent) {
|
|
224
|
+
res.writeHead(502, { 'Content-Type': 'text/plain' });
|
|
225
|
+
res.end(`Error forwarding request: ${error.message}`);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
// Just end the response if headers have already been sent
|
|
229
|
+
res.end();
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
// Track request details for logging
|
|
233
|
+
let requestSize = 0;
|
|
234
|
+
req.on('data', (chunk) => {
|
|
235
|
+
requestSize += chunk.length;
|
|
236
|
+
});
|
|
237
|
+
// Log the request
|
|
238
|
+
this.emit(ForwardingHandlerEvents.HTTP_REQUEST, {
|
|
239
|
+
method: req.method,
|
|
240
|
+
url: req.url,
|
|
241
|
+
headers: req.headers,
|
|
242
|
+
remoteAddress: req.socket.remoteAddress,
|
|
243
|
+
target: `${target.host}:${target.port}`
|
|
244
|
+
});
|
|
245
|
+
// Pipe the client request to the proxy request
|
|
246
|
+
if (req.readable) {
|
|
247
|
+
req.pipe(proxyReq);
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
proxyReq.end();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cHMtdGVybWluYXRlLXRvLWh0dHBzLWhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9mb3J3YXJkaW5nL2hhbmRsZXJzL2h0dHBzLXRlcm1pbmF0ZS10by1odHRwcy1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFdEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFeEU7O0dBRUc7QUFDSCxNQUFNLE9BQU8sNEJBQTZCLFNBQVEsaUJBQWlCO0lBR2pFOzs7T0FHRztJQUNILFlBQVksTUFBc0I7UUFDaEMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBUFIsa0JBQWEsR0FBcUMsSUFBSSxDQUFDO1FBUzdELGtFQUFrRTtRQUNsRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssMEJBQTBCLEVBQUUsQ0FBQztZQUMvQyxNQUFNLElBQUksS0FBSyxDQUFDLGdFQUFnRSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNqRyxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFVBQVU7UUFDckIsNkRBQTZEO1FBQzdELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUM7WUFDbEMsNENBQTRDO1lBQzVDLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQztnQkFDbkQsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHO2dCQUNyQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUk7YUFDeEMsQ0FBQyxDQUFDO1lBRUgs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
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forwarding handler implementations
|
|
3
|
+
*/
|
|
4
|
+
export { ForwardingHandler } from './base-handler.js';
|
|
5
|
+
export { HttpForwardingHandler } from './http-handler.js';
|
|
6
|
+
export { HttpsPassthroughHandler } from './https-passthrough-handler.js';
|
|
7
|
+
export { HttpsTerminateToHttpHandler } from './https-terminate-to-http-handler.js';
|
|
8
|
+
export { HttpsTerminateToHttpsHandler } from './https-terminate-to-https-handler.js';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forwarding handler implementations
|
|
3
|
+
*/
|
|
4
|
+
export { ForwardingHandler } from './base-handler.js';
|
|
5
|
+
export { HttpForwardingHandler } from './http-handler.js';
|
|
6
|
+
export { HttpsPassthroughHandler } from './https-passthrough-handler.js';
|
|
7
|
+
export { HttpsTerminateToHttpHandler } from './https-terminate-to-http-handler.js';
|
|
8
|
+
export { HttpsTerminateToHttpsHandler } from './https-terminate-to-https-handler.js';
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9mb3J3YXJkaW5nL2hhbmRsZXJzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDMUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDekUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDbkYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sdUNBQXVDLENBQUMifQ==
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forwarding system module
|
|
3
|
+
* Provides a flexible and type-safe way to configure and manage various forwarding strategies
|
|
4
|
+
*/
|
|
5
|
+
export * from './config/forwarding-types.js';
|
|
6
|
+
export * from './config/domain-config.js';
|
|
7
|
+
export * from './config/domain-manager.js';
|
|
8
|
+
export { ForwardingHandler } from './handlers/base-handler.js';
|
|
9
|
+
export * from './handlers/http-handler.js';
|
|
10
|
+
export * from './handlers/https-passthrough-handler.js';
|
|
11
|
+
export * from './handlers/https-terminate-to-http-handler.js';
|
|
12
|
+
export * from './handlers/https-terminate-to-https-handler.js';
|
|
13
|
+
export * from './factory/forwarding-factory.js';
|
|
14
|
+
export declare const helpers: {
|
|
15
|
+
httpOnly: (partialConfig: Partial<import("./config/forwarding-types.js").IForwardConfig> & Pick<import("./config/forwarding-types.js").IForwardConfig, "target">) => import("./config/forwarding-types.js").IForwardConfig;
|
|
16
|
+
tlsTerminateToHttp: (partialConfig: Partial<import("./config/forwarding-types.js").IForwardConfig> & Pick<import("./config/forwarding-types.js").IForwardConfig, "target">) => import("./config/forwarding-types.js").IForwardConfig;
|
|
17
|
+
tlsTerminateToHttps: (partialConfig: Partial<import("./config/forwarding-types.js").IForwardConfig> & Pick<import("./config/forwarding-types.js").IForwardConfig, "target">) => import("./config/forwarding-types.js").IForwardConfig;
|
|
18
|
+
httpsPassthrough: (partialConfig: Partial<import("./config/forwarding-types.js").IForwardConfig> & Pick<import("./config/forwarding-types.js").IForwardConfig, "target">) => import("./config/forwarding-types.js").IForwardConfig;
|
|
19
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forwarding system module
|
|
3
|
+
* Provides a flexible and type-safe way to configure and manage various forwarding strategies
|
|
4
|
+
*/
|
|
5
|
+
// Export types and configuration
|
|
6
|
+
export * from './config/forwarding-types.js';
|
|
7
|
+
export * from './config/domain-config.js';
|
|
8
|
+
export * from './config/domain-manager.js';
|
|
9
|
+
// Export handlers
|
|
10
|
+
export { ForwardingHandler } from './handlers/base-handler.js';
|
|
11
|
+
export * from './handlers/http-handler.js';
|
|
12
|
+
export * from './handlers/https-passthrough-handler.js';
|
|
13
|
+
export * from './handlers/https-terminate-to-http-handler.js';
|
|
14
|
+
export * from './handlers/https-terminate-to-https-handler.js';
|
|
15
|
+
// Export factory
|
|
16
|
+
export * from './factory/forwarding-factory.js';
|
|
17
|
+
// Helper functions as a convenience object
|
|
18
|
+
import { httpOnly, tlsTerminateToHttp, tlsTerminateToHttps, httpsPassthrough } from './config/forwarding-types.js';
|
|
19
|
+
export const helpers = {
|
|
20
|
+
httpOnly,
|
|
21
|
+
tlsTerminateToHttp,
|
|
22
|
+
tlsTerminateToHttps,
|
|
23
|
+
httpsPassthrough
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9mb3J3YXJkaW5nL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILGlDQUFpQztBQUNqQyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyw0QkFBNEIsQ0FBQztBQUUzQyxrQkFBa0I7QUFDbEIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLHlDQUF5QyxDQUFDO0FBQ3hELGNBQWMsK0NBQStDLENBQUM7QUFDOUQsY0FBYyxnREFBZ0QsQ0FBQztBQUUvRCxpQkFBaUI7QUFDakIsY0FBYyxpQ0FBaUMsQ0FBQztBQUVoRCwyQ0FBMkM7QUFDM0MsT0FBTyxFQUNMLFFBQVEsRUFDUixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLGdCQUFnQixFQUNqQixNQUFNLDhCQUE4QixDQUFDO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRztJQUNyQixRQUFRO0lBQ1Isa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQixnQkFBZ0I7Q0FDakIsQ0FBQyJ9
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP functionality module
|
|
3
|
+
*/
|
|
4
|
+
export * from './models/http-types.js';
|
|
5
|
+
export * from './port80/index.js';
|
|
6
|
+
export * from './router/index.js';
|
|
7
|
+
export * from './redirects/index.js';
|
|
8
|
+
import { Port80Handler } from './port80/port80-handler.js';
|
|
9
|
+
import { ChallengeResponder } from './port80/challenge-responder.js';
|
|
10
|
+
export declare const Http: {
|
|
11
|
+
Port80: {
|
|
12
|
+
Handler: typeof Port80Handler;
|
|
13
|
+
ChallengeResponder: typeof ChallengeResponder;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP functionality module
|
|
3
|
+
*/
|
|
4
|
+
// Export types and models
|
|
5
|
+
export * from './models/http-types.js';
|
|
6
|
+
// Export submodules
|
|
7
|
+
export * from './port80/index.js';
|
|
8
|
+
export * from './router/index.js';
|
|
9
|
+
export * from './redirects/index.js';
|
|
10
|
+
// Import the components we need for the namespace
|
|
11
|
+
import { Port80Handler } from './port80/port80-handler.js';
|
|
12
|
+
import { ChallengeResponder } from './port80/challenge-responder.js';
|
|
13
|
+
// Convenience namespace exports
|
|
14
|
+
export const Http = {
|
|
15
|
+
Port80: {
|
|
16
|
+
Handler: Port80Handler,
|
|
17
|
+
ChallengeResponder: ChallengeResponder
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9odHRwL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsMEJBQTBCO0FBQzFCLGNBQWMsd0JBQXdCLENBQUM7QUFFdkMsb0JBQW9CO0FBQ3BCLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLHNCQUFzQixDQUFDO0FBRXJDLGtEQUFrRDtBQUNsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFckUsZ0NBQWdDO0FBQ2hDLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRztJQUNsQixNQUFNLEVBQUU7UUFDTixPQUFPLEVBQUUsYUFBYTtRQUN0QixrQkFBa0IsRUFBRSxrQkFBa0I7S0FDdkM7Q0FDRixDQUFDIn0=
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import type { IDomainOptions } from '../../certificate/models/certificate-types.js';
|
|
3
|
+
/**
|
|
4
|
+
* HTTP-specific event types
|
|
5
|
+
*/
|
|
6
|
+
export declare enum HttpEvents {
|
|
7
|
+
REQUEST_RECEIVED = "request-received",
|
|
8
|
+
REQUEST_FORWARDED = "request-forwarded",
|
|
9
|
+
REQUEST_HANDLED = "request-handled",
|
|
10
|
+
REQUEST_ERROR = "request-error"
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* HTTP status codes as an enum for better type safety
|
|
14
|
+
*/
|
|
15
|
+
export declare enum HttpStatus {
|
|
16
|
+
OK = 200,
|
|
17
|
+
MOVED_PERMANENTLY = 301,
|
|
18
|
+
FOUND = 302,
|
|
19
|
+
TEMPORARY_REDIRECT = 307,
|
|
20
|
+
PERMANENT_REDIRECT = 308,
|
|
21
|
+
BAD_REQUEST = 400,
|
|
22
|
+
NOT_FOUND = 404,
|
|
23
|
+
METHOD_NOT_ALLOWED = 405,
|
|
24
|
+
INTERNAL_SERVER_ERROR = 500,
|
|
25
|
+
NOT_IMPLEMENTED = 501,
|
|
26
|
+
SERVICE_UNAVAILABLE = 503
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Represents a domain configuration with certificate status information
|
|
30
|
+
*/
|
|
31
|
+
export interface IDomainCertificate {
|
|
32
|
+
options: IDomainOptions;
|
|
33
|
+
certObtained: boolean;
|
|
34
|
+
obtainingInProgress: boolean;
|
|
35
|
+
certificate?: string;
|
|
36
|
+
privateKey?: string;
|
|
37
|
+
expiryDate?: Date;
|
|
38
|
+
lastRenewalAttempt?: Date;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Base error class for HTTP-related errors
|
|
42
|
+
*/
|
|
43
|
+
export declare class HttpError extends Error {
|
|
44
|
+
constructor(message: string);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Error related to certificate operations
|
|
48
|
+
*/
|
|
49
|
+
export declare class CertificateError extends HttpError {
|
|
50
|
+
readonly domain: string;
|
|
51
|
+
readonly isRenewal: boolean;
|
|
52
|
+
constructor(message: string, domain: string, isRenewal?: boolean);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Error related to server operations
|
|
56
|
+
*/
|
|
57
|
+
export declare class ServerError extends HttpError {
|
|
58
|
+
readonly code?: string;
|
|
59
|
+
constructor(message: string, code?: string);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Redirect configuration for HTTP requests
|
|
63
|
+
*/
|
|
64
|
+
export interface IRedirectConfig {
|
|
65
|
+
source: string;
|
|
66
|
+
destination: string;
|
|
67
|
+
type: HttpStatus;
|
|
68
|
+
preserveQuery?: boolean;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* HTTP router configuration
|
|
72
|
+
*/
|
|
73
|
+
export interface IRouterConfig {
|
|
74
|
+
routes: Array<{
|
|
75
|
+
path: string;
|
|
76
|
+
handler: (req: plugins.http.IncomingMessage, res: plugins.http.ServerResponse) => void;
|
|
77
|
+
}>;
|
|
78
|
+
notFoundHandler?: (req: plugins.http.IncomingMessage, res: plugins.http.ServerResponse) => void;
|
|
79
|
+
}
|
|
80
|
+
export { HttpError as Port80HandlerError };
|
|
81
|
+
export { CertificateError as CertError };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
/**
|
|
3
|
+
* HTTP-specific event types
|
|
4
|
+
*/
|
|
5
|
+
export var HttpEvents;
|
|
6
|
+
(function (HttpEvents) {
|
|
7
|
+
HttpEvents["REQUEST_RECEIVED"] = "request-received";
|
|
8
|
+
HttpEvents["REQUEST_FORWARDED"] = "request-forwarded";
|
|
9
|
+
HttpEvents["REQUEST_HANDLED"] = "request-handled";
|
|
10
|
+
HttpEvents["REQUEST_ERROR"] = "request-error";
|
|
11
|
+
})(HttpEvents || (HttpEvents = {}));
|
|
12
|
+
/**
|
|
13
|
+
* HTTP status codes as an enum for better type safety
|
|
14
|
+
*/
|
|
15
|
+
export var HttpStatus;
|
|
16
|
+
(function (HttpStatus) {
|
|
17
|
+
HttpStatus[HttpStatus["OK"] = 200] = "OK";
|
|
18
|
+
HttpStatus[HttpStatus["MOVED_PERMANENTLY"] = 301] = "MOVED_PERMANENTLY";
|
|
19
|
+
HttpStatus[HttpStatus["FOUND"] = 302] = "FOUND";
|
|
20
|
+
HttpStatus[HttpStatus["TEMPORARY_REDIRECT"] = 307] = "TEMPORARY_REDIRECT";
|
|
21
|
+
HttpStatus[HttpStatus["PERMANENT_REDIRECT"] = 308] = "PERMANENT_REDIRECT";
|
|
22
|
+
HttpStatus[HttpStatus["BAD_REQUEST"] = 400] = "BAD_REQUEST";
|
|
23
|
+
HttpStatus[HttpStatus["NOT_FOUND"] = 404] = "NOT_FOUND";
|
|
24
|
+
HttpStatus[HttpStatus["METHOD_NOT_ALLOWED"] = 405] = "METHOD_NOT_ALLOWED";
|
|
25
|
+
HttpStatus[HttpStatus["INTERNAL_SERVER_ERROR"] = 500] = "INTERNAL_SERVER_ERROR";
|
|
26
|
+
HttpStatus[HttpStatus["NOT_IMPLEMENTED"] = 501] = "NOT_IMPLEMENTED";
|
|
27
|
+
HttpStatus[HttpStatus["SERVICE_UNAVAILABLE"] = 503] = "SERVICE_UNAVAILABLE";
|
|
28
|
+
})(HttpStatus || (HttpStatus = {}));
|
|
29
|
+
/**
|
|
30
|
+
* Base error class for HTTP-related errors
|
|
31
|
+
*/
|
|
32
|
+
export class HttpError extends Error {
|
|
33
|
+
constructor(message) {
|
|
34
|
+
super(message);
|
|
35
|
+
this.name = 'HttpError';
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Error related to certificate operations
|
|
40
|
+
*/
|
|
41
|
+
export class CertificateError extends HttpError {
|
|
42
|
+
constructor(message, domain, isRenewal = false) {
|
|
43
|
+
super(`${message} for domain ${domain}${isRenewal ? ' (renewal)' : ''}`);
|
|
44
|
+
this.domain = domain;
|
|
45
|
+
this.isRenewal = isRenewal;
|
|
46
|
+
this.name = 'CertificateError';
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Error related to server operations
|
|
51
|
+
*/
|
|
52
|
+
export class ServerError extends HttpError {
|
|
53
|
+
constructor(message, code) {
|
|
54
|
+
super(message);
|
|
55
|
+
this.code = code;
|
|
56
|
+
this.name = 'ServerError';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Backward compatibility interfaces
|
|
60
|
+
export { HttpError as Port80HandlerError };
|
|
61
|
+
export { CertificateError as CertError };
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2h0dHAvbW9kZWxzL2h0dHAtdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQU81Qzs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLFVBS1g7QUFMRCxXQUFZLFVBQVU7SUFDcEIsbURBQXFDLENBQUE7SUFDckMscURBQXVDLENBQUE7SUFDdkMsaURBQW1DLENBQUE7SUFDbkMsNkNBQStCLENBQUE7QUFDakMsQ0FBQyxFQUxXLFVBQVUsS0FBVixVQUFVLFFBS3JCO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLENBQU4sSUFBWSxVQVlYO0FBWkQsV0FBWSxVQUFVO0lBQ3BCLHlDQUFRLENBQUE7SUFDUix1RUFBdUIsQ0FBQTtJQUN2QiwrQ0FBVyxDQUFBO0lBQ1gseUVBQXdCLENBQUE7SUFDeEIseUVBQXdCLENBQUE7SUFDeEIsMkRBQWlCLENBQUE7SUFDakIsdURBQWUsQ0FBQTtJQUNmLHlFQUF3QixDQUFBO0lBQ3hCLCtFQUEyQixDQUFBO0lBQzNCLG1FQUFxQixDQUFBO0lBQ3JCLDJFQUF5QixDQUFBO0FBQzNCLENBQUMsRUFaVyxVQUFVLEtBQVYsVUFBVSxRQVlyQjtBQWVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFNBQVUsU0FBUSxLQUFLO0lBQ2xDLFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQztJQUMxQixDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxTQUFTO0lBQzdDLFlBQ0UsT0FBZSxFQUNDLE1BQWMsRUFDZCxZQUFxQixLQUFLO1FBRTFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sZUFBZSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFIekQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGNBQVMsR0FBVCxTQUFTLENBQWlCO1FBRzFDLElBQUksQ0FBQyxJQUFJLEdBQUcsa0JBQWtCLENBQUM7SUFDakMsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sV0FBWSxTQUFRLFNBQVM7SUFDeEMsWUFBWSxPQUFlLEVBQWtCLElBQWE7UUFDeEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRDRCLFNBQUksR0FBSixJQUFJLENBQVM7UUFFeEQsSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUM7SUFDNUIsQ0FBQztDQUNGO0FBdUJELG9DQUFvQztBQUNwQyxPQUFPLEVBQUUsU0FBUyxJQUFJLGtCQUFrQixFQUFFLENBQUM7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixJQUFJLFNBQVMsRUFBRSxDQUFDIn0=
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for SmartAcme interfaces used by ChallengeResponder
|
|
3
|
+
* These reflect the actual SmartAcme API based on the documentation
|
|
4
|
+
*/
|
|
5
|
+
import * as plugins from '../../plugins.js';
|
|
6
|
+
/**
|
|
7
|
+
* Structure for SmartAcme certificate result
|
|
8
|
+
*/
|
|
9
|
+
export interface ISmartAcmeCert {
|
|
10
|
+
id?: string;
|
|
11
|
+
domainName: string;
|
|
12
|
+
created?: number | Date | string;
|
|
13
|
+
privateKey: string;
|
|
14
|
+
publicKey: string;
|
|
15
|
+
csr?: string;
|
|
16
|
+
validUntil: number | Date | string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Structure for SmartAcme options
|
|
20
|
+
*/
|
|
21
|
+
export interface ISmartAcmeOptions {
|
|
22
|
+
accountEmail: string;
|
|
23
|
+
certManager: ICertManager;
|
|
24
|
+
environment: 'production' | 'integration';
|
|
25
|
+
challengeHandlers: IChallengeHandler<any>[];
|
|
26
|
+
challengePriority?: string[];
|
|
27
|
+
retryOptions?: {
|
|
28
|
+
retries?: number;
|
|
29
|
+
factor?: number;
|
|
30
|
+
minTimeoutMs?: number;
|
|
31
|
+
maxTimeoutMs?: number;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Interface for certificate manager
|
|
36
|
+
*/
|
|
37
|
+
export interface ICertManager {
|
|
38
|
+
init(): Promise<void>;
|
|
39
|
+
get(domainName: string): Promise<ISmartAcmeCert | null>;
|
|
40
|
+
put(cert: ISmartAcmeCert): Promise<ISmartAcmeCert>;
|
|
41
|
+
delete(domainName: string): Promise<void>;
|
|
42
|
+
close?(): Promise<void>;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Interface for challenge handler
|
|
46
|
+
*/
|
|
47
|
+
export interface IChallengeHandler<T> {
|
|
48
|
+
getSupportedTypes(): string[];
|
|
49
|
+
prepare(ch: T): Promise<void>;
|
|
50
|
+
verify?(ch: T): Promise<void>;
|
|
51
|
+
cleanup(ch: T): Promise<void>;
|
|
52
|
+
checkWetherDomainIsSupported(domain: string): Promise<boolean>;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* HTTP-01 challenge type
|
|
56
|
+
*/
|
|
57
|
+
export interface IHttp01Challenge {
|
|
58
|
+
type: string;
|
|
59
|
+
token: string;
|
|
60
|
+
keyAuthorization: string;
|
|
61
|
+
webPath: string;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* HTTP-01 Memory Handler Interface
|
|
65
|
+
*/
|
|
66
|
+
export interface IHttp01MemoryHandler extends IChallengeHandler<IHttp01Challenge> {
|
|
67
|
+
handleRequest(req: plugins.http.IncomingMessage, res: plugins.http.ServerResponse, next?: () => void): void;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* SmartAcme main class interface
|
|
71
|
+
*/
|
|
72
|
+
export interface ISmartAcme {
|
|
73
|
+
start(): Promise<void>;
|
|
74
|
+
stop(): Promise<void>;
|
|
75
|
+
getCertificateForDomain(domain: string): Promise<ISmartAcmeCert>;
|
|
76
|
+
on?(event: string, listener: (data: any) => void): void;
|
|
77
|
+
eventEmitter?: plugins.EventEmitter;
|
|
78
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for SmartAcme interfaces used by ChallengeResponder
|
|
3
|
+
* These reflect the actual SmartAcme API based on the documentation
|
|
4
|
+
*/
|
|
5
|
+
import * as plugins from '../../plugins.js';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNtZS1pbnRlcmZhY2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvaHR0cC9wb3J0ODAvYWNtZS1pbnRlcmZhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNILE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUMifQ==
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import { IncomingMessage, ServerResponse } from 'http';
|
|
3
|
+
import type { ICertificateData } from '../../certificate/models/certificate-types.js';
|
|
4
|
+
/**
|
|
5
|
+
* ChallengeResponder handles ACME HTTP-01 challenges by leveraging SmartAcme
|
|
6
|
+
* It acts as a bridge between the HTTP server and the ACME challenge verification process
|
|
7
|
+
*/
|
|
8
|
+
export declare class ChallengeResponder extends plugins.EventEmitter {
|
|
9
|
+
private readonly useProduction;
|
|
10
|
+
private readonly email;
|
|
11
|
+
private readonly certificateStore;
|
|
12
|
+
private smartAcme;
|
|
13
|
+
private http01Handler;
|
|
14
|
+
/**
|
|
15
|
+
* Creates a new challenge responder
|
|
16
|
+
* @param useProduction Whether to use production ACME servers
|
|
17
|
+
* @param email Account email for ACME
|
|
18
|
+
* @param certificateStore Directory to store certificates
|
|
19
|
+
*/
|
|
20
|
+
constructor(useProduction?: boolean, email?: string, certificateStore?: string);
|
|
21
|
+
/**
|
|
22
|
+
* Initialize the ACME client
|
|
23
|
+
*/
|
|
24
|
+
initialize(): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Ensure the certificate store directory exists
|
|
27
|
+
*/
|
|
28
|
+
private ensureCertificateStore;
|
|
29
|
+
/**
|
|
30
|
+
* Setup event listeners to forward SmartACME events to our own event emitter
|
|
31
|
+
*/
|
|
32
|
+
private setupEventListeners;
|
|
33
|
+
/**
|
|
34
|
+
* Handle HTTP request by checking if it's an ACME challenge
|
|
35
|
+
* @param req HTTP request object
|
|
36
|
+
* @param res HTTP response object
|
|
37
|
+
* @returns true if the request was handled, false otherwise
|
|
38
|
+
*/
|
|
39
|
+
handleRequest(req: IncomingMessage, res: ServerResponse): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Request a certificate for a domain
|
|
42
|
+
* @param domain Domain name to request a certificate for
|
|
43
|
+
* @param isRenewal Whether this is a renewal request
|
|
44
|
+
*/
|
|
45
|
+
requestCertificate(domain: string, isRenewal?: boolean): Promise<ICertificateData>;
|
|
46
|
+
/**
|
|
47
|
+
* Check if a certificate is expiring soon and trigger renewal if needed
|
|
48
|
+
* @param domain Domain name
|
|
49
|
+
* @param certificate Certificate data
|
|
50
|
+
* @param thresholdDays Days before expiry to trigger renewal
|
|
51
|
+
*/
|
|
52
|
+
checkCertificateExpiry(domain: string, certificate: ICertificateData, thresholdDays?: number): void;
|
|
53
|
+
}
|