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")