feat: Allow direct control of IP family to be returned by DNS lookup

implements #306
This commit is contained in:
cetteup 2022-12-13 10:46:43 +01:00
parent 70ec2a45a7
commit 3c38fe48fe
4 changed files with 9 additions and 7 deletions

View file

@ -5,7 +5,7 @@ const Minimist = require('minimist'),
const argv = Minimist(process.argv.slice(2), {
boolean: ['pretty','debug','givenPortOnly','requestRules'],
string: ['guildId','listenUdpPort']
string: ['guildId','listenUdpPort','ipFamily']
});
const debug = argv.debug;

View file

@ -20,10 +20,11 @@ class DnsResolver {
/**
* Response port will only be present if srv record was involved.
* @param {string} host
* @param {number} ipFamily
* @param {string=} srvRecordPrefix
* @returns {Promise<{address:string, port:number=}>}
*/
async resolve(host, srvRecordPrefix) {
async resolve(host, ipFamily, srvRecordPrefix) {
this.logger.debug("DNS Lookup: " + host);
if(this.isIp(host)) {
@ -52,7 +53,7 @@ class DnsResolver {
}
return {
port: srvPort,
...await this.resolve(srvHost, srvRecordPrefix)
...await this.resolve(srvHost, ipFamily, srvRecordPrefix)
};
}
this.logger.debug("No SRV Record");
@ -62,7 +63,7 @@ class DnsResolver {
}
this.logger.debug("Standard Resolve: " + host);
const dnsResult = await dnsLookupAsync(host);
const dnsResult = await dnsLookupAsync(host, ipFamily);
// For some reason, this sometimes returns a string address rather than an object.
// I haven't been able to reproduce, but it's been reported on the issue tracker.
let address;

View file

@ -5,7 +5,8 @@ const GameResolver = require('./GameResolver'),
const defaultOptions = {
socketTimeout: 2000,
attemptTimeout: 10000,
maxAttempts: 1
maxAttempts: 1,
ipFamily: 0
};
class QueryRunner {
@ -19,7 +20,7 @@ class QueryRunner {
async run(userOptions) {
for (const key of Object.keys(userOptions)) {
const value = userOptions[key];
if (['port'].includes(key)) {
if (['port', 'ipFamily'].includes(key)) {
userOptions[key] = parseInt(value);
}
}

View file

@ -69,7 +69,7 @@ class Core extends EventEmitter {
async runOnce() {
const options = this.options;
if (('host' in options) && !('address' in options)) {
const resolved = await this.dnsResolver.resolve(options.host, this.srvRecord);
const resolved = await this.dnsResolver.resolve(options.host, options.ipFamily, this.srvRecord);
options.address = resolved.address;
if (resolved.port) options.port = resolved.port;
}