build-internal-cdn-rules.ts 3.2 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. export const buildInternalCDNDomains = task(import.meta.path, async () => {
  12. const set = new Set<string>();
  13. const keywords = new Set<string>();
  14. const addApexDomain = (input: string) => {
  15. // We are including the private domains themselves
  16. const d = tldts.getDomain(input, { allowPrivateDomains: false });
  17. if (d) {
  18. set.add(d);
  19. }
  20. };
  21. const processLocalDomainSet = async (domainSetPath: string) => {
  22. for await (const line of readFileByLine(domainSetPath)) {
  23. // console.log({ line });
  24. const parsed = tldts.parse(line, { allowPrivateDomains: true, detectIp: false });
  25. if (parsed.isIp) continue;
  26. if (parsed.isIcann || parsed.isPrivate) {
  27. if (parsed.domain) {
  28. set.add(parsed.domain);
  29. }
  30. continue;
  31. }
  32. if (processLine(line)) {
  33. console.warn('[drop line from domainset]', line);
  34. }
  35. }
  36. };
  37. const processLocalRuleSet = async (ruleSetPath: string) => {
  38. for await (const line of readFileByLine(ruleSetPath)) {
  39. if (line.startsWith('DOMAIN-SUFFIX,')) {
  40. addApexDomain(line.replace('DOMAIN-SUFFIX,', ''));
  41. } else if (line.startsWith('DOMAIN,')) {
  42. addApexDomain(line.replace('DOMAIN,', ''));
  43. } else if (line.startsWith('DOMAIN-KEYWORD')) {
  44. keywords.add(escapeRegExp(line.replace('DOMAIN-KEYWORD,', '')));
  45. } else if (line.startsWith('USER-AGENT,') || line.startsWith('PROCESS-NAME,') || line.startsWith('URL-REGEX,')) {
  46. // do nothing
  47. } else if (processLine(line)) {
  48. console.warn('[drop line from ruleset]', line);
  49. }
  50. }
  51. };
  52. const gorhill = (await Promise.all([
  53. getGorhillPublicSuffixPromise(),
  54. processLocalRuleSet(path.resolve(import.meta.dir, '../List/non_ip/cdn.conf')),
  55. processLocalRuleSet(path.resolve(import.meta.dir, '../List/non_ip/global.conf')),
  56. processLocalRuleSet(path.resolve(import.meta.dir, '../List/non_ip/global_plus.conf')),
  57. processLocalRuleSet(path.resolve(import.meta.dir, '../List/non_ip/my_proxy.conf')),
  58. processLocalRuleSet(path.resolve(import.meta.dir, '../List/non_ip/stream.conf')),
  59. processLocalRuleSet(path.resolve(import.meta.dir, '../List/non_ip/telegram.conf')),
  60. processLocalDomainSet(path.resolve(import.meta.dir, '../List/domainset/cdn.conf')),
  61. processLocalDomainSet(path.resolve(import.meta.dir, '../List/domainset/download.conf'))
  62. ]))[0];
  63. return compareAndWriteFile(
  64. [
  65. ...sortDomains(Array.from(set), gorhill).map(i => `SUFFIX,${i}`),
  66. ...Array.from(keywords).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. }