@serve.zone/dcrouter 13.17.0 → 13.17.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_serve/bundle.js +3 -3
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/acme/index.d.ts +1 -0
- package/dist_ts/acme/index.js +2 -0
- package/dist_ts/acme/manager.acme-config.d.ts +48 -0
- package/dist_ts/acme/manager.acme-config.js +156 -0
- package/dist_ts/classes.cert-provision-scheduler.d.ts +52 -0
- package/dist_ts/classes.cert-provision-scheduler.js +138 -0
- package/dist_ts/classes.dcrouter.d.ts +401 -0
- package/dist_ts/classes.dcrouter.js +1852 -0
- package/dist_ts/classes.storage-cert-manager.d.ts +15 -0
- package/dist_ts/classes.storage-cert-manager.js +53 -0
- package/dist_ts/config/classes.api-token-manager.d.ts +44 -0
- package/dist_ts/config/classes.api-token-manager.js +180 -0
- package/dist_ts/config/classes.db-seeder.d.ts +25 -0
- package/dist_ts/config/classes.db-seeder.js +69 -0
- package/dist_ts/config/classes.reference-resolver.d.ts +80 -0
- package/dist_ts/config/classes.reference-resolver.js +483 -0
- package/dist_ts/config/classes.route-config-manager.d.ts +54 -0
- package/dist_ts/config/classes.route-config-manager.js +370 -0
- package/dist_ts/config/classes.target-profile-manager.d.ts +82 -0
- package/dist_ts/config/classes.target-profile-manager.js +349 -0
- package/dist_ts/config/index.d.ts +6 -0
- package/dist_ts/config/index.js +8 -0
- package/dist_ts/config/validator.d.ts +104 -0
- package/dist_ts/config/validator.js +152 -0
- package/dist_ts/db/classes.cache.cleaner.d.ts +47 -0
- package/dist_ts/db/classes.cache.cleaner.js +130 -0
- package/dist_ts/db/classes.cached.document.d.ts +76 -0
- package/dist_ts/db/classes.cached.document.js +100 -0
- package/dist_ts/db/classes.dcrouter-db.d.ts +70 -0
- package/dist_ts/db/classes.dcrouter-db.js +146 -0
- package/dist_ts/db/documents/classes.accounting-session.doc.d.ts +32 -0
- package/dist_ts/db/documents/classes.accounting-session.doc.js +214 -0
- package/dist_ts/db/documents/classes.acme-cert.doc.d.ts +13 -0
- package/dist_ts/db/documents/classes.acme-cert.doc.js +109 -0
- package/dist_ts/db/documents/classes.acme-config.doc.d.ts +22 -0
- package/dist_ts/db/documents/classes.acme-config.doc.js +121 -0
- package/dist_ts/db/documents/classes.api-token.doc.d.ts +18 -0
- package/dist_ts/db/documents/classes.api-token.doc.js +127 -0
- package/dist_ts/db/documents/classes.cached.email.d.ts +125 -0
- package/dist_ts/db/documents/classes.cached.email.js +337 -0
- package/dist_ts/db/documents/classes.cached.ip.reputation.d.ts +119 -0
- package/dist_ts/db/documents/classes.cached.ip.reputation.js +323 -0
- package/dist_ts/db/documents/classes.cert-backoff.doc.d.ts +11 -0
- package/dist_ts/db/documents/classes.cert-backoff.doc.js +97 -0
- package/dist_ts/db/documents/classes.dns-provider.doc.d.ts +22 -0
- package/dist_ts/db/documents/classes.dns-provider.doc.js +134 -0
- package/dist_ts/db/documents/classes.dns-record.doc.d.ts +21 -0
- package/dist_ts/db/documents/classes.dns-record.doc.js +143 -0
- package/dist_ts/db/documents/classes.domain.doc.d.ts +22 -0
- package/dist_ts/db/documents/classes.domain.doc.js +146 -0
- package/dist_ts/db/documents/classes.email-domain.doc.d.ts +17 -0
- package/dist_ts/db/documents/classes.email-domain.doc.js +124 -0
- package/dist_ts/db/documents/classes.network-target.doc.d.ts +15 -0
- package/dist_ts/db/documents/classes.network-target.doc.js +118 -0
- package/dist_ts/db/documents/classes.proxy-cert.doc.d.ts +12 -0
- package/dist_ts/db/documents/classes.proxy-cert.doc.js +103 -0
- package/dist_ts/db/documents/classes.remote-ingress-edge.doc.d.ts +17 -0
- package/dist_ts/db/documents/classes.remote-ingress-edge.doc.js +130 -0
- package/dist_ts/db/documents/classes.route.doc.d.ts +18 -0
- package/dist_ts/db/documents/classes.route.doc.js +121 -0
- package/dist_ts/db/documents/classes.source-profile.doc.d.ts +15 -0
- package/dist_ts/db/documents/classes.source-profile.doc.js +115 -0
- package/dist_ts/db/documents/classes.target-profile.doc.d.ts +16 -0
- package/dist_ts/db/documents/classes.target-profile.doc.js +121 -0
- package/dist_ts/db/documents/classes.vlan-mappings.doc.d.ts +15 -0
- package/dist_ts/db/documents/classes.vlan-mappings.doc.js +77 -0
- package/dist_ts/db/documents/classes.vpn-client.doc.d.ts +23 -0
- package/dist_ts/db/documents/classes.vpn-client.doc.js +172 -0
- package/dist_ts/db/documents/classes.vpn-server-keys.doc.d.ts +10 -0
- package/dist_ts/db/documents/classes.vpn-server-keys.doc.js +94 -0
- package/dist_ts/db/documents/index.d.ts +20 -0
- package/dist_ts/db/documents/index.js +30 -0
- package/dist_ts/db/index.d.ts +4 -0
- package/dist_ts/db/index.js +9 -0
- package/dist_ts/dns/index.d.ts +2 -0
- package/dist_ts/dns/index.js +3 -0
- package/dist_ts/dns/manager.dns.d.ts +267 -0
- package/dist_ts/dns/manager.dns.js +906 -0
- package/dist_ts/dns/providers/cloudflare.provider.d.ts +21 -0
- package/dist_ts/dns/providers/cloudflare.provider.js +106 -0
- package/dist_ts/dns/providers/factory.d.ts +23 -0
- package/dist_ts/dns/providers/factory.js +47 -0
- package/dist_ts/dns/providers/index.d.ts +3 -0
- package/dist_ts/dns/providers/index.js +4 -0
- package/dist_ts/dns/providers/interfaces.d.ts +54 -0
- package/dist_ts/dns/providers/interfaces.js +2 -0
- package/dist_ts/email/classes.email-domain.manager.d.ts +46 -0
- package/dist_ts/email/classes.email-domain.manager.js +276 -0
- package/dist_ts/email/index.d.ts +1 -0
- package/dist_ts/email/index.js +2 -0
- package/dist_ts/errors/base.errors.d.ts +224 -0
- package/dist_ts/errors/base.errors.js +320 -0
- package/dist_ts/errors/error-handler.d.ts +98 -0
- package/dist_ts/errors/error-handler.js +282 -0
- package/dist_ts/errors/error.codes.d.ts +115 -0
- package/dist_ts/errors/error.codes.js +136 -0
- package/dist_ts/errors/index.d.ts +54 -0
- package/dist_ts/errors/index.js +136 -0
- package/dist_ts/errors/reputation.errors.d.ts +183 -0
- package/dist_ts/errors/reputation.errors.js +292 -0
- package/dist_ts/http3/http3-route-augmentation.d.ts +50 -0
- package/dist_ts/http3/http3-route-augmentation.js +98 -0
- package/dist_ts/http3/index.d.ts +1 -0
- package/dist_ts/http3/index.js +2 -0
- package/dist_ts/index.d.ts +8 -0
- package/dist_ts/index.js +29 -0
- package/dist_ts/logger.d.ts +21 -0
- package/dist_ts/logger.js +81 -0
- package/dist_ts/monitoring/classes.metricscache.d.ts +32 -0
- package/dist_ts/monitoring/classes.metricscache.js +63 -0
- package/dist_ts/monitoring/classes.metricsmanager.d.ts +235 -0
- package/dist_ts/monitoring/classes.metricsmanager.js +875 -0
- package/dist_ts/monitoring/index.d.ts +1 -0
- package/dist_ts/monitoring/index.js +2 -0
- package/dist_ts/opsserver/classes.opsserver.d.ts +47 -0
- package/dist_ts/opsserver/classes.opsserver.js +105 -0
- package/dist_ts/opsserver/handlers/acme-config.handler.d.ts +16 -0
- package/dist_ts/opsserver/handlers/acme-config.handler.js +77 -0
- package/dist_ts/opsserver/handlers/admin.handler.d.ts +40 -0
- package/dist_ts/opsserver/handlers/admin.handler.js +191 -0
- package/dist_ts/opsserver/handlers/api-token.handler.d.ts +6 -0
- package/dist_ts/opsserver/handlers/api-token.handler.js +62 -0
- package/dist_ts/opsserver/handlers/certificate.handler.d.ts +77 -0
- package/dist_ts/opsserver/handlers/certificate.handler.js +574 -0
- package/dist_ts/opsserver/handlers/config.handler.d.ts +7 -0
- package/dist_ts/opsserver/handlers/config.handler.js +200 -0
- package/dist_ts/opsserver/handlers/dns-provider.handler.d.ts +16 -0
- package/dist_ts/opsserver/handlers/dns-provider.handler.js +156 -0
- package/dist_ts/opsserver/handlers/dns-record.handler.d.ts +13 -0
- package/dist_ts/opsserver/handlers/dns-record.handler.js +98 -0
- package/dist_ts/opsserver/handlers/domain.handler.d.ts +13 -0
- package/dist_ts/opsserver/handlers/domain.handler.js +137 -0
- package/dist_ts/opsserver/handlers/email-domain.handler.d.ts +16 -0
- package/dist_ts/opsserver/handlers/email-domain.handler.js +150 -0
- package/dist_ts/opsserver/handlers/email-ops.handler.d.ts +30 -0
- package/dist_ts/opsserver/handlers/email-ops.handler.js +227 -0
- package/dist_ts/opsserver/handlers/index.d.ts +21 -0
- package/dist_ts/opsserver/handlers/index.js +22 -0
- package/dist_ts/opsserver/handlers/logs.handler.d.ts +25 -0
- package/dist_ts/opsserver/handlers/logs.handler.js +264 -0
- package/dist_ts/opsserver/handlers/network-target.handler.d.ts +10 -0
- package/dist_ts/opsserver/handlers/network-target.handler.js +117 -0
- package/dist_ts/opsserver/handlers/radius.handler.d.ts +6 -0
- package/dist_ts/opsserver/handlers/radius.handler.js +295 -0
- package/dist_ts/opsserver/handlers/remoteingress.handler.d.ts +6 -0
- package/dist_ts/opsserver/handlers/remoteingress.handler.js +156 -0
- package/dist_ts/opsserver/handlers/route-management.handler.d.ts +14 -0
- package/dist_ts/opsserver/handlers/route-management.handler.js +98 -0
- package/dist_ts/opsserver/handlers/security.handler.d.ts +9 -0
- package/dist_ts/opsserver/handlers/security.handler.js +237 -0
- package/dist_ts/opsserver/handlers/source-profile.handler.d.ts +10 -0
- package/dist_ts/opsserver/handlers/source-profile.handler.js +119 -0
- package/dist_ts/opsserver/handlers/stats.handler.d.ts +11 -0
- package/dist_ts/opsserver/handlers/stats.handler.js +461 -0
- package/dist_ts/opsserver/handlers/target-profile.handler.d.ts +10 -0
- package/dist_ts/opsserver/handlers/target-profile.handler.js +117 -0
- package/dist_ts/opsserver/handlers/users.handler.d.ts +12 -0
- package/dist_ts/opsserver/handlers/users.handler.js +24 -0
- package/dist_ts/opsserver/handlers/vpn.handler.d.ts +6 -0
- package/dist_ts/opsserver/handlers/vpn.handler.js +262 -0
- package/dist_ts/opsserver/helpers/guards.d.ts +27 -0
- package/dist_ts/opsserver/helpers/guards.js +43 -0
- package/dist_ts/opsserver/index.d.ts +1 -0
- package/dist_ts/opsserver/index.js +2 -0
- package/dist_ts/paths.d.ts +25 -0
- package/dist_ts/paths.js +44 -0
- package/dist_ts/plugins.d.ts +81 -0
- package/dist_ts/plugins.js +115 -0
- package/dist_ts/radius/classes.accounting.manager.d.ts +223 -0
- package/dist_ts/radius/classes.accounting.manager.js +449 -0
- package/dist_ts/radius/classes.radius.server.d.ts +169 -0
- package/dist_ts/radius/classes.radius.server.js +384 -0
- package/dist_ts/radius/classes.vlan.manager.d.ts +124 -0
- package/dist_ts/radius/classes.vlan.manager.js +272 -0
- package/dist_ts/radius/index.d.ts +13 -0
- package/dist_ts/radius/index.js +14 -0
- package/dist_ts/remoteingress/classes.remoteingress-manager.d.ts +92 -0
- package/dist_ts/remoteingress/classes.remoteingress-manager.js +291 -0
- package/dist_ts/remoteingress/classes.tunnel-manager.d.ts +59 -0
- package/dist_ts/remoteingress/classes.tunnel-manager.js +165 -0
- package/dist_ts/remoteingress/index.d.ts +2 -0
- package/dist_ts/remoteingress/index.js +3 -0
- package/dist_ts/security/classes.contentscanner.d.ts +164 -0
- package/dist_ts/security/classes.contentscanner.js +642 -0
- package/dist_ts/security/classes.ipreputationchecker.d.ts +145 -0
- package/dist_ts/security/classes.ipreputationchecker.js +458 -0
- package/dist_ts/security/classes.securitylogger.d.ts +144 -0
- package/dist_ts/security/classes.securitylogger.js +235 -0
- package/dist_ts/security/index.d.ts +3 -0
- package/dist_ts/security/index.js +4 -0
- package/dist_ts/sms/classes.smsservice.d.ts +15 -0
- package/dist_ts/sms/classes.smsservice.js +72 -0
- package/dist_ts/sms/config/sms.config.d.ts +93 -0
- package/dist_ts/sms/config/sms.config.js +2 -0
- package/dist_ts/sms/config/sms.schema.d.ts +5 -0
- package/dist_ts/sms/config/sms.schema.js +121 -0
- package/dist_ts/sms/index.d.ts +1 -0
- package/dist_ts/sms/index.js +2 -0
- package/dist_ts/vpn/classes.vpn-manager.d.ts +159 -0
- package/dist_ts/vpn/classes.vpn-manager.js +459 -0
- package/dist_ts/vpn/index.d.ts +1 -0
- package/dist_ts/vpn/index.js +2 -0
- package/dist_ts_apiclient/classes.apitoken.d.ts +41 -0
- package/dist_ts_apiclient/classes.apitoken.js +115 -0
- package/dist_ts_apiclient/classes.certificate.d.ts +57 -0
- package/dist_ts_apiclient/classes.certificate.js +69 -0
- package/dist_ts_apiclient/classes.config.d.ts +7 -0
- package/dist_ts_apiclient/classes.config.js +11 -0
- package/dist_ts_apiclient/classes.dcrouterapiclient.d.ts +41 -0
- package/dist_ts_apiclient/classes.dcrouterapiclient.js +81 -0
- package/dist_ts_apiclient/classes.email.d.ts +30 -0
- package/dist_ts_apiclient/classes.email.js +52 -0
- package/dist_ts_apiclient/classes.logs.d.ts +21 -0
- package/dist_ts_apiclient/classes.logs.js +14 -0
- package/dist_ts_apiclient/classes.radius.d.ts +59 -0
- package/dist_ts_apiclient/classes.radius.js +95 -0
- package/dist_ts_apiclient/classes.remoteingress.d.ts +54 -0
- package/dist_ts_apiclient/classes.remoteingress.js +136 -0
- package/dist_ts_apiclient/classes.route.d.ts +39 -0
- package/dist_ts_apiclient/classes.route.js +125 -0
- package/dist_ts_apiclient/classes.stats.d.ts +47 -0
- package/dist_ts_apiclient/classes.stats.js +38 -0
- package/dist_ts_apiclient/index.d.ts +10 -0
- package/dist_ts_apiclient/index.js +14 -0
- package/dist_ts_apiclient/plugins.d.ts +3 -0
- package/dist_ts_apiclient/plugins.js +5 -0
- package/dist_ts_interfaces/data/acme-config.d.ts +25 -0
- package/dist_ts_interfaces/data/acme-config.js +2 -0
- package/dist_ts_interfaces/data/auth.d.ts +8 -0
- package/dist_ts_interfaces/data/auth.js +2 -0
- package/dist_ts_interfaces/data/dns-provider.d.ts +136 -0
- package/dist_ts_interfaces/data/dns-provider.js +41 -0
- package/dist_ts_interfaces/data/dns-record.d.ts +42 -0
- package/dist_ts_interfaces/data/dns-record.js +2 -0
- package/dist_ts_interfaces/data/domain.d.ts +35 -0
- package/dist_ts_interfaces/data/domain.js +2 -0
- package/dist_ts_interfaces/data/email-domain.d.ts +70 -0
- package/dist_ts_interfaces/data/email-domain.js +2 -0
- package/dist_ts_interfaces/data/index.d.ts +11 -0
- package/dist_ts_interfaces/data/index.js +12 -0
- package/dist_ts_interfaces/data/remoteingress.d.ts +60 -0
- package/dist_ts_interfaces/data/remoteingress.js +2 -0
- package/dist_ts_interfaces/data/route-management.d.ts +110 -0
- package/dist_ts_interfaces/data/route-management.js +2 -0
- package/dist_ts_interfaces/data/stats.d.ts +239 -0
- package/dist_ts_interfaces/data/stats.js +2 -0
- package/dist_ts_interfaces/data/target-profile.d.ts +28 -0
- package/dist_ts_interfaces/data/target-profile.js +2 -0
- package/dist_ts_interfaces/data/vpn.d.ts +61 -0
- package/dist_ts_interfaces/data/vpn.js +2 -0
- package/dist_ts_interfaces/index.d.ts +5 -0
- package/dist_ts_interfaces/index.js +8 -0
- package/dist_ts_interfaces/plugins.d.ts +2 -0
- package/dist_ts_interfaces/plugins.js +4 -0
- package/dist_ts_interfaces/requests/acme-config.d.ts +42 -0
- package/dist_ts_interfaces/requests/acme-config.js +2 -0
- package/dist_ts_interfaces/requests/admin.d.ts +31 -0
- package/dist_ts_interfaces/requests/admin.js +3 -0
- package/dist_ts_interfaces/requests/api-tokens.d.ts +79 -0
- package/dist_ts_interfaces/requests/api-tokens.js +2 -0
- package/dist_ts_interfaces/requests/certificate.d.ts +111 -0
- package/dist_ts_interfaces/requests/certificate.js +3 -0
- package/dist_ts_interfaces/requests/combined.stats.d.ts +28 -0
- package/dist_ts_interfaces/requests/combined.stats.js +2 -0
- package/dist_ts_interfaces/requests/config.d.ts +90 -0
- package/dist_ts_interfaces/requests/config.js +3 -0
- package/dist_ts_interfaces/requests/dns-providers.d.ts +117 -0
- package/dist_ts_interfaces/requests/dns-providers.js +2 -0
- package/dist_ts_interfaces/requests/dns-records.d.ts +89 -0
- package/dist_ts_interfaces/requests/dns-records.js +2 -0
- package/dist_ts_interfaces/requests/domains.d.ts +142 -0
- package/dist_ts_interfaces/requests/domains.js +2 -0
- package/dist_ts_interfaces/requests/email-domains.d.ts +142 -0
- package/dist_ts_interfaces/requests/email-domains.js +2 -0
- package/dist_ts_interfaces/requests/email-ops.d.ts +82 -0
- package/dist_ts_interfaces/requests/email-ops.js +3 -0
- package/dist_ts_interfaces/requests/index.d.ts +21 -0
- package/dist_ts_interfaces/requests/index.js +22 -0
- package/dist_ts_interfaces/requests/logs.d.ts +41 -0
- package/dist_ts_interfaces/requests/logs.js +4 -0
- package/dist_ts_interfaces/requests/network-targets.d.ts +102 -0
- package/dist_ts_interfaces/requests/network-targets.js +2 -0
- package/dist_ts_interfaces/requests/radius.d.ts +268 -0
- package/dist_ts_interfaces/requests/radius.js +3 -0
- package/dist_ts_interfaces/requests/remoteingress.d.ts +108 -0
- package/dist_ts_interfaces/requests/remoteingress.js +3 -0
- package/dist_ts_interfaces/requests/route-management.d.ts +85 -0
- package/dist_ts_interfaces/requests/route-management.js +2 -0
- package/dist_ts_interfaces/requests/source-profiles.d.ts +102 -0
- package/dist_ts_interfaces/requests/source-profiles.js +2 -0
- package/dist_ts_interfaces/requests/stats.d.ts +177 -0
- package/dist_ts_interfaces/requests/stats.js +4 -0
- package/dist_ts_interfaces/requests/target-profiles.d.ts +103 -0
- package/dist_ts_interfaces/requests/target-profiles.js +2 -0
- package/dist_ts_interfaces/requests/users.d.ts +19 -0
- package/dist_ts_interfaces/requests/users.js +3 -0
- package/dist_ts_interfaces/requests/vpn.d.ts +177 -0
- package/dist_ts_interfaces/requests/vpn.js +3 -0
- package/dist_ts_migrations/index.d.ts +28 -0
- package/dist_ts_migrations/index.js +82 -0
- package/dist_ts_oci_container/index.d.ts +8 -0
- package/dist_ts_oci_container/index.js +110 -0
- package/dist_ts_oci_container/plugins.d.ts +3 -0
- package/dist_ts_oci_container/plugins.js +4 -0
- package/dist_ts_web/00_commitinfo_data.d.ts +8 -0
- package/dist_ts_web/00_commitinfo_data.js +9 -0
- package/dist_ts_web/appstate.d.ts +478 -0
- package/dist_ts_web/appstate.js +1968 -0
- package/dist_ts_web/elements/access/index.d.ts +2 -0
- package/dist_ts_web/elements/access/index.js +3 -0
- package/dist_ts_web/elements/access/ops-view-apitokens.d.ts +13 -0
- package/dist_ts_web/elements/access/ops-view-apitokens.js +372 -0
- package/dist_ts_web/elements/access/ops-view-users.d.ts +11 -0
- package/dist_ts_web/elements/access/ops-view-users.js +190 -0
- package/dist_ts_web/elements/domains/dns-provider-form.d.ts +60 -0
- package/dist_ts_web/elements/domains/dns-provider-form.js +259 -0
- package/dist_ts_web/elements/domains/index.d.ts +5 -0
- package/dist_ts_web/elements/domains/index.js +6 -0
- package/dist_ts_web/elements/domains/ops-view-certificates.d.ts +25 -0
- package/dist_ts_web/elements/domains/ops-view-certificates.js +669 -0
- package/dist_ts_web/elements/domains/ops-view-dns.d.ts +17 -0
- package/dist_ts_web/elements/domains/ops-view-dns.js +305 -0
- package/dist_ts_web/elements/domains/ops-view-domains.d.ts +19 -0
- package/dist_ts_web/elements/domains/ops-view-domains.js +456 -0
- package/dist_ts_web/elements/domains/ops-view-providers.d.ts +21 -0
- package/dist_ts_web/elements/domains/ops-view-providers.js +330 -0
- package/dist_ts_web/elements/email/index.d.ts +3 -0
- package/dist_ts_web/elements/email/index.js +4 -0
- package/dist_ts_web/elements/email/ops-view-email-domains.d.ts +19 -0
- package/dist_ts_web/elements/email/ops-view-email-domains.js +410 -0
- package/dist_ts_web/elements/email/ops-view-email-security.d.ts +14 -0
- package/dist_ts_web/elements/email/ops-view-email-security.js +178 -0
- package/dist_ts_web/elements/email/ops-view-emails.d.ts +21 -0
- package/dist_ts_web/elements/email/ops-view-emails.js +165 -0
- package/dist_ts_web/elements/index.d.ts +9 -0
- package/dist_ts_web/elements/index.js +10 -0
- package/dist_ts_web/elements/network/index.d.ts +7 -0
- package/dist_ts_web/elements/network/index.js +8 -0
- package/dist_ts_web/elements/network/ops-view-network-activity.d.ts +60 -0
- package/dist_ts_web/elements/network/ops-view-network-activity.js +754 -0
- package/dist_ts_web/elements/network/ops-view-networktargets.d.ts +17 -0
- package/dist_ts_web/elements/network/ops-view-networktargets.js +255 -0
- package/dist_ts_web/elements/network/ops-view-remoteingress.d.ts +20 -0
- package/dist_ts_web/elements/network/ops-view-remoteingress.js +497 -0
- package/dist_ts_web/elements/network/ops-view-routes.d.ts +17 -0
- package/dist_ts_web/elements/network/ops-view-routes.js +700 -0
- package/dist_ts_web/elements/network/ops-view-sourceprofiles.d.ts +17 -0
- package/dist_ts_web/elements/network/ops-view-sourceprofiles.js +278 -0
- package/dist_ts_web/elements/network/ops-view-targetprofiles.d.ts +21 -0
- package/dist_ts_web/elements/network/ops-view-targetprofiles.js +420 -0
- package/dist_ts_web/elements/network/ops-view-vpn.d.ts +31 -0
- package/dist_ts_web/elements/network/ops-view-vpn.js +873 -0
- package/dist_ts_web/elements/ops-dashboard.d.ts +31 -0
- package/dist_ts_web/elements/ops-dashboard.js +405 -0
- package/dist_ts_web/elements/ops-view-logs.d.ts +13 -0
- package/dist_ts_web/elements/ops-view-logs.js +159 -0
- package/dist_ts_web/elements/overview/index.d.ts +2 -0
- package/dist_ts_web/elements/overview/index.js +3 -0
- package/dist_ts_web/elements/overview/ops-view-config.d.ts +19 -0
- package/dist_ts_web/elements/overview/ops-view-config.js +339 -0
- package/dist_ts_web/elements/overview/ops-view-overview.d.ts +24 -0
- package/dist_ts_web/elements/overview/ops-view-overview.js +545 -0
- package/dist_ts_web/elements/security/index.d.ts +3 -0
- package/dist_ts_web/elements/security/index.js +4 -0
- package/dist_ts_web/elements/security/ops-view-security-authentication.d.ts +13 -0
- package/dist_ts_web/elements/security/ops-view-security-authentication.js +157 -0
- package/dist_ts_web/elements/security/ops-view-security-blocked.d.ts +15 -0
- package/dist_ts_web/elements/security/ops-view-security-blocked.js +153 -0
- package/dist_ts_web/elements/security/ops-view-security-overview.d.ts +16 -0
- package/dist_ts_web/elements/security/ops-view-security-overview.js +205 -0
- package/dist_ts_web/elements/shared/css.d.ts +1 -0
- package/dist_ts_web/elements/shared/css.js +10 -0
- package/dist_ts_web/elements/shared/index.d.ts +1 -0
- package/dist_ts_web/elements/shared/index.js +2 -0
- package/dist_ts_web/index.d.ts +1 -0
- package/dist_ts_web/index.js +10 -0
- package/dist_ts_web/plugins.d.ts +7 -0
- package/dist_ts_web/plugins.js +13 -0
- package/dist_ts_web/router.d.ts +21 -0
- package/dist_ts_web/router.js +151 -0
- package/package.json +1 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/monitoring/classes.metricsmanager.ts +0 -25
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/elements/network/ops-view-routes.ts +9 -1
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { IDnsProviderClient, IConnectionTestResult, IProviderRecord, IProviderRecordInput } from './interfaces.js';
|
|
2
|
+
import type { IProviderDomainListing } from '../../../dist_ts_interfaces/data/dns-provider.js';
|
|
3
|
+
/**
|
|
4
|
+
* Cloudflare implementation of IDnsProviderClient.
|
|
5
|
+
*
|
|
6
|
+
* Wraps `@apiclient.xyz/cloudflare`. Records at Cloudflare are addressed by
|
|
7
|
+
* an internal record id, which we surface as `providerRecordId` so the rest
|
|
8
|
+
* of the system can issue updates and deletes without ambiguity (Cloudflare
|
|
9
|
+
* can have multiple records of the same name+type).
|
|
10
|
+
*/
|
|
11
|
+
export declare class CloudflareDnsProvider implements IDnsProviderClient {
|
|
12
|
+
private cfAccount;
|
|
13
|
+
constructor(apiToken: string);
|
|
14
|
+
testConnection(): Promise<IConnectionTestResult>;
|
|
15
|
+
listDomains(): Promise<IProviderDomainListing[]>;
|
|
16
|
+
listRecords(domain: string): Promise<IProviderRecord[]>;
|
|
17
|
+
createRecord(domain: string, record: IProviderRecordInput): Promise<IProviderRecord>;
|
|
18
|
+
updateRecord(domain: string, providerRecordId: string, record: IProviderRecordInput): Promise<IProviderRecord>;
|
|
19
|
+
deleteRecord(domain: string, providerRecordId: string): Promise<void>;
|
|
20
|
+
private isSupportedType;
|
|
21
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import { logger } from '../../logger.js';
|
|
3
|
+
/**
|
|
4
|
+
* Cloudflare implementation of IDnsProviderClient.
|
|
5
|
+
*
|
|
6
|
+
* Wraps `@apiclient.xyz/cloudflare`. Records at Cloudflare are addressed by
|
|
7
|
+
* an internal record id, which we surface as `providerRecordId` so the rest
|
|
8
|
+
* of the system can issue updates and deletes without ambiguity (Cloudflare
|
|
9
|
+
* can have multiple records of the same name+type).
|
|
10
|
+
*/
|
|
11
|
+
export class CloudflareDnsProvider {
|
|
12
|
+
cfAccount;
|
|
13
|
+
constructor(apiToken) {
|
|
14
|
+
if (!apiToken) {
|
|
15
|
+
throw new Error('CloudflareDnsProvider: apiToken is required');
|
|
16
|
+
}
|
|
17
|
+
this.cfAccount = new plugins.cloudflare.CloudflareAccount(apiToken);
|
|
18
|
+
}
|
|
19
|
+
async testConnection() {
|
|
20
|
+
try {
|
|
21
|
+
// Listing zones is the lightest-weight call that proves the token works.
|
|
22
|
+
await this.cfAccount.zoneManager.listZones();
|
|
23
|
+
return { ok: true };
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
27
|
+
logger.log('warn', `CloudflareDnsProvider testConnection failed: ${message}`);
|
|
28
|
+
return { ok: false, error: message };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async listDomains() {
|
|
32
|
+
const zones = await this.cfAccount.zoneManager.listZones();
|
|
33
|
+
return zones.map((zone) => ({
|
|
34
|
+
name: zone.name,
|
|
35
|
+
externalId: zone.id,
|
|
36
|
+
nameservers: zone.name_servers ?? [],
|
|
37
|
+
}));
|
|
38
|
+
}
|
|
39
|
+
async listRecords(domain) {
|
|
40
|
+
const records = await this.cfAccount.recordManager.listRecords(domain);
|
|
41
|
+
return records
|
|
42
|
+
.filter((r) => this.isSupportedType(r.type))
|
|
43
|
+
.map((r) => ({
|
|
44
|
+
providerRecordId: r.id,
|
|
45
|
+
name: r.name,
|
|
46
|
+
type: r.type,
|
|
47
|
+
value: r.content,
|
|
48
|
+
ttl: r.ttl,
|
|
49
|
+
proxied: r.proxied,
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
async createRecord(domain, record) {
|
|
53
|
+
const zoneId = await this.cfAccount.zoneManager.getZoneId(domain);
|
|
54
|
+
const apiRecord = {
|
|
55
|
+
zone_id: zoneId,
|
|
56
|
+
type: record.type,
|
|
57
|
+
name: record.name,
|
|
58
|
+
content: record.value,
|
|
59
|
+
ttl: record.ttl ?? 1, // 1 = automatic
|
|
60
|
+
};
|
|
61
|
+
if (record.proxied !== undefined) {
|
|
62
|
+
apiRecord.proxied = record.proxied;
|
|
63
|
+
}
|
|
64
|
+
const created = await this.cfAccount.apiAccount.dns.records.create(apiRecord);
|
|
65
|
+
return {
|
|
66
|
+
providerRecordId: created.id,
|
|
67
|
+
name: created.name,
|
|
68
|
+
type: created.type,
|
|
69
|
+
value: created.content,
|
|
70
|
+
ttl: created.ttl,
|
|
71
|
+
proxied: created.proxied,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
async updateRecord(domain, providerRecordId, record) {
|
|
75
|
+
const zoneId = await this.cfAccount.zoneManager.getZoneId(domain);
|
|
76
|
+
const apiRecord = {
|
|
77
|
+
zone_id: zoneId,
|
|
78
|
+
type: record.type,
|
|
79
|
+
name: record.name,
|
|
80
|
+
content: record.value,
|
|
81
|
+
ttl: record.ttl ?? 1,
|
|
82
|
+
};
|
|
83
|
+
if (record.proxied !== undefined) {
|
|
84
|
+
apiRecord.proxied = record.proxied;
|
|
85
|
+
}
|
|
86
|
+
const updated = await this.cfAccount.apiAccount.dns.records.edit(providerRecordId, apiRecord);
|
|
87
|
+
return {
|
|
88
|
+
providerRecordId: updated.id,
|
|
89
|
+
name: updated.name,
|
|
90
|
+
type: updated.type,
|
|
91
|
+
value: updated.content,
|
|
92
|
+
ttl: updated.ttl,
|
|
93
|
+
proxied: updated.proxied,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
async deleteRecord(domain, providerRecordId) {
|
|
97
|
+
const zoneId = await this.cfAccount.zoneManager.getZoneId(domain);
|
|
98
|
+
await this.cfAccount.apiAccount.dns.records.delete(providerRecordId, {
|
|
99
|
+
zone_id: zoneId,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
isSupportedType(type) {
|
|
103
|
+
return ['A', 'AAAA', 'CNAME', 'MX', 'TXT', 'NS', 'SOA', 'CAA'].includes(type);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWRmbGFyZS5wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL2Rucy9wcm92aWRlcnMvY2xvdWRmbGFyZS5wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQVV6Qzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLHFCQUFxQjtJQUN4QixTQUFTLENBQXVDO0lBRXhELFlBQVksUUFBZ0I7UUFDMUIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRU0sS0FBSyxDQUFDLGNBQWM7UUFDekIsSUFBSSxDQUFDO1lBQ0gseUVBQXlFO1lBQ3pFLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDN0MsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN0QixDQUFDO1FBQUMsT0FBTyxHQUFZLEVBQUUsQ0FBQztZQUN0QixNQUFNLE9BQU8sR0FBRyxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsZ0RBQWdELE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDOUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3ZDLENBQUM7SUFD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
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { IDnsProviderClient } from './interfaces.js';
|
|
2
|
+
import type { TDnsProviderType, TDnsProviderCredentials } from '../../../dist_ts_interfaces/data/dns-provider.js';
|
|
3
|
+
/**
|
|
4
|
+
* Instantiate a runtime DNS provider client from a stored DnsProviderDoc.
|
|
5
|
+
*
|
|
6
|
+
* @throws if the provider type is not supported.
|
|
7
|
+
*
|
|
8
|
+
* ## Adding a new provider (e.g. Route53)
|
|
9
|
+
*
|
|
10
|
+
* 1. **Type union** — extend `TDnsProviderType` in
|
|
11
|
+
* `ts_interfaces/data/dns-provider.ts` (e.g. `'cloudflare' | 'route53'`).
|
|
12
|
+
* 2. **Credentials interface** — add `IRoute53Credentials` and append it to
|
|
13
|
+
* the `TDnsProviderCredentials` discriminated union.
|
|
14
|
+
* 3. **Descriptor** — append a new entry to `dnsProviderTypeDescriptors` so
|
|
15
|
+
* the OpsServer UI picks up the new type and renders the right credential
|
|
16
|
+
* form fields automatically.
|
|
17
|
+
* 4. **Provider class** — create `ts/dns/providers/route53.provider.ts`
|
|
18
|
+
* implementing `IDnsProviderClient`.
|
|
19
|
+
* 5. **Factory case** — add a new `case 'route53':` below. The
|
|
20
|
+
* `_exhaustive: never` line will fail to compile until you do.
|
|
21
|
+
* 6. **Index** — re-export the new class from `ts/dns/providers/index.ts`.
|
|
22
|
+
*/
|
|
23
|
+
export declare function createDnsProvider(type: TDnsProviderType, credentials: TDnsProviderCredentials): IDnsProviderClient;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { CloudflareDnsProvider } from './cloudflare.provider.js';
|
|
2
|
+
/**
|
|
3
|
+
* Instantiate a runtime DNS provider client from a stored DnsProviderDoc.
|
|
4
|
+
*
|
|
5
|
+
* @throws if the provider type is not supported.
|
|
6
|
+
*
|
|
7
|
+
* ## Adding a new provider (e.g. Route53)
|
|
8
|
+
*
|
|
9
|
+
* 1. **Type union** — extend `TDnsProviderType` in
|
|
10
|
+
* `ts_interfaces/data/dns-provider.ts` (e.g. `'cloudflare' | 'route53'`).
|
|
11
|
+
* 2. **Credentials interface** — add `IRoute53Credentials` and append it to
|
|
12
|
+
* the `TDnsProviderCredentials` discriminated union.
|
|
13
|
+
* 3. **Descriptor** — append a new entry to `dnsProviderTypeDescriptors` so
|
|
14
|
+
* the OpsServer UI picks up the new type and renders the right credential
|
|
15
|
+
* form fields automatically.
|
|
16
|
+
* 4. **Provider class** — create `ts/dns/providers/route53.provider.ts`
|
|
17
|
+
* implementing `IDnsProviderClient`.
|
|
18
|
+
* 5. **Factory case** — add a new `case 'route53':` below. The
|
|
19
|
+
* `_exhaustive: never` line will fail to compile until you do.
|
|
20
|
+
* 6. **Index** — re-export the new class from `ts/dns/providers/index.ts`.
|
|
21
|
+
*/
|
|
22
|
+
export function createDnsProvider(type, credentials) {
|
|
23
|
+
switch (type) {
|
|
24
|
+
case 'cloudflare': {
|
|
25
|
+
if (credentials.type !== 'cloudflare') {
|
|
26
|
+
throw new Error(`createDnsProvider: type mismatch — provider type is 'cloudflare' but credentials.type is '${credentials.type}'`);
|
|
27
|
+
}
|
|
28
|
+
return new CloudflareDnsProvider(credentials.apiToken);
|
|
29
|
+
}
|
|
30
|
+
case 'dcrouter': {
|
|
31
|
+
// The built-in DcRouter pseudo-provider has no runtime client — dcrouter
|
|
32
|
+
// itself serves the records via the embedded smartdns.DnsServer. This
|
|
33
|
+
// case exists only to satisfy the exhaustive switch; it should never
|
|
34
|
+
// actually run because the handler layer rejects any CRUD that would
|
|
35
|
+
// result in a DnsProviderDoc with type: 'dcrouter'.
|
|
36
|
+
throw new Error(`createDnsProvider: 'dcrouter' is a built-in pseudo-provider — no runtime client exists. ` +
|
|
37
|
+
`This call indicates a DnsProviderDoc with type: 'dcrouter' was persisted, which should never happen.`);
|
|
38
|
+
}
|
|
39
|
+
default: {
|
|
40
|
+
// If you see a TypeScript error here after extending TDnsProviderType,
|
|
41
|
+
// add a `case` for the new type above. The `never` enforces exhaustiveness.
|
|
42
|
+
const _exhaustive = type;
|
|
43
|
+
throw new Error(`createDnsProvider: unsupported provider type: ${_exhaustive}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL2Rucy9wcm92aWRlcnMvZmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVqRTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsSUFBc0IsRUFDdEIsV0FBb0M7SUFFcEMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQztZQUNsQixJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFLENBQUM7Z0JBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQ2IsNkZBQTZGLFdBQVcsQ0FBQyxJQUFJLEdBQUcsQ0FDakgsQ0FBQztZQUNKLENBQUM7WUFDRCxPQUFPLElBQUkscUJBQXFCLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFDRCxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDaEIseUVBQXlFO1lBQ3pFLHNFQUFzRTtZQUN0RSxxRUFBcUU7WUFDckUscUVBQXFFO1lBQ3JFLG9EQUFvRDtZQUNwRCxNQUFNLElBQUksS0FBSyxDQUNiLDBGQUEwRjtnQkFDeEYsc0dBQXNHLENBQ3pHLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNSLHVFQUF1RTtZQUN2RSw0RUFBNEU7WUFDNUUsTUFBTSxXQUFXLEdBQVUsSUFBSSxDQUFDO1lBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDbEYsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDIn0=
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from './interfaces.js';
|
|
2
|
+
export * from './cloudflare.provider.js';
|
|
3
|
+
export * from './factory.js';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9kbnMvcHJvdmlkZXJzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLGNBQWMsQ0FBQyJ9
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { TDnsRecordType } from '../../../dist_ts_interfaces/data/dns-record.js';
|
|
2
|
+
import type { IProviderDomainListing } from '../../../dist_ts_interfaces/data/dns-provider.js';
|
|
3
|
+
/**
|
|
4
|
+
* A DNS record as seen at a provider's API. The `providerRecordId` field
|
|
5
|
+
* is the provider's internal identifier, used for subsequent updates and
|
|
6
|
+
* deletes (since providers can have multiple records of the same name+type).
|
|
7
|
+
*/
|
|
8
|
+
export interface IProviderRecord {
|
|
9
|
+
providerRecordId: string;
|
|
10
|
+
name: string;
|
|
11
|
+
type: TDnsRecordType;
|
|
12
|
+
value: string;
|
|
13
|
+
ttl: number;
|
|
14
|
+
proxied?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Input shape for creating / updating a DNS record at a provider.
|
|
18
|
+
*/
|
|
19
|
+
export interface IProviderRecordInput {
|
|
20
|
+
name: string;
|
|
21
|
+
type: TDnsRecordType;
|
|
22
|
+
value: string;
|
|
23
|
+
ttl?: number;
|
|
24
|
+
proxied?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Outcome of a connection test against a provider's API.
|
|
28
|
+
*/
|
|
29
|
+
export interface IConnectionTestResult {
|
|
30
|
+
ok: boolean;
|
|
31
|
+
error?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Pluggable DNS provider client interface. One implementation per provider type
|
|
35
|
+
* (Cloudflare, Route53, …). Implementations live in ts/dns/providers/ and are
|
|
36
|
+
* instantiated by `createDnsProvider()` in factory.ts.
|
|
37
|
+
*
|
|
38
|
+
* NOT a smartdata interface — this is the *runtime* client. The persisted
|
|
39
|
+
* representation is in `IDnsProvider` (ts_interfaces/data/dns-provider.ts).
|
|
40
|
+
*/
|
|
41
|
+
export interface IDnsProviderClient {
|
|
42
|
+
/** Lightweight check that credentials are valid and the API is reachable. */
|
|
43
|
+
testConnection(): Promise<IConnectionTestResult>;
|
|
44
|
+
/** List all DNS zones visible to this provider account. */
|
|
45
|
+
listDomains(): Promise<IProviderDomainListing[]>;
|
|
46
|
+
/** List all DNS records for a zone (FQDN). */
|
|
47
|
+
listRecords(domain: string): Promise<IProviderRecord[]>;
|
|
48
|
+
/** Create a new DNS record at the provider; returns the created record (with id). */
|
|
49
|
+
createRecord(domain: string, record: IProviderRecordInput): Promise<IProviderRecord>;
|
|
50
|
+
/** Update an existing record by provider id; returns the updated record. */
|
|
51
|
+
updateRecord(domain: string, providerRecordId: string, record: IProviderRecordInput): Promise<IProviderRecord>;
|
|
52
|
+
/** Delete a record by provider id. */
|
|
53
|
+
deleteRecord(domain: string, providerRecordId: string): Promise<void>;
|
|
54
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { IEmailDomain, IEmailDnsRecord } from '../../dist_ts_interfaces/data/email-domain.js';
|
|
2
|
+
/**
|
|
3
|
+
* EmailDomainManager — orchestrates email domain setup.
|
|
4
|
+
*
|
|
5
|
+
* Wires smartmta's DKIMCreator (key generation) with dcrouter's DnsManager
|
|
6
|
+
* (record creation for dcrouter-hosted and provider-managed zones) to provide
|
|
7
|
+
* a single entry point for setting up an email domain from A to Z.
|
|
8
|
+
*/
|
|
9
|
+
export declare class EmailDomainManager {
|
|
10
|
+
private dcRouter;
|
|
11
|
+
constructor(dcRouterRef: any);
|
|
12
|
+
private get dnsManager();
|
|
13
|
+
private get dkimCreator();
|
|
14
|
+
private get emailHostname();
|
|
15
|
+
getAll(): Promise<IEmailDomain[]>;
|
|
16
|
+
getById(id: string): Promise<IEmailDomain | null>;
|
|
17
|
+
createEmailDomain(opts: {
|
|
18
|
+
linkedDomainId: string;
|
|
19
|
+
subdomain?: string;
|
|
20
|
+
dkimSelector?: string;
|
|
21
|
+
dkimKeySize?: number;
|
|
22
|
+
rotateKeys?: boolean;
|
|
23
|
+
rotationIntervalDays?: number;
|
|
24
|
+
}): Promise<IEmailDomain>;
|
|
25
|
+
updateEmailDomain(id: string, changes: {
|
|
26
|
+
rotateKeys?: boolean;
|
|
27
|
+
rotationIntervalDays?: number;
|
|
28
|
+
rateLimits?: IEmailDomain['rateLimits'];
|
|
29
|
+
}): Promise<void>;
|
|
30
|
+
deleteEmailDomain(id: string): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Compute the 4 required DNS records for an email domain.
|
|
33
|
+
*/
|
|
34
|
+
getRequiredDnsRecords(id: string): Promise<IEmailDnsRecord[]>;
|
|
35
|
+
/**
|
|
36
|
+
* Auto-create missing DNS records via the linked domain's DNS path.
|
|
37
|
+
*/
|
|
38
|
+
provisionDnsRecords(id: string): Promise<number>;
|
|
39
|
+
/**
|
|
40
|
+
* Validate DNS records via live lookups.
|
|
41
|
+
*/
|
|
42
|
+
validateDns(id: string): Promise<IEmailDnsRecord[]>;
|
|
43
|
+
private checkMx;
|
|
44
|
+
private checkTxtRecord;
|
|
45
|
+
private docToInterface;
|
|
46
|
+
}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import { logger } from '../logger.js';
|
|
3
|
+
import { EmailDomainDoc } from '../db/documents/classes.email-domain.doc.js';
|
|
4
|
+
import { DomainDoc } from '../db/documents/classes.domain.doc.js';
|
|
5
|
+
import { DnsRecordDoc } from '../db/documents/classes.dns-record.doc.js';
|
|
6
|
+
/**
|
|
7
|
+
* EmailDomainManager — orchestrates email domain setup.
|
|
8
|
+
*
|
|
9
|
+
* Wires smartmta's DKIMCreator (key generation) with dcrouter's DnsManager
|
|
10
|
+
* (record creation for dcrouter-hosted and provider-managed zones) to provide
|
|
11
|
+
* a single entry point for setting up an email domain from A to Z.
|
|
12
|
+
*/
|
|
13
|
+
export class EmailDomainManager {
|
|
14
|
+
dcRouter; // DcRouter — avoids circular import
|
|
15
|
+
constructor(dcRouterRef) {
|
|
16
|
+
this.dcRouter = dcRouterRef;
|
|
17
|
+
}
|
|
18
|
+
get dnsManager() {
|
|
19
|
+
return this.dcRouter.dnsManager;
|
|
20
|
+
}
|
|
21
|
+
get dkimCreator() {
|
|
22
|
+
return this.dcRouter.emailServer?.dkimCreator;
|
|
23
|
+
}
|
|
24
|
+
get emailHostname() {
|
|
25
|
+
return this.dcRouter.options?.emailConfig?.hostname || this.dcRouter.options?.tls?.domain || 'localhost';
|
|
26
|
+
}
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// CRUD
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
async getAll() {
|
|
31
|
+
const docs = await EmailDomainDoc.findAll();
|
|
32
|
+
return docs.map((d) => this.docToInterface(d));
|
|
33
|
+
}
|
|
34
|
+
async getById(id) {
|
|
35
|
+
const doc = await EmailDomainDoc.findById(id);
|
|
36
|
+
return doc ? this.docToInterface(doc) : null;
|
|
37
|
+
}
|
|
38
|
+
async createEmailDomain(opts) {
|
|
39
|
+
// Resolve the linked DNS domain
|
|
40
|
+
const domainDoc = await DomainDoc.findById(opts.linkedDomainId);
|
|
41
|
+
if (!domainDoc) {
|
|
42
|
+
throw new Error(`DNS domain not found: ${opts.linkedDomainId}`);
|
|
43
|
+
}
|
|
44
|
+
const baseDomain = domainDoc.name;
|
|
45
|
+
const subdomain = opts.subdomain?.trim() || undefined;
|
|
46
|
+
const domainName = subdomain ? `${subdomain}.${baseDomain}` : baseDomain;
|
|
47
|
+
// Check for duplicates
|
|
48
|
+
const existing = await EmailDomainDoc.findByDomain(domainName);
|
|
49
|
+
if (existing) {
|
|
50
|
+
throw new Error(`Email domain already exists for ${domainName}`);
|
|
51
|
+
}
|
|
52
|
+
const selector = opts.dkimSelector || 'default';
|
|
53
|
+
const keySize = opts.dkimKeySize || 2048;
|
|
54
|
+
const now = new Date().toISOString();
|
|
55
|
+
// Generate DKIM keys
|
|
56
|
+
let publicKey;
|
|
57
|
+
if (this.dkimCreator) {
|
|
58
|
+
try {
|
|
59
|
+
await this.dkimCreator.handleDKIMKeysForDomain(domainName);
|
|
60
|
+
const dnsRecord = await this.dkimCreator.getDNSRecordForSelector(domainName, selector);
|
|
61
|
+
// Extract public key from the DNS record value
|
|
62
|
+
const match = dnsRecord?.value?.match(/p=([A-Za-z0-9+/=]+)/);
|
|
63
|
+
publicKey = match ? match[1] : undefined;
|
|
64
|
+
logger.log('info', `DKIM keys generated for ${domainName} (selector: ${selector})`);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
logger.log('warn', `DKIM key generation failed for ${domainName}: ${err.message}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Create the document
|
|
71
|
+
const doc = new EmailDomainDoc();
|
|
72
|
+
doc.id = plugins.smartunique.shortId();
|
|
73
|
+
doc.domain = domainName.toLowerCase();
|
|
74
|
+
doc.linkedDomainId = opts.linkedDomainId;
|
|
75
|
+
doc.subdomain = subdomain;
|
|
76
|
+
doc.dkim = {
|
|
77
|
+
selector,
|
|
78
|
+
keySize,
|
|
79
|
+
publicKey,
|
|
80
|
+
rotateKeys: opts.rotateKeys ?? false,
|
|
81
|
+
rotationIntervalDays: opts.rotationIntervalDays ?? 90,
|
|
82
|
+
};
|
|
83
|
+
doc.dnsStatus = {
|
|
84
|
+
mx: 'unchecked',
|
|
85
|
+
spf: 'unchecked',
|
|
86
|
+
dkim: 'unchecked',
|
|
87
|
+
dmarc: 'unchecked',
|
|
88
|
+
};
|
|
89
|
+
doc.createdAt = now;
|
|
90
|
+
doc.updatedAt = now;
|
|
91
|
+
await doc.save();
|
|
92
|
+
logger.log('info', `Email domain created: ${domainName}`);
|
|
93
|
+
return this.docToInterface(doc);
|
|
94
|
+
}
|
|
95
|
+
async updateEmailDomain(id, changes) {
|
|
96
|
+
const doc = await EmailDomainDoc.findById(id);
|
|
97
|
+
if (!doc)
|
|
98
|
+
throw new Error(`Email domain not found: ${id}`);
|
|
99
|
+
if (changes.rotateKeys !== undefined)
|
|
100
|
+
doc.dkim.rotateKeys = changes.rotateKeys;
|
|
101
|
+
if (changes.rotationIntervalDays !== undefined)
|
|
102
|
+
doc.dkim.rotationIntervalDays = changes.rotationIntervalDays;
|
|
103
|
+
if (changes.rateLimits !== undefined)
|
|
104
|
+
doc.rateLimits = changes.rateLimits;
|
|
105
|
+
doc.updatedAt = new Date().toISOString();
|
|
106
|
+
await doc.save();
|
|
107
|
+
}
|
|
108
|
+
async deleteEmailDomain(id) {
|
|
109
|
+
const doc = await EmailDomainDoc.findById(id);
|
|
110
|
+
if (!doc)
|
|
111
|
+
throw new Error(`Email domain not found: ${id}`);
|
|
112
|
+
await doc.delete();
|
|
113
|
+
logger.log('info', `Email domain deleted: ${doc.domain}`);
|
|
114
|
+
}
|
|
115
|
+
// ---------------------------------------------------------------------------
|
|
116
|
+
// DNS record computation
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
/**
|
|
119
|
+
* Compute the 4 required DNS records for an email domain.
|
|
120
|
+
*/
|
|
121
|
+
async getRequiredDnsRecords(id) {
|
|
122
|
+
const doc = await EmailDomainDoc.findById(id);
|
|
123
|
+
if (!doc)
|
|
124
|
+
throw new Error(`Email domain not found: ${id}`);
|
|
125
|
+
const domain = doc.domain;
|
|
126
|
+
const selector = doc.dkim.selector;
|
|
127
|
+
const publicKey = doc.dkim.publicKey || '';
|
|
128
|
+
const hostname = this.emailHostname;
|
|
129
|
+
const records = [
|
|
130
|
+
{
|
|
131
|
+
type: 'MX',
|
|
132
|
+
name: domain,
|
|
133
|
+
value: `10 ${hostname}`,
|
|
134
|
+
status: doc.dnsStatus.mx,
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
type: 'TXT',
|
|
138
|
+
name: domain,
|
|
139
|
+
value: 'v=spf1 a mx ~all',
|
|
140
|
+
status: doc.dnsStatus.spf,
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
type: 'TXT',
|
|
144
|
+
name: `${selector}._domainkey.${domain}`,
|
|
145
|
+
value: `v=DKIM1; h=sha256; k=rsa; p=${publicKey}`,
|
|
146
|
+
status: doc.dnsStatus.dkim,
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
type: 'TXT',
|
|
150
|
+
name: `_dmarc.${domain}`,
|
|
151
|
+
value: `v=DMARC1; p=none; rua=mailto:dmarc@${domain}`,
|
|
152
|
+
status: doc.dnsStatus.dmarc,
|
|
153
|
+
},
|
|
154
|
+
];
|
|
155
|
+
return records;
|
|
156
|
+
}
|
|
157
|
+
// ---------------------------------------------------------------------------
|
|
158
|
+
// DNS provisioning
|
|
159
|
+
// ---------------------------------------------------------------------------
|
|
160
|
+
/**
|
|
161
|
+
* Auto-create missing DNS records via the linked domain's DNS path.
|
|
162
|
+
*/
|
|
163
|
+
async provisionDnsRecords(id) {
|
|
164
|
+
const doc = await EmailDomainDoc.findById(id);
|
|
165
|
+
if (!doc)
|
|
166
|
+
throw new Error(`Email domain not found: ${id}`);
|
|
167
|
+
if (!this.dnsManager)
|
|
168
|
+
throw new Error('DnsManager not available');
|
|
169
|
+
const requiredRecords = await this.getRequiredDnsRecords(id);
|
|
170
|
+
const domainId = doc.linkedDomainId;
|
|
171
|
+
// Get existing DNS records for the linked domain
|
|
172
|
+
const existingRecords = await DnsRecordDoc.findByDomainId(domainId);
|
|
173
|
+
let provisioned = 0;
|
|
174
|
+
for (const required of requiredRecords) {
|
|
175
|
+
// Check if a matching record already exists
|
|
176
|
+
const exists = existingRecords.some((r) => {
|
|
177
|
+
if (required.type === 'MX') {
|
|
178
|
+
return r.type === 'MX' && r.name.toLowerCase() === required.name.toLowerCase();
|
|
179
|
+
}
|
|
180
|
+
// For TXT records, match by name AND check value prefix (v=spf1, v=DKIM1, v=DMARC1)
|
|
181
|
+
if (r.type !== 'TXT' || r.name.toLowerCase() !== required.name.toLowerCase())
|
|
182
|
+
return false;
|
|
183
|
+
if (required.value.startsWith('v=spf1'))
|
|
184
|
+
return r.value.includes('v=spf1');
|
|
185
|
+
if (required.value.startsWith('v=DKIM1'))
|
|
186
|
+
return r.value.includes('v=DKIM1');
|
|
187
|
+
if (required.value.startsWith('v=DMARC1'))
|
|
188
|
+
return r.value.includes('v=DMARC1');
|
|
189
|
+
return false;
|
|
190
|
+
});
|
|
191
|
+
if (!exists) {
|
|
192
|
+
try {
|
|
193
|
+
await this.dnsManager.createRecord({
|
|
194
|
+
domainId,
|
|
195
|
+
name: required.name,
|
|
196
|
+
type: required.type,
|
|
197
|
+
value: required.value,
|
|
198
|
+
ttl: 3600,
|
|
199
|
+
createdBy: 'email-domain-manager',
|
|
200
|
+
});
|
|
201
|
+
provisioned++;
|
|
202
|
+
logger.log('info', `Provisioned ${required.type} record for ${required.name}`);
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
logger.log('warn', `Failed to provision ${required.type} for ${required.name}: ${err.message}`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// Re-validate after provisioning
|
|
210
|
+
await this.validateDns(id);
|
|
211
|
+
return provisioned;
|
|
212
|
+
}
|
|
213
|
+
// ---------------------------------------------------------------------------
|
|
214
|
+
// DNS validation
|
|
215
|
+
// ---------------------------------------------------------------------------
|
|
216
|
+
/**
|
|
217
|
+
* Validate DNS records via live lookups.
|
|
218
|
+
*/
|
|
219
|
+
async validateDns(id) {
|
|
220
|
+
const doc = await EmailDomainDoc.findById(id);
|
|
221
|
+
if (!doc)
|
|
222
|
+
throw new Error(`Email domain not found: ${id}`);
|
|
223
|
+
const domain = doc.domain;
|
|
224
|
+
const selector = doc.dkim.selector;
|
|
225
|
+
const resolver = new plugins.dns.promises.Resolver();
|
|
226
|
+
// MX check
|
|
227
|
+
doc.dnsStatus.mx = await this.checkMx(resolver, domain);
|
|
228
|
+
// SPF check
|
|
229
|
+
doc.dnsStatus.spf = await this.checkTxtRecord(resolver, domain, 'v=spf1');
|
|
230
|
+
// DKIM check
|
|
231
|
+
doc.dnsStatus.dkim = await this.checkTxtRecord(resolver, `${selector}._domainkey.${domain}`, 'v=DKIM1');
|
|
232
|
+
// DMARC check
|
|
233
|
+
doc.dnsStatus.dmarc = await this.checkTxtRecord(resolver, `_dmarc.${domain}`, 'v=DMARC1');
|
|
234
|
+
doc.dnsStatus.lastCheckedAt = new Date().toISOString();
|
|
235
|
+
doc.updatedAt = new Date().toISOString();
|
|
236
|
+
await doc.save();
|
|
237
|
+
return this.getRequiredDnsRecords(id);
|
|
238
|
+
}
|
|
239
|
+
async checkMx(resolver, domain) {
|
|
240
|
+
try {
|
|
241
|
+
const records = await resolver.resolveMx(domain);
|
|
242
|
+
return records && records.length > 0 ? 'valid' : 'missing';
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
return 'missing';
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
async checkTxtRecord(resolver, name, prefix) {
|
|
249
|
+
try {
|
|
250
|
+
const records = await resolver.resolveTxt(name);
|
|
251
|
+
const flat = records.map((r) => r.join(''));
|
|
252
|
+
const found = flat.some((r) => r.startsWith(prefix));
|
|
253
|
+
return found ? 'valid' : 'missing';
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
return 'missing';
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// ---------------------------------------------------------------------------
|
|
260
|
+
// Helpers
|
|
261
|
+
// ---------------------------------------------------------------------------
|
|
262
|
+
docToInterface(doc) {
|
|
263
|
+
return {
|
|
264
|
+
id: doc.id,
|
|
265
|
+
domain: doc.domain,
|
|
266
|
+
linkedDomainId: doc.linkedDomainId,
|
|
267
|
+
subdomain: doc.subdomain,
|
|
268
|
+
dkim: doc.dkim,
|
|
269
|
+
rateLimits: doc.rateLimits,
|
|
270
|
+
dnsStatus: doc.dnsStatus,
|
|
271
|
+
createdAt: doc.createdAt,
|
|
272
|
+
updatedAt: doc.updatedAt,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5lbWFpbC1kb21haW4ubWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2VtYWlsL2NsYXNzZXMuZW1haWwtZG9tYWluLm1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDN0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUl6RTs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBQ3JCLFFBQVEsQ0FBTSxDQUFDLG9DQUFvQztJQUUzRCxZQUFZLFdBQWdCO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFZLFVBQVU7UUFDcEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFBWSxXQUFXO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDO0lBQ2hELENBQUM7SUFFRCxJQUFZLGFBQWE7UUFDdkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLElBQUksV0FBVyxDQUFDO0lBQzNHLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsT0FBTztJQUNQLDhFQUE4RTtJQUV2RSxLQUFLLENBQUMsTUFBTTtRQUNqQixNQUFNLElBQUksR0FBRyxNQUFNLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1QyxPQUFP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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './classes.email-domain.manager.js';
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from './classes.email-domain.manager.js';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9lbWFpbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLG1DQUFtQyxDQUFDIn0=
|