build-cdn-conf.js 2.6 KB

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