added dns checking
| @@ -9,6 +9,7 @@ import path from 'node:path'; | ||
| 9 | 9 | import util from 'node:util'; |
| 10 | 10 | import net from 'node:net'; |
| 11 | 11 | import dns from 'node:dns'; |
| 12 | +import { promises as dnsPromise } from 'node:dns' | |
| 12 | 13 | import process from 'node:process'; |
| 13 | 14 | import { fileURLToPath } from 'node:url'; |
| 14 | 15 | |
| @@ -383,43 +384,36 @@ function getSessionCookieAge() { | ||
| 383 | 384 | } |
| 384 | 385 | |
| 385 | 386 | |
| 386 | 387 | async function canResolve(name, useIPv6 = true, useIPv4 = true) { |
| 387 | - return new Promise((resolve, reject) => { | |
| 388 | + try { | |
| 388 | - let v6Resolve | |
| 389 | + let v6Resolved = false; | |
| 389 | - let v4Resolve | |
| 390 | + let v4Resolved = false; | |
| 390 | 391 | |
| 391 | 392 | if (useIPv6) { |
| 392 | - dns.resolve6(name, (err) => { | |
| 393 | + try { | |
| 393 | - if (err) { | |
| 394 | + await dnsPromise.resolve6(name); | |
| 394 | - v6Resolve = false | |
| 395 | + v6Resolved = true; | |
| 395 | 396 | } elsecatch (error) { |
| 396 | - v6Resolve = true | |
| 397 | + v6Resolved = false; | |
| 397 | 398 | } |
| 398 | - }); | |
| 399 | - | |
| 400 | - } else { | |
| 401 | - v6Resolve = false | |
| 402 | 399 | } |
| 403 | 400 | |
| 401 | + // If we need to check IPv4 resolution | |
| 404 | 402 | if (useIPv4) { |
| 405 | - dns.resolve(name, (err) => { | |
| 403 | + try { | |
| 406 | - if (err) { | |
| 404 | + await dnsPromise.resolve(name); | |
| 407 | - v4Resolve = false | |
| 405 | + v4Resolved = true; | |
| 408 | 406 | } elsecatch (error) { |
| 409 | - v4Resolve = true | |
| 407 | + v4Resolved = false; | |
| 410 | 408 | } |
| 411 | - }); | |
| 412 | - | |
| 413 | - } else { | |
| 414 | - v4Resolve = false | |
| 415 | 409 | } |
| 416 | 410 | |
| 417 | - if (v6Resolve || v4Resolve) { | |
| 411 | + console.log(v6Resolved, v4Resolved) | |
| 418 | - resolve | |
| 412 | + return v6Resolved || v4Resolved; | |
| 419 | - } else { | |
| 413 | + | |
| 420 | - reject | |
| 414 | + } catch (error) { | |
| 421 | - } | |
| 415 | + return false; | |
| 422 | 416 | }); |
| 423 | 417 | } |
| 424 | 418 | |
| 425 | 419 | async function getHasIP() { |
| @@ -774,12 +768,14 @@ const preSetupTasks = async function () { | ||
| 774 | 768 | |
| 775 | 769 | /** |
| 776 | 770 | * Gets the hostname to use for autorun in the browser. |
| 777 | 771 | * @returns promise({string} The hostname to use for autorun |
| 778 | 772 | */ |
| 779 | 773 | async function getAutorunHostname(useIPv6, useIPv4) { |
| 780 | 774 | if (autorunHostname === 'auto') { |
| 775 | + let localhostResolve = await canResolve('localhost', useIPv6, useIPv4) | |
| 776 | + | |
| 781 | 777 | if (useIPv6 && useIPv4) { |
| 782 | 778 | if (avoidLocalhost || !localhostResolve) return '[::1]'; |
| 783 | 779 | return 'localhost'; |
| 784 | 780 | } |
| 785 | 781 | |
| @@ -792,6 +788,7 @@ function getAutorunHostname(useIPv6, useIPv4) { | ||
| 792 | 788 | } |
| 793 | 789 | } |
| 794 | 790 | |
| 791 | + | |
| 795 | 792 | return autorunHostname; |
| 796 | 793 | } |
| 797 | 794 | |
| @@ -803,7 +800,7 @@ function getAutorunHostname(useIPv6, useIPv4) { | ||
| 803 | 800 | const postSetupTasks = async function (v6Failed, v4Failed, useIPv6, useIPv4) { |
| 804 | 801 | const autorunUrl = new URL( |
| 805 | 802 | (cliArguments.ssl ? 'https://' : 'http://') + |
| 806 | 803 | (await getAutorunHostname(useIPv6, useIPv4)) + |
| 807 | 804 | (':') + |
| 808 | 805 | ((autorunPortOverride >= 0) ? autorunPortOverride : server_port), |
| 809 | 806 | ); |
| @@ -1045,6 +1042,7 @@ async function startServer() { | ||
| 1045 | 1042 | process.exit(1); |
| 1046 | 1043 | } |
| 1047 | 1044 | |
| 1045 | + | |
| 1048 | 1046 | const [v6Failed, v4Failed] = await startHTTPorHTTPS(useIPv6, useIPv4); |
| 1049 | 1047 | |
| 1050 | 1048 | handleServerListenFail(v6Failed, v4Failed, useIPv6, useIPv4); |