123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.SrvPoller = exports.SrvPollingEvent = void 0;
- const dns = require("dns");
- const timers_1 = require("timers");
- const error_1 = require("../error");
- const mongo_types_1 = require("../mongo_types");
- const utils_1 = require("../utils");
- /**
- * @internal
- * @category Event
- */
- class SrvPollingEvent {
- constructor(srvRecords) {
- this.srvRecords = srvRecords;
- }
- hostnames() {
- return new Set(this.srvRecords.map(r => utils_1.HostAddress.fromSrvRecord(r).toString()));
- }
- }
- exports.SrvPollingEvent = SrvPollingEvent;
- /** @internal */
- class SrvPoller extends mongo_types_1.TypedEventEmitter {
- constructor(options) {
- super();
- if (!options || !options.srvHost) {
- throw new error_1.MongoRuntimeError('Options for SrvPoller must exist and include srvHost');
- }
- this.srvHost = options.srvHost;
- this.srvMaxHosts = options.srvMaxHosts ?? 0;
- this.srvServiceName = options.srvServiceName ?? 'mongodb';
- this.rescanSrvIntervalMS = 60000;
- this.heartbeatFrequencyMS = options.heartbeatFrequencyMS ?? 10000;
- this.haMode = false;
- this.generation = 0;
- this._timeout = undefined;
- }
- get srvAddress() {
- return `_${this.srvServiceName}._tcp.${this.srvHost}`;
- }
- get intervalMS() {
- return this.haMode ? this.heartbeatFrequencyMS : this.rescanSrvIntervalMS;
- }
- start() {
- if (!this._timeout) {
- this.schedule();
- }
- }
- stop() {
- if (this._timeout) {
- (0, timers_1.clearTimeout)(this._timeout);
- this.generation += 1;
- this._timeout = undefined;
- }
- }
- // TODO(NODE-4994): implement new logging logic for SrvPoller failures
- schedule() {
- if (this._timeout) {
- (0, timers_1.clearTimeout)(this._timeout);
- }
- this._timeout = (0, timers_1.setTimeout)(() => {
- this._poll().catch(() => null);
- }, this.intervalMS);
- }
- success(srvRecords) {
- this.haMode = false;
- this.schedule();
- this.emit(SrvPoller.SRV_RECORD_DISCOVERY, new SrvPollingEvent(srvRecords));
- }
- failure() {
- this.haMode = true;
- this.schedule();
- }
- async _poll() {
- const generation = this.generation;
- let srvRecords;
- try {
- srvRecords = await dns.promises.resolveSrv(this.srvAddress);
- }
- catch (dnsError) {
- this.failure();
- return;
- }
- if (generation !== this.generation) {
- return;
- }
- const finalAddresses = [];
- for (const record of srvRecords) {
- if ((0, utils_1.matchesParentDomain)(record.name, this.srvHost)) {
- finalAddresses.push(record);
- }
- }
- if (!finalAddresses.length) {
- this.failure();
- return;
- }
- this.success(finalAddresses);
- }
- }
- /** @event */
- SrvPoller.SRV_RECORD_DISCOVERY = 'srvRecordDiscovery';
- exports.SrvPoller = SrvPoller;
- //# sourceMappingURL=srv_polling.js.map
|