is-domain-alive.ts 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import { createDomainAliveChecker, createRegisterableDomainAliveChecker } from 'domain-alive';
  2. import { $$fetch } from './fetch-retry';
  3. const dnsServers = [
  4. 'h2://8.8.8.8/dns-query', 'h2://8.8.4.4/dns-query',
  5. 'h2://1.0.0.1/dns-query', 'h2://1.1.1.1/dns-query',
  6. 'h2://162.159.36.1/dns-query', 'h2://162.159.46.1/dns-query',
  7. 'h2://dns.cloudflare.com/dns-query', // Cloudflare DoH that uses different IPs: 172.64.41.8,162.159.61.8
  8. 'h2://cloudflare-dns.com/dns-query', // Cloudflare DoH that uses different IPs: 104.16.249.249,104.16.248.249
  9. 'h2://mozilla.cloudflare-dns.com/dns-query', // Cloudflare DoH that uses different IPs: 162.159.61.4,172.64.41.4
  10. // one.one.one.one // Cloudflare DoH that uses 1.1.1.1 and 1.0.0.1
  11. // 'https://101.101.101.101/dns-query', 'https://dns.twnic.tw/dns-query' // TWNIC, has DNS pollution, e.g. t66y.com
  12. // 'https://dns.hinet.net/dns-query' // HiNet DoH, has DNS pollution, e.g. t66y.com
  13. 'h2://185.222.222.222/dns-query', 'h2://45.11.45.11/dns-query', // DNS.SB
  14. // 'https://doh.dns.sb/dns-query', // DNS.SB, Unicast PoPs w/ GeoDNS
  15. 'h2://us-chi.doh.sb/dns-query', // DNS.SB Chicago PoP
  16. 'h2://us-nyc.doh.sb/dns-query', // DNS.SB New York City PoP
  17. 'h2://us-sjc.doh.sb/dns-query', // DNS.SB San Jose PoP
  18. // 'https://doh.sb/dns-query', // DNS.SB xTom Anycast IP
  19. // 'https://dns.sb/dns-query', // DNS.SB use same xTom Anycast IP as doh.sb
  20. // 'https://dns10.quad9.net/dns-query', // Quad9 unfiltered
  21. 'h2://9.9.9.10/dns-query', 'h2://149.112.112.10/dns-query', // Quad9 unfiltered
  22. // OpenDNS sandbox (unfiltered), doesn't support HTTP/2 properly
  23. // Error: Session closed without receiving a SETTINGS frame
  24. //
  25. // verified with curl:
  26. // curl: (16) Error in the HTTP2 framing layer
  27. 'https://doh.sandbox.opendns.com/dns-query',
  28. 'h2://unfiltered.adguard-dns.com/dns-query', // AdGuard unfiltered
  29. // 'https://v.recipes/dns-query', // Proxy Cloudflare, too many HTTP 503
  30. 'h2://v.recipes/dns/dns.google/dns-query', // Proxy Google, claims to not limited by Google 1500 QPS limit
  31. 'h2://freedns.controld.com/p0', // ControlD unfiltered
  32. // 'h2://dns.bebasid.com/unfiltered', // BebasID, cause loads of RangeError: Attempt to access memory outside buffer bounds, possibly caused by timeout
  33. // 'https://193.110.81.0/dns-query', // dns0.eu
  34. // 'https://185.253.5.0/dns-query', // dns0.eu
  35. // 'https://zero.dns0.eu/dns-query',
  36. 'h2://dns.nextdns.io/dns-query',
  37. 'h2://anycast.dns.nextdns.io/dns-query',
  38. 'h2://wikimedia-dns.org/dns-query',
  39. // 'https://ordns.he.net/dns-query',
  40. // 'https://dns.mullvad.net/dns-query', empty HTTP body a lot
  41. 'h2://basic.rethinkdns.com/dns-query',
  42. 'h2://dns.surfsharkdns.com/dns-query',
  43. 'h2://private.canadianshield.cira.ca/dns-query',
  44. // 'https://unfiltered.joindns4.eu/dns-query', // too many ECONNRESET on GitHub Actions
  45. 'h2://public.dns.iij.jp/dns-query',
  46. // 'https://common.dot.dns.yandex.net/dns-query', // too many ECONNRESET on GitHub Actions
  47. 'h2://safeservedns.com/dns-query' // NameCheap DNS, supports DoT, DoH, UDP53
  48. // 'https://ada.openbld.net/dns-query', Contains filtering
  49. // 'h2://dns.rabbitdns.org/dns-query' -- TO MANY HTTP 522
  50. ];
  51. const resultCache = new Map();
  52. const registerableDomainResultCache = new Map();
  53. export async function getMethods() {
  54. const customWhoisServersMapping = await (await ($$fetch('https://cdn.jsdelivr.net/npm/whois-servers-list@latest/list.json'))).json() as any;
  55. const isRegisterableDomainAlive = createRegisterableDomainAliveChecker({
  56. dns: {
  57. dnsServers,
  58. maxAttempts: 6
  59. },
  60. registerableDomainResultCache,
  61. whois: {
  62. customWhoisServersMapping
  63. }
  64. });
  65. const isDomainAlive = createDomainAliveChecker({
  66. dns: {
  67. dnsServers,
  68. maxAttempts: 6
  69. },
  70. registerableDomainResultCache,
  71. resultCache,
  72. whois: {
  73. customWhoisServersMapping
  74. }
  75. });
  76. return { isRegisterableDomainAlive, isDomainAlive };
  77. };