build-cdn-conf.js 2.5 KB

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