From 5ebbd3a493069036d93b026a4d319431b99121f0 Mon Sep 17 00:00:00 2001 From: lluiscab Date: Fri, 24 Aug 2018 10:00:47 +0200 Subject: [PATCH] Fixed hostname resolver and added comments and errors --- src/client/tcp_dns.js | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/src/client/tcp_dns.js b/src/client/tcp_dns.js index bf8ac5c..c62a66e 100644 --- a/src/client/tcp_dns.js +++ b/src/client/tcp_dns.js @@ -2,30 +2,59 @@ const net = require('net') const dns = require('dns') module.exports = function (client, options) { + + // Default options options.port = options.port || 25565 options.host = options.host || 'localhost' if (!options.connect) { + options.connect = (client) => { + + // Use stream if provided if (options.stream) { client.setSocket(options.stream) client.emit('connect') - } else if (options.port === 25565 && net.isIP(options.host) === 0 && options.host !== 'localhost') { - dns.resolveSrv('_minecraft._tcp.' + options.host, function (err, addresses) { + return; + } + + // If port was not defined (defauls to 25565), host is not an ip neither localhost + if (options.port === 25565 && net.isIP(options.host) === 0 && options.host !== 'localhost') { + + // Try to resolve SRV records for the comain + dns.resolveSrv('_minecraft._tcp.' + options.host, (err, addresses) => { + + // Error resolving domain if (err) { - client.setSocket(net.connect(options.port, options.host)) - return; + + // Could not resolve SRV lookup, connect directly + if(err.code === 'ENODATA') { + client.setSocket(net.connect(options.port, options.host)) + return; + } else { + // Something else happened + return client.emit('error', err) + } + } + + // SRV Lookup resolved conrrectly if (addresses && addresses.length > 0) { client.setSocket(net.connect(addresses[0].port, addresses[0].name)) - return; + } else { + client.emit('error', new Error("Could not resolve hostname")); } - client.emit('error', 'Could not resolve server address'); }) + } else { + // Otherwise, just connect using the provided hostname and port client.setSocket(net.connect(options.port, options.host)) } + + } + } + }