tools-migrate-domains.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import path from 'node:path';
  2. import { readFileByLine } from './lib/fetch-text-by-line';
  3. import { processFilterRulesWithPreload } from './lib/parse-filter/filters';
  4. import { processHosts } from './lib/parse-filter/hosts';
  5. import { processLine } from './lib/process-line';
  6. import { HostnameSmolTrie } from './lib/trie';
  7. import { dummySpan } from './trace';
  8. import { SOURCE_DIR } from './constants/dir';
  9. import { PREDEFINED_WHITELIST } from './constants/reject-data-source';
  10. (async () => {
  11. const trie = new HostnameSmolTrie();
  12. await writeHostsToTrie(trie, 'https://cdn.jsdelivr.net/gh/jerryn70/GoodbyeAds@master/Extension/GoodbyeAds-Xiaomi-Extension.txt', true);
  13. await runWhiteOnSource(path.join(SOURCE_DIR, 'domainset', 'reject.conf'), trie);
  14. await runWhiteOnSource(path.join(SOURCE_DIR, 'non_ip', 'reject.conf'), trie);
  15. for (let i = 0, len = PREDEFINED_WHITELIST.length; i < len; i++) {
  16. trie.whitelist(PREDEFINED_WHITELIST[i]);
  17. }
  18. console.log('---------------------------');
  19. console.log(trie.dump().join('\n'));
  20. console.log('---------------------------');
  21. })();
  22. async function runWhiteOnSource(sourceFile: string, trie: HostnameSmolTrie) {
  23. for await (const line of readFileByLine(sourceFile)) {
  24. const l = processLine(line);
  25. if (l) {
  26. if (l.includes(',')) {
  27. const [type, domain] = l.split(',', 3);
  28. if (type === 'DOMAIN') {
  29. trie.whitelist(domain, false);
  30. } else if (type === 'DOMAIN-SUFFIX') {
  31. trie.whitelist(domain, true);
  32. }
  33. } else {
  34. trie.whitelist(l);
  35. }
  36. }
  37. }
  38. }
  39. async function writeHostsToTrie(trie: HostnameSmolTrie, hostsUrl: string, includeAllSubDomain = false) {
  40. const hosts = await processHosts(dummySpan, hostsUrl, [], includeAllSubDomain);
  41. for (let i = 0, len = hosts.length; i < len; i++) {
  42. trie.add(hosts[i]);
  43. }
  44. }
  45. // eslint-disable-next-line unused-imports/no-unused-vars -- ready to use function
  46. async function writeFiltersToTrie(trie: HostnameSmolTrie, filterUrl: string, includeThirdParty = false) {
  47. const { whiteDomainSuffixes, whiteDomains, blackDomainSuffixes, blackDomains } = await processFilterRulesWithPreload(filterUrl, [], includeThirdParty)(dummySpan);
  48. for (let i = 0, len = blackDomainSuffixes.length; i < len; i++) {
  49. trie.add(blackDomainSuffixes[i], true);
  50. }
  51. for (let i = 0, len = blackDomains.length; i < len; i++) {
  52. trie.add(blackDomains[i], false);
  53. }
  54. for (let i = 0, len = whiteDomainSuffixes.length; i < len; i++) {
  55. trie.whitelist(whiteDomainSuffixes[i], true);
  56. }
  57. for (let i = 0, len = whiteDomains.length; i < len; i++) {
  58. trie.whitelist(whiteDomains[i], false);
  59. }
  60. }