build-cdn-conf.js 2.6 KB

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