build-internal-cdn-rules.ts 2.8 KB

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