@samitouri / QOSami-HFS / commits / 8dba5150

fix: check_domain api could time out

Massimo Melina committed Jun 7, 2026 at 17:11 UTC 8dba51501356495a8b6efc6096ca0bd781d98cb4
1 file changed +6 -5
src/api.net.ts
+6 -5
@@ -7,7 +7,7 @@ import {
7 import _ from 'lodash'
8 import { getCertObject } from './listen'
9 import { getProjectInfo } from './github'
10 -import { apiAssertTypes, onlyTruthy, promiseBestEffort } from './misc'
10 +import { apiAssertTypes, haveTimeout, onlyTruthy, promiseBestEffort } from './misc'
11 import { lookup, Resolver } from 'dns/promises'
12 import { isIPv6 } from 'net'
13 import { getNatInfo, getPublicIps, getUpnpClient, mappedPort, upnpMappingParam } from './nat'
@@ -20,13 +20,14 @@ export default {
20
21 async check_domain({ domain }) {
22 apiAssertTypes({ string: { domain } })
23 - const resolver = new Resolver()
23 + const resolver = new Resolver({ timeout: 3_000, tries: 2 })
24 const prjInfo = await getProjectInfo()
25 resolver.setServers(prjInfo.dnsServers)
26 + const timeout = 7_000 // the external timeout should be larger
27 const settled = await Promise.allSettled([
27 - resolver.resolve(domain, 'A'),
28 - resolver.resolve(domain, 'AAAA'),
29 - lookup(domain).then(x => [x.address]),
28 + haveTimeout(timeout, resolver.resolve(domain, 'A')),
29 + haveTimeout(timeout, resolver.resolve(domain, 'AAAA')),
30 + haveTimeout(timeout, lookup(domain).then(x => [x.address])),
31 ])
32 if (settled[0].status === 'rejected' && settled[0].reason.code === 'ECONNREFUSED')
33 return new ApiError(HTTP_SERVICE_UNAVAILABLE, "cannot resolve domain")