validate-domestic.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import path from 'node:path';
  2. import { SOURCE_DIR } from './constants/dir';
  3. import { parseFelixDnsmasqFromResp } from './lib/parse-dnsmasq';
  4. import { $$fetch } from './lib/fetch-retry';
  5. import runAgainstSourceFile from './lib/run-against-source-file';
  6. import { getTopOneMillionDomains } from './validate-gfwlist';
  7. import { HostnameSmolTrie } from './lib/trie';
  8. import tldts from 'tldts-experimental';
  9. import { DOMESTICS } from '../Source/non_ip/domestic';
  10. export async function parseDomesticList() {
  11. const allChinaDomains = new Set<string>(await parseFelixDnsmasqFromResp(await $$fetch('https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf')));
  12. const topDomainTrie = await getTopOneMillionDomains();
  13. const resultTrie = new HostnameSmolTrie();
  14. topDomainTrie.dumpWithoutDot((domain) => {
  15. const apexDomain = tldts.getDomain(domain);
  16. if (apexDomain && allChinaDomains.has(apexDomain)) {
  17. resultTrie.add(apexDomain, false);
  18. }
  19. });
  20. const callback = (domain: string, includeAllSubdomain: boolean) => resultTrie.whitelist(domain, includeAllSubdomain);
  21. // await Promise.all([
  22. await runAgainstSourceFile(
  23. path.resolve(SOURCE_DIR, 'non_ip/domestic.conf'),
  24. callback
  25. );
  26. await runAgainstSourceFile(
  27. path.resolve(SOURCE_DIR, 'domainset/reject.conf'),
  28. callback
  29. );
  30. Object.values(DOMESTICS).forEach(domestic => {
  31. domestic.domains.forEach(domain => {
  32. switch (domain[0]) {
  33. case '+':
  34. case '$': {
  35. resultTrie.whitelist(domain.slice(1), true);
  36. break;
  37. }
  38. default: {
  39. resultTrie.whitelist(domain, true);
  40. break;
  41. }
  42. }
  43. });
  44. });
  45. // noop, DOMAIN-KEYWORD handing
  46. // for (const d of top5000) {
  47. // if (d.includes(domain)) {
  48. // notIncludedDomestic.delete(d);
  49. // }
  50. // }
  51. // ]);
  52. console.log(resultTrie.dump().join('\n') + '\n');
  53. }
  54. if (require.main === module) {
  55. parseDomesticList().catch(console.error);
  56. }