build-internal-cdn-rules.ts 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import path from 'path';
  2. import * as tldts from 'tldts';
  3. import { processLine } from './lib/process-line';
  4. import { readFileByLine } from './lib/fetch-text-by-line';
  5. import { sortDomains } from './lib/stable-sort-domain';
  6. import { task } from './lib/trace-runner';
  7. import { compareAndWriteFile } from './lib/create-file';
  8. import { getGorhillPublicSuffixPromise } from './lib/get-gorhill-publicsuffix';
  9. // const { createCachedGorhillGetDomain } = require('./lib/cached-tld-parse');
  10. const escapeRegExp = (string = '') => string.replaceAll(/[$()*+.?[\\\]^{|}]/g, '\\$&');
  11. const addApexDomain = (input: string, set: Set<string>) => {
  12. // We are including the private domains themselves
  13. const d = tldts.getDomain(input, { allowPrivateDomains: false });
  14. if (d) {
  15. set.add(d);
  16. }
  17. };
  18. const processLocalDomainSet = async (domainSetPath: string, set: Set<string>) => {
  19. for await (const line of readFileByLine(domainSetPath)) {
  20. // console.log({ line });
  21. const parsed = tldts.parse(line, { allowPrivateDomains: true, detectIp: false });
  22. if (parsed.isIp) continue;
  23. if (parsed.isIcann || parsed.isPrivate) {
  24. if (parsed.domain) {
  25. set.add(parsed.domain);
  26. }
  27. continue;
  28. }
  29. if (processLine(line)) {
  30. console.warn('[drop line from domainset]', line);
  31. }
  32. }
  33. };
  34. const processLocalRuleSet = async (ruleSetPath: string, set: Set<string>, keywords: Set<string>) => {
  35. for await (const line of readFileByLine(ruleSetPath)) {
  36. if (line.startsWith('DOMAIN-SUFFIX,')) {
  37. addApexDomain(line.replace('DOMAIN-SUFFIX,', ''), set);
  38. } else if (line.startsWith('DOMAIN,')) {
  39. addApexDomain(line.replace('DOMAIN,', ''), set);
  40. } else if (line.startsWith('DOMAIN-KEYWORD')) {
  41. keywords.add(escapeRegExp(line.replace('DOMAIN-KEYWORD,', '')));
  42. } else if (line.startsWith('USER-AGENT,') || line.startsWith('PROCESS-NAME,') || line.startsWith('URL-REGEX,')) {
  43. // do nothing
  44. } else if (processLine(line)) {
  45. console.warn('[drop line from ruleset]', line);
  46. }
  47. }
  48. };
  49. export const buildInternalCDNDomains = task(import.meta.path, async () => {
  50. const proxySet = new Set<string>();
  51. const proxyKeywords = new Set<string>();
  52. const gorhill = (await Promise.all([
  53. getGorhillPublicSuffixPromise(),
  54. processLocalRuleSet(path.resolve(import.meta.dir, '../List/non_ip/cdn.conf'), proxySet, proxyKeywords),
  55. processLocalRuleSet(path.resolve(import.meta.dir, '../List/non_ip/global.conf'), proxySet, proxyKeywords),
  56. processLocalRuleSet(path.resolve(import.meta.dir, '../List/non_ip/global_plus.conf'), proxySet, proxyKeywords),
  57. processLocalRuleSet(path.resolve(import.meta.dir, '../List/non_ip/my_proxy.conf'), proxySet, proxyKeywords),
  58. processLocalRuleSet(path.resolve(import.meta.dir, '../List/non_ip/stream.conf'), proxySet, proxyKeywords),
  59. processLocalRuleSet(path.resolve(import.meta.dir, '../List/non_ip/telegram.conf'), proxySet, proxyKeywords),
  60. processLocalDomainSet(path.resolve(import.meta.dir, '../List/domainset/cdn.conf'), proxySet),
  61. processLocalDomainSet(path.resolve(import.meta.dir, '../List/domainset/download.conf'), proxySet)
  62. ]))[0];
  63. return compareAndWriteFile(
  64. [
  65. ...sortDomains(Array.from(proxySet), gorhill).map(i => `SUFFIX,${i}`),
  66. ...Array.from(proxyKeywords).sort().map(i => `REGEX,${i}`)
  67. ],
  68. path.resolve(import.meta.dir, '../List/internal/cdn.txt')
  69. );
  70. });
  71. if (import.meta.main) {
  72. buildInternalCDNDomains();
  73. }