build-cdn-conf.js 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. /**
  37. * Dedupe cdn.conf
  38. */
  39. /** @type {Set<string>} */
  40. const cdnDomains = new Set();
  41. for await (const line of readFileByLine(
  42. path.resolve(__dirname, '../Source/domainset/cdn.conf')
  43. )) {
  44. const l = processLine(line);
  45. if (l) {
  46. cdnDomains.add(l);
  47. }
  48. }
  49. await Promise.all([
  50. compareAndWriteFile(
  51. withBannerArray(
  52. 'Sukka\'s Surge Rules - CDN Domains',
  53. [
  54. 'License: AGPL 3.0',
  55. 'Homepage: https://ruleset.skk.moe',
  56. 'GitHub: https://github.com/SukkaW/Surge',
  57. '',
  58. 'This file contains object storage and static assets CDN domains.'
  59. ],
  60. new Date(),
  61. minifyRules(cdnDomainsList)
  62. ),
  63. path.resolve(__dirname, '../List/non_ip/cdn.conf')
  64. ),
  65. compareAndWriteFile(
  66. withBannerArray(
  67. 'Sukka\'s Surge Rules - CDN Domains',
  68. [
  69. 'License: AGPL 3.0',
  70. 'Homepage: https://ruleset.skk.moe',
  71. 'GitHub: https://github.com/SukkaW/Surge',
  72. '',
  73. 'This file contains object storage and static assets CDN domains.'
  74. ],
  75. new Date(),
  76. minifyRules(domainDeduper(Array.from(cdnDomains)))
  77. ),
  78. path.resolve(__dirname, '../List/domainset/cdn.conf')
  79. )
  80. ]);
  81. console.timeEnd('Total Time - build-cdn-conf');
  82. })();