parse-dnsmasq.ts 1.1 KB

12345678910111213141516171819202122232425262728293031323334
  1. import { createReadlineInterfaceFromResponse } from './fetch-text-by-line';
  2. import { parse as tldtsParse } from 'tldts';
  3. import { $fetch } from './make-fetch-happen';
  4. import type { NodeFetchResponse } from './make-fetch-happen';
  5. function isDomainLoose(domain: string): boolean {
  6. const { isIcann, isPrivate, isIp } = tldtsParse(domain);
  7. return !!(!isIp && (isIcann || isPrivate));
  8. }
  9. export function extractDomainsFromFelixDnsmasq(line: string): string | null {
  10. if (line.startsWith('server=/') && line.endsWith('/114.114.114.114')) {
  11. return line.slice(8, -16);
  12. }
  13. return null;
  14. }
  15. export async function parseFelixDnsmasqFromResp(resp: Response | NodeFetchResponse): Promise<string[]> {
  16. const results: string[] = [];
  17. for await (const line of createReadlineInterfaceFromResponse(resp)) {
  18. const domain = extractDomainsFromFelixDnsmasq(line);
  19. if (domain && isDomainLoose(domain)) {
  20. results.push(domain);
  21. }
  22. }
  23. return results;
  24. }
  25. export async function parseFelixDnsmasq(url: string): Promise<string[]> {
  26. const resp = await $fetch(url);
  27. return parseFelixDnsmasqFromResp(resp);
  28. }