parse-dnsmasq.ts 1.1 KB

123456789101112131415161718192021222324252627282930313233
  1. import { createReadlineInterfaceFromResponse } from './fetch-text-by-line';
  2. // https://github.com/remusao/tldts/issues/2121
  3. // In short, single label domain suffix is ignored due to the size optimization, so no isIcann
  4. // import tldts from 'tldts-experimental';
  5. import tldts from 'tldts';
  6. import type { UndiciResponseData } from './fetch-retry';
  7. import type { Response } from 'undici';
  8. function isDomainLoose(domain: string): boolean {
  9. const r = tldts.parse(domain);
  10. return !!(!r.isIp && (r.isIcann || r.isPrivate));
  11. }
  12. export function extractDomainsFromFelixDnsmasq(line: string): string | null {
  13. if (line.startsWith('server=/') && line.endsWith('/114.114.114.114')) {
  14. return line.slice(8, -16);
  15. }
  16. return null;
  17. }
  18. export async function parseFelixDnsmasqFromResp(resp: UndiciResponseData | Response): Promise<string[]> {
  19. const results: string[] = [];
  20. for await (const line of createReadlineInterfaceFromResponse(resp, true)) {
  21. const domain = extractDomainsFromFelixDnsmasq(line);
  22. if (domain && isDomainLoose(domain)) {
  23. results.push(domain);
  24. }
  25. }
  26. return results;
  27. }