build-internal-cdn-rules.ts 2.8 KB

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