diff --git a/Build/lib/get-telegram-backup-ip.ts b/Build/lib/get-telegram-backup-ip.ts index ecd751c6..c8665a55 100644 --- a/Build/lib/get-telegram-backup-ip.ts +++ b/Build/lib/get-telegram-backup-ip.ts @@ -131,10 +131,13 @@ const pool = new Worktank({ const picocolors = __require('picocolors') as typeof import('picocolors'); const { fetch } = __require('./fetch-retry') as typeof import('./fetch-retry'); - const DNS2 = __require('dns2') as typeof import('dns2'); + + const dns = __require('node:dns/promises') as typeof import('node:dns/promises'); + const { createReadlineInterfaceFromResponse } = __require('./fetch-text-by-line') as typeof import('./fetch-text-by-line'); const { getTelegramBackupIPFromBase64 } = __require('./get-telegram-backup-ip') as typeof import('./get-telegram-backup-ip'); const { fastIpVersion } = __require('foxts/fast-ip-version') as typeof import('foxts/fast-ip-version'); + const { fastStringArrayJoin } = __require('foxts/fast-string-array-join') as typeof import('foxts/fast-string-array-join'); const resp = await fetch('https://core.telegram.org/resources/cidr.txt'); const lastModified = resp.headers.get('last-modified'); @@ -159,33 +162,37 @@ const pool = new Worktank({ // https://github.com/tdlib/td/blob/master/td/telegram/ConfigManager.cpp - // Backup IP Source 1 (DoH) - await Promise.all([ - DNS2.DOHClient({ dns: 'https://8.8.4.4/dns-query?dns={query}' }), - DNS2.DOHClient({ dns: 'https://1.0.0.1/dns-query?dns={query}' }) - ].flatMap( - (client) => [ - 'apv3.stel.com', // prod - 'tapv3.stel.com' // test - ].map(async (domain) => { - try { - // tapv3.stel.com was for testing server - const resp = await client(domain, 'TXT'); - const strings = resp.answers.map(i => i.data); + const resolvers = ['8.8.8.8', '1.0.0.1'].map((ip) => { + const resolver = new dns.Resolver(); + resolver.setServers([ip]); + return Object.assign(resolver, { server: ip }); + }); - const str = strings[0]!.length > strings[1]!.length - ? strings[0]! + strings[1]! - : strings[1]! + strings[0]!; - - const ips = getTelegramBackupIPFromBase64(str); - ips.forEach(i => backupIPs.add(i.ip)); - - console.log('[telegram backup ip]', picocolors.green('DoH TXT'), { domain, ips }); - } catch (e) { - console.error('[telegram backup ip]', picocolors.red('DoH TXT error'), { domain }, e); + // Backup IP Source 1 (DNS) + await Promise.all(resolvers.flatMap((resolver) => [ + 'apv3.stel.com', // prod + 'tapv3.stel.com' // test + ].map(async (domain) => { + try { + // tapv3.stel.com was for testing server + const resp = await resolver.resolveTxt(domain); + const strings = resp.map(r => fastStringArrayJoin(r, '')); // flatten + if (strings.length !== 2) { + throw new TypeError(`Unexpected TXT record count: ${strings.length}`); } - }) - )); + + const str = strings[0].length > strings[1].length + ? strings[0] + strings[1] + : strings[1] + strings[0]; + + const ips = getTelegramBackupIPFromBase64(str); + ips.forEach(i => backupIPs.add(i.ip)); + + console.log('[telegram backup ip]', picocolors.green('DNS TXT'), { domain, ips, server: resolver.server }); + } catch (e) { + console.error('[telegram backup ip]', picocolors.red('DNS TXT error'), { domain }, e); + } + }))); // Backup IP Source 2: Firebase Realtime Database (test server not supported) try { diff --git a/package.json b/package.json index ef7d3ee8..59687079 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,6 @@ "ci-info": "^4.3.1", "cli-progress": "^3.12.0", "csv-parse": "^6.1.0", - "dns2": "github:lsongdev/node-dns#e4fa035aca0b8eb730bde3431fbf0c60a31a09c9", "domain-alive": "^0.1.14", "fast-cidr-tools": "^0.3.4", "fast-escape-regexp": "^1.0.1", @@ -56,7 +55,6 @@ "@swc/core": "1.13.5", "@types/better-sqlite3": "^7.6.13", "@types/cli-progress": "^3.11.6", - "@types/dns2": "^2.0.10", "@types/mocha": "^10.0.10", "@types/node": "^24.10.4", "@types/tar-fs": "^2.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1b97dd1e..5ee31f17 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,9 +35,6 @@ importers: csv-parse: specifier: ^6.1.0 version: 6.1.0 - dns2: - specifier: github:lsongdev/node-dns#e4fa035aca0b8eb730bde3431fbf0c60a31a09c9 - version: https://codeload.github.com/lsongdev/node-dns/tar.gz/e4fa035aca0b8eb730bde3431fbf0c60a31a09c9 domain-alive: specifier: ^0.1.14 version: 0.1.14 @@ -120,9 +117,6 @@ importers: '@types/cli-progress': specifier: ^3.11.6 version: 3.11.6 - '@types/dns2': - specifier: ^2.0.10 - version: 2.0.10 '@types/mocha': specifier: ^10.0.10 version: 10.0.10 @@ -667,9 +661,6 @@ packages: '@types/cli-progress@3.11.6': resolution: {integrity: sha512-cE3+jb9WRlu+uOSAugewNpITJDt1VF8dHOopPO4IABFc3SXYL5WE/+PTz/FCdZRRfIujiWW3n3aMbv1eIGVRWA==} - '@types/dns2@2.0.10': - resolution: {integrity: sha512-3ezTiJfY6/VlXnvEOVSSbWpFbxtS3zXi0f2mccV6tI7wT+BIvTgLZhEUVHpiE1ycLKMqJyXndmkKw42nX49MQA==} - '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -1117,10 +1108,6 @@ packages: resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} engines: {node: '>=0.3.1'} - dns2@https://codeload.github.com/lsongdev/node-dns/tar.gz/e4fa035aca0b8eb730bde3431fbf0c60a31a09c9: - resolution: {tarball: https://codeload.github.com/lsongdev/node-dns/tar.gz/e4fa035aca0b8eb730bde3431fbf0c60a31a09c9} - version: 2.1.0 - dom-serializer@1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} @@ -2653,10 +2640,6 @@ snapshots: dependencies: '@types/node': 24.10.4 - '@types/dns2@2.0.10': - dependencies: - '@types/node': 24.10.4 - '@types/estree@1.0.8': {} '@types/istanbul-lib-coverage@2.0.6': {} @@ -3062,8 +3045,6 @@ snapshots: diff@7.0.0: {} - dns2@https://codeload.github.com/lsongdev/node-dns/tar.gz/e4fa035aca0b8eb730bde3431fbf0c60a31a09c9: {} - dom-serializer@1.4.1: dependencies: domelementtype: 2.3.0