build-cdn-conf.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // @ts-check
  2. const path = require('path');
  3. const { compareAndWriteFile } = require('./lib/string-array-compare');
  4. const { withBannerArray } = require('./lib/with-banner');
  5. const { minifyRules } = require('./lib/minify-rules');
  6. const { fetchRemoteTextAndCreateReadlineInterface, readFileByLine } = require('./lib/fetch-remote-text-by-line');
  7. const Trie = require('./lib/trie');
  8. const { surgeRulesetToClashClassicalTextRuleset } = require('./lib/clash');
  9. (async () => {
  10. console.time('Total Time - build-cdn-conf');
  11. const trie = new Trie();
  12. for await (const line of await fetchRemoteTextAndCreateReadlineInterface('https://publicsuffix.org/list/public_suffix_list.dat')) {
  13. trie.add(line);
  14. }
  15. /**
  16. * Extract OSS domain from publicsuffix list
  17. * @type {Set<string>}
  18. */
  19. const S3OSSDomains = new Set();
  20. trie.find('.amazonaws.com')
  21. .filter(line => (line.startsWith('s3-') || line.startsWith('s3.')) && !line.includes('cn-'))
  22. .forEach(line => S3OSSDomains.add(line));
  23. trie.find('.scw.cloud')
  24. .filter(line => (line.startsWith('s3-') || line.startsWith('s3.')) && !line.includes('cn-'))
  25. .forEach(line => S3OSSDomains.add(line));
  26. /** @type {string[]} */
  27. const cdnDomainsList = [];
  28. for await (const line of readFileByLine(path.resolve(__dirname, '../Source/non_ip/cdn.conf'))) {
  29. if (line === '# --- [AWS S3 Replace Me] ---') {
  30. S3OSSDomains.forEach(domain => cdnDomainsList.push(`DOMAIN-SUFFIX,${domain}`));
  31. } else {
  32. cdnDomainsList.push(line);
  33. }
  34. }
  35. const description = [
  36. 'License: AGPL 3.0',
  37. 'Homepage: https://ruleset.skk.moe',
  38. 'GitHub: https://github.com/SukkaW/Surge',
  39. '',
  40. 'This file contains object storage and static assets CDN domains.'
  41. ];
  42. const ruleset = minifyRules(cdnDomainsList);
  43. await Promise.all([
  44. compareAndWriteFile(
  45. withBannerArray(
  46. 'Sukka\'s Ruleset - CDN Domains',
  47. description,
  48. new Date(),
  49. ruleset
  50. ),
  51. path.resolve(__dirname, '../List/non_ip/cdn.conf')
  52. ),
  53. compareAndWriteFile(
  54. withBannerArray(
  55. 'Sukka\'s Ruleset - CDN Domains',
  56. description,
  57. new Date(),
  58. surgeRulesetToClashClassicalTextRuleset(ruleset)
  59. ),
  60. path.resolve(__dirname, '../Clash/non_ip/cdn.txt')
  61. )
  62. ]);
  63. console.timeEnd('Total Time - build-cdn-conf');
  64. })();