build-cdn-conf.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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 { domainDeduper } = require('./lib/domain-deduper');
  7. const { processLine } = require('./lib/process-line');
  8. const { fetchRemoteTextAndCreateReadlineInterface, readFileByLine } = require('./lib/fetch-remote-text-by-line');
  9. const Trie = require('./lib/trie');
  10. (async () => {
  11. console.time('Total Time - build-cdn-conf');
  12. const trie = new Trie();
  13. for await (const line of await fetchRemoteTextAndCreateReadlineInterface('https://publicsuffix.org/list/public_suffix_list.dat')) {
  14. trie.add(line);
  15. }
  16. /**
  17. * Extract OSS domain from publicsuffix list
  18. * @type {Set<string>}
  19. */
  20. const S3OSSDomains = new Set();
  21. trie.find('.amazonaws.com')
  22. .filter(line => (line.startsWith('s3-') || line.startsWith('s3.')) && !line.includes('cn-'))
  23. .forEach(line => S3OSSDomains.add(line));
  24. trie.find('.scw.cloud')
  25. .filter(line => (line.startsWith('s3-') || line.startsWith('s3.')) && !line.includes('cn-'))
  26. .forEach(line => S3OSSDomains.add(line));
  27. /** @type {string[]} */
  28. const cdnDomainsList = [];
  29. for await (const line of readFileByLine(path.resolve(__dirname, '../Source/non_ip/cdn.conf'))) {
  30. if (line === '# --- [AWS S3 Replace Me] ---') {
  31. S3OSSDomains.forEach(domain => cdnDomainsList.push(`DOMAIN-SUFFIX,${domain}`));
  32. } else {
  33. cdnDomainsList.push(line);
  34. }
  35. }
  36. await compareAndWriteFile(
  37. withBannerArray(
  38. 'Sukka\'s Surge Rules - CDN Domains',
  39. [
  40. 'License: AGPL 3.0',
  41. 'Homepage: https://ruleset.skk.moe',
  42. 'GitHub: https://github.com/SukkaW/Surge',
  43. '',
  44. 'This file contains object storage and static assets CDN domains.'
  45. ],
  46. new Date(),
  47. minifyRules(cdnDomainsList)
  48. ),
  49. path.resolve(__dirname, '../List/non_ip/cdn.conf')
  50. );
  51. /**
  52. * Dedupe cdn.conf
  53. */
  54. /** @type {Set<string>} */
  55. const cdnDomains = new Set();
  56. for await (const line of readFileByLine(
  57. path.resolve(__dirname, '../Source/domainset/cdn.conf')
  58. )) {
  59. const l = processLine(line);
  60. if (l) {
  61. cdnDomains.add(l);
  62. }
  63. }
  64. await compareAndWriteFile(
  65. withBannerArray(
  66. 'Sukka\'s Surge Rules - CDN Domains',
  67. [
  68. 'License: AGPL 3.0',
  69. 'Homepage: https://ruleset.skk.moe',
  70. 'GitHub: https://github.com/SukkaW/Surge',
  71. '',
  72. 'This file contains object storage and static assets CDN domains.'
  73. ],
  74. new Date(),
  75. minifyRules(domainDeduper(Array.from(cdnDomains)))
  76. ),
  77. path.resolve(__dirname, '../List/domainset/cdn.conf')
  78. );
  79. console.timeEnd('Total Time - build-cdn-conf');
  80. })();