UNPKG

@linkedmink/node-route53-dynamic-dns

Version:

Background process that updates AWS Route 53 DNS address records whenever the public IP of the hosting environment changes

70 lines (58 loc) 2.99 kB
import { Command } from "commander"; import { ConfigKey } from "../constants/config.mjs"; import { PublicIpEvent, DnsRecordsEvent } from "../constants/events.mjs"; import { PACKAGE_VERSION } from "../constants/version.mjs"; import { EnvironmentConfig } from "../environment/environment-config.mjs"; import { initializeLogging } from "../environment/logger.mjs"; import { HealthCheckServer } from "../event-handlers/health-check-server.mjs"; import { PublicIpClient } from "../event-handlers/public-ip-event-emitter.mjs"; import { Route53AddressRecordUpdater } from "../event-handlers/route53-address-record-updater.mjs"; import { Route53DnsRecordSetStore } from "../services/dns-record-set-source.mjs"; import { Route53UpdateClient } from "../services/route53-update-client.mjs"; import { DnsZoneRecordClient } from "../types/dns-zone-record-client.mjs"; import { PublicIpEventEmitter } from "../types/public-ip-events.mjs"; export default (config: EnvironmentConfig) => { const main = async () => { const logger = initializeLogging(config); logger.info("Initializing App"); const route53Client: DnsZoneRecordClient = new Route53UpdateClient(); const inputHostnames = config.getJson<string[]>(ConfigKey.HostnamesToUpdate); const isCachedRecordsEnabled = config.getBool(ConfigKey.CacheDnsRecords); const dnsRecordSetSource = new Route53DnsRecordSetStore( route53Client, isCachedRecordsEnabled, inputHostnames ); const route53Updater = new Route53AddressRecordUpdater(route53Client, dnsRecordSetSource); const ipUpdateInterval = config.getNumber(ConfigKey.IpCheckIntervalSeconds) * 1000; const ipUpdateTimeout = config.getNumber(ConfigKey.IpCheckTimeoutMs); const isIpV6Enabled = config.getBool(ConfigKey.IpV6Enabled); const publicIpClient: PublicIpEventEmitter = new PublicIpClient( ipUpdateInterval, ipUpdateTimeout, isIpV6Enabled ); // eslint-disable-next-line @typescript-eslint/no-misused-promises publicIpClient.on(PublicIpEvent.Retrieved, route53Updater.handlePublicIpUpdate); const port = config.getNumberOrNull(ConfigKey.BindPort); if (port !== null) { const healthCheckServer = new HealthCheckServer(); dnsRecordSetSource.on( DnsRecordsEvent.Retrieved, healthCheckServer.handleRecordsRetrievedEvent ); dnsRecordSetSource.on(DnsRecordsEvent.Updated, healthCheckServer.handleRecordsUpdatedEvent); publicIpClient.on(PublicIpEvent.Retrieved, healthCheckServer.handlePublicIpEvent); const host = config.getStringOrNull(ConfigKey.BindHost); await healthCheckServer.start(port, host !== null ? host : undefined); } void publicIpClient.start(); logger.verbose("Initialized App"); }; return new Command("service") .version(PACKAGE_VERSION) .description( "This will run the background process that updates host records from your public IP until it's terminated" ) .action(main); };