build-internal-cdn-rules.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import path from 'path';
  2. import { processLine } from './lib/process-line';
  3. import { readFileByLine } from './lib/fetch-text-by-line';
  4. import { sortDomains } from './lib/stable-sort-domain';
  5. import { task } from './trace';
  6. import { compareAndWriteFile } from './lib/create-file';
  7. import { getGorhillPublicSuffixPromise } from './lib/get-gorhill-publicsuffix';
  8. import { domainDeduper } from './lib/domain-deduper';
  9. import { sort } from './lib/timsort';
  10. const escapeRegExp = (string = '') => string.replaceAll(/[$()*+.?[\\\]^{|}]/g, '\\$&');
  11. const processLocalDomainSet = async (domainSetPath: string, set: Set<string>) => {
  12. for await (const l of readFileByLine(domainSetPath)) {
  13. const line = processLine(l);
  14. if (line) {
  15. set.add(line[0] === '.' ? line.slice(1) : line);
  16. }
  17. }
  18. };
  19. const processLocalRuleSet = async (ruleSetPath: string, set: Set<string>, keywords: Set<string>) => {
  20. for await (const line of readFileByLine(ruleSetPath)) {
  21. if (line.startsWith('DOMAIN-SUFFIX,')) {
  22. set.add(line.slice(14));
  23. } else if (line.startsWith('DOMAIN,')) {
  24. set.add(line.slice(7));
  25. } else if (line.startsWith('DOMAIN-KEYWORD')) {
  26. keywords.add(escapeRegExp(line.slice(15)));
  27. } else if (line.includes('USER-AGENT,') || line.includes('PROCESS-NAME,') || line.includes('URL-REGEX,') || line.includes('DOMAIN-WILDCARD')) {
  28. // do nothing
  29. } else if (processLine(line)) {
  30. console.warn('[drop line from ruleset]', line);
  31. }
  32. }
  33. };
  34. export const buildInternalCDNDomains = task(import.meta.path, async (span) => {
  35. const proxySet = new Set<string>();
  36. const proxyKeywords = new Set<string>();
  37. const gorhill = (await Promise.all([
  38. getGorhillPublicSuffixPromise(),
  39. processLocalRuleSet(path.resolve(import.meta.dir, '../List/non_ip/cdn.conf'), proxySet, proxyKeywords),
  40. processLocalRuleSet(path.resolve(import.meta.dir, '../List/non_ip/global.conf'), proxySet, proxyKeywords),
  41. processLocalRuleSet(path.resolve(import.meta.dir, '../List/non_ip/my_proxy.conf'), proxySet, proxyKeywords),
  42. processLocalRuleSet(path.resolve(import.meta.dir, '../List/non_ip/my_plus.conf'), proxySet, proxyKeywords),
  43. processLocalRuleSet(path.resolve(import.meta.dir, '../List/non_ip/stream.conf'), proxySet, proxyKeywords),
  44. processLocalRuleSet(path.resolve(import.meta.dir, '../List/non_ip/telegram.conf'), proxySet, proxyKeywords),
  45. processLocalDomainSet(path.resolve(import.meta.dir, '../List/domainset/cdn.conf'), proxySet),
  46. processLocalDomainSet(path.resolve(import.meta.dir, '../List/domainset/download.conf'), proxySet)
  47. ]))[0];
  48. return compareAndWriteFile(
  49. span,
  50. [
  51. ...sortDomains(domainDeduper(Array.from(proxySet)), gorhill).map(i => `SUFFIX,${i}`),
  52. ...sort(Array.from(proxyKeywords)).map(i => `REGEX,${i}`)
  53. ],
  54. path.resolve(import.meta.dir, '../Internal/cdn.txt')
  55. );
  56. });
  57. if (import.meta.main) {
  58. buildInternalCDNDomains();
  59. }