@push.rocks/smartproxy 19.3.2 → 19.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/forwarding/factory/forwarding-factory.js +29 -1
- package/dist_ts/http/index.d.ts +1 -3
- package/dist_ts/http/index.js +4 -10
- package/dist_ts/http/models/http-types.d.ts +4 -91
- package/dist_ts/http/models/http-types.js +5 -60
- package/dist_ts/http/router/proxy-router.d.ts +1 -1
- package/dist_ts/http/router/route-router.d.ts +1 -1
- package/dist_ts/index.d.ts +9 -7
- package/dist_ts/index.js +10 -7
- package/dist_ts/proxies/{network-proxy → http-proxy}/certificate-manager.d.ts +2 -2
- package/dist_ts/proxies/{network-proxy → http-proxy}/certificate-manager.js +1 -1
- package/dist_ts/proxies/{network-proxy → http-proxy}/connection-pool.d.ts +2 -2
- package/dist_ts/proxies/http-proxy/connection-pool.js +210 -0
- package/dist_ts/proxies/http-proxy/context-creator.js +108 -0
- package/dist_ts/proxies/{network-proxy → http-proxy}/function-cache.js +1 -1
- package/dist_ts/proxies/http-proxy/handlers/index.d.ts +5 -0
- package/dist_ts/proxies/http-proxy/handlers/index.js +6 -0
- package/dist_ts/proxies/http-proxy/handlers/redirect-handler.d.ts +18 -0
- package/dist_ts/proxies/http-proxy/handlers/redirect-handler.js +78 -0
- package/dist_ts/proxies/http-proxy/handlers/static-handler.d.ts +19 -0
- package/dist_ts/proxies/http-proxy/handlers/static-handler.js +203 -0
- package/dist_ts/proxies/{network-proxy/network-proxy.d.ts → http-proxy/http-proxy.d.ts} +10 -9
- package/dist_ts/proxies/{network-proxy/network-proxy.js → http-proxy/http-proxy.js} +13 -12
- package/dist_ts/proxies/{network-proxy → http-proxy}/http-request-handler.js +1 -1
- package/dist_ts/proxies/http-proxy/http2-request-handler.js +201 -0
- package/dist_ts/proxies/{network-proxy → http-proxy}/index.d.ts +2 -2
- package/dist_ts/proxies/http-proxy/index.js +12 -0
- package/dist_ts/proxies/http-proxy/models/http-types.d.ts +119 -0
- package/dist_ts/proxies/http-proxy/models/http-types.js +112 -0
- package/dist_ts/proxies/http-proxy/models/index.d.ts +5 -0
- package/dist_ts/proxies/http-proxy/models/index.js +6 -0
- package/dist_ts/proxies/{network-proxy → http-proxy}/models/types.d.ts +2 -2
- package/dist_ts/proxies/http-proxy/models/types.js +276 -0
- package/dist_ts/proxies/{network-proxy → http-proxy}/request-handler.d.ts +3 -3
- package/dist_ts/proxies/{network-proxy → http-proxy}/request-handler.js +2 -2
- package/dist_ts/proxies/http-proxy/security-manager.js +255 -0
- package/dist_ts/proxies/{network-proxy → http-proxy}/websocket-handler.d.ts +3 -3
- package/dist_ts/proxies/{network-proxy → http-proxy}/websocket-handler.js +2 -2
- package/dist_ts/proxies/index.d.ts +5 -5
- package/dist_ts/proxies/index.js +5 -5
- package/dist_ts/proxies/smart-proxy/certificate-manager.d.ts +4 -4
- package/dist_ts/proxies/smart-proxy/certificate-manager.js +11 -11
- package/dist_ts/proxies/smart-proxy/http-proxy-bridge.d.ts +41 -0
- package/dist_ts/proxies/smart-proxy/http-proxy-bridge.js +121 -0
- package/dist_ts/proxies/smart-proxy/index.d.ts +2 -1
- package/dist_ts/proxies/smart-proxy/index.js +4 -2
- package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +2 -2
- package/dist_ts/proxies/smart-proxy/port-manager.js +3 -3
- package/dist_ts/proxies/smart-proxy/route-connection-handler.d.ts +3 -3
- package/dist_ts/proxies/smart-proxy/route-connection-handler.js +24 -265
- package/dist_ts/proxies/smart-proxy/smart-proxy.d.ts +1 -1
- package/dist_ts/proxies/smart-proxy/smart-proxy.js +25 -25
- package/dist_ts/routing/index.d.ts +5 -0
- package/dist_ts/routing/index.js +8 -0
- package/dist_ts/routing/models/http-types.d.ts +6 -0
- package/dist_ts/routing/models/http-types.js +7 -0
- package/dist_ts/routing/router/index.d.ts +8 -0
- package/dist_ts/routing/router/index.js +7 -0
- package/dist_ts/{classes.router.d.ts → routing/router/proxy-router.d.ts} +14 -11
- package/dist_ts/{classes.router.js → routing/router/proxy-router.js} +2 -2
- package/dist_ts/routing/router/route-router.d.ts +108 -0
- package/dist_ts/routing/router/route-router.js +393 -0
- package/package.json +1 -1
- package/readme.md +12 -12
- package/readme.plan.md +152 -257
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/forwarding/factory/forwarding-factory.ts +28 -0
- package/ts/index.ts +13 -9
- package/ts/proxies/{network-proxy → http-proxy}/certificate-manager.ts +2 -2
- package/ts/proxies/{network-proxy → http-proxy}/connection-pool.ts +2 -2
- package/ts/proxies/http-proxy/handlers/index.ts +6 -0
- package/ts/proxies/http-proxy/handlers/redirect-handler.ts +105 -0
- package/ts/proxies/http-proxy/handlers/static-handler.ts +251 -0
- package/ts/proxies/{network-proxy/network-proxy.ts → http-proxy/http-proxy.ts} +15 -14
- package/ts/proxies/{network-proxy → http-proxy}/index.ts +3 -3
- package/ts/proxies/http-proxy/models/http-types.ts +165 -0
- package/ts/proxies/http-proxy/models/index.ts +5 -0
- package/ts/proxies/{network-proxy → http-proxy}/models/types.ts +2 -2
- package/ts/proxies/{network-proxy → http-proxy}/request-handler.ts +3 -3
- package/ts/proxies/{network-proxy → http-proxy}/websocket-handler.ts +3 -3
- package/ts/proxies/index.ts +7 -7
- package/ts/proxies/smart-proxy/certificate-manager.ts +10 -10
- package/ts/proxies/smart-proxy/{network-proxy-bridge.ts → http-proxy-bridge.ts} +44 -44
- package/ts/proxies/smart-proxy/index.ts +4 -1
- package/ts/proxies/smart-proxy/models/interfaces.ts +3 -3
- package/ts/proxies/smart-proxy/port-manager.ts +2 -2
- package/ts/proxies/smart-proxy/route-connection-handler.ts +23 -307
- package/ts/proxies/smart-proxy/smart-proxy.ts +25 -25
- package/ts/routing/index.ts +9 -0
- package/ts/routing/models/http-types.ts +6 -0
- package/ts/{http → routing}/router/proxy-router.ts +1 -1
- package/ts/{http → routing}/router/route-router.ts +1 -1
- package/dist_ts/certificate/acme/acme-factory.d.ts +0 -17
- package/dist_ts/certificate/acme/acme-factory.js +0 -40
- package/dist_ts/certificate/acme/challenge-handler.d.ts +0 -44
- package/dist_ts/certificate/acme/challenge-handler.js +0 -92
- package/dist_ts/certificate/acme/index.d.ts +0 -4
- package/dist_ts/certificate/acme/index.js +0 -5
- package/dist_ts/certificate/certificate-manager.d.ts +0 -150
- package/dist_ts/certificate/certificate-manager.js +0 -505
- package/dist_ts/certificate/events/certificate-events.d.ts +0 -33
- package/dist_ts/certificate/events/certificate-events.js +0 -38
- package/dist_ts/certificate/events/simplified-events.d.ts +0 -56
- package/dist_ts/certificate/events/simplified-events.js +0 -13
- package/dist_ts/certificate/index.d.ts +0 -30
- package/dist_ts/certificate/index.js +0 -37
- package/dist_ts/certificate/models/certificate-errors.d.ts +0 -69
- package/dist_ts/certificate/models/certificate-errors.js +0 -141
- package/dist_ts/certificate/models/certificate-strategy.d.ts +0 -60
- package/dist_ts/certificate/models/certificate-strategy.js +0 -73
- package/dist_ts/certificate/models/certificate-types.d.ts +0 -97
- package/dist_ts/certificate/models/certificate-types.js +0 -2
- package/dist_ts/certificate/providers/cert-provisioner.d.ts +0 -119
- package/dist_ts/certificate/providers/cert-provisioner.js +0 -422
- package/dist_ts/certificate/providers/index.d.ts +0 -4
- package/dist_ts/certificate/providers/index.js +0 -5
- package/dist_ts/certificate/simplified-certificate-manager.d.ts +0 -150
- package/dist_ts/certificate/simplified-certificate-manager.js +0 -501
- package/dist_ts/certificate/storage/file-storage.d.ts +0 -66
- package/dist_ts/certificate/storage/file-storage.js +0 -194
- package/dist_ts/certificate/storage/index.d.ts +0 -4
- package/dist_ts/certificate/storage/index.js +0 -5
- package/dist_ts/certificate/utils/certificate-helpers.d.ts +0 -17
- package/dist_ts/certificate/utils/certificate-helpers.js +0 -45
- package/dist_ts/classes.iptablesproxy.d.ts +0 -112
- package/dist_ts/classes.iptablesproxy.js +0 -765
- package/dist_ts/classes.networkproxy.d.ts +0 -243
- package/dist_ts/classes.networkproxy.js +0 -1424
- package/dist_ts/classes.nftablesproxy.d.ts +0 -219
- package/dist_ts/classes.nftablesproxy.js +0 -1542
- package/dist_ts/classes.port80handler.d.ts +0 -215
- package/dist_ts/classes.port80handler.js +0 -736
- package/dist_ts/classes.portproxy.d.ts +0 -171
- package/dist_ts/classes.portproxy.js +0 -1802
- package/dist_ts/classes.pp.acmemanager.d.ts +0 -34
- package/dist_ts/classes.pp.acmemanager.js +0 -123
- package/dist_ts/classes.pp.connectionhandler.d.ts +0 -39
- package/dist_ts/classes.pp.connectionhandler.js +0 -754
- package/dist_ts/classes.pp.connectionmanager.d.ts +0 -78
- package/dist_ts/classes.pp.connectionmanager.js +0 -378
- package/dist_ts/classes.pp.domainconfigmanager.d.ts +0 -55
- package/dist_ts/classes.pp.domainconfigmanager.js +0 -103
- package/dist_ts/classes.pp.interfaces.d.ts +0 -133
- package/dist_ts/classes.pp.interfaces.js +0 -2
- package/dist_ts/classes.pp.networkproxybridge.d.ts +0 -57
- package/dist_ts/classes.pp.networkproxybridge.js +0 -306
- package/dist_ts/classes.pp.portproxy.d.ts +0 -64
- package/dist_ts/classes.pp.portproxy.js +0 -567
- package/dist_ts/classes.pp.portrangemanager.d.ts +0 -56
- package/dist_ts/classes.pp.portrangemanager.js +0 -179
- package/dist_ts/classes.pp.securitymanager.d.ts +0 -47
- package/dist_ts/classes.pp.securitymanager.js +0 -126
- package/dist_ts/classes.pp.snihandler.d.ts +0 -153
- package/dist_ts/classes.pp.snihandler.js +0 -1053
- package/dist_ts/classes.pp.timeoutmanager.d.ts +0 -47
- package/dist_ts/classes.pp.timeoutmanager.js +0 -154
- package/dist_ts/classes.pp.tlsalert.d.ts +0 -149
- package/dist_ts/classes.pp.tlsalert.js +0 -225
- package/dist_ts/classes.pp.tlsmanager.d.ts +0 -57
- package/dist_ts/classes.pp.tlsmanager.js +0 -132
- package/dist_ts/classes.snihandler.d.ts +0 -198
- package/dist_ts/classes.snihandler.js +0 -1210
- package/dist_ts/classes.sslredirect.d.ts +0 -8
- package/dist_ts/classes.sslredirect.js +0 -28
- package/dist_ts/common/acmeFactory.d.ts +0 -9
- package/dist_ts/common/acmeFactory.js +0 -20
- package/dist_ts/common/port80-adapter.d.ts +0 -11
- package/dist_ts/common/port80-adapter.js +0 -87
- package/dist_ts/examples/forwarding-example.d.ts +0 -1
- package/dist_ts/examples/forwarding-example.js +0 -96
- package/dist_ts/forwarding/config/domain-config.d.ts +0 -12
- package/dist_ts/forwarding/config/domain-config.js +0 -12
- package/dist_ts/forwarding/config/domain-manager.d.ts +0 -86
- package/dist_ts/forwarding/config/domain-manager.js +0 -242
- package/dist_ts/helpers.certificates.d.ts +0 -5
- package/dist_ts/helpers.certificates.js +0 -23
- package/dist_ts/http/port80/acme-interfaces.d.ts +0 -108
- package/dist_ts/http/port80/acme-interfaces.js +0 -51
- package/dist_ts/http/port80/challenge-responder.d.ts +0 -53
- package/dist_ts/http/port80/challenge-responder.js +0 -203
- package/dist_ts/http/port80/index.d.ts +0 -6
- package/dist_ts/http/port80/index.js +0 -9
- package/dist_ts/http/port80/port80-handler.d.ts +0 -136
- package/dist_ts/http/port80/port80-handler.js +0 -592
- package/dist_ts/http/redirects/index.d.ts +0 -4
- package/dist_ts/http/redirects/index.js +0 -5
- package/dist_ts/networkproxy/classes.np.certificatemanager.d.ts +0 -77
- package/dist_ts/networkproxy/classes.np.certificatemanager.js +0 -372
- package/dist_ts/networkproxy/classes.np.connectionpool.d.ts +0 -47
- package/dist_ts/networkproxy/classes.np.connectionpool.js +0 -210
- package/dist_ts/networkproxy/classes.np.networkproxy.d.ts +0 -118
- package/dist_ts/networkproxy/classes.np.networkproxy.js +0 -387
- package/dist_ts/networkproxy/classes.np.requesthandler.d.ts +0 -56
- package/dist_ts/networkproxy/classes.np.requesthandler.js +0 -393
- package/dist_ts/networkproxy/classes.np.types.d.ts +0 -83
- package/dist_ts/networkproxy/classes.np.types.js +0 -35
- package/dist_ts/networkproxy/classes.np.websockethandler.d.ts +0 -38
- package/dist_ts/networkproxy/classes.np.websockethandler.js +0 -188
- package/dist_ts/networkproxy/index.d.ts +0 -1
- package/dist_ts/networkproxy/index.js +0 -4
- package/dist_ts/nfttablesproxy/classes.nftablesproxy.d.ts +0 -219
- package/dist_ts/nfttablesproxy/classes.nftablesproxy.js +0 -1542
- package/dist_ts/port80handler/classes.port80handler.d.ts +0 -10
- package/dist_ts/port80handler/classes.port80handler.js +0 -16
- package/dist_ts/proxies/network-proxy/connection-pool.js +0 -210
- package/dist_ts/proxies/network-proxy/context-creator.js +0 -108
- package/dist_ts/proxies/network-proxy/http2-request-handler.js +0 -201
- package/dist_ts/proxies/network-proxy/index.js +0 -12
- package/dist_ts/proxies/network-proxy/models/index.d.ts +0 -4
- package/dist_ts/proxies/network-proxy/models/index.js +0 -5
- package/dist_ts/proxies/network-proxy/models/types.js +0 -276
- package/dist_ts/proxies/network-proxy/security-manager.js +0 -255
- package/dist_ts/proxies/network-proxy/simplified-certificate-bridge.d.ts +0 -48
- package/dist_ts/proxies/network-proxy/simplified-certificate-bridge.js +0 -76
- package/dist_ts/proxies/smart-proxy/connection-handler.d.ts +0 -39
- package/dist_ts/proxies/smart-proxy/connection-handler.js +0 -894
- package/dist_ts/proxies/smart-proxy/domain-config-manager.d.ts +0 -110
- package/dist_ts/proxies/smart-proxy/domain-config-manager.js +0 -386
- package/dist_ts/proxies/smart-proxy/legacy-smart-proxy.d.ts +0 -168
- package/dist_ts/proxies/smart-proxy/legacy-smart-proxy.js +0 -642
- package/dist_ts/proxies/smart-proxy/models/simplified-smartproxy-config.d.ts +0 -65
- package/dist_ts/proxies/smart-proxy/models/simplified-smartproxy-config.js +0 -31
- package/dist_ts/proxies/smart-proxy/models/smartproxy-options.d.ts +0 -102
- package/dist_ts/proxies/smart-proxy/models/smartproxy-options.js +0 -73
- package/dist_ts/proxies/smart-proxy/network-proxy-bridge.d.ts +0 -41
- package/dist_ts/proxies/smart-proxy/network-proxy-bridge.js +0 -121
- package/dist_ts/proxies/smart-proxy/port-range-manager.d.ts +0 -56
- package/dist_ts/proxies/smart-proxy/port-range-manager.js +0 -176
- package/dist_ts/proxies/smart-proxy/route-helpers/index.d.ts +0 -9
- package/dist_ts/proxies/smart-proxy/route-helpers/index.js +0 -11
- package/dist_ts/proxies/smart-proxy/route-helpers.d.ts +0 -7
- package/dist_ts/proxies/smart-proxy/route-helpers.js +0 -9
- package/dist_ts/proxies/smart-proxy/simplified-smart-proxy.d.ts +0 -41
- package/dist_ts/proxies/smart-proxy/simplified-smart-proxy.js +0 -132
- package/dist_ts/proxies/smart-proxy/utils/route-migration-utils.d.ts +0 -51
- package/dist_ts/proxies/smart-proxy/utils/route-migration-utils.js +0 -124
- package/dist_ts/redirect/classes.redirect.d.ts +0 -96
- package/dist_ts/redirect/classes.redirect.js +0 -194
- package/dist_ts/smartproxy/classes.pp.certprovisioner.d.ts +0 -54
- package/dist_ts/smartproxy/classes.pp.certprovisioner.js +0 -179
- package/dist_ts/smartproxy/classes.pp.connectionhandler.d.ts +0 -39
- package/dist_ts/smartproxy/classes.pp.connectionhandler.js +0 -894
- package/dist_ts/smartproxy/classes.pp.connectionmanager.d.ts +0 -78
- package/dist_ts/smartproxy/classes.pp.connectionmanager.js +0 -378
- package/dist_ts/smartproxy/classes.pp.domainconfigmanager.d.ts +0 -94
- package/dist_ts/smartproxy/classes.pp.domainconfigmanager.js +0 -255
- package/dist_ts/smartproxy/classes.pp.interfaces.d.ts +0 -103
- package/dist_ts/smartproxy/classes.pp.interfaces.js +0 -2
- package/dist_ts/smartproxy/classes.pp.networkproxybridge.d.ts +0 -62
- package/dist_ts/smartproxy/classes.pp.networkproxybridge.js +0 -316
- package/dist_ts/smartproxy/classes.pp.portrangemanager.d.ts +0 -56
- package/dist_ts/smartproxy/classes.pp.portrangemanager.js +0 -176
- package/dist_ts/smartproxy/classes.pp.securitymanager.d.ts +0 -64
- package/dist_ts/smartproxy/classes.pp.securitymanager.js +0 -149
- package/dist_ts/smartproxy/classes.pp.snihandler.d.ts +0 -153
- package/dist_ts/smartproxy/classes.pp.snihandler.js +0 -1053
- package/dist_ts/smartproxy/classes.pp.timeoutmanager.d.ts +0 -47
- package/dist_ts/smartproxy/classes.pp.timeoutmanager.js +0 -154
- package/dist_ts/smartproxy/classes.pp.tlsalert.d.ts +0 -149
- package/dist_ts/smartproxy/classes.pp.tlsalert.js +0 -225
- package/dist_ts/smartproxy/classes.pp.tlsmanager.d.ts +0 -57
- package/dist_ts/smartproxy/classes.pp.tlsmanager.js +0 -132
- package/dist_ts/smartproxy/classes.smartproxy.d.ts +0 -63
- package/dist_ts/smartproxy/classes.smartproxy.js +0 -521
- package/dist_ts/smartproxy/forwarding/domain-config.d.ts +0 -12
- package/dist_ts/smartproxy/forwarding/domain-config.js +0 -12
- package/dist_ts/smartproxy/forwarding/domain-manager.d.ts +0 -86
- package/dist_ts/smartproxy/forwarding/domain-manager.js +0 -241
- package/dist_ts/smartproxy/forwarding/forwarding.factory.d.ts +0 -24
- package/dist_ts/smartproxy/forwarding/forwarding.factory.js +0 -137
- package/dist_ts/smartproxy/forwarding/forwarding.handler.d.ts +0 -55
- package/dist_ts/smartproxy/forwarding/forwarding.handler.js +0 -94
- package/dist_ts/smartproxy/forwarding/http.handler.d.ts +0 -25
- package/dist_ts/smartproxy/forwarding/http.handler.js +0 -123
- package/dist_ts/smartproxy/forwarding/https-passthrough.handler.d.ts +0 -24
- package/dist_ts/smartproxy/forwarding/https-passthrough.handler.js +0 -154
- package/dist_ts/smartproxy/forwarding/https-terminate-to-http.handler.d.ts +0 -36
- package/dist_ts/smartproxy/forwarding/https-terminate-to-http.handler.js +0 -229
- package/dist_ts/smartproxy/forwarding/https-terminate-to-https.handler.d.ts +0 -35
- package/dist_ts/smartproxy/forwarding/https-terminate-to-https.handler.js +0 -254
- package/dist_ts/smartproxy/forwarding/index.d.ts +0 -16
- package/dist_ts/smartproxy/forwarding/index.js +0 -23
- package/dist_ts/smartproxy/types/forwarding.types.d.ts +0 -104
- package/dist_ts/smartproxy/types/forwarding.types.js +0 -50
- package/dist_ts/smartproxy.classes.networkproxy.d.ts +0 -31
- package/dist_ts/smartproxy.classes.networkproxy.js +0 -305
- package/dist_ts/smartproxy.classes.router.d.ts +0 -13
- package/dist_ts/smartproxy.classes.router.js +0 -33
- package/dist_ts/smartproxy.classes.sslredirect.d.ts +0 -8
- package/dist_ts/smartproxy.classes.sslredirect.js +0 -28
- package/dist_ts/smartproxy.helpers.certificates.d.ts +0 -5
- package/dist_ts/smartproxy.helpers.certificates.js +0 -23
- package/dist_ts/smartproxy.plugins.d.ts +0 -18
- package/dist_ts/smartproxy.plugins.js +0 -23
- package/dist_ts/smartproxy.portproxy.d.ts +0 -26
- package/dist_ts/smartproxy.portproxy.js +0 -295
- package/ts/http/index.ts +0 -16
- package/ts/http/models/http-types.ts +0 -108
- package/ts/http/redirects/index.ts +0 -3
- package/ts/proxies/network-proxy/models/index.ts +0 -4
- package/ts/redirect/classes.redirect.ts +0 -295
- /package/dist_ts/proxies/{network-proxy → http-proxy}/context-creator.d.ts +0 -0
- /package/dist_ts/proxies/{network-proxy → http-proxy}/function-cache.d.ts +0 -0
- /package/dist_ts/proxies/{network-proxy → http-proxy}/http-request-handler.d.ts +0 -0
- /package/dist_ts/proxies/{network-proxy → http-proxy}/http2-request-handler.d.ts +0 -0
- /package/dist_ts/proxies/{network-proxy → http-proxy}/security-manager.d.ts +0 -0
- /package/ts/proxies/{network-proxy → http-proxy}/context-creator.ts +0 -0
- /package/ts/proxies/{network-proxy → http-proxy}/function-cache.ts +0 -0
- /package/ts/proxies/{network-proxy → http-proxy}/http-request-handler.ts +0 -0
- /package/ts/proxies/{network-proxy → http-proxy}/http2-request-handler.ts +0 -0
- /package/ts/proxies/{network-proxy → http-proxy}/security-manager.ts +0 -0
- /package/ts/{http → routing}/router/index.ts +0 -0
|
@@ -1,422 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../../plugins.js';
|
|
2
|
-
import { Port80HandlerEvents, CertProvisionerEvents } from '../events/certificate-events.js';
|
|
3
|
-
import { Port80Handler } from '../../http/port80/port80-handler.js';
|
|
4
|
-
/**
|
|
5
|
-
* CertProvisioner manages certificate provisioning and renewal workflows,
|
|
6
|
-
* unifying static certificates and HTTP-01 challenges via Port80Handler.
|
|
7
|
-
*
|
|
8
|
-
* This class directly works with route configurations instead of converting to domain configs.
|
|
9
|
-
*/
|
|
10
|
-
export class CertProvisioner extends plugins.EventEmitter {
|
|
11
|
-
/**
|
|
12
|
-
* Extract routes that need certificates
|
|
13
|
-
* @param routes Route configurations
|
|
14
|
-
*/
|
|
15
|
-
extractCertificateRoutesFromRoutes(routes) {
|
|
16
|
-
const certRoutes = [];
|
|
17
|
-
// Process all HTTPS routes that need certificates
|
|
18
|
-
for (const route of routes) {
|
|
19
|
-
// Only process routes with TLS termination that need certificates
|
|
20
|
-
if (route.action.type === 'forward' &&
|
|
21
|
-
route.action.tls &&
|
|
22
|
-
(route.action.tls.mode === 'terminate' || route.action.tls.mode === 'terminate-and-reencrypt') &&
|
|
23
|
-
route.match.domains) {
|
|
24
|
-
// Extract domains from the route
|
|
25
|
-
const domains = Array.isArray(route.match.domains)
|
|
26
|
-
? route.match.domains
|
|
27
|
-
: [route.match.domains];
|
|
28
|
-
// For each domain in the route, create a certRoute entry
|
|
29
|
-
for (const domain of domains) {
|
|
30
|
-
// Skip wildcard domains that can't use ACME unless we have a certProvider
|
|
31
|
-
if (domain.includes('*') && (!this.certProvisionFunction || this.certProvisionFunction.length === 0)) {
|
|
32
|
-
console.warn(`Skipping wildcard domain that requires a certProvisionFunction: ${domain}`);
|
|
33
|
-
continue;
|
|
34
|
-
}
|
|
35
|
-
certRoutes.push({
|
|
36
|
-
domain,
|
|
37
|
-
route,
|
|
38
|
-
tlsMode: route.action.tls.mode
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
return certRoutes;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Constructor for CertProvisioner
|
|
47
|
-
*
|
|
48
|
-
* @param routeConfigs Array of route configurations
|
|
49
|
-
* @param port80Handler HTTP-01 challenge handler instance
|
|
50
|
-
* @param networkProxyBridge Bridge for applying external certificates
|
|
51
|
-
* @param certProvider Optional callback returning a static cert or 'http01'
|
|
52
|
-
* @param renewThresholdDays Days before expiry to trigger renewals
|
|
53
|
-
* @param renewCheckIntervalHours Interval in hours to check for renewals
|
|
54
|
-
* @param autoRenew Whether to automatically schedule renewals
|
|
55
|
-
* @param routeForwards Route-specific forwarding configs for ACME challenges
|
|
56
|
-
*/
|
|
57
|
-
constructor(routeConfigs, port80Handler, networkProxyBridge, certProvider, renewThresholdDays = 30, renewCheckIntervalHours = 24, autoRenew = true, routeForwards = []) {
|
|
58
|
-
super();
|
|
59
|
-
this.certRoutes = [];
|
|
60
|
-
this.routeConfigs = routeConfigs;
|
|
61
|
-
this.port80Handler = port80Handler;
|
|
62
|
-
this.networkProxyBridge = networkProxyBridge;
|
|
63
|
-
this.certProvisionFunction = certProvider;
|
|
64
|
-
this.renewThresholdDays = renewThresholdDays;
|
|
65
|
-
this.renewCheckIntervalHours = renewCheckIntervalHours;
|
|
66
|
-
this.autoRenew = autoRenew;
|
|
67
|
-
this.provisionMap = new Map();
|
|
68
|
-
this.routeForwards = routeForwards;
|
|
69
|
-
// Extract certificate routes during instantiation
|
|
70
|
-
this.certRoutes = this.extractCertificateRoutesFromRoutes(routeConfigs);
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Start initial provisioning and schedule renewals.
|
|
74
|
-
*/
|
|
75
|
-
async start() {
|
|
76
|
-
// Subscribe to Port80Handler certificate events
|
|
77
|
-
this.setupEventSubscriptions();
|
|
78
|
-
// Apply route forwarding for ACME challenges
|
|
79
|
-
this.setupForwardingConfigs();
|
|
80
|
-
// Initial provisioning for all domains in routes
|
|
81
|
-
await this.provisionAllCertificates();
|
|
82
|
-
// Schedule renewals if enabled
|
|
83
|
-
if (this.autoRenew) {
|
|
84
|
-
this.scheduleRenewals();
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Set up event subscriptions for certificate events
|
|
89
|
-
*/
|
|
90
|
-
setupEventSubscriptions() {
|
|
91
|
-
this.port80Handler.on(Port80HandlerEvents.CERTIFICATE_ISSUED, (data) => {
|
|
92
|
-
// Add route reference if we have it
|
|
93
|
-
const routeRef = this.findRouteForDomain(data.domain);
|
|
94
|
-
const enhancedData = {
|
|
95
|
-
...data,
|
|
96
|
-
source: 'http01',
|
|
97
|
-
isRenewal: false,
|
|
98
|
-
routeReference: routeRef ? {
|
|
99
|
-
routeId: routeRef.route.name,
|
|
100
|
-
routeName: routeRef.route.name
|
|
101
|
-
} : undefined
|
|
102
|
-
};
|
|
103
|
-
this.emit(CertProvisionerEvents.CERTIFICATE_ISSUED, enhancedData);
|
|
104
|
-
});
|
|
105
|
-
this.port80Handler.on(Port80HandlerEvents.CERTIFICATE_RENEWED, (data) => {
|
|
106
|
-
// Add route reference if we have it
|
|
107
|
-
const routeRef = this.findRouteForDomain(data.domain);
|
|
108
|
-
const enhancedData = {
|
|
109
|
-
...data,
|
|
110
|
-
source: 'http01',
|
|
111
|
-
isRenewal: true,
|
|
112
|
-
routeReference: routeRef ? {
|
|
113
|
-
routeId: routeRef.route.name,
|
|
114
|
-
routeName: routeRef.route.name
|
|
115
|
-
} : undefined
|
|
116
|
-
};
|
|
117
|
-
this.emit(CertProvisionerEvents.CERTIFICATE_RENEWED, enhancedData);
|
|
118
|
-
});
|
|
119
|
-
this.port80Handler.on(Port80HandlerEvents.CERTIFICATE_FAILED, (error) => {
|
|
120
|
-
this.emit(CertProvisionerEvents.CERTIFICATE_FAILED, error);
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Find a route for a given domain
|
|
125
|
-
*/
|
|
126
|
-
findRouteForDomain(domain) {
|
|
127
|
-
return this.certRoutes.find(certRoute => certRoute.domain === domain);
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Set up forwarding configurations for the Port80Handler
|
|
131
|
-
*/
|
|
132
|
-
setupForwardingConfigs() {
|
|
133
|
-
for (const config of this.routeForwards) {
|
|
134
|
-
const domainOptions = {
|
|
135
|
-
domainName: config.domain,
|
|
136
|
-
sslRedirect: config.sslRedirect || false,
|
|
137
|
-
acmeMaintenance: false,
|
|
138
|
-
forward: config.target ? {
|
|
139
|
-
ip: config.target.host,
|
|
140
|
-
port: config.target.port
|
|
141
|
-
} : undefined
|
|
142
|
-
};
|
|
143
|
-
this.port80Handler.addDomain(domainOptions);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Provision certificates for all routes that need them
|
|
148
|
-
*/
|
|
149
|
-
async provisionAllCertificates() {
|
|
150
|
-
for (const certRoute of this.certRoutes) {
|
|
151
|
-
await this.provisionCertificateForRoute(certRoute);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Provision a certificate for a route
|
|
156
|
-
*/
|
|
157
|
-
async provisionCertificateForRoute(certRoute) {
|
|
158
|
-
const { domain, route } = certRoute;
|
|
159
|
-
const isWildcard = domain.includes('*');
|
|
160
|
-
let provision = 'http01';
|
|
161
|
-
// Try to get a certificate from the provision function
|
|
162
|
-
if (this.certProvisionFunction) {
|
|
163
|
-
try {
|
|
164
|
-
provision = await this.certProvisionFunction(domain);
|
|
165
|
-
}
|
|
166
|
-
catch (err) {
|
|
167
|
-
console.error(`certProvider error for ${domain} on route ${route.name || 'unnamed'}:`, err);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
else if (isWildcard) {
|
|
171
|
-
// No certProvider: cannot handle wildcard without DNS-01 support
|
|
172
|
-
console.warn(`Skipping wildcard domain without certProvisionFunction: ${domain}`);
|
|
173
|
-
return;
|
|
174
|
-
}
|
|
175
|
-
// Store the route reference with the provision type
|
|
176
|
-
this.provisionMap.set(domain, {
|
|
177
|
-
type: provision === 'http01' || provision === 'dns01' ? provision : 'static',
|
|
178
|
-
routeRef: certRoute
|
|
179
|
-
});
|
|
180
|
-
// Handle different provisioning methods
|
|
181
|
-
if (provision === 'http01') {
|
|
182
|
-
if (isWildcard) {
|
|
183
|
-
console.warn(`Skipping HTTP-01 for wildcard domain: ${domain}`);
|
|
184
|
-
return;
|
|
185
|
-
}
|
|
186
|
-
this.port80Handler.addDomain({
|
|
187
|
-
domainName: domain,
|
|
188
|
-
sslRedirect: true,
|
|
189
|
-
acmeMaintenance: true,
|
|
190
|
-
routeReference: {
|
|
191
|
-
routeId: route.name || domain,
|
|
192
|
-
routeName: route.name
|
|
193
|
-
}
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
else if (provision === 'dns01') {
|
|
197
|
-
// DNS-01 challenges would be handled by the certProvisionFunction
|
|
198
|
-
// DNS-01 handling would go here if implemented
|
|
199
|
-
console.log(`DNS-01 challenge type set for ${domain}`);
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
// Static certificate (e.g., DNS-01 provisioned or user-provided)
|
|
203
|
-
const certObj = provision;
|
|
204
|
-
const certData = {
|
|
205
|
-
domain: certObj.domainName,
|
|
206
|
-
certificate: certObj.publicKey,
|
|
207
|
-
privateKey: certObj.privateKey,
|
|
208
|
-
expiryDate: new Date(certObj.validUntil),
|
|
209
|
-
source: 'static',
|
|
210
|
-
isRenewal: false,
|
|
211
|
-
routeReference: {
|
|
212
|
-
routeId: route.name || domain,
|
|
213
|
-
routeName: route.name
|
|
214
|
-
}
|
|
215
|
-
};
|
|
216
|
-
this.networkProxyBridge.applyExternalCertificate(certData);
|
|
217
|
-
this.emit(CertProvisionerEvents.CERTIFICATE_ISSUED, certData);
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* Schedule certificate renewals using a task manager
|
|
222
|
-
*/
|
|
223
|
-
scheduleRenewals() {
|
|
224
|
-
this.renewManager = new plugins.taskbuffer.TaskManager();
|
|
225
|
-
const renewTask = new plugins.taskbuffer.Task({
|
|
226
|
-
name: 'CertificateRenewals',
|
|
227
|
-
taskFunction: async () => await this.performRenewals()
|
|
228
|
-
});
|
|
229
|
-
const hours = this.renewCheckIntervalHours;
|
|
230
|
-
const cronExpr = `0 0 */${hours} * * *`;
|
|
231
|
-
this.renewManager.addAndScheduleTask(renewTask, cronExpr);
|
|
232
|
-
this.renewManager.start();
|
|
233
|
-
}
|
|
234
|
-
/**
|
|
235
|
-
* Perform renewals for all domains that need it
|
|
236
|
-
*/
|
|
237
|
-
async performRenewals() {
|
|
238
|
-
for (const [domain, info] of this.provisionMap.entries()) {
|
|
239
|
-
// Skip wildcard domains for HTTP-01 challenges
|
|
240
|
-
if (domain.includes('*') && info.type === 'http01')
|
|
241
|
-
continue;
|
|
242
|
-
try {
|
|
243
|
-
await this.renewCertificateForDomain(domain, info.type, info.routeRef);
|
|
244
|
-
}
|
|
245
|
-
catch (err) {
|
|
246
|
-
console.error(`Renewal error for ${domain}:`, err);
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* Renew a certificate for a specific domain
|
|
252
|
-
* @param domain Domain to renew
|
|
253
|
-
* @param provisionType Type of provisioning for this domain
|
|
254
|
-
* @param certRoute The route reference for this domain
|
|
255
|
-
*/
|
|
256
|
-
async renewCertificateForDomain(domain, provisionType, certRoute) {
|
|
257
|
-
if (provisionType === 'http01') {
|
|
258
|
-
await this.port80Handler.renewCertificate(domain);
|
|
259
|
-
}
|
|
260
|
-
else if ((provisionType === 'static' || provisionType === 'dns01') && this.certProvisionFunction) {
|
|
261
|
-
const provision = await this.certProvisionFunction(domain);
|
|
262
|
-
if (provision !== 'http01' && provision !== 'dns01') {
|
|
263
|
-
const certObj = provision;
|
|
264
|
-
const routeRef = certRoute?.route;
|
|
265
|
-
const certData = {
|
|
266
|
-
domain: certObj.domainName,
|
|
267
|
-
certificate: certObj.publicKey,
|
|
268
|
-
privateKey: certObj.privateKey,
|
|
269
|
-
expiryDate: new Date(certObj.validUntil),
|
|
270
|
-
source: 'static',
|
|
271
|
-
isRenewal: true,
|
|
272
|
-
routeReference: routeRef ? {
|
|
273
|
-
routeId: routeRef.name || domain,
|
|
274
|
-
routeName: routeRef.name
|
|
275
|
-
} : undefined
|
|
276
|
-
};
|
|
277
|
-
this.networkProxyBridge.applyExternalCertificate(certData);
|
|
278
|
-
this.emit(CertProvisionerEvents.CERTIFICATE_RENEWED, certData);
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
/**
|
|
283
|
-
* Stop all scheduled renewal tasks.
|
|
284
|
-
*/
|
|
285
|
-
async stop() {
|
|
286
|
-
if (this.renewManager) {
|
|
287
|
-
this.renewManager.stop();
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
/**
|
|
291
|
-
* Request a certificate on-demand for the given domain.
|
|
292
|
-
* This will look for a matching route configuration and provision accordingly.
|
|
293
|
-
*
|
|
294
|
-
* @param domain Domain name to provision
|
|
295
|
-
*/
|
|
296
|
-
async requestCertificate(domain) {
|
|
297
|
-
const isWildcard = domain.includes('*');
|
|
298
|
-
// Find matching route
|
|
299
|
-
const certRoute = this.findRouteForDomain(domain);
|
|
300
|
-
// Determine provisioning method
|
|
301
|
-
let provision = 'http01';
|
|
302
|
-
if (this.certProvisionFunction) {
|
|
303
|
-
provision = await this.certProvisionFunction(domain);
|
|
304
|
-
}
|
|
305
|
-
else if (isWildcard) {
|
|
306
|
-
// Cannot perform HTTP-01 on wildcard without certProvider
|
|
307
|
-
throw new Error(`Cannot request certificate for wildcard domain without certProvisionFunction: ${domain}`);
|
|
308
|
-
}
|
|
309
|
-
if (provision === 'http01') {
|
|
310
|
-
if (isWildcard) {
|
|
311
|
-
throw new Error(`Cannot request HTTP-01 certificate for wildcard domain: ${domain}`);
|
|
312
|
-
}
|
|
313
|
-
await this.port80Handler.renewCertificate(domain);
|
|
314
|
-
}
|
|
315
|
-
else if (provision === 'dns01') {
|
|
316
|
-
// DNS-01 challenges would be handled by external mechanisms
|
|
317
|
-
console.log(`DNS-01 challenge requested for ${domain}`);
|
|
318
|
-
}
|
|
319
|
-
else {
|
|
320
|
-
// Static certificate (e.g., DNS-01 provisioned) supports wildcards
|
|
321
|
-
const certObj = provision;
|
|
322
|
-
const certData = {
|
|
323
|
-
domain: certObj.domainName,
|
|
324
|
-
certificate: certObj.publicKey,
|
|
325
|
-
privateKey: certObj.privateKey,
|
|
326
|
-
expiryDate: new Date(certObj.validUntil),
|
|
327
|
-
source: 'static',
|
|
328
|
-
isRenewal: false,
|
|
329
|
-
routeReference: certRoute ? {
|
|
330
|
-
routeId: certRoute.route.name || domain,
|
|
331
|
-
routeName: certRoute.route.name
|
|
332
|
-
} : undefined
|
|
333
|
-
};
|
|
334
|
-
this.networkProxyBridge.applyExternalCertificate(certData);
|
|
335
|
-
this.emit(CertProvisionerEvents.CERTIFICATE_ISSUED, certData);
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
/**
|
|
339
|
-
* Add a new domain for certificate provisioning
|
|
340
|
-
*
|
|
341
|
-
* @param domain Domain to add
|
|
342
|
-
* @param options Domain configuration options
|
|
343
|
-
*/
|
|
344
|
-
async addDomain(domain, options) {
|
|
345
|
-
const domainOptions = {
|
|
346
|
-
domainName: domain,
|
|
347
|
-
sslRedirect: options?.sslRedirect ?? true,
|
|
348
|
-
acmeMaintenance: options?.acmeMaintenance ?? true,
|
|
349
|
-
routeReference: {
|
|
350
|
-
routeId: options?.routeId,
|
|
351
|
-
routeName: options?.routeName
|
|
352
|
-
}
|
|
353
|
-
};
|
|
354
|
-
this.port80Handler.addDomain(domainOptions);
|
|
355
|
-
// Find matching route or create a generic one
|
|
356
|
-
const existingRoute = this.findRouteForDomain(domain);
|
|
357
|
-
if (existingRoute) {
|
|
358
|
-
await this.provisionCertificateForRoute(existingRoute);
|
|
359
|
-
}
|
|
360
|
-
else {
|
|
361
|
-
// We don't have a route, just provision the domain
|
|
362
|
-
const isWildcard = domain.includes('*');
|
|
363
|
-
let provision = 'http01';
|
|
364
|
-
if (this.certProvisionFunction) {
|
|
365
|
-
provision = await this.certProvisionFunction(domain);
|
|
366
|
-
}
|
|
367
|
-
else if (isWildcard) {
|
|
368
|
-
throw new Error(`Cannot request certificate for wildcard domain without certProvisionFunction: ${domain}`);
|
|
369
|
-
}
|
|
370
|
-
this.provisionMap.set(domain, {
|
|
371
|
-
type: provision === 'http01' || provision === 'dns01' ? provision : 'static'
|
|
372
|
-
});
|
|
373
|
-
if (provision !== 'http01' && provision !== 'dns01') {
|
|
374
|
-
const certObj = provision;
|
|
375
|
-
const certData = {
|
|
376
|
-
domain: certObj.domainName,
|
|
377
|
-
certificate: certObj.publicKey,
|
|
378
|
-
privateKey: certObj.privateKey,
|
|
379
|
-
expiryDate: new Date(certObj.validUntil),
|
|
380
|
-
source: 'static',
|
|
381
|
-
isRenewal: false,
|
|
382
|
-
routeReference: {
|
|
383
|
-
routeId: options?.routeId,
|
|
384
|
-
routeName: options?.routeName
|
|
385
|
-
}
|
|
386
|
-
};
|
|
387
|
-
this.networkProxyBridge.applyExternalCertificate(certData);
|
|
388
|
-
this.emit(CertProvisionerEvents.CERTIFICATE_ISSUED, certData);
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
/**
|
|
393
|
-
* Update routes with new configurations
|
|
394
|
-
* This replaces all existing routes with new ones and re-provisions certificates as needed
|
|
395
|
-
*
|
|
396
|
-
* @param newRoutes New route configurations to use
|
|
397
|
-
*/
|
|
398
|
-
async updateRoutes(newRoutes) {
|
|
399
|
-
// Store the new route configs
|
|
400
|
-
this.routeConfigs = newRoutes;
|
|
401
|
-
// Extract new certificate routes
|
|
402
|
-
const newCertRoutes = this.extractCertificateRoutesFromRoutes(newRoutes);
|
|
403
|
-
// Find domains that no longer need certificates
|
|
404
|
-
const oldDomains = new Set(this.certRoutes.map(r => r.domain));
|
|
405
|
-
const newDomains = new Set(newCertRoutes.map(r => r.domain));
|
|
406
|
-
// Domains to remove
|
|
407
|
-
const domainsToRemove = [...oldDomains].filter(d => !newDomains.has(d));
|
|
408
|
-
// Remove obsolete domains from provision map
|
|
409
|
-
for (const domain of domainsToRemove) {
|
|
410
|
-
this.provisionMap.delete(domain);
|
|
411
|
-
}
|
|
412
|
-
// Update the cert routes
|
|
413
|
-
this.certRoutes = newCertRoutes;
|
|
414
|
-
// Provision certificates for new routes
|
|
415
|
-
for (const certRoute of newCertRoutes) {
|
|
416
|
-
if (!oldDomains.has(certRoute.domain)) {
|
|
417
|
-
await this.provisionCertificateForRoute(certRoute);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydC1wcm92aXNpb25lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2NlcnRpZmljYXRlL3Byb3ZpZGVycy9jZXJ0LXByb3Zpc2lvbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFHNUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDN0YsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBcUJwRTs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxlQUFnQixTQUFRLE9BQU8sQ0FBQyxZQUFZO0lBY3ZEOzs7T0FHRztJQUNLLGtDQUFrQyxDQUFDLE1BQXNCO1FBQy9ELE1BQU0sVUFBVSxHQUFpQixFQUFFLENBQUM7UUFFcEMsa0RBQWtEO1FBQ2xELEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7WUFDM0Isa0VBQWtFO1lBQ2xFLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUztnQkFDL0IsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHO2dCQUNoQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxXQUFXLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLHlCQUF5QixDQUFDO2dCQUM5RixLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUV4QixpQ0FBaUM7Z0JBQ2pDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7b0JBQ2hELENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU87b0JBQ3JCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JB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
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
/**
|
|
3
|
-
* Certificate providers
|
|
4
|
-
*/
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jZXJ0aWZpY2F0ZS9wcm92aWRlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHIn0=
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Simplified, unified certificate manager for SmartProxy
|
|
3
|
-
*/
|
|
4
|
-
import * as plugins from '../plugins.js';
|
|
5
|
-
import type { CertProvider } from './models/certificate-strategy.js';
|
|
6
|
-
import type { CertificateEventMap, ICertificateEventEmitter } from './events/simplified-events.js';
|
|
7
|
-
import type { IRouteConfig } from '../proxies/smart-proxy/models/route-types.js';
|
|
8
|
-
/**
|
|
9
|
-
* Certificate storage format
|
|
10
|
-
*/
|
|
11
|
-
interface StoredCertificate {
|
|
12
|
-
domain: string;
|
|
13
|
-
certificate: string;
|
|
14
|
-
privateKey: string;
|
|
15
|
-
expiresAt: Date;
|
|
16
|
-
source: 'acme-http' | 'acme-dns' | 'static';
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Certificate manager configuration
|
|
20
|
-
*/
|
|
21
|
-
export interface CertificateManagerConfig {
|
|
22
|
-
certProvider: CertProvider;
|
|
23
|
-
acmeEmail: string;
|
|
24
|
-
acmeServer: 'production' | 'staging';
|
|
25
|
-
storageDir?: string;
|
|
26
|
-
renewBeforeDays?: number;
|
|
27
|
-
defaultCertPath?: string;
|
|
28
|
-
defaultKeyPath?: string;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Unified certificate manager
|
|
32
|
-
*/
|
|
33
|
-
export declare class SimplifiedCertificateManager extends plugins.EventEmitter implements ICertificateEventEmitter {
|
|
34
|
-
private config;
|
|
35
|
-
private certificateCache;
|
|
36
|
-
private acmeClient;
|
|
37
|
-
private renewalTimer?;
|
|
38
|
-
private pendingRequests;
|
|
39
|
-
constructor(config: CertificateManagerConfig);
|
|
40
|
-
/**
|
|
41
|
-
* Initialize the certificate manager
|
|
42
|
-
*/
|
|
43
|
-
start(): Promise<void>;
|
|
44
|
-
/**
|
|
45
|
-
* Stop the certificate manager
|
|
46
|
-
*/
|
|
47
|
-
stop(): Promise<void>;
|
|
48
|
-
/**
|
|
49
|
-
* Get a certificate for a domain (main entry point)
|
|
50
|
-
*/
|
|
51
|
-
getCertificate(domain: string): Promise<StoredCertificate>;
|
|
52
|
-
/**
|
|
53
|
-
* Request a new certificate
|
|
54
|
-
*/
|
|
55
|
-
private requestCertificate;
|
|
56
|
-
/**
|
|
57
|
-
* Request certificate via ACME HTTP-01
|
|
58
|
-
*/
|
|
59
|
-
private requestAcmeHttpCertificate;
|
|
60
|
-
/**
|
|
61
|
-
* Request certificate via ACME DNS-01
|
|
62
|
-
*/
|
|
63
|
-
private requestAcmeDnsCertificate;
|
|
64
|
-
/**
|
|
65
|
-
* Renew a certificate
|
|
66
|
-
*/
|
|
67
|
-
renewCertificate(domain: string): Promise<StoredCertificate>;
|
|
68
|
-
/**
|
|
69
|
-
* Check certificates for renewal
|
|
70
|
-
*/
|
|
71
|
-
private checkForRenewals;
|
|
72
|
-
/**
|
|
73
|
-
* Initialize ACME client
|
|
74
|
-
*/
|
|
75
|
-
private initializeAcmeClient;
|
|
76
|
-
/**
|
|
77
|
-
* Load stored certificates from disk
|
|
78
|
-
*/
|
|
79
|
-
private loadStoredCertificates;
|
|
80
|
-
/**
|
|
81
|
-
* Store certificate to disk
|
|
82
|
-
*/
|
|
83
|
-
private storeCertificate;
|
|
84
|
-
/**
|
|
85
|
-
* Ensure storage directory exists
|
|
86
|
-
*/
|
|
87
|
-
private ensureStorageDir;
|
|
88
|
-
/**
|
|
89
|
-
* Get or create ACME account key
|
|
90
|
-
*/
|
|
91
|
-
private getOrCreateAccountKey;
|
|
92
|
-
/**
|
|
93
|
-
* Generate keypair for certificate
|
|
94
|
-
*/
|
|
95
|
-
private generateKeypair;
|
|
96
|
-
/**
|
|
97
|
-
* Generate CSR for domain
|
|
98
|
-
*/
|
|
99
|
-
private generateCsr;
|
|
100
|
-
/**
|
|
101
|
-
* Extract expiry date from certificate
|
|
102
|
-
*/
|
|
103
|
-
private extractExpiryDate;
|
|
104
|
-
/**
|
|
105
|
-
* Check if certificate is valid
|
|
106
|
-
*/
|
|
107
|
-
private isCertificateValid;
|
|
108
|
-
/**
|
|
109
|
-
* Check if certificate should be renewed
|
|
110
|
-
*/
|
|
111
|
-
private shouldRenew;
|
|
112
|
-
/**
|
|
113
|
-
* Check if certificate is expiring soon
|
|
114
|
-
*/
|
|
115
|
-
private isExpiringSoon;
|
|
116
|
-
/**
|
|
117
|
-
* Get days remaining until expiry
|
|
118
|
-
*/
|
|
119
|
-
private getDaysRemaining;
|
|
120
|
-
/**
|
|
121
|
-
* Start renewal timer
|
|
122
|
-
*/
|
|
123
|
-
private startRenewalTimer;
|
|
124
|
-
/**
|
|
125
|
-
* Get default certificate for SNI fallback
|
|
126
|
-
*/
|
|
127
|
-
getDefaultCertificate(): Promise<{
|
|
128
|
-
cert: string;
|
|
129
|
-
key: string;
|
|
130
|
-
}>;
|
|
131
|
-
/**
|
|
132
|
-
* Set up HTTP challenge responder
|
|
133
|
-
*/
|
|
134
|
-
private setupHttpChallenge;
|
|
135
|
-
/**
|
|
136
|
-
* Clean up HTTP challenge
|
|
137
|
-
*/
|
|
138
|
-
private cleanupHttpChallenge;
|
|
139
|
-
/**
|
|
140
|
-
* Type assertion for event emitter
|
|
141
|
-
*/
|
|
142
|
-
on<K extends keyof CertificateEventMap>(event: K, listener: (data: CertificateEventMap[K]) => void): this;
|
|
143
|
-
off<K extends keyof CertificateEventMap>(event: K, listener: (data: CertificateEventMap[K]) => void): this;
|
|
144
|
-
emit<K extends keyof CertificateEventMap>(event: K, data: CertificateEventMap[K]): boolean;
|
|
145
|
-
/**
|
|
146
|
-
* Update routes (placeholder for future implementation)
|
|
147
|
-
*/
|
|
148
|
-
updateRoutes(routes: IRouteConfig[]): Promise<void>;
|
|
149
|
-
}
|
|
150
|
-
export {};
|